#include "support/filetools.h"
#include "support/lassert.h"
#include "support/lstrings.h"
+#include "support/mutex.h"
#include "support/qstring_helpers.h"
#include "support/os.h"
#include "support/Package.h"
: d(abs_filename.empty() ? new Private : new Private(abs_filename))
{
//LYXERR(Debug::FILES, "FileName(" << abs_filename << ')');
- LASSERT(empty() || isAbsolute(d->name), /**/);
+ LATTEST(empty() || isAbsolute(d->name));
}
d->fi.setFile(toqstr(name));
d->name = fromqstr(d->fi.absoluteFilePath());
//LYXERR(Debug::FILES, "FileName::set(" << name << ')');
- LASSERT(empty() || isAbsolute(d->name), /**/);
+ LATTEST(empty() || isAbsolute(d->name));
}
d->fi.setFile(QDir(rhs.d->fi.absoluteFilePath()), toqstr(suffix));
d->name = fromqstr(d->fi.absoluteFilePath());
//LYXERR(Debug::FILES, "FileName::set(" << d->name << ')');
- LASSERT(empty() || isAbsolute(d->name), /**/);
+ LATTEST(empty() || isAbsolute(d->name));
}
}
-bool FileName::copyTo(FileName const & name) const
+bool FileName::copyTo(FileName const & name, bool keepsymlink) const
{
- LYXERR(Debug::FILES, "Copying " << name);
+ FileNameSet visited;
+ return copyTo(name, keepsymlink, visited);
+}
+
+
+bool FileName::copyTo(FileName const & name, bool keepsymlink,
+ FileName::FileNameSet & visited) const
+{
+ LYXERR(Debug::FILES, "Copying " << name << " keep symlink: " << keepsymlink);
+ if (keepsymlink && name.isSymLink()) {
+ visited.insert(*this);
+ FileName const target(fromqstr(name.d->fi.symLinkTarget()));
+ if (visited.find(target) != visited.end()) {
+ LYXERR(Debug::FILES, "Found circular symlink: " << target);
+ return false;
+ }
+ return copyTo(target, true);
+ }
QFile::remove(name.d->fi.absoluteFilePath());
bool success = QFile::copy(d->fi.absoluteFilePath(), name.d->fi.absoluteFilePath());
if (!success)
bool FileName::renameTo(FileName const & name) const
{
+ LYXERR(Debug::FILES, "Renaming " << name);
bool success = QFile::rename(d->fi.absoluteFilePath(), name.d->fi.absoluteFilePath());
if (!success)
LYXERR0("Could not rename file " << *this << " to " << name);
bool FileName::moveTo(FileName const & name) const
{
+ LYXERR(Debug::FILES, "Moving " << name);
QFile::remove(name.d->fi.absoluteFilePath());
bool success = QFile::rename(d->fi.absoluteFilePath(),
}
-static string createTempFile(QString const & mask)
-{
- QTemporaryFile qt_tmp(mask);
- if (qt_tmp.open()) {
- string const temp_file = fromqstr(qt_tmp.fileName());
- LYXERR(Debug::FILES, "Temporary file `" << temp_file << "' created.");
- return temp_file;
- }
- LYXERR(Debug::FILES, "Unable to create temporary file with following template: "
- << qt_tmp.fileTemplate());
- return string();
-}
-
-
-FileName FileName::tempName(FileName const & temp_dir, string const & mask)
-{
- QFileInfo tmp_fi(QDir(temp_dir.d->fi.absoluteFilePath()), toqstr(mask));
- LYXERR(Debug::FILES, "Temporary file in " << tmp_fi.absoluteFilePath());
- return FileName(createTempFile(tmp_fi.absoluteFilePath()));
-}
-
-
-FileName FileName::tempName(string const & mask)
-{
- return tempName(package().temp_dir(), mask);
-}
-
-
FileName FileName::getcwd()
{
// return makeAbsPath("."); would create an infinite loop
if (encoding.empty() || encoding == "UTF-8")
s = QString::fromUtf8(contents.data());
else if (encoding == "ascii")
+#if (QT_VERSION < 0x050000)
s = QString::fromAscii(contents.data());
+#else
+ s = QString::fromLatin1(contents.data());
+#endif
else if (encoding == "local8bit")
s = QString::fromLocal8Bit(contents.data());
else if (encoding == "latin1")
string DocFileName::mangledFileName(string const & dir) const
{
+ // Concurrent access to these variables is possible.
+
// We need to make sure that every DocFileName instance for a given
// filename returns the same mangled name.
typedef map<string, string> MangledMap;
static MangledMap mangledNames;
+ static Mutex mangledMutex;
+ // this locks both access to mangledNames and counter below
+ Mutex::Locker lock(&mangledMutex);
MangledMap::const_iterator const it = mangledNames.find(absFileName());
if (it != mangledNames.end())
return (*it).second;