#include "support/filetools.h"
#include "support/lassert.h"
#include "support/lstrings.h"
-#include "support/qstring_helpers.h"
+#include "support/mutex.h"
#include "support/os.h"
#include "support/Package.h"
#include "support/qstring_helpers.h"
#include <QTime>
#include <boost/crc.hpp>
-#include <boost/scoped_array.hpp>
#include <algorithm>
#include <iterator>
bool FileName::copyTo(FileName const & name, bool keepsymlink) const
{
FileNameSet visited;
- visited.insert(*this);
return copyTo(name, keepsymlink, visited);
}
{
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);
bool FileName::renameTo(FileName const & name) const
{
- LYXERR(Debug::FILES, "Renaming " << name);
+ LYXERR(Debug::FILES, "Renaming " << name << " as " << *this);
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);
+ LYXERR(Debug::FILES, "Moving " << name << " to " << *this);
QFile::remove(name.d->fi.absoluteFilePath());
bool success = QFile::rename(d->fi.absoluteFilePath(),
}
+//QFileInfo caching info might fool this test if file was changed meanwhile.
+//refresh() helps, but we don't want to put it blindly here, because it might
+//trigger slowdown on networked file systems.
bool FileName::isFileEmpty() const
{
LASSERT(!empty(), return true);
}
-static string createTempFile(QString const & mask)
-{
- // FIXME: This is not safe. QTemporaryFile creates a file in open(),
- // but the file is deleted when qt_tmp goes out of scope.
- // Therefore the next call to createTempFile() may create the
- // same file again. To make this safe the QTemporaryFile object
- // needs to be kept for the whole life time of the temp file name.
- // This can be achieved by using the TempFile class.
- QTemporaryFile qt_tmp(mask + ".XXXXXXXXXXXX");
- 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
}
+bool FileName::link(FileName const & name) const
+{
+ return QFile::link(toqstr(absFileName()), toqstr(name.absFileName()));
+}
+
+
unsigned long checksum_ifstream_fallback(char const * file)
{
unsigned long result = 0;
string DocFileName::mangledFileName(string const & dir) const
{
- // FIXME THREAD
// 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;
// Add the extension back on
mname = support::changeExtension(mname, getExtension(name));
- // FIXME THREAD
// Prepend a counter to the filename. This is necessary to make
// the mangled name unique.
static int counter = 0;