aboutsummaryrefslogtreecommitdiffstats
path: root/src/kvilib/file/KviFileUtils.cpp
diff options
context:
space:
mode:
authorGravatar Szymon Tomasz Stefanek2010-12-25 05:28:46 +0000
committerGravatar Szymon Tomasz Stefanek2010-12-25 05:28:46 +0000
commitf2f47c5eaa7d284abad1f693d7c75c85c42565df (patch)
tree2dd141a4ae4911ef3a1abf4d1910d3f7ba071c27 /src/kvilib/file/KviFileUtils.cpp
parentMore work on the window popup (diff)
downloadKVIrc-f2f47c5eaa7d284abad1f693d7c75c85c42565df.tar.gz
KVIrc-f2f47c5eaa7d284abad1f693d7c75c85c42565df.tar.bz2
KVIrc-f2f47c5eaa7d284abad1f693d7c75c85c42565df.zip
Beginning of 'the big rename & cleanup'. File names should match class names, when possible. Move classes to one per file. Move C functions to namespaces, if possible. Kill some abbreviations...
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@5229 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/kvilib/file/KviFileUtils.cpp')
-rw-r--r--src/kvilib/file/KviFileUtils.cpp471
1 files changed, 471 insertions, 0 deletions
diff --git a/src/kvilib/file/KviFileUtils.cpp b/src/kvilib/file/KviFileUtils.cpp
new file mode 100644
index 000000000..28b8da0bc
--- /dev/null
+++ b/src/kvilib/file/KviFileUtils.cpp
@@ -0,0 +1,471 @@
+//=============================================================================
+//
+// File : KviFileUtils.cpp
+// Creation date : Fri Dec 25 1998 18:26:48 by Szymon Stefanek
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 1998-2010 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//=============================================================================
+
+#define _KVI_FILEUTLIS_CPP_
+
+#include "KviFileUtils.h"
+#include "KviQString.h"
+#include "KviFile.h"
+#include "KviMemory.h"
+
+#include <QDir>
+#include <QFileInfo>
+#include <QtGlobal>
+#include <QTextCodec>
+#include <QTextStream>
+
+
+namespace KviFileUtils
+{
+ static char cHexChars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+ /*
+ WORKING CODE BUT UNUSED FOR NOW
+ bool readLine(QFile * f,QString &szBuffer,bool bClearBuffer)
+ {
+ // FIXME: Should this assume UTF8 encoding ?
+ char tmp_buf[256];
+ int cur_len = 0;
+ //char *cur_ptr = tmp_buf;
+ if(bClearBuffer)szBuffer = "";
+ int ch = f->getch();
+
+ while((ch != -1)&&(ch != '\n')&&(ch != 0))
+ {
+ tmp_buf[cur_len] = ch;
+ cur_len++;
+ if(cur_len > 255)
+ {
+ if(tmp_buf[255] == '\r')cur_len--; //Ignore CR...
+ int lastlen = szBuffer.length();
+ szBuffer.resize(lastlen + cur_len);
+ QChar *p1 = szBuffer.unicode() + lastlen;
+ char * p2 = tmp_buf;
+ for(int i=0;i<cur_len;i++)*p1++ = *p2++;
+ cur_len = 0;
+ }
+ ch = f->getch();
+ }
+ if(ch == 0)
+ {
+ qDebug("Warning : %s is not an ascii file",f->name().latin1());
+ }
+ if(cur_len > 0)
+ {
+ if(tmp_buf[cur_len - 1] == '\r')cur_len--; //Ignore CR...
+ int lastlen = szBuffer.length();
+ szBuffer.resize(lastlen + cur_len);
+ QChar *p1 = szBuffer.unicode() + lastlen;
+ char * p2 = tmp_buf;
+ for(int i=0;i<cur_len;i++)*p1++ = *p2++;
+ }
+ return (ch == '\n'); //more data to read else a broken file or EOF
+ }
+
+ bool loadFileStripCR(const QString &szPath,QString &szBuffer)
+ {
+ QFile f(szPath);
+ if(!f.open(IO_ReadOnly))return false;
+ szBuffer = "";
+ while(readLine(&f,szBuffer,false))
+ {
+ szBuffer.append('\n'); // readLine returned true...last char was a newline
+ }
+ // readLine returned false, no ending newline encountered
+ return true;
+ }
+ */
+
+ bool makeDir(const QString & szPath)
+ {
+ QDir d;
+ QString szDir = KviQString::trimmed(szPath);
+ adjustFilePath(szDir);
+ QString szCreatedDir;
+
+#if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
+ int idx = szDir.indexOf(':');
+ if(idx == 1)
+ {
+ szCreatedDir = szDir.left(2);
+ szDir.remove(0,2);
+ }
+#endif
+
+ KviQString::stripLeft(szDir,KVI_PATH_SEPARATOR_CHAR);
+ while(!szDir.isEmpty())
+ {
+ szCreatedDir += KVI_PATH_SEPARATOR;
+ szCreatedDir += KviQString::getToken(szDir,KVI_PATH_SEPARATOR_CHAR);
+ if(!directoryExists(szCreatedDir))
+ {
+ if(!d.mkdir(szCreatedDir))
+ {
+ qDebug("Can't create directory %s",KviQString::toUtf8(szCreatedDir).data());
+ return false;
+ }
+ }
+ KviQString::stripLeft(szDir,KVI_PATH_SEPARATOR_CHAR);
+ }
+ return true;
+ }
+
+ bool makeDir(const char * pcPath)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return makeDir(szPath);
+ }
+
+ bool renameFile(const QString & szSrc, const QString & szDst)
+ {
+ QDir d;
+ return d.rename(szSrc,szDst);
+ }
+
+ bool renameFile(const char * pcSrc, const char * pcDst)
+ {
+ QString szPath = QString::fromUtf8(pcSrc);
+ QString szPath2 = QString::fromUtf8(pcDst);
+ return renameFile(szPath,szPath2);
+ }
+
+ bool copyFile(const QString & szSrc, const QString & szDst)
+ {
+ KviFile f1(szSrc);
+ if(!f1.open(QFile::ReadOnly))
+ return false;
+ KviFile f2(szDst);
+ if(!f2.open(QFile::WriteOnly | QFile::Truncate))
+ {
+ f1.close();
+ return false;
+ }
+ char cBuffer[1024];
+ while(!f1.atEnd())
+ {
+ int iLen = f1.read(cBuffer,1024);
+ if(iLen <= 0)
+ {
+ f1.close();
+ f2.close();
+ return false; //"serious error"
+ }
+ f2.write(cBuffer,iLen);
+ }
+ f1.close();
+ f2.close();
+ return true;
+ }
+
+ bool copyFile(const char * pcSrc, const char * pcDst)
+ {
+ QString szPath = QString::fromUtf8(pcSrc);
+ QString szPath2 = QString::fromUtf8(pcDst);
+ return copyFile(szPath,szPath2);
+ }
+
+ bool loadFile(const QString & szPath, QString & szBuffer, bool bUtf8)
+ {
+ KviFile f(szPath);
+ if(!f.open(QFile::ReadOnly))
+ return false;
+ if(bUtf8)
+ {
+ QByteArray ba = f.readAll();
+ szBuffer = QString::fromUtf8(ba.data(),ba.size());
+ //qDebug("BUFFERLEN: %d",szBuffer.length());
+ } else {
+ szBuffer = QString(f.readAll());
+ }
+ return true;
+ }
+
+ void adjustFilePath(QString & szPath)
+ {
+#if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
+ szPath.replace('/',"\\");
+ szPath.replace("\\\\","\\");
+ // FIXME: Use the default drive here ?
+ if(szPath.startsWith("\\"))
+ szPath.prepend("C:");
+#else
+ szPath.replace('\\',"/");
+ szPath.replace("//","/");
+ // deal with windows paths
+ if((szPath.length() > 2) && (szPath.at(0) != QChar('/')))
+ {
+ if((szPath.at(1) == QChar(':')) && (szPath.at(2) == QChar('/')))
+ {
+ szPath.remove(0,2);
+ }
+ }
+ szPath = QDir::cleanPath(szPath);
+#endif
+
+ }
+
+ bool removeFile(const QString & szPath)
+ {
+ QDir d;
+ return d.remove(szPath);
+ }
+
+ bool removeFile(const char * pcPath)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return removeFile(szPath);
+ }
+
+ bool removeDir(const QString & szPath)
+ {
+ QDir d;
+ return d.rmdir(szPath);
+ }
+
+ bool removeDir(const char * pcPath)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return removeDir(szPath);
+ }
+
+ bool deleteDir(const QString & szPath)
+ {
+ QDir d(szPath);
+ QStringList sl = d.entryList(QDir::Dirs);
+ QStringList::Iterator it;
+ for(it = sl.begin(); it != sl.end(); it++)
+ {
+ QString szSubdir = *it;
+ if(!(KviQString::equalCS(szSubdir,"..") || KviQString::equalCS(szSubdir,".")))
+ {
+ QString szSubPath = szPath;
+ KviQString::ensureLastCharIs(szSubPath,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szSubPath += szSubdir;
+ if(!KviFileUtils::deleteDir(szSubPath))
+ return false;
+ }
+ }
+
+ sl = d.entryList(QDir::Files);
+ for(it = sl.begin(); it != sl.end(); it++)
+ {
+ QString szFilePath = szPath;
+ KviQString::ensureLastCharIs(szFilePath,QChar(KVI_PATH_SEPARATOR_CHAR));
+ szFilePath += *it;
+ if(!KviFileUtils::removeFile(szFilePath))
+ return false;
+ }
+
+ return KviFileUtils::removeDir(szPath);
+ }
+
+ bool writeFile(const QString & szPath, const QString & szData, bool bAppend)
+ {
+ KviFile f(szPath);
+ if(!f.open(QFile::WriteOnly | (bAppend ? QFile::Append : QFile::Truncate)))
+ return false;
+ QByteArray szTmp = KviQString::toUtf8(szData);
+ if(!szTmp.data())
+ return true;
+ if(f.write(szTmp.data(),szTmp.length()) != ((unsigned int)(szTmp.length())))
+ return false;
+ return true;
+ }
+
+ bool writeFile(const char * pcPath, const QString & szData, bool bAppend)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return writeFile(szPath,szData,bAppend);
+ }
+
+ bool writeFileLocal8Bit(const QString & szPath, const QString & szData, bool bAppend)
+ {
+ KviFile f(szPath);
+ if(!f.open(QFile::WriteOnly | (bAppend ? QFile::Append : QFile::Truncate)))
+ return false;
+ QByteArray szTmp = QTextCodec::codecForLocale()->fromUnicode(szData);
+ if(!szTmp.data())
+ return true;
+ if(f.write(szTmp.data(),szTmp.length()) != ((unsigned int)(szTmp.length())))
+ return false;
+ return true;
+ }
+
+ bool writeFileLocal8Bit(const char * pcPath, const QString & szData, bool bAppend)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return writeFileLocal8Bit(szPath,szData,bAppend);
+ }
+
+ bool readFile(const QString & szPath, QString & szBuffer, unsigned int uMaxSize)
+ {
+ KviFile f(szPath);
+ if(!f.open(QFile::ReadOnly))
+ return false;
+ if(f.size() < 1)
+ {
+ szBuffer = "";
+ f.close();
+ return true;
+ }
+ if(f.size() > uMaxSize)
+ return false;
+ char * pcBuf = new char[f.size() + 1];
+ if(f.read(pcBuf,f.size()) != ((long int)f.size()))
+ {
+ delete[] pcBuf;
+ pcBuf = 0;
+ return false;
+ }
+ pcBuf[f.size()] = '\0';
+ szBuffer = QString::fromUtf8(pcBuf);
+ delete[] pcBuf;
+ pcBuf = 0;
+ return true;
+ }
+
+ bool readFile(const char * pcPath, QString & szBuffer, unsigned int uMaxSize)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return readFile(szPath,szBuffer,uMaxSize);
+ }
+
+ QString extractFileName(const QString & szFileNameWithPath)
+ {
+ return QFileInfo(szFileNameWithPath).fileName();
+ }
+
+ QString extractFilePath(const QString & szFileNameWithPath)
+ {
+ return QFileInfo(szFileNameWithPath).absolutePath();
+ }
+
+ bool readLine(QFile * pFile, QString & szBuffer, bool bUtf8)
+ {
+ QTextStream stream(pFile);
+ // By default, QTextCodec::codecForLocale() is used, and automatic unicode detection is enabled.
+ if(bUtf8)
+ stream.setCodec(QTextCodec::codecForMib(106));
+ /*
+ * Name: UTF-8
+ * MIBenum: 106
+ * from: http://www.iana.org/assignments/character-sets
+ */
+ szBuffer = stream.readLine();
+ return !szBuffer.isNull();
+ }
+
+ bool readLines(QFile * pFile, QStringList & buffer, int iStartLine, int iCount, bool bUtf8)
+ {
+ QTextStream stream(pFile);
+ //please read comments in the readLine(...) method
+ if(bUtf8)
+ stream.setCodec(QTextCodec::codecForMib(106));
+
+ for(int i=0;i<iStartLine;i++)
+ stream.readLine();
+
+ if(iCount>0)
+ {
+ for(; (iCount>0 && !stream.atEnd()) ; iCount-- )
+ buffer.append(stream.readLine());
+ } else {
+ while(!stream.atEnd()) {
+ buffer.append(stream.readLine());
+ }
+ }
+ return buffer.count()!= 0;
+ }
+
+ bool directoryExists(const QString & szPath)
+ {
+ QFileInfo f(szPath);
+ return (f.exists() && f.isDir());
+ }
+
+ bool isReadable(const QString & szFname)
+ {
+ QFileInfo f(szFname);
+ return (f.exists() && f.isFile() && f.isReadable());
+ }
+
+ bool isReadable(const char * pcPath)
+ {
+ QString szPath = QString::fromUtf8(pcPath);
+ return isReadable(szPath);
+ }
+
+ bool isAbsolutePath(const QString & szPath)
+ {
+ QFileInfo f(szPath);
+ return !f.isRelative();
+ }
+
+ void encodeFileName(QString & szPath)
+ {
+ QString szSrc(szPath);
+ szPath = "";
+ for(int i = 0; i < szSrc.length(); i++)
+ {
+ QChar cur = szSrc[i];
+ if( ! (cur.isLetter() || cur.isDigit() || cur==' ' || cur=='_' || cur=='.' || cur=='#' || cur=='%') )
+ {
+ if(cur.row()!=0)
+ {
+ szPath += '%';
+ szPath += cHexChars[cur.row() >> 4];
+ szPath += cHexChars[cur.row() & 15];
+ }
+ szPath += '%';
+ szPath += cHexChars[cur.cell() >> 4];
+ szPath += cHexChars[cur.cell() & 15];
+ } else if (cur=='%')
+ {
+ szPath += "%%";
+ } else {
+ szPath += cur;
+ }
+ }
+ }
+
+ void cleanFileName(QString & szPath)
+ {
+ QString szSrc(szPath);
+ szPath = "";
+ for(int i = 0; i < szSrc.length(); i++)
+ {
+ QChar cur = szSrc[i];
+#if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
+ if(cur.unicode() < 32 || cur=='<' || cur=='>' || cur==':' || cur=='"' || cur=='/' || cur=='\\' || cur=='|' || cur=='?' || cur=='*')
+#else
+ if(cur.unicode() == 0 || cur=='/')
+#endif
+ {
+ szPath += '_';
+ } else {
+ szPath += cur;
+ }
+ }
+ }
+}