#include <config.h>
#include "support/FileName.h"
+#include "support/FileNameList.h"
#include "support/debug.h"
#include "support/filetools.h"
#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 {
}
+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);
}
// 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;
}
- LYXERR0("Checksumming \"" << absFilename() << "\".");
- 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 const success = QFile::remove(d->fi.absoluteFilePath());
if (!success && exists())
- lyxerr << "FileName::removeFile(): Could not delete file "
- << *this << "." << endl;
+ LYXERR0("Could not delete file " << *this);
return success;
}
{
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;
}
{
bool const success = rmdir(d->fi);
if (!success)
- lyxerr << "Could not delete " << *this << "." << endl;
+ LYXERR0("Could not delete " << *this);
return success;
}
}
-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);
}
// 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();