#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"
#include "support/qstring_helpers.h"
#include <QTime>
#include <boost/crc.hpp>
-#include <boost/scoped_array.hpp>
#include <algorithm>
#include <iterator>
{
Private() {}
- Private(string const & abs_filename) : fi(toqstr(abs_filename))
+ Private(string const & abs_filename) : fi(toqstr(handleTildeName(abs_filename)))
{
name = fromqstr(fi.absoluteFilePath());
fi.setCaching(fi.exists() ? true : false);
}
///
- inline void refresh()
+ inline void refresh()
{
fi.refresh();
}
-
static
bool isFilesystemEqual(QString const & lhs, QString const & rhs)
{
Qt::CaseSensitive : Qt::CaseInsensitive) == 0;
}
+ static
+ string const handleTildeName(string const & name)
+ {
+ return name == "~" ? Package::get_home_dir().absFileName() :
+ prefixIs(name, "~/") ? Package::get_home_dir().absFileName() + name.substr(1) :
+ name;
+ }
+
/// The absolute file name in UTF-8 encoding.
std::string name;
///
bool FileName::isAbsolute(string const & name)
{
- QFileInfo fi(toqstr(name));
+ QFileInfo fi(toqstr(Private::handleTildeName(name)));
return fi.isAbsolute();
}
void FileName::set(string const & name)
{
- d->fi.setFile(toqstr(name));
+ d->fi.setFile(toqstr(Private::handleTildeName(name)));
d->name = fromqstr(d->fi.absoluteFilePath());
//LYXERR(Debug::FILES, "FileName::set(" << name << ')');
LATTEST(empty() || isAbsolute(d->name));
bool FileName::moveTo(FileName const & name) const
{
- LYXERR(Debug::FILES, "Moving " << name << " to " << *this);
+ LYXERR(Debug::FILES, "Moving " << *this << " to " << name);
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);
}
+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;
// FIXME: This code is not ready with Qt4.4.2,
// see http://www.lyx.org/trac/ticket/5293
// FIXME: should we check if the MapExtension extension is supported?
- // see QAbstractFileEngine::supportsExtension() and
+ // see QAbstractFileEngine::supportsExtension() and
// QAbstractFileEngine::MapExtension)
QFile qf(fi.filePath());
if (!qf.open(QIODevice::ReadOnly))
continue;
bool removed;
if (list.at(i).isDir()) {
- LYXERR(Debug::FILES, "Removing dir "
+ LYXERR(Debug::FILES, "Removing dir "
<< fromqstr(list.at(i).absoluteFilePath()));
removed = rmdir(list.at(i));
}
else {
- LYXERR(Debug::FILES, "Removing file "
+ LYXERR(Debug::FILES, "Removing file "
<< fromqstr(list.at(i).absoluteFilePath()));
removed = dir.remove(list.at(i).fileName());
}
LYXERR0("Could not delete "
<< fromqstr(list.at(i).absoluteFilePath()));
}
- }
+ }
QDir parent = fi.absolutePath();
success &= parent.rmdir(fi.fileName());
return success;
typedef map<string, string> MangledMap;
static MangledMap mangledNames;
static Mutex mangledMutex;
- // this locks both access to mangledNames and counter below
+ // 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())