]> git.lyx.org Git - lyx.git/blobdiff - src/support/FileName.cpp
Revert qprocess code. Revisions reverted: 22026, 22030, 22044, 22048,
[lyx.git] / src / support / FileName.cpp
index 67a9b8579a074b74c168f3e922d33de02904ba73..40e717516c971614267e9dab8f06f3678b205061 100644 (file)
@@ -11,6 +11,7 @@
 #include <config.h>
 
 #include "support/FileName.h"
+#include "support/FileNameList.h"
 
 #include "support/debug.h"
 #include "support/filetools.h"
@@ -24,6 +25,7 @@
 #include <QFile>
 #include <QFileInfo>
 #include <QList>
+#include <QTime>
 
 #include <boost/assert.hpp>
 
 #include <cerrno>
 #include <fcntl.h>
 
-
-using std::map;
-using std::string;
-using std::ifstream;
-using std::ostringstream;
-using std::endl;
+using namespace std;
 
 namespace lyx {
 namespace support {
@@ -86,6 +83,12 @@ FileName::FileName(string const & abs_filename)
 }
 
 
+FileName::~FileName()
+{
+       delete d;
+}
+
+
 FileName::FileName(FileName const & rhs) : d(new Private)
 {
        d->fi = rhs.d->fi;
@@ -224,6 +227,39 @@ bool FileName::isDirWritable() const
 }
 
 
+FileNameList FileName::dirList(std::string const & ext) const
+{
+       FileNameList dirlist;
+       if (!isDirectory()) {
+               LYXERR0("Directory '" << *this << "' does not exist!");
+               return dirlist;
+       }
+
+       QDir dir = d->fi.absoluteDir();
+
+       if (!ext.empty()) {
+               QString filter;
+               switch (ext[0]) {
+               case '.': filter = "*" + toqstr(ext); break;
+               case '*': filter = toqstr(ext); break;
+               default: filter = "*." + toqstr(ext);
+               }
+               dir.setNameFilters(QStringList(filter));
+               LYXERR(Debug::FILES, "filtering on extension "
+                       << fromqstr(filter) << " is requested.");
+       }
+
+       QFileInfoList list = dir.entryInfoList();
+       for (int i = 0; i != list.size(); ++i) {
+               FileName fi(fromqstr(list.at(i).absoluteFilePath()));
+               dirlist.push_back(fi);
+               LYXERR(Debug::FILES, "found file " << fi);
+       }
+
+       return dirlist;
+}
+
+
 FileName FileName::tempName(FileName const & dir, std::string const & mask)
 {
        return support::tempName(dir, mask);
@@ -252,19 +288,26 @@ unsigned long FileName::checksum() const
        }
        // a directory may be passed here so we need to test it. (bug 3622)
        if (isDirectory()) {
-               LYXERR0('\\' << absFilename() << "\" is a directory!");
+               LYXERR0('"' << absFilename() << "\" is a directory!");
                return 0;
        }
-       return sum(absFilename().c_str());
+       if (!lyxerr.debugging(Debug::FILES))
+               return sum(absFilename().c_str());
+
+       QTime t;
+       t.start();
+       unsigned long r = sum(absFilename().c_str());
+       lyxerr << "Checksumming \"" << absFilename() << "\" lasted "
+               << t.elapsed() << " ms." << endl;
+       return r;
 }
 
 
 bool FileName::removeFile() const
 {
        bool const success = QFile::remove(d->fi.absoluteFilePath());
-       if (!success)
-               lyxerr << "FileName::removeFile(): Could not delete file "
-                       << *this << "." << endl;
+       if (!success && exists())
+               LYXERR0("Could not delete file " << *this);
        return success;
 }
 
@@ -273,32 +316,32 @@ static bool rmdir(QFileInfo const & fi)
 {
        QDir dir(fi.absoluteFilePath());
        QFileInfoList list = dir.entryInfoList();
-       bool global_success = true;
+       bool success = true;
        for (int i = 0; i != list.size(); ++i) {
                if (list.at(i).fileName() == ".")
                        continue;
                if (list.at(i).fileName() == "..")
                        continue;
-               bool success;
+               bool removed;
                if (list.at(i).isDir()) {
-                       LYXERR(Debug::FILES, "Erasing dir " 
+                       LYXERR(Debug::FILES, "Removing dir " 
                                << fromqstr(list.at(i).absoluteFilePath()));
-                       success = rmdir(list.at(i));
+                       removed = rmdir(list.at(i));
                }
                else {
-                       LYXERR(Debug::FILES, "Erasing file " 
+                       LYXERR(Debug::FILES, "Removing file " 
                                << fromqstr(list.at(i).absoluteFilePath()));
-                       success = dir.remove(list.at(i).fileName());
+                       removed = dir.remove(list.at(i).fileName());
                }
-               if (!success) {
-                       global_success = false;
-                       lyxerr << "Could not delete "
-                               << fromqstr(list.at(i).absoluteFilePath()) << "." << endl;
+               if (!removed) {
+                       success = false;
+                       LYXERR0("Could not delete "
+                               << fromqstr(list.at(i).absoluteFilePath()));
                }
        } 
        QDir parent = fi.absolutePath();
-       global_success |= parent.rmdir(fi.fileName());
-       return global_success;
+       success &= parent.rmdir(fi.fileName());
+       return success;
 }
 
 
@@ -306,7 +349,7 @@ bool FileName::destroyDirectory() const
 {
        bool const success = rmdir(d->fi);
        if (!success)
-               lyxerr << "Could not delete " << *this << "." << endl;
+               LYXERR0("Could not delete " << *this);
 
        return success;
 }
@@ -319,37 +362,9 @@ bool FileName::createDirectory(int permission) const
 }
 
 
-std::vector<FileName> dirList(FileName const & dirname, std::string const & ext)
+docstring const FileName::absoluteFilePath() const
 {
-       std::vector<FileName> dirlist;
-       if (!dirname.isDirectory()) {
-               LYXERR0("Directory '" << dirname << "' does not exist!");
-               return dirlist;
-       }
-
-       QDir dir(dirname.d->fi.absoluteFilePath());
-
-       if (!ext.empty()) {
-               QString filter;
-               switch (ext[0]) {
-               case '.': filter = "*" + toqstr(ext); break;
-               case '*': filter = toqstr(ext); break;
-               default: filter = "*." + toqstr(ext);
-               }
-               dir.setNameFilters(QStringList(filter));
-               LYXERR(Debug::FILES, "filtering on extension "
-                       << fromqstr(filter) << " is requested.");
-       }
-
-       QFileInfoList list = dir.entryInfoList();
-       for (int i = 0; i != list.size(); ++i) {
-               FileName fi;
-               fi.d->fi = list.at(i);
-               dirlist.push_back(fi);
-               LYXERR(Debug::FILES, "found file " << fi);
-       }
-
-       return dirlist;
+       return qstring_to_ucs4(d->fi.absoluteFilePath());
 }
 
 
@@ -359,20 +374,39 @@ docstring FileName::displayName(int threshold) const
 }
 
 
-string FileName::fileContents() const
+docstring FileName::fileContents(string const & encoding) const
 {
-       if (exists()) {
-               string const encodedname = toFilesystemEncoding();
-               ifstream ifs(encodedname.c_str());
-               ostringstream ofs;
-               if (ifs && ofs) {
-                       ofs << ifs.rdbuf();
-                       ifs.close();
-                       return ofs.str();
-               }
+       if (!isReadableFile()) {
+               LYXERR0("File '" << *this << "' is not redable!");
+               return docstring();
        }
-       lyxerr << "LyX was not able to read file '" << *this << '\'' << std::endl;
-       return string();
+
+       QFile file(d->fi.absoluteFilePath());
+       if (!file.open(QIODevice::ReadOnly)) {
+               LYXERR0("File '" << *this
+                       << "' could not be opened in read only mode!");
+               return docstring();
+       }
+       QByteArray contents = file.readAll();
+       file.close();
+
+       if (contents.isEmpty()) {
+               LYXERR(Debug::FILES, "File '" << *this
+                       << "' is either empty or some error happened while reading it.");
+               return docstring();
+       }
+
+       QString s;
+       if (encoding.empty() || encoding == "UTF-8")
+               s = QString::fromUtf8(contents.data());
+       else if (encoding == "ascii")
+               s = QString::fromAscii(contents.data());
+       else if (encoding == "local8bit")
+               s = QString::fromLocal8Bit(contents.data());
+       else if (encoding == "latin1")
+               s = QString::fromLatin1(contents.data());
+
+       return qstring_to_ucs4(s);
 }
 
 
@@ -424,8 +458,8 @@ string FileName::guessFormatFromContents() const
        // GZIP \037\213        http://www.ietf.org/rfc/rfc1952.txt
        // ZIP  PK...                   http://www.halyava.ru/document/ind_arch.htm
        // Z    \037\235                UNIX compress
-       // paranoia check
 
+       // paranoia check
        if (empty() || !isReadableFile())
                return string();
 
@@ -578,6 +612,13 @@ bool FileName::isZippedFile() const
 }
 
 
+docstring const FileName::relPath(string const & path) const
+{
+       // FIXME UNICODE
+       return makeRelPath(absoluteFilePath(), from_utf8(path));
+}
+
+
 bool operator==(FileName const & lhs, FileName const & rhs)
 {
        return lhs.absFilename() == rhs.absFilename();
@@ -648,7 +689,7 @@ void DocFileName::erase()
 string DocFileName::relFilename(string const & path) const
 {
        // FIXME UNICODE
-       return to_utf8(makeRelPath(qstring_to_ucs4(d->fi.absoluteFilePath()), from_utf8(path)));
+       return to_utf8(relPath(path));
 }