Next step of true unicode filenames: Use support::FileName instead of

std::string at many places (not all yet).


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16069 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2006-11-26 21:30:39 +00:00
parent 0dae88fca6
commit 8e6e970d7b
105 changed files with 834 additions and 666 deletions

View File

@ -209,7 +209,7 @@ bool BufferView::loadLyXFile(string const & filename, bool tolastfiles)
{ {
// Get absolute path of file and add ".lyx" // Get absolute path of file and add ".lyx"
// to the filename if necessary // to the filename if necessary
string s = fileSearch(string(), filename, "lyx"); string s = fileSearch(string(), filename, "lyx").absFilename();
bool const found = !s.empty(); bool const found = !s.empty();
@ -1387,7 +1387,7 @@ void BufferView::menuInsertLyXFile(string const & filenm)
// Get absolute path of file and add ".lyx" // Get absolute path of file and add ".lyx"
// to the filename if necessary // to the filename if necessary
filename = fileSearch(string(), filename, "lyx"); filename = fileSearch(string(), filename, "lyx").absFilename();
docstring const disp_fn = makeDisplayPath(filename); docstring const disp_fn = makeDisplayPath(filename);
// emit message signal. // emit message signal.

View File

@ -32,7 +32,6 @@
#include <map> #include <map>
#include <sstream> #include <sstream>
using lyx::support::absolutePath;
using lyx::support::addName; using lyx::support::addName;
using std::string; using std::string;
@ -41,6 +40,8 @@ namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
using support::FileName;
namespace { namespace {
unsigned long do_crc(string const & s) unsigned long do_crc(string const & s)
@ -51,28 +52,27 @@ unsigned long do_crc(string const & s)
} }
static string cache_dir; static FileName cache_dir;
class CacheItem { class CacheItem {
public: public:
CacheItem() {} CacheItem() {}
CacheItem(string const & orig_from, string const & to_format, CacheItem(FileName const & orig_from, string const & to_format,
time_t t, unsigned long c) time_t t, unsigned long c)
: timestamp(t), checksum(c) : timestamp(t), checksum(c)
{ {
BOOST_ASSERT(absolutePath(orig_from));
std::ostringstream os; std::ostringstream os;
os << std::setw(10) << std::setfill('0') << do_crc(orig_from) os << std::setw(10) << std::setfill('0') << do_crc(orig_from.absFilename())
<< '-' << to_format; << '-' << to_format;
cache_name = addName(cache_dir, os.str()); cache_name = FileName(addName(cache_dir.absFilename(), os.str()));
lyxerr[Debug::FILES] << "Add file cache item " << orig_from lyxerr[Debug::FILES] << "Add file cache item " << orig_from
<< ' ' << to_format << ' ' << cache_name << ' ' << to_format << ' ' << cache_name
<< ' ' << timestamp << ' ' << checksum << ' ' << timestamp << ' ' << checksum
<< '.' << std::endl; << '.' << std::endl;
} }
~CacheItem() {} ~CacheItem() {}
string cache_name; FileName cache_name;
time_t timestamp; time_t timestamp;
unsigned long checksum; unsigned long checksum;
}; };
@ -84,7 +84,7 @@ public:
* nested map to find the cache item quickly by filename and format. * nested map to find the cache item quickly by filename and format.
*/ */
typedef std::map<string, CacheItem> FormatCacheType; typedef std::map<string, CacheItem> FormatCacheType;
typedef std::map<string, FormatCacheType> CacheType; typedef std::map<FileName, FormatCacheType> CacheType;
class ConverterCache::Impl { class ConverterCache::Impl {
@ -94,7 +94,7 @@ public:
/// ///
void writeIndex(); void writeIndex();
/// ///
CacheItem * find(string const & from, string const & format); CacheItem * find(FileName const & from, string const & format);
CacheType cache; CacheType cache;
}; };
@ -102,8 +102,8 @@ public:
void ConverterCache::Impl::readIndex() void ConverterCache::Impl::readIndex()
{ {
time_t const now = current_time(); time_t const now = current_time();
string const index = addName(cache_dir, "index"); FileName const index(addName(cache_dir.absFilename(), "index"));
std::ifstream is(index.c_str()); std::ifstream is(index.toFilesystemEncoding().c_str());
while (is.good()) { while (is.good()) {
string orig_from; string orig_from;
string to_format; string to_format;
@ -111,7 +111,8 @@ void ConverterCache::Impl::readIndex()
unsigned long checksum; unsigned long checksum;
if (!(is >> orig_from >> to_format >> timestamp >> checksum)) if (!(is >> orig_from >> to_format >> timestamp >> checksum))
return; return;
CacheItem item(orig_from, to_format, timestamp, checksum); FileName const orig_from_name(orig_from);
CacheItem item(orig_from_name, to_format, timestamp, checksum);
// Don't cache files that do not exist anymore // Don't cache files that do not exist anymore
if (!fs::exists(orig_from)) { if (!fs::exists(orig_from)) {
@ -123,7 +124,7 @@ void ConverterCache::Impl::readIndex()
} }
// Delete the cached file if it is too old // Delete the cached file if it is too old
if (difftime(now, fs::last_write_time(item.cache_name)) > if (difftime(now, fs::last_write_time(item.cache_name.toFilesystemEncoding())) >
lyxrc.converter_cache_maxage) { lyxrc.converter_cache_maxage) {
lyxerr[Debug::FILES] << "Not caching file `" lyxerr[Debug::FILES] << "Not caching file `"
<< orig_from << "' (too old)." << std::endl; << orig_from << "' (too old)." << std::endl;
@ -131,7 +132,7 @@ void ConverterCache::Impl::readIndex()
continue; continue;
} }
cache[orig_from][to_format] = item; cache[orig_from_name][to_format] = item;
} }
is.close(); is.close();
} }
@ -139,12 +140,12 @@ void ConverterCache::Impl::readIndex()
void ConverterCache::Impl::writeIndex() void ConverterCache::Impl::writeIndex()
{ {
string const index = addName(cache_dir, "index"); FileName const index(addName(cache_dir.absFilename(), "index"));
std::ofstream os(index.c_str()); std::ofstream os(index.toFilesystemEncoding().c_str());
os.close(); os.close();
if (!lyx::support::chmod(index.c_str(), 0600)) if (!lyx::support::chmod(index, 0600))
return; return;
os.open(index.c_str()); os.open(index.toFilesystemEncoding().c_str());
CacheType::iterator it1 = cache.begin(); CacheType::iterator it1 = cache.begin();
CacheType::iterator const end1 = cache.end(); CacheType::iterator const end1 = cache.end();
for (; it1 != end1; ++it1) { for (; it1 != end1; ++it1) {
@ -159,7 +160,7 @@ void ConverterCache::Impl::writeIndex()
} }
CacheItem * ConverterCache::Impl::find(string const & from, CacheItem * ConverterCache::Impl::find(FileName const & from,
string const & format) string const & format)
{ {
if (!lyxrc.use_converter_cache) if (!lyxrc.use_converter_cache)
@ -188,8 +189,8 @@ void ConverterCache::init()
return; return;
// We do this here and not in the constructor because package() gets // We do this here and not in the constructor because package() gets
// initialized after all static variables. // initialized after all static variables.
cache_dir = addName(support::package().user_support(), "cache"); cache_dir = FileName(addName(support::package().user_support(), "cache"));
if (!fs::exists(cache_dir)) if (!fs::exists(cache_dir.toFilesystemEncoding()))
if (support::mkdir(cache_dir, 0700) != 0) { if (support::mkdir(cache_dir, 0700) != 0) {
lyxerr << "Could not create cache directory `" lyxerr << "Could not create cache directory `"
<< cache_dir << "'." << std::endl; << cache_dir << "'." << std::endl;
@ -212,21 +213,19 @@ ConverterCache::~ConverterCache()
} }
void ConverterCache::add(string const & orig_from, string const & to_format, void ConverterCache::add(FileName const & orig_from, string const & to_format,
string const & converted_file) const FileName const & converted_file) const
{ {
if (!lyxrc.use_converter_cache) if (!lyxrc.use_converter_cache)
return; return;
lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from
<< ' ' << to_format << ' ' << converted_file << ' ' << to_format << ' ' << converted_file
<< std::endl; << std::endl;
BOOST_ASSERT(absolutePath(orig_from));
BOOST_ASSERT(absolutePath(converted_file));
// Is the file in the cache already? // Is the file in the cache already?
CacheItem * item = pimpl_->find(orig_from, to_format); CacheItem * item = pimpl_->find(orig_from, to_format);
time_t const timestamp = fs::last_write_time(orig_from); time_t const timestamp = fs::last_write_time(orig_from.toFilesystemEncoding());
Mover const & mover = movers(to_format); Mover const & mover = movers(to_format);
if (item) { if (item) {
lyxerr[Debug::FILES] << "ConverterCache::add(" << orig_from << "):\n" lyxerr[Debug::FILES] << "ConverterCache::add(" << orig_from << "):\n"
@ -267,14 +266,13 @@ void ConverterCache::add(string const & orig_from, string const & to_format,
} }
void ConverterCache::remove(string const & orig_from, void ConverterCache::remove(FileName const & orig_from,
string const & to_format) const string const & to_format) const
{ {
if (!lyxrc.use_converter_cache) if (!lyxrc.use_converter_cache)
return; return;
lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from
<< ' ' << to_format << std::endl; << ' ' << to_format << std::endl;
BOOST_ASSERT(absolutePath(orig_from));
CacheType::iterator const it1 = pimpl_->cache.find(orig_from); CacheType::iterator const it1 = pimpl_->cache.find(orig_from);
if (it1 == pimpl_->cache.end()) if (it1 == pimpl_->cache.end())
@ -289,21 +287,20 @@ void ConverterCache::remove(string const & orig_from,
} }
bool ConverterCache::inCache(string const & orig_from, bool ConverterCache::inCache(FileName const & orig_from,
string const & to_format) const string const & to_format) const
{ {
if (!lyxrc.use_converter_cache) if (!lyxrc.use_converter_cache)
return false; return false;
lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from
<< ' ' << to_format << std::endl; << ' ' << to_format << std::endl;
BOOST_ASSERT(absolutePath(orig_from));
CacheItem * const item = pimpl_->find(orig_from, to_format); CacheItem * const item = pimpl_->find(orig_from, to_format);
if (!item) { if (!item) {
lyxerr[Debug::FILES] << "not in cache." << std::endl; lyxerr[Debug::FILES] << "not in cache." << std::endl;
return false; return false;
} }
time_t const timestamp = fs::last_write_time(orig_from); time_t const timestamp = fs::last_write_time(orig_from.toFilesystemEncoding());
if (item->timestamp == timestamp) { if (item->timestamp == timestamp) {
lyxerr[Debug::FILES] << "identical timestamp." << std::endl; lyxerr[Debug::FILES] << "identical timestamp." << std::endl;
return true; return true;
@ -318,12 +315,11 @@ bool ConverterCache::inCache(string const & orig_from,
} }
string const ConverterCache::cacheName(string const & orig_from, FileName const & ConverterCache::cacheName(FileName const & orig_from,
string const & to_format) const string const & to_format) const
{ {
lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from
<< ' ' << to_format << std::endl; << ' ' << to_format << std::endl;
BOOST_ASSERT(absolutePath(orig_from));
CacheItem * const item = pimpl_->find(orig_from, to_format); CacheItem * const item = pimpl_->find(orig_from, to_format);
BOOST_ASSERT(item); BOOST_ASSERT(item);
@ -331,15 +327,13 @@ string const ConverterCache::cacheName(string const & orig_from,
} }
bool ConverterCache::copy(string const & orig_from, string const & to_format, bool ConverterCache::copy(FileName const & orig_from, string const & to_format,
string const & dest) const FileName const & dest) const
{ {
if (!lyxrc.use_converter_cache) if (!lyxrc.use_converter_cache)
return false; return false;
lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from lyxerr[Debug::FILES] << BOOST_CURRENT_FUNCTION << ' ' << orig_from
<< ' ' << to_format << ' ' << dest << std::endl; << ' ' << to_format << ' ' << dest << std::endl;
BOOST_ASSERT(absolutePath(orig_from));
BOOST_ASSERT(absolutePath(dest));
CacheItem * const item = pimpl_->find(orig_from, to_format); CacheItem * const item = pimpl_->find(orig_from, to_format);
BOOST_ASSERT(item); BOOST_ASSERT(item);

View File

@ -29,6 +29,8 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
/** /**
* Cache for converted files. The cache works as follows: * Cache for converted files. The cache works as follows:
* *
@ -60,27 +62,27 @@ public:
* Add \c converted_file (\c orig_from converted to \c to_format) to * Add \c converted_file (\c orig_from converted to \c to_format) to
* the cache if it is not already in or not up to date. * the cache if it is not already in or not up to date.
*/ */
void add(std::string const & orig_from, std::string const & to_format, void add(support::FileName const & orig_from, std::string const & to_format,
std::string const & converted_file) const; support::FileName const & converted_file) const;
/// Remove a file from the cache. /// Remove a file from the cache.
void remove(std::string const & orig_from, void remove(support::FileName const & orig_from,
std::string const & to_format) const; std::string const & to_format) const;
/** /**
* Returns \c true if \c orig_from converted to \c to_format is in * Returns \c true if \c orig_from converted to \c to_format is in
* the cache and up to date. * the cache and up to date.
*/ */
bool inCache(std::string const & orig_from, bool inCache(support::FileName const & orig_from,
std::string const & to_format) const; std::string const & to_format) const;
/// Get the name of the cached file /// Get the name of the cached file
std::string const cacheName(std::string const & orig_from, support::FileName const & cacheName(support::FileName const & orig_from,
std::string const & to_format) const; std::string const & to_format) const;
/// Copy the file from the cache to \p dest /// Copy the file from the cache to \p dest
bool copy(std::string const & orig_from, std::string const & to_format, bool copy(support::FileName const & orig_from, std::string const & to_format,
std::string const & dest) const; support::FileName const & dest) const;
private: private:
/** Make the c-tor, d-tor private so we can control how many objects /** Make the c-tor, d-tor private so we can control how many objects

View File

@ -32,6 +32,7 @@ namespace lyx {
using std::time; using std::time;
#endif #endif
using support::FileName;
using support::ltrim; using support::ltrim;
using support::makeAbsPath; using support::makeAbsPath;
using support::onlyFilename; using support::onlyFilename;
@ -52,10 +53,8 @@ bool DepTable::dep_info::changed() const
} }
void DepTable::insert(string const & fi, bool upd) void DepTable::insert(FileName const & f, bool upd)
{ {
// not quite sure if this is the correct place for MakeAbsPath
string const f = makeAbsPath(fi);
if (deplist.find(f) == deplist.end()) { if (deplist.find(f) == deplist.end()) {
dep_info di; dep_info di;
di.crc_prev = 0; di.crc_prev = 0;
@ -64,7 +63,7 @@ void DepTable::insert(string const & fi, bool upd)
di.crc_cur = sum(f); di.crc_cur = sum(f);
lyxerr[Debug::DEPEND] << "done." << endl; lyxerr[Debug::DEPEND] << "done." << endl;
struct stat f_info; struct stat f_info;
stat(fi.c_str(), &f_info); stat(f.toFilesystemEncoding().c_str(), &f_info);
di.mtime_cur = f_info.st_mtime; di.mtime_cur = f_info.st_mtime;
} else { } else {
di.crc_cur = 0; di.crc_cur = 0;
@ -87,7 +86,7 @@ void DepTable::update()
dep_info &di = itr->second; dep_info &di = itr->second;
struct stat f_info; struct stat f_info;
if (stat(itr->first.c_str(), &f_info) == 0) { if (stat(itr->first.toFilesystemEncoding().c_str(), &f_info) == 0) {
if (di.mtime_cur == f_info.st_mtime) { if (di.mtime_cur == f_info.st_mtime) {
di.crc_prev = di.crc_cur; di.crc_prev = di.crc_cur;
lyxerr[Debug::DEPEND] << itr->first << " same mtime" << endl; lyxerr[Debug::DEPEND] << itr->first << " same mtime" << endl;
@ -132,10 +131,8 @@ bool DepTable::sumchange() const
} }
bool DepTable::haschanged(string const & f) const bool DepTable::haschanged(FileName const & fil) const
{ {
// not quite sure if this is the correct place for MakeAbsPath
string const fil = makeAbsPath(f);
DepList::const_iterator cit = deplist.find(fil); DepList::const_iterator cit = deplist.find(fil);
if (cit != deplist.end()) { if (cit != deplist.end()) {
if (cit->second.changed()) if (cit->second.changed())
@ -150,7 +147,7 @@ bool DepTable::extchanged(string const & ext) const
DepList::const_iterator cit = deplist.begin(); DepList::const_iterator cit = deplist.begin();
DepList::const_iterator end = deplist.end(); DepList::const_iterator end = deplist.end();
for (; cit != end; ++cit) { for (; cit != end; ++cit) {
if (suffixIs(cit->first, ext)) { if (suffixIs(cit->first.absFilename(), ext)) {
if (cit->second.changed()) if (cit->second.changed())
return true; return true;
} }
@ -164,7 +161,7 @@ bool DepTable::ext_exist(string const & ext) const
DepList::const_iterator cit = deplist.begin(); DepList::const_iterator cit = deplist.begin();
DepList::const_iterator end = deplist.end(); DepList::const_iterator end = deplist.end();
for (; cit != end; ++cit) { for (; cit != end; ++cit) {
if (suffixIs(cit->first, ext)) { if (suffixIs(cit->first.absFilename(), ext)) {
return true; return true;
} }
} }
@ -172,7 +169,7 @@ bool DepTable::ext_exist(string const & ext) const
} }
bool DepTable::exist(string const & fil) const bool DepTable::exist(FileName const & fil) const
{ {
return deplist.find(fil) != deplist.end(); return deplist.find(fil) != deplist.end();
} }
@ -183,7 +180,7 @@ void DepTable::remove_files_with_extension(string const & suf)
DepList::iterator cit = deplist.begin(); DepList::iterator cit = deplist.begin();
DepList::iterator end = deplist.end(); DepList::iterator end = deplist.end();
while (cit != end) { while (cit != end) {
if (suffixIs(cit->first, suf)) { if (suffixIs(cit->first.absFilename(), suf)) {
// Can't erase the current iterator, but we // Can't erase the current iterator, but we
// can increment and then erase. // can increment and then erase.
// Deplist is a map so only the erased // Deplist is a map so only the erased
@ -197,12 +194,12 @@ void DepTable::remove_files_with_extension(string const & suf)
} }
void DepTable::remove_file(string const & filename) void DepTable::remove_file(FileName const & filename)
{ {
DepList::iterator cit = deplist.begin(); DepList::iterator cit = deplist.begin();
DepList::iterator end = deplist.end(); DepList::iterator end = deplist.end();
while (cit != end) { while (cit != end) {
if (onlyFilename(cit->first) == filename) { if (cit->first == filename) {
// Can't erase the current iterator, but we // Can't erase the current iterator, but we
// can increment and then erase. // can increment and then erase.
// deplist is a map so only the erased // deplist is a map so only the erased
@ -216,9 +213,9 @@ void DepTable::remove_file(string const & filename)
} }
void DepTable::write(string const & f) const void DepTable::write(FileName const & f) const
{ {
ofstream ofs(f.c_str()); ofstream ofs(f.toFilesystemEncoding().c_str());
DepList::const_iterator cit = deplist.begin(); DepList::const_iterator cit = deplist.begin();
DepList::const_iterator end = deplist.end(); DepList::const_iterator end = deplist.end();
for (; cit != end; ++cit) { for (; cit != end; ++cit) {
@ -238,9 +235,9 @@ void DepTable::write(string const & f) const
} }
bool DepTable::read(string const & f) bool DepTable::read(FileName const & f)
{ {
ifstream ifs(f.c_str()); ifstream ifs(f.toFilesystemEncoding().c_str());
string nome; string nome;
dep_info di; dep_info di;
// This doesn't change through the loop. // This doesn't change through the loop.
@ -254,7 +251,7 @@ bool DepTable::read(string const & f)
<< di.mtime_cur << ' ' << di.mtime_cur << ' '
<< nome << endl; << nome << endl;
} }
deplist[nome] = di; deplist[FileName(nome)] = di;
} }
return deplist.size(); return deplist.size();
} }

View File

@ -13,6 +13,8 @@
#ifndef DEP_TABLE_H #ifndef DEP_TABLE_H
#define DEP_TABLE_H #define DEP_TABLE_H
#include "support/filename.h"
#include <map> #include <map>
#include <string> #include <string>
@ -25,28 +27,28 @@ public:
/** This one is a little bit harder since we need the absolute /** This one is a little bit harder since we need the absolute
filename. Should we insert files with .sty .cls etc as filename. Should we insert files with .sty .cls etc as
extension? */ extension? */
void insert(std::string const & f, bool upd = false); void insert(support::FileName const & f, bool upd = false);
/// ///
void update(); void update();
/// ///
void write(std::string const & f) const; void write(support::FileName const & f) const;
/// returns true if dep file was read successfully /// returns true if dep file was read successfully
bool read(std::string const & f); bool read(support::FileName const & f);
/// returns true if any of the files has changed /// returns true if any of the files has changed
bool sumchange() const; bool sumchange() const;
/// return true if fil has changed. /// return true if fil has changed.
bool haschanged(std::string const & fil) const; bool haschanged(support::FileName const & fil) const;
/// return true if a file with extension ext has changed. /// return true if a file with extension ext has changed.
bool extchanged(std::string const & ext) const; bool extchanged(std::string const & ext) const;
/// ///
bool exist(std::string const & fil) const; bool exist(support::FileName const & fil) const;
/// returns true if any files with ext exist /// returns true if any files with ext exist
bool ext_exist(std::string const & ext) const; bool ext_exist(std::string const & ext) const;
/// ///
void remove_files_with_extension(std::string const &); void remove_files_with_extension(std::string const &);
/// ///
void remove_file(std::string const &); void remove_file(support::FileName const &);
private: private:
/// ///
class dep_info { class dep_info {
@ -61,7 +63,7 @@ private:
bool changed() const; bool changed() const;
}; };
/// ///
typedef std::map<std::string, dep_info> DepList; typedef std::map<support::FileName, dep_info> DepList;
/// ///
DepList deplist; DepList deplist;
}; };

View File

@ -40,8 +40,10 @@ using support::absolutePath;
using support::bformat; using support::bformat;
using support::changeExtension; using support::changeExtension;
using support::contains; using support::contains;
using support::FileName;
using support::findtexfile; using support::findtexfile;
using support::getcwd; using support::getcwd;
using support::makeAbsPath;
using support::onlyFilename; using support::onlyFilename;
using support::prefixIs; using support::prefixIs;
using support::quoteName; using support::quoteName;
@ -127,11 +129,11 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp,
: cmd(latex), file(f), path(p), runparams(rp) : cmd(latex), file(f), path(p), runparams(rp)
{ {
num_errors = 0; num_errors = 0;
depfile = file + ".dep";
if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ? if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ?
depfile += "-pdf"; depfile = FileName(makeAbsPath(file + ".dep-pdf"));
output_file = changeExtension(file,".pdf"); output_file = changeExtension(file,".pdf");
} else { } else {
depfile = FileName(makeAbsPath(file + ".dep"));
output_file = changeExtension(file,".dvi"); output_file = changeExtension(file,".dvi");
} }
} }
@ -148,22 +150,20 @@ void LaTeX::deleteFilesOnError() const
// but the reason for the error might be in a generated file... // but the reason for the error might be in a generated file...
string const ofname = onlyFilename(file);
// bibtex file // bibtex file
string const bbl = changeExtension(ofname, ".bbl"); FileName const bbl(makeAbsPath(changeExtension(file, ".bbl")));
unlink(bbl); unlink(bbl);
// makeindex file // makeindex file
string const ind = changeExtension(ofname, ".ind"); FileName const ind(makeAbsPath(changeExtension(file, ".ind")));
unlink(ind); unlink(ind);
// nomencl file // nomencl file
string const nls = changeExtension(ofname, ".nls"); FileName const nls(makeAbsPath(changeExtension(file, ".nls")));
unlink(nls); unlink(nls);
// Also remove the aux file // Also remove the aux file
string const aux = changeExtension(ofname, ".aux"); FileName const aux(makeAbsPath(changeExtension(file, ".aux")));
unlink(aux); unlink(aux);
} }
@ -203,7 +203,7 @@ int LaTeX::run(TeXErrors & terr)
// remake the dependency file. // remake the dependency file.
// //
bool had_depfile = fs::exists(depfile); bool had_depfile = fs::exists(depfile.toFilesystemEncoding());
bool run_bibtex = false; bool run_bibtex = false;
string aux_file = onlyFilename(changeExtension(file, "aux")); string aux_file = onlyFilename(changeExtension(file, "aux"));
@ -281,13 +281,13 @@ int LaTeX::run(TeXErrors & terr)
&& fs::is_empty(changeExtension(file, ".idx")); && fs::is_empty(changeExtension(file, ".idx"));
// run makeindex // run makeindex
if (head.haschanged(onlyFilename(changeExtension(file, ".idx")))) { if (head.haschanged(FileName(makeAbsPath(onlyFilename(changeExtension(file, ".idx")))))) {
// no checks for now // no checks for now
lyxerr[Debug::LATEX] << "Running MakeIndex." << endl; lyxerr[Debug::LATEX] << "Running MakeIndex." << endl;
message(_("Running MakeIndex.")); message(_("Running MakeIndex."));
rerun |= runMakeIndex(onlyFilename(changeExtension(file, ".idx")), runparams); rerun |= runMakeIndex(onlyFilename(changeExtension(file, ".idx")), runparams);
} }
if (head.haschanged(onlyFilename(changeExtension(file, ".nlo")))) { if (head.haschanged(FileName(makeAbsPath(onlyFilename(changeExtension(file, ".nlo")))))) {
lyxerr[Debug::LATEX] << "Running MakeIndex for nomencl." << endl; lyxerr[Debug::LATEX] << "Running MakeIndex for nomencl." << endl;
message(_("Running MakeIndex for nomencl.")); message(_("Running MakeIndex for nomencl."));
string const nomenclstr = " -s nomencl.ist -o " + changeExtension(file, ".nls"); string const nomenclstr = " -s nomencl.ist -o " + changeExtension(file, ".nls");
@ -355,7 +355,7 @@ int LaTeX::run(TeXErrors & terr)
// more after this. // more after this.
// run makeindex if the <file>.idx has changed or was generated. // run makeindex if the <file>.idx has changed or was generated.
if (head.haschanged(onlyFilename(changeExtension(file, ".idx")))) { if (head.haschanged(FileName(makeAbsPath(onlyFilename(changeExtension(file, ".idx")))))) {
// no checks for now // no checks for now
lyxerr[Debug::LATEX] << "Running MakeIndex." << endl; lyxerr[Debug::LATEX] << "Running MakeIndex." << endl;
message(_("Running MakeIndex.")); message(_("Running MakeIndex."));
@ -363,7 +363,7 @@ int LaTeX::run(TeXErrors & terr)
} }
// I am not pretty sure if need this twice. // I am not pretty sure if need this twice.
if (head.haschanged(onlyFilename(changeExtension(file, ".nlo")))) { if (head.haschanged(FileName(makeAbsPath(onlyFilename(changeExtension(file, ".nlo")))))) {
lyxerr[Debug::LATEX] << "Running MakeIndex for nomencl." << endl; lyxerr[Debug::LATEX] << "Running MakeIndex for nomencl." << endl;
message(_("Running MakeIndex for nomencl.")); message(_("Running MakeIndex for nomencl."));
string nomenclstr = " -s nomencl.ist -o " + changeExtension(file, ".nls"); string nomenclstr = " -s nomencl.ist -o " + changeExtension(file, ".nls");
@ -525,14 +525,14 @@ void LaTeX::updateBibtexDependencies(DepTable & dep,
it2 != it->databases.end(); ++it2) { it2 != it->databases.end(); ++it2) {
string file = findtexfile(*it2, "bib"); string file = findtexfile(*it2, "bib");
if (!file.empty()) if (!file.empty())
dep.insert(file, true); dep.insert(FileName(makeAbsPath(file)), true);
} }
for (set<string>::const_iterator it2 = it->styles.begin(); for (set<string>::const_iterator it2 = it->styles.begin();
it2 != it->styles.end(); ++it2) { it2 != it->styles.end(); ++it2) {
string file = findtexfile(*it2, "bst"); string file = findtexfile(*it2, "bst");
if (!file.empty()) if (!file.empty())
dep.insert(file, true); dep.insert(FileName(makeAbsPath(file)), true);
} }
} }
} }
@ -728,7 +728,7 @@ void handleFoundFile(string const & ff, DepTable & head)
// since this file cannot be a file generated by // since this file cannot be a file generated by
// the latex run. // the latex run.
if (fs::exists(foundfile) && !fs::is_directory(foundfile)) if (fs::exists(foundfile) && !fs::is_directory(foundfile))
head.insert(foundfile, true); head.insert(FileName(makeAbsPath(foundfile)), true);
return; return;
} }
@ -753,13 +753,13 @@ void handleFoundFile(string const & ff, DepTable & head)
<< "Tmpdir TeX file: " << "Tmpdir TeX file: "
<< onlyfile << onlyfile
<< endl; << endl;
head.insert(onlyfile, true); head.insert(FileName(makeAbsPath(onlyfile)), true);
} else { } else {
lyxerr[Debug::DEPEND] lyxerr[Debug::DEPEND]
<< "In tmpdir file:" << "In tmpdir file:"
<< onlyfile << onlyfile
<< endl; << endl;
head.insert(onlyfile); head.insert(FileName(makeAbsPath(onlyfile)));
} }
} else } else
lyxerr[Debug::DEPEND] lyxerr[Debug::DEPEND]
@ -843,7 +843,7 @@ void LaTeX::deplog(DepTable & head)
} }
// Make sure that the main .tex file is in the dependancy file. // Make sure that the main .tex file is in the dependancy file.
head.insert(onlyFilename(file), true); head.insert(FileName(makeAbsPath(onlyFilename(file))), true);
} }

View File

@ -17,6 +17,7 @@
#include "outputparams.h" #include "outputparams.h"
#include "support/docstring.h" #include "support/docstring.h"
#include "support/filename.h"
#include <boost/utility.hpp> #include <boost/utility.hpp>
#include <boost/signal.hpp> #include <boost/signal.hpp>
@ -155,7 +156,7 @@ private:
int startscript(); int startscript();
/// The dependency file. /// The dependency file.
std::string depfile; support::FileName depfile;
/// ///
void deplog(DepTable & head); void deplog(DepTable & head);

View File

@ -30,7 +30,6 @@
#include "support/docstream.h" #include "support/docstream.h"
#include "support/filetools.h" #include "support/filetools.h"
#include <sstream>
namespace lyx { namespace lyx {
@ -77,7 +76,7 @@ void LaTeXFeatures::require(string const & name)
void LaTeXFeatures::getAvailable() void LaTeXFeatures::getAvailable()
{ {
LyXLex lex(0, 0); LyXLex lex(0, 0);
string real_file = libFileSearch("", "packages.lst"); support::FileName const real_file = libFileSearch("", "packages.lst");
if (real_file.empty()) if (real_file.empty())
return; return;

View File

@ -238,11 +238,11 @@ string const ToolbarBackend::getIcon(FuncRequest const & f)
if (!f.argument().empty()) if (!f.argument().empty())
xpm_name = subst(name + ' ' + to_utf8(f.argument()), ' ', '_'); xpm_name = subst(name + ' ' + to_utf8(f.argument()), ' ', '_');
fullname = libFileSearch("images", xpm_name, "xpm"); fullname = libFileSearch("images", xpm_name, "xpm").absFilename();
if (fullname.empty()) { if (fullname.empty()) {
// try without the argument // try without the argument
fullname = libFileSearch("images", name, "xpm"); fullname = libFileSearch("images", name, "xpm").absFilename();
} }
} }
@ -255,7 +255,7 @@ string const ToolbarBackend::getIcon(FuncRequest const & f)
lyxerr[Debug::GUI] << "Cannot find icon for command \"" lyxerr[Debug::GUI] << "Cannot find icon for command \""
<< lyxaction.getActionName(f.action) << lyxaction.getActionName(f.action)
<< '(' << to_utf8(f.argument()) << ")\"" << endl; << '(' << to_utf8(f.argument()) << ")\"" << endl;
return libFileSearch("images", "unknown", "xpm"); return libFileSearch("images", "unknown", "xpm").absFilename();
} }

View File

@ -101,6 +101,7 @@ using support::changeExtension;
using support::cmd_ret; using support::cmd_ret;
using support::createBufferTmpDir; using support::createBufferTmpDir;
using support::destroyDir; using support::destroyDir;
using support::FileName;
using support::getFormatFromContents; using support::getFormatFromContents;
using support::isDirWriteable; using support::isDirWriteable;
using support::libFileSearch; using support::libFileSearch;
@ -571,7 +572,8 @@ void Buffer::insertStringAsLines(ParagraphList & pars,
bool Buffer::readFile(string const & filename) bool Buffer::readFile(string const & filename)
{ {
// Check if the file is compressed. // Check if the file is compressed.
string const format = getFormatFromContents(filename); FileName const name(makeAbsPath(filename));
string const format = getFormatFromContents(name);
if (format == "gzip" || format == "zip" || format == "compress") { if (format == "gzip" || format == "zip" || format == "compress") {
params().compressed = true; params().compressed = true;
} }
@ -579,7 +581,7 @@ bool Buffer::readFile(string const & filename)
// remove dummy empty par // remove dummy empty par
paragraphs().clear(); paragraphs().clear();
LyXLex lex(0, 0); LyXLex lex(0, 0);
lex.setFile(filename); lex.setFile(name);
if (!readFile(lex, filename)) if (!readFile(lex, filename))
return false; return false;
@ -655,7 +657,7 @@ bool Buffer::readFile(LyXLex & lex, string const & filename)
from_utf8(filename))); from_utf8(filename)));
return false; return false;
} }
string const lyx2lyx = libFileSearch("lyx2lyx", "lyx2lyx"); FileName const lyx2lyx = libFileSearch("lyx2lyx", "lyx2lyx");
if (lyx2lyx.empty()) { if (lyx2lyx.empty()) {
Alert::error(_("Conversion script not found"), Alert::error(_("Conversion script not found"),
bformat(_("%1$s is from an earlier" bformat(_("%1$s is from an earlier"
@ -666,7 +668,7 @@ bool Buffer::readFile(LyXLex & lex, string const & filename)
return false; return false;
} }
ostringstream command; ostringstream command;
command << os::python() << ' ' << quoteName(lyx2lyx) command << os::python() << ' ' << quoteName(lyx2lyx.toFilesystemEncoding())
<< " -t " << convert<string>(LYX_FORMAT) << " -t " << convert<string>(LYX_FORMAT)
<< " -o " << quoteName(tmpfile) << ' ' << " -o " << quoteName(tmpfile) << ' '
<< quoteName(filename); << quoteName(filename);
@ -745,7 +747,7 @@ bool Buffer::save() const
} else { } else {
// Saving failed, so backup is not backup // Saving failed, so backup is not backup
if (lyxrc.make_backup) if (lyxrc.make_backup)
rename(s, fileName()); rename(FileName(s), FileName(fileName()));
return false; return false;
} }
return true; return true;

View File

@ -53,7 +53,9 @@ namespace lyx {
using namespace std; using namespace std;
using support::bformat; using support::bformat;
using support::FileName;
using support::libFileSearch; using support::libFileSearch;
using support::makeAbsPath;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::onlyFilename; using support::onlyFilename;
using support::onlyPath; using support::onlyPath;
@ -127,7 +129,7 @@ bool readFile(Buffer * const b, string const & s)
return b->readFile(a); return b->readFile(a);
case 1: case 1:
// Here we delete the autosave // Here we delete the autosave
unlink(a); unlink(FileName(makeAbsPath(a)));
break; break;
default: default:
return false; return false;
@ -185,7 +187,7 @@ Buffer * newFile(string const & filename, string const & templatename,
string tname; string tname;
// use defaults.lyx as a default template if it exists. // use defaults.lyx as a default template if it exists.
if (templatename.empty()) if (templatename.empty())
tname = libFileSearch("templates", "defaults.lyx"); tname = libFileSearch("templates", "defaults.lyx").absFilename();
else else
tname = templatename; tname = templatename;

View File

@ -51,8 +51,8 @@ bool CharacterSet::loadFile(string const & fname)
// open definition file // open definition file
lyxerr[Debug::KBMAP] lyxerr[Debug::KBMAP]
<< "Reading character set file " << fname << ".cdef" << endl; << "Reading character set file " << fname << ".cdef" << endl;
string const filename = libFileSearch("kbd", fname, "cdef"); support::FileName const filename = libFileSearch("kbd", fname, "cdef");
ifstream ifs(filename.c_str()); ifstream ifs(filename.toFilesystemEncoding().c_str());
if (!ifs) { if (!ifs) {
lyxerr << "Unable to open character set file" << endl; lyxerr << "Unable to open character set file" << endl;
return true; // no definition, use 7-bit ascii return true; // no definition, use 7-bit ascii

View File

@ -34,13 +34,13 @@
namespace lyx { namespace lyx {
using support::absolutePath;
using support::addName; using support::addName;
using support::bformat; using support::bformat;
using support::changeExtension; using support::changeExtension;
using support::compare_ascii_no_case; using support::compare_ascii_no_case;
using support::contains; using support::contains;
using support::dirList; using support::dirList;
using support::FileName;
using support::getExtension; using support::getExtension;
using support::isFileReadable; using support::isFileReadable;
using support::libFileSearch; using support::libFileSearch;
@ -287,15 +287,11 @@ OutputParams::FLAVOR Converters::getFlavor(Graph::EdgePath const & path)
bool Converters::convert(Buffer const * buffer, bool Converters::convert(Buffer const * buffer,
string const & from_file, string const & to_file, FileName const & from_file, FileName const & to_file,
string const & orig_from, FileName const & orig_from,
string const & from_format, string const & to_format, string const & from_format, string const & to_format,
ErrorList & errorList, int conversionflags) ErrorList & errorList, int conversionflags)
{ {
BOOST_ASSERT(absolutePath(from_file));
BOOST_ASSERT(absolutePath(to_file));
BOOST_ASSERT(absolutePath(orig_from));
if (from_format == to_format) if (from_format == to_format)
return move(from_format, from_file, to_file, false); return move(from_format, from_file, to_file, false);
@ -309,16 +305,16 @@ bool Converters::convert(Buffer const * buffer,
// if no special converter defined, then we take the // if no special converter defined, then we take the
// default one from ImageMagic. // default one from ImageMagic.
string const from_ext = from_format.empty() ? string const from_ext = from_format.empty() ?
getExtension(from_file) : getExtension(from_file.absFilename()) :
formats.extension(from_format); formats.extension(from_format);
string const to_ext = formats.extension(to_format); string const to_ext = formats.extension(to_format);
string const command = string const command =
support::os::python() + ' ' + support::os::python() + ' ' +
quoteName(libFileSearch("scripts", "convertDefault.py")) + quoteName(libFileSearch("scripts", "convertDefault.py").toFilesystemEncoding()) +
' ' + ' ' +
quoteName(from_ext + ':' + from_file) + quoteName(from_ext + ':' + from_file.toFilesystemEncoding()) +
' ' + ' ' +
quoteName(to_ext + ':' + to_file); quoteName(to_ext + ':' + to_file.toFilesystemEncoding());
lyxerr[Debug::FILES] lyxerr[Debug::FILES]
<< "No converter defined! " << "No converter defined! "
"I use convertDefault.py:\n\t" "I use convertDefault.py:\n\t"
@ -347,17 +343,17 @@ bool Converters::convert(Buffer const * buffer,
// This has the added benefit that all other files that may be // This has the added benefit that all other files that may be
// generated by the converter are deleted when LyX closes and do not // generated by the converter are deleted when LyX closes and do not
// clutter the real working directory. // clutter the real working directory.
string path = onlyPath(from_file); string path = onlyPath(from_file.absFilename());
Path p(path); Path p(path);
// empty the error list before any new conversion takes place. // empty the error list before any new conversion takes place.
errorList.clear(); errorList.clear();
bool run_latex = false; bool run_latex = false;
string from_base = changeExtension(from_file, ""); string from_base = changeExtension(from_file.absFilename(), "");
string to_base = changeExtension(to_file, ""); string to_base = changeExtension(to_file.absFilename(), "");
string infile; FileName infile;
string outfile = from_file; FileName outfile = from_file;
for (Graph::EdgePath::const_iterator cit = edgepath.begin(); for (Graph::EdgePath::const_iterator cit = edgepath.begin();
cit != edgepath.end(); ++cit) { cit != edgepath.end(); ++cit) {
Converter const & conv = converterlist_[*cit]; Converter const & conv = converterlist_[*cit];
@ -366,19 +362,19 @@ bool Converters::convert(Buffer const * buffer,
lyxerr[Debug::FILES] << "Converting from " lyxerr[Debug::FILES] << "Converting from "
<< conv.from << " to " << conv.to << endl; << conv.from << " to " << conv.to << endl;
infile = outfile; infile = outfile;
outfile = conv.result_dir.empty() outfile = FileName(conv.result_dir.empty()
? changeExtension(from_file, conv.To->extension()) ? changeExtension(from_file.absFilename(), conv.To->extension())
: addName(subst(conv.result_dir, : addName(subst(conv.result_dir,
token_base, from_base), token_base, from_base),
subst(conv.result_file, subst(conv.result_file,
token_base, onlyFilename(from_base))); token_base, onlyFilename(from_base))));
// if input and output files are equal, we use a // if input and output files are equal, we use a
// temporary file as intermediary (JMarc) // temporary file as intermediary (JMarc)
string real_outfile; FileName real_outfile;
if (outfile == infile) { if (outfile == infile) {
real_outfile = infile; real_outfile = infile;
outfile = addName(buffer->temppath(), "tmpfile.out"); outfile = FileName(addName(buffer->temppath(), "tmpfile.out"));
} }
if (conv.latex) { if (conv.latex) {
@ -397,9 +393,9 @@ bool Converters::convert(Buffer const * buffer,
} }
string const infile2 = (conv.original_dir) string const infile2 = (conv.original_dir)
? infile : makeRelPath(infile, path); ? infile.absFilename() : makeRelPath(infile.absFilename(), path);
string const outfile2 = (conv.original_dir) string const outfile2 = (conv.original_dir)
? outfile : makeRelPath(outfile, path); ? outfile.absFilename() : makeRelPath(outfile.absFilename(), path);
string command = conv.command; string command = conv.command;
command = subst(command, token_from, quoteName(infile2)); command = subst(command, token_from, quoteName(infile2));
@ -486,7 +482,7 @@ bool Converters::convert(Buffer const * buffer,
string const to = subst(conv.result_dir, string const to = subst(conv.result_dir,
token_base, to_base); token_base, to_base);
Mover const & mover = movers(conv.from); Mover const & mover = movers(conv.from);
if (!mover.rename(from, to)) { if (!mover.rename(FileName(from), FileName(to))) {
Alert::error(_("Cannot convert file"), Alert::error(_("Cannot convert file"),
bformat(_("Could not move a temporary directory from %1$s to %2$s."), bformat(_("Could not move a temporary directory from %1$s to %2$s."),
from_ascii(from), from_ascii(to))); from_ascii(from), from_ascii(to)));
@ -503,18 +499,18 @@ bool Converters::convert(Buffer const * buffer,
bool Converters::move(string const & fmt, bool Converters::move(string const & fmt,
string const & from, string const & to, bool copy) FileName const & from, FileName const & to, bool copy)
{ {
if (from == to) if (from == to)
return true; return true;
bool no_errors = true; bool no_errors = true;
string const path = onlyPath(from); string const path = onlyPath(from.absFilename());
string const base = onlyFilename(changeExtension(from, "")); string const base = onlyFilename(changeExtension(from.absFilename(), string()));
string const to_base = changeExtension(to, ""); string const to_base = changeExtension(to.absFilename(), string());
string const to_extension = getExtension(to); string const to_extension = getExtension(to.absFilename());
vector<string> files = dirList(onlyPath(from), getExtension(from)); vector<string> files = dirList(onlyPath(from.absFilename()), getExtension(from.absFilename()));
for (vector<string>::const_iterator it = files.begin(); for (vector<string>::const_iterator it = files.begin();
it != files.end(); ++it) it != files.end(); ++it)
if (prefixIs(*it, base)) { if (prefixIs(*it, base)) {
@ -526,8 +522,8 @@ bool Converters::move(string const & fmt,
Mover const & mover = movers(fmt); Mover const & mover = movers(fmt);
bool const moved = copy bool const moved = copy
? mover.copy(from2, to2) ? mover.copy(FileName(from2), FileName(to2))
: mover.rename(from2, to2); : mover.rename(FileName(from2), FileName(to2));
if (!moved && no_errors) { if (!moved && no_errors) {
Alert::error(_("Cannot convert file"), Alert::error(_("Cannot convert file"),
bformat(copy ? bformat(copy ?

View File

@ -21,6 +21,7 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
class Buffer; class Buffer;
class ErrorList; class ErrorList;
@ -118,8 +119,8 @@ public:
}; };
/// ///
bool convert(Buffer const * buffer, bool convert(Buffer const * buffer,
std::string const & from_file, std::string const & to_file, support::FileName const & from_file, support::FileName const & to_file,
std::string const & orig_from, support::FileName const & orig_from,
std::string const & from_format, std::string const & to_format, std::string const & from_format, std::string const & to_format,
ErrorList & errorList, int conversionflags = none); ErrorList & errorList, int conversionflags = none);
/// ///
@ -154,7 +155,7 @@ private:
/// If \p from = /path/file.ext and \p to = /path2/file2.ext2 then /// If \p from = /path/file.ext and \p to = /path2/file2.ext2 then
/// this method moves each /path/file*.ext file to /path2/file2*.ext2 /// this method moves each /path/file*.ext file to /path2/file2*.ext2
bool move(std::string const & fmt, bool move(std::string const & fmt,
std::string const & from, std::string const & to, support::FileName const & from, support::FileName const & to,
bool copy); bool copy);
/// ///
Graph G_; Graph G_;

View File

@ -18,6 +18,8 @@
#include "lyxlex.h" #include "lyxlex.h"
#include "lyxrc.h" #include "lyxrc.h"
#include "support/filename.h"
namespace lyx { namespace lyx {
@ -267,7 +269,7 @@ Encodings::Encodings()
{ {
} }
void Encodings::read(string const & filename) void Encodings::read(support::FileName const & filename)
{ {
enum Encodingtags { enum Encodingtags {
et_encoding = 1, et_encoding = 1,

View File

@ -20,6 +20,8 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
/// ///
class Encoding { class Encoding {
public: public:
@ -53,7 +55,7 @@ public:
/// ///
Encodings(); Encodings();
/// ///
void read(std::string const & filename); void read(support::FileName const & filename);
/// Get encoding from LyX name \p name /// Get encoding from LyX name \p name
Encoding const * getFromLyXName(std::string const & name) const; Encoding const * getFromLyXName(std::string const & name) const;
/// Get encoding from LaTeX name \p name /// Get encoding from LaTeX name \p name

View File

@ -43,6 +43,7 @@ using support::addName;
using support::bformat; using support::bformat;
using support::changeExtension; using support::changeExtension;
using support::contains; using support::contains;
using support::FileName;
using support::makeAbsPath; using support::makeAbsPath;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::onlyFilename; using support::onlyFilename;
@ -106,7 +107,7 @@ enum CopyStatus {
* - CANCEL if the export should be cancelled * - CANCEL if the export should be cancelled
*/ */
CopyStatus copyFile(string const & format, CopyStatus copyFile(string const & format,
string const & sourceFile, string const & destFile, FileName const & sourceFile, FileName const & destFile,
string const & latexFile, bool force) string const & latexFile, bool force)
{ {
CopyStatus ret = force ? FORCE : SUCCESS; CopyStatus ret = force ? FORCE : SUCCESS;
@ -115,11 +116,11 @@ CopyStatus copyFile(string const & format,
// overwrite themselves. This check could be changed to // overwrite themselves. This check could be changed to
// boost::filesystem::equivalent(sourceFile, destFile) if export to // boost::filesystem::equivalent(sourceFile, destFile) if export to
// other directories than the document directory is desired. // other directories than the document directory is desired.
if (!prefixIs(onlyPath(sourceFile), package().temp_dir())) if (!prefixIs(onlyPath(sourceFile.absFilename()), package().temp_dir()))
return ret; return ret;
if (!force) { if (!force) {
switch(checkOverwrite(destFile)) { switch(checkOverwrite(destFile.absFilename())) {
case 0: case 0:
ret = SUCCESS; ret = SUCCESS;
break; break;
@ -135,8 +136,8 @@ CopyStatus copyFile(string const & format,
if (!mover.copy(sourceFile, destFile, latexFile)) if (!mover.copy(sourceFile, destFile, latexFile))
Alert::error(_("Couldn't copy file"), Alert::error(_("Couldn't copy file"),
bformat(_("Copying %1$s to %2$s failed."), bformat(_("Copying %1$s to %2$s failed."),
makeDisplayPath(sourceFile), makeDisplayPath(sourceFile.absFilename()),
makeDisplayPath(destFile))); makeDisplayPath(destFile.absFilename())));
return ret; return ret;
} }
@ -219,8 +220,8 @@ bool Exporter::Export(Buffer * buffer, string const & format,
string const error_type = (format == "program")? "Build" : bufferFormat(*buffer); string const error_type = (format == "program")? "Build" : bufferFormat(*buffer);
string const ext = formats.extension(format); string const ext = formats.extension(format);
string const tmp_result_file = changeExtension(filename, ext); string const tmp_result_file = changeExtension(filename, ext);
bool const success = converters.convert(buffer, filename, bool const success = converters.convert(buffer, FileName(filename),
tmp_result_file, buffer->fileName(), backend_format, format, FileName(tmp_result_file), FileName(buffer->fileName()), backend_format, format,
buffer->errorList(error_type)); buffer->errorList(error_type));
// Emit the signal to show the error list. // Emit the signal to show the error list.
buffer->errors(error_type); buffer->errors(error_type);
@ -242,15 +243,15 @@ bool Exporter::Export(Buffer * buffer, string const & format,
string const fmt = string const fmt =
formats.getFormatFromFile(it->sourceName); formats.getFormatFromFile(it->sourceName);
status = copyFile(fmt, it->sourceName, status = copyFile(fmt, it->sourceName,
makeAbsPath(it->exportName, dest), FileName(makeAbsPath(it->exportName, dest)),
it->exportName, status == FORCE); it->exportName, status == FORCE);
} }
if (status == CANCEL) { if (status == CANCEL) {
buffer->message(_("Document export cancelled.")); buffer->message(_("Document export cancelled."));
} else if (fs::exists(tmp_result_file)) { } else if (fs::exists(tmp_result_file)) {
// Finally copy the main file // Finally copy the main file
status = copyFile(format, tmp_result_file, status = copyFile(format, FileName(tmp_result_file),
result_file, result_file, FileName(result_file), result_file,
status == FORCE); status == FORCE);
buffer->message(bformat(_("Document exported as %1$s " buffer->message(bformat(_("Document exported as %1$s "
"to file `%2$s'"), "to file `%2$s'"),
@ -280,7 +281,7 @@ bool Exporter::preview(Buffer * buffer, string const & format)
string result_file; string result_file;
if (!Export(buffer, format, true, result_file)) if (!Export(buffer, format, true, result_file))
return false; return false;
return formats.view(*buffer, result_file, format); return formats.view(*buffer, FileName(result_file), format);
} }
@ -311,7 +312,7 @@ Exporter::getExportableFormats(Buffer const & buffer, bool only_viewable)
} }
ExportedFile::ExportedFile(string const & s, string const & e) : ExportedFile::ExportedFile(FileName const & s, string const & e) :
sourceName(s), exportName(e) {} sourceName(s), exportName(e) {}
@ -324,11 +325,9 @@ bool operator==(ExportedFile const & f1, ExportedFile const & f2)
void ExportData::addExternalFile(string const & format, void ExportData::addExternalFile(string const & format,
string const & sourceName, FileName const & sourceName,
string const & exportName) string const & exportName)
{ {
BOOST_ASSERT(support::absolutePath(sourceName));
// Make sure that we have every file only once, otherwise copyFile() // Make sure that we have every file only once, otherwise copyFile()
// would ask several times if it should overwrite a file. // would ask several times if it should overwrite a file.
vector<ExportedFile> & files = externalfiles[format]; vector<ExportedFile> & files = externalfiles[format];
@ -339,9 +338,9 @@ void ExportData::addExternalFile(string const & format,
void ExportData::addExternalFile(string const & format, void ExportData::addExternalFile(string const & format,
string const & sourceName) FileName const & sourceName)
{ {
addExternalFile(format, sourceName, onlyFilename(sourceName)); addExternalFile(format, sourceName, onlyFilename(sourceName.absFilename()));
} }

View File

@ -13,6 +13,8 @@
#ifndef EXPORTER_H #ifndef EXPORTER_H
#define EXPORTER_H #define EXPORTER_H
#include "support/filename.h"
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
@ -50,9 +52,9 @@ public:
class ExportedFile { class ExportedFile {
public: public:
ExportedFile(std::string const &, std::string const &); ExportedFile(support::FileName const &, std::string const &);
/// absolute name of the source file /// absolute name of the source file
std::string sourceName; support::FileName sourceName;
/// final name that the exported file should get (absolute name or /// final name that the exported file should get (absolute name or
/// relative to the directory of the master document) /// relative to the directory of the master document)
std::string exportName; std::string exportName;
@ -76,7 +78,7 @@ public:
* or relative to the exported document. * or relative to the exported document.
*/ */
void addExternalFile(std::string const & format, void addExternalFile(std::string const & format,
std::string const & sourceName, support::FileName const & sourceName,
std::string const & exportName); std::string const & exportName);
/** add a referenced file for one format. /** add a referenced file for one format.
* The final name is the source file name without path. * The final name is the source file name without path.
@ -84,7 +86,7 @@ public:
* \param sourceName source file name. Needs to be absolute * \param sourceName source file name. Needs to be absolute
*/ */
void addExternalFile(std::string const & format, void addExternalFile(std::string const & format,
std::string const & sourceName); support::FileName const & sourceName);
/// get referenced files for \p format /// get referenced files for \p format
std::vector<ExportedFile> const std::vector<ExportedFile> const
externalFiles(std::string const & format) const; externalFiles(std::string const & format) const;

View File

@ -35,6 +35,7 @@ using support::absolutePath;
using support::bformat; using support::bformat;
using support::compare_ascii_no_case; using support::compare_ascii_no_case;
using support::contains; using support::contains;
using support::FileName;
using support::libScriptSearch; using support::libScriptSearch;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::onlyPath; using support::onlyPath;
@ -136,7 +137,7 @@ Format const * Formats::getFormat(string const & name) const
} }
string Formats::getFormatFromFile(string const & filename) const string Formats::getFormatFromFile(FileName const & filename) const
{ {
if (filename.empty()) if (filename.empty())
return string(); return string();
@ -146,7 +147,7 @@ string Formats::getFormatFromFile(string const & filename) const
return format; return format;
// try to find a format from the file extension. // try to find a format from the file extension.
string const ext(support::getExtension(filename)); string const ext(support::getExtension(filename.absFilename()));
if (!ext.empty()) { if (!ext.empty()) {
// this is ambigous if two formats have the same extension, // this is ambigous if two formats have the same extension,
// but better than nothing // but better than nothing
@ -261,14 +262,13 @@ void Formats::setViewer(string const & name, string const & command)
} }
bool Formats::view(Buffer const & buffer, string const & filename, bool Formats::view(Buffer const & buffer, FileName const & filename,
string const & format_name) const string const & format_name) const
{ {
BOOST_ASSERT(absolutePath(filename)); if (filename.empty() || !fs::exists(filename.toFilesystemEncoding())) {
if (filename.empty() || !fs::exists(filename)) {
Alert::error(_("Cannot view file"), Alert::error(_("Cannot view file"),
bformat(_("File does not exist: %1$s"), bformat(_("File does not exist: %1$s"),
from_utf8(filename))); from_utf8(filename.absFilename())));
return false; return false;
} }
@ -286,12 +286,12 @@ bool Formats::view(Buffer const & buffer, string const & filename,
} }
// viewer is 'auto' // viewer is 'auto'
if (format->viewer() == "auto") { if (format->viewer() == "auto") {
if (os::autoOpenFile(filename, os::VIEW)) if (os::autoOpenFile(filename.absFilename(), os::VIEW))
return true; return true;
else { else {
Alert::error(_("Cannot view file"), Alert::error(_("Cannot view file"),
bformat(_("Auto-view file %1$s failed"), bformat(_("Auto-view file %1$s failed"),
from_utf8(filename))); from_utf8(filename.absFilename())));
return false; return false;
} }
} }
@ -312,10 +312,11 @@ bool Formats::view(Buffer const & buffer, string const & filename,
if (!contains(command, token_from)) if (!contains(command, token_from))
command += ' ' + token_from; command += ' ' + token_from;
command = subst(command, token_from, quoteName(filename)); command = subst(command, token_from, quoteName(filename.toFilesystemEncoding()));
command = subst(command, token_path, quoteName(onlyPath(filename))); command = subst(command, token_path, quoteName(onlyPath(filename.toFilesystemEncoding())));
command = subst(command, token_socket, quoteName(theLyXServerSocket().address())); command = subst(command, token_socket, quoteName(theLyXServerSocket().address()));
lyxerr[Debug::FILES] << "Executing command: " << command << std::endl; lyxerr[Debug::FILES] << "Executing command: " << command << std::endl;
// FIXME UNICODE utf8 can be wrong for files
buffer.message(_("Executing command: ") + from_utf8(command)); buffer.message(_("Executing command: ") + from_utf8(command));
Systemcall one; Systemcall one;
@ -331,14 +332,13 @@ bool Formats::view(Buffer const & buffer, string const & filename,
} }
bool Formats::edit(Buffer const & buffer, string const & filename, bool Formats::edit(Buffer const & buffer, FileName const & filename,
string const & format_name) const string const & format_name) const
{ {
BOOST_ASSERT(absolutePath(filename)); if (filename.empty() || !fs::exists(filename.toFilesystemEncoding())) {
if (filename.empty() || !fs::exists(filename)) {
Alert::error(_("Cannot edit file"), Alert::error(_("Cannot edit file"),
bformat(_("File does not exist: %1$s"), bformat(_("File does not exist: %1$s"),
from_utf8(filename))); from_utf8(filename.absFilename())));
return false; return false;
} }
@ -356,12 +356,12 @@ bool Formats::edit(Buffer const & buffer, string const & filename,
} }
// editor is 'auto' // editor is 'auto'
if (format->editor() == "auto") { if (format->editor() == "auto") {
if (os::autoOpenFile(filename, os::EDIT)) if (os::autoOpenFile(filename.absFilename(), os::EDIT))
return true; return true;
else { else {
Alert::error(_("Cannot edit file"), Alert::error(_("Cannot edit file"),
bformat(_("Auto-edit file %1$s failed"), bformat(_("Auto-edit file %1$s failed"),
from_utf8(filename))); from_utf8(filename.absFilename())));
return false; return false;
} }
} }
@ -371,10 +371,11 @@ bool Formats::edit(Buffer const & buffer, string const & filename,
if (!contains(command, token_from)) if (!contains(command, token_from))
command += ' ' + token_from; command += ' ' + token_from;
command = subst(command, token_from, quoteName(filename)); command = subst(command, token_from, quoteName(filename.toFilesystemEncoding()));
command = subst(command, token_path, quoteName(onlyPath(filename))); command = subst(command, token_path, quoteName(onlyPath(filename.toFilesystemEncoding())));
command = subst(command, token_socket, quoteName(theLyXServerSocket().address())); command = subst(command, token_socket, quoteName(theLyXServerSocket().address()));
lyxerr[Debug::FILES] << "Executing command: " << command << std::endl; lyxerr[Debug::FILES] << "Executing command: " << command << std::endl;
// FIXME UNICODE utf8 can be wrong for files
buffer.message(_("Executing command: ") + from_utf8(command)); buffer.message(_("Executing command: ") + from_utf8(command));
Systemcall one; Systemcall one;

View File

@ -15,11 +15,12 @@
#include "support/docstring.h" #include "support/docstring.h"
#include <vector> #include <vector>
#include <string>
namespace lyx { namespace lyx {
namespace support { class FileName; }
class Buffer; class Buffer;
class Format { class Format {
@ -131,7 +132,7 @@ public:
* \returns file format if it could be found, otherwise an empty * \returns file format if it could be found, otherwise an empty
* string. * string.
*/ */
std::string getFormatFromFile(std::string const & filename) const; std::string getFormatFromFile(support::FileName const & filename) const;
/// Set editor and/or viewer to "auto" for formats that can be /// Set editor and/or viewer to "auto" for formats that can be
/// opened by the OS. /// opened by the OS.
void setAutoOpen(); void setAutoOpen();
@ -151,10 +152,10 @@ public:
/// ///
void setViewer(std::string const & name, std::string const & command); void setViewer(std::string const & name, std::string const & command);
/// ///
bool view(Buffer const & buffer, std::string const & filename, bool view(Buffer const & buffer, support::FileName const & filename,
std::string const & format_name) const; std::string const & format_name) const;
/// ///
bool edit(Buffer const & buffer, std::string const & filename, bool edit(Buffer const & buffer, support::FileName const & filename,
std::string const & format_name) const; std::string const & format_name) const;
/// ///
docstring const prettyName(std::string const & name) const; docstring const prettyName(std::string const & name) const;

View File

@ -28,6 +28,7 @@ using std::string;
namespace lyx { namespace lyx {
using support::FileName;
using support::fileSearch; using support::fileSearch;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::package; using support::package;
@ -42,12 +43,12 @@ ControlAboutlyx::ControlAboutlyx(Dialog & parent)
void ControlAboutlyx::getCredits(ostream & ss) const void ControlAboutlyx::getCredits(ostream & ss) const
{ {
string const name = fileSearch(package().system_support(), "CREDITS"); FileName const name = fileSearch(package().system_support(), "CREDITS");
bool found(!name.empty()); bool found(!name.empty());
if (found) { if (found) {
std::ifstream in(name.c_str()); std::ifstream in(name.toFilesystemEncoding().c_str());
ss << in.rdbuf(); ss << in.rdbuf();
found = ss.good(); found = ss.good();

View File

@ -38,6 +38,7 @@ using std::string;
namespace lyx { namespace lyx {
using support::FileFilterList; using support::FileFilterList;
using support::FileName;
using support::makeAbsPath; using support::makeAbsPath;
using support::readBB_from_PSFile; using support::readBB_from_PSFile;
@ -174,8 +175,7 @@ docstring const ControlExternal::browse(docstring const & input,
string const ControlExternal::readBB(string const & file) string const ControlExternal::readBB(string const & file)
{ {
string const abs_file = FileName const abs_file(makeAbsPath(file, kernel().bufferFilepath()));
makeAbsPath(file, kernel().bufferFilepath());
// try to get it from the file, if possible. Zipped files are // try to get it from the file, if possible. Zipped files are
// unzipped in the readBB_from_PSFile-Function // unzipped in the readBB_from_PSFile-Function

View File

@ -44,6 +44,7 @@ namespace lyx {
using support::addName; using support::addName;
using support::FileFilterList; using support::FileFilterList;
using support::FileName;
using support::isFileReadable; using support::isFileReadable;
using support::makeAbsPath; using support::makeAbsPath;
using support::package; using support::package;
@ -102,8 +103,7 @@ docstring const ControlGraphics::browse(docstring const & in_name) const
string const ControlGraphics::readBB(string const & file) string const ControlGraphics::readBB(string const & file)
{ {
string const abs_file = FileName const abs_file(makeAbsPath(file, kernel().bufferFilepath()));
makeAbsPath(file, kernel().bufferFilepath());
// try to get it from the file, if possible. Zipped files are // try to get it from the file, if possible. Zipped files are
// unzipped in the readBB_from_PSFile-Function // unzipped in the readBB_from_PSFile-Function
@ -132,7 +132,7 @@ string const ControlGraphics::readBB(string const & file)
bool ControlGraphics::isFilenameValid(string const & fname) const bool ControlGraphics::isFilenameValid(string const & fname) const
{ {
// It may be that the filename is relative. // It may be that the filename is relative.
string const name = makeAbsPath(fname, kernel().bufferFilepath()); FileName const name(makeAbsPath(fname, kernel().bufferFilepath()));
return isFileReadable(name); return isFileReadable(name);
} }

View File

@ -35,6 +35,7 @@ using std::string;
namespace lyx { namespace lyx {
using support::FileFilterList; using support::FileFilterList;
using support::FileName;
using support::isFileReadable; using support::isFileReadable;
using support::makeAbsPath; using support::makeAbsPath;
using support::onlyPath; using support::onlyPath;
@ -104,7 +105,7 @@ void ControlInclude::load(string const & file)
kernel().dispatch(FuncRequest(LFUN_BUFFER_CHILD_OPEN, file)); kernel().dispatch(FuncRequest(LFUN_BUFFER_CHILD_OPEN, file));
else else
// tex file or other text file in verbatim mode // tex file or other text file in verbatim mode
formats.edit(kernel().buffer(), file, "text"); formats.edit(kernel().buffer(), FileName(file), "text");
} }
@ -114,7 +115,7 @@ bool ControlInclude::fileExists(string const & file)
= makeAbsPath(file, = makeAbsPath(file,
onlyPath(kernel().buffer().fileName())); onlyPath(kernel().buffer().fileName()));
if (isFileReadable(fileWithAbsPath)) if (isFileReadable(FileName(fileWithAbsPath)))
return true; return true;
return false; return false;

View File

@ -385,7 +385,7 @@ string const find_xpm(string const & name)
<< "Looking for math XPM called \"" << "Looking for math XPM called \""
<< xpm_name << '"' << std::endl; << xpm_name << '"' << std::endl;
return libFileSearch("images/math/", xpm_name, "xpm"); return libFileSearch("images/math/", xpm_name, "xpm").absFilename();
} }
} // namespace frontend } // namespace frontend

View File

@ -11,12 +11,14 @@
#include <config.h> #include <config.h>
#include "ControlShowFile.h" #include "ControlShowFile.h"
#include "support/filetools.h" #include "support/filetools.h"
using std::string; using std::string;
namespace lyx { namespace lyx {
using support::FileName;
using support::onlyFilename; using support::onlyFilename;
namespace frontend { namespace frontend {
@ -29,7 +31,7 @@ ControlShowFile::ControlShowFile(Dialog & parent)
bool ControlShowFile::initialiseParams(string const & data) bool ControlShowFile::initialiseParams(string const & data)
{ {
filename_ = data; filename_ = FileName(data);
return true; return true;
} }
@ -48,7 +50,7 @@ string ControlShowFile::getFileContents()
string ControlShowFile::getFileName() string ControlShowFile::getFileName()
{ {
return onlyFilename(filename_); return onlyFilename(filename_.absFilename());
} }
} // namespace frontend } // namespace frontend

View File

@ -14,6 +14,8 @@
#include "Dialog.h" #include "Dialog.h"
#include "support/filename.h"
namespace lyx { namespace lyx {
namespace frontend { namespace frontend {
@ -38,7 +40,7 @@ public:
private: private:
/// ///
std::string filename_; support::FileName filename_;
}; };
} // namespace frontend } // namespace frontend

View File

@ -109,7 +109,7 @@ docstring const browseLibFile(docstring const & dir,
lyx::from_utf8(addName(package().user_support(), lyx::to_utf8(dir)))); lyx::from_utf8(addName(package().user_support(), lyx::to_utf8(dir))));
docstring const result = browseFile(lyx::from_utf8( docstring const result = browseFile(lyx::from_utf8(
libFileSearch(lyx::to_utf8(dir), lyx::to_utf8(name), lyx::to_utf8(ext))), libFileSearch(to_utf8(dir), to_utf8(name), to_utf8(ext)).absFilename()),
title, filters, false, dir1, dir2); title, filters, false, dir1, dir2);
// remove the extension if it is the default one // remove the extension if it is the default one
@ -121,7 +121,7 @@ docstring const browseLibFile(docstring const & dir,
// remove the directory, if it is the default one // remove the directory, if it is the default one
docstring const file = lyx::from_utf8(onlyFilename(lyx::to_utf8(noextresult))); docstring const file = lyx::from_utf8(onlyFilename(lyx::to_utf8(noextresult)));
if (lyx::from_utf8(libFileSearch(lyx::to_utf8(dir), lyx::to_utf8(file), lyx::to_utf8(ext))) == result) if (from_utf8(libFileSearch(to_utf8(dir), to_utf8(file), to_utf8(ext)).absFilename()) == result)
return file; return file;
else else
return noextresult; return noextresult;

View File

@ -35,6 +35,7 @@ namespace lyx {
using support::bformat; using support::bformat;
using support::contains; using support::contains;
using support::FileName;
using support::getExtension; using support::getExtension;
using support::getFileContents; using support::getFileContents;
using support::getVectorFromString; using support::getVectorFromString;
@ -53,16 +54,16 @@ void rescanTexStyles()
{ {
// Run rescan in user lyx directory // Run rescan in user lyx directory
Path p(package().user_support()); Path p(package().user_support());
string const command = libFileSearch("scripts", "TeXFiles.py"); FileName const command = libFileSearch("scripts", "TeXFiles.py");
Systemcall one; Systemcall one;
int const status = one.startscript(Systemcall::Wait, int const status = one.startscript(Systemcall::Wait,
lyx::support::os::python() + ' ' + lyx::support::os::python() + ' ' +
quoteName(command)); quoteName(command.toFilesystemEncoding()));
if (status == 0) if (status == 0)
return; return;
// FIXME UNICODE // FIXME UNICODE
Alert::error(_("Could not update TeX information"), Alert::error(_("Could not update TeX information"),
bformat(_("The script `%s' failed."), lyx::from_utf8(command))); bformat(_("The script `%s' failed."), lyx::from_utf8(command.absFilename())));
} }
@ -80,7 +81,7 @@ void texhash()
void getTexFileList(string const & filename, std::vector<string> & list) void getTexFileList(string const & filename, std::vector<string> & list)
{ {
list.clear(); list.clear();
string const file = libFileSearch("", filename); FileName const file = libFileSearch("", filename);
if (file.empty()) if (file.empty())
return; return;
@ -138,8 +139,12 @@ string const getTexFileFromList(string const & file,
lstfile = "bstFiles.lst"; lstfile = "bstFiles.lst";
else if (type == "bib") else if (type == "bib")
lstfile = "bibFiles.lst"; lstfile = "bibFiles.lst";
string const allClasses = getFileContents(libFileSearch(string(), FileName const abslstfile = libFileSearch(string(), lstfile);
lstfile)); if (abslstfile.empty()) {
lyxerr << "File `'" << lstfile << "' not found." << endl;
return string();
}
string const allClasses = getFileContents(abslstfile);
int entries = 0; int entries = 0;
string classfile = token(allClasses, '\n', entries); string classfile = token(allClasses, '\n', entries);
int count = 0; int count = 0;

View File

@ -69,7 +69,7 @@ void BulletsModule::setupPanel(QListWidget * lw, QString panelname, std::string
bulletpaneCO->addItem(panelname); bulletpaneCO->addItem(panelname);
// get pixmap with bullets // get pixmap with bullets
QPixmap pixmap = QPixmap(toqstr(libFileSearch("images", fname, "xpm"))); QPixmap pixmap = QPixmap(toqstr(libFileSearch("images", fname, "xpm").absFilename()));
int const w = pixmap.width() / 6; int const w = pixmap.width() / 6;
int const h = pixmap.height() / 6; int const h = pixmap.height() / 6;

View File

@ -58,10 +58,10 @@ using std::endl;
using std::string; using std::string;
using std::vector; using std::vector;
using lyx::support::onlyFilename;
namespace lyx { namespace lyx {
using support::FileName;
using support::onlyFilename;
using support::subst; using support::subst;
using support::libFileSearch; using support::libFileSearch;
@ -118,9 +118,9 @@ GuiView::GuiView(int id)
#ifndef Q_WS_MACX #ifndef Q_WS_MACX
// assign an icon to main form. We do not do it under Qt/Mac, // assign an icon to main form. We do not do it under Qt/Mac,
// since the icon is provided in the application bundle. // since the icon is provided in the application bundle.
string const iconname = libFileSearch("images", "lyx", "xpm"); FileName const iconname = libFileSearch("images", "lyx", "xpm");
if (!iconname.empty()) if (!iconname.empty())
setWindowIcon(QPixmap(toqstr(iconname))); setWindowIcon(QPixmap(toqstr(iconname.absFilename())));
#endif #endif
} }

View File

@ -61,6 +61,8 @@ namespace os = lyx::support::os;
namespace lyx { namespace lyx {
using support::FileName;
/// return the LyX key state from Qt's /// return the LyX key state from Qt's
static key_modifier::state q_key_state(Qt::KeyboardModifiers state) static key_modifier::state q_key_state(Qt::KeyboardModifiers state)
{ {
@ -470,11 +472,11 @@ void GuiWorkArea::doGreyOut(QLPainter & pain)
lyxerr[Debug::GUI] << "show banner: " << lyxrc.show_banner << endl; lyxerr[Debug::GUI] << "show banner: " << lyxrc.show_banner << endl;
/// The text to be written on top of the pixmap /// The text to be written on top of the pixmap
QString const text = lyx_version ? QString(lyx_version) : qt_("unknown version"); QString const text = lyx_version ? QString(lyx_version) : qt_("unknown version");
string const file = support::libFileSearch("images", "banner", "ppm"); FileName const file = support::libFileSearch("images", "banner", "ppm");
if (file.empty()) if (file.empty())
return; return;
QPixmap pm(toqstr(file)); QPixmap pm(toqstr(file.absFilename()));
if (!pm) { if (!pm) {
lyxerr << "could not load splash screen: '" << file << "'" << endl; lyxerr << "could not load splash screen: '" << file << "'" << endl;
return; return;

View File

@ -78,8 +78,8 @@ QCommandBuffer::QCommandBuffer(GuiView * view, ControlCommandBuffer & control,
QWidget * parent) QWidget * parent)
: QWidget(parent), view_(view), controller_(control) : QWidget(parent), view_(view), controller_(control)
{ {
QPixmap qpup(toqstr(libFileSearch("images", "up", "xpm"))); QPixmap qpup(toqstr(libFileSearch("images", "up", "xpm").absFilename()));
QPixmap qpdown(toqstr(libFileSearch("images", "down", "xpm"))); QPixmap qpdown(toqstr(libFileSearch("images", "down", "xpm").absFilename()));
QVBoxLayout * top = new QVBoxLayout(this); QVBoxLayout * top = new QVBoxLayout(this);
QHBoxLayout * layout = new QHBoxLayout(0); QHBoxLayout * layout = new QHBoxLayout(0);

View File

@ -19,6 +19,7 @@
#include "graphics/GraphicsParams.h" #include "graphics/GraphicsParams.h"
#include "support/filename.h"
#include "support/lstrings.h" // lowercase #include "support/lstrings.h" // lowercase
#include <QPainter> #include <QPainter>
@ -152,7 +153,7 @@ unsigned int QLImage::getHeight_impl() const
} }
void QLImage::load_impl(string const & filename) void QLImage::load_impl(support::FileName const & filename)
{ {
if (!original_.isNull()) { if (!original_.isNull()) {
lyxerr[Debug::GRAPHICS] lyxerr[Debug::GRAPHICS]
@ -161,7 +162,7 @@ void QLImage::load_impl(string const & filename)
return; return;
} }
if (!original_.load(toqstr(filename))) { if (!original_.load(toqstr(filename.absFilename()))) {
lyxerr[Debug::GRAPHICS] lyxerr[Debug::GRAPHICS]
<< "Unable to open image" << endl; << "Unable to open image" << endl;
finishedLoading(false); finishedLoading(false);

View File

@ -51,7 +51,7 @@ private:
* The process is asynchronous, so this method starts the loading. * The process is asynchronous, so this method starts the loading.
* When finished, the Image::finishedLoading signal is emitted. * When finished, the Image::finishedLoading signal is emitted.
*/ */
virtual void load_impl(std::string const & filename); virtual void load_impl(support::FileName const & filename);
/** /**
* Finishes the process of modifying transformed_, using * Finishes the process of modifying transformed_, using
* \c params to decide on color, grayscale etc. * \c params to decide on color, grayscale etc.

View File

@ -29,9 +29,11 @@
using std::string; using std::string;
using lyx::support::libFileSearch;
namespace lyx { namespace lyx {
using support::FileName;
using support::libFileSearch;
namespace frontend { namespace frontend {
@ -70,26 +72,26 @@ QMathDialog::QMathDialog(QMath * form)
connect( equationPB, SIGNAL( clicked() ), this, SLOT( equationClicked() ) ); connect( equationPB, SIGNAL( clicked() ), this, SLOT( equationClicked() ) );
connect( symbolsCO, SIGNAL(activated(int)), this, SLOT(showingPanel(int))); connect( symbolsCO, SIGNAL(activated(int)), this, SLOT(showingPanel(int)));
string icon_path = libFileSearch("images/math", "sqrt-square", "xpm"); FileName icon_path = libFileSearch("images/math", "sqrt-square", "xpm");
sqrtPB->setIcon(QIcon(toqstr(icon_path))); sqrtPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "space", "xpm"); icon_path = libFileSearch("images/math", "space", "xpm");
spacePB->setIcon(QIcon(toqstr(icon_path))); spacePB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "style", "xpm"); icon_path = libFileSearch("images/math", "style", "xpm");
stylePB->setIcon(QIcon(toqstr(icon_path))); stylePB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "font", "xpm"); icon_path = libFileSearch("images/math", "font", "xpm");
fontPB->setIcon(QIcon(toqstr(icon_path))); fontPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "equation", "xpm"); icon_path = libFileSearch("images/math", "equation", "xpm");
equationPB->setIcon(QIcon(toqstr(icon_path))); equationPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "frac-square", "xpm"); icon_path = libFileSearch("images/math", "frac-square", "xpm");
fracPB->setIcon(QIcon(toqstr(icon_path))); fracPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "sub", "xpm"); icon_path = libFileSearch("images/math", "sub", "xpm");
subscriptPB->setIcon(QIcon(toqstr(icon_path))); subscriptPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "super", "xpm"); icon_path = libFileSearch("images/math", "super", "xpm");
superscriptPB->setIcon(QIcon(toqstr(icon_path))); superscriptPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "matrix", "xpm"); icon_path = libFileSearch("images/math", "matrix", "xpm");
matrixPB->setIcon(QIcon(toqstr(icon_path))); matrixPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
icon_path = libFileSearch("images/math", "delim", "xpm"); icon_path = libFileSearch("images/math", "delim", "xpm");
delimitersPB->setIcon(QIcon(toqstr(icon_path))); delimitersPB->setIcon(QIcon(toqstr(icon_path.absFilename())));
// function list // function list
for (int i = 0; *function_names[i]; ++i) { for (int i = 0; *function_names[i]; ++i) {

View File

@ -17,22 +17,24 @@
#include "debug.h" #include "debug.h"
#include "support/filename.h"
#include "support/filetools.h" #include "support/filetools.h"
#include <map> #include <map>
namespace support = lyx::support;
using std::string; using std::string;
namespace lyx { namespace lyx {
using support::FileName;
namespace graphics { namespace graphics {
/** The cache contains one item per file, so use a map to find the /** The cache contains one item per file, so use a map to find the
* cache item quickly by filename. * cache item quickly by filename.
*/ */
typedef std::map<string, Cache::ItemPtr> CacheType; typedef std::map<FileName, Cache::ItemPtr> CacheType;
class Cache::Impl { class Cache::Impl {
public: public:
@ -64,15 +66,8 @@ std::vector<string> Cache::loadableFormats() const
} }
void Cache::add(string const & file) const void Cache::add(FileName const & file) const
{ {
if (!support::absolutePath(file)) {
lyxerr << "Cache::add(" << file << "):\n"
<< "The file must be have an absolute path."
<< std::endl;
return;
}
// Is the file in the cache already? // Is the file in the cache already?
if (inCache(file)) { if (inCache(file)) {
lyxerr[Debug::GRAPHICS] << "Cache::add(" << file << "):\n" lyxerr[Debug::GRAPHICS] << "Cache::add(" << file << "):\n"
@ -85,7 +80,7 @@ void Cache::add(string const & file) const
} }
void Cache::remove(string const & file) const void Cache::remove(FileName const & file) const
{ {
CacheType::iterator it = pimpl_->cache.find(file); CacheType::iterator it = pimpl_->cache.find(file);
if (it == pimpl_->cache.end()) if (it == pimpl_->cache.end())
@ -101,13 +96,13 @@ void Cache::remove(string const & file) const
} }
bool Cache::inCache(string const & file) const bool Cache::inCache(FileName const & file) const
{ {
return pimpl_->cache.find(file) != pimpl_->cache.end(); return pimpl_->cache.find(file) != pimpl_->cache.end();
} }
Cache::ItemPtr const Cache::item(string const & file) const Cache::ItemPtr const Cache::item(FileName const & file) const
{ {
CacheType::const_iterator it = pimpl_->cache.find(file); CacheType::const_iterator it = pimpl_->cache.find(file);
if (it == pimpl_->cache.end()) if (it == pimpl_->cache.end())

View File

@ -29,6 +29,9 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
namespace graphics { namespace graphics {
class CacheItem; class CacheItem;
@ -46,13 +49,13 @@ public:
std::vector<std::string> loadableFormats() const; std::vector<std::string> loadableFormats() const;
/// Add a graphics file to the cache. /// Add a graphics file to the cache.
void add(std::string const & file) const; void add(support::FileName const & file) const;
/// Remove a file from the cache. /// Remove a file from the cache.
void remove(std::string const & file) const; void remove(support::FileName const & file) const;
/// Returns \c true if the file is in the cache. /// Returns \c true if the file is in the cache.
bool inCache(std::string const & file) const; bool inCache(support::FileName const & file) const;
/** Get the cache item associated with file. /** Get the cache item associated with file.
* Returns an empty container if there is no such item. * Returns an empty container if there is no such item.
@ -66,7 +69,7 @@ public:
*/ */
typedef boost::shared_ptr<CacheItem> ItemPtr; typedef boost::shared_ptr<CacheItem> ItemPtr;
/// ///
ItemPtr const item(std::string const & file) const; ItemPtr const item(support::FileName const & file) const;
private: private:
/** Make the c-tor, d-tor private so we can control how many objects /** Make the c-tor, d-tor private so we can control how many objects

View File

@ -20,6 +20,7 @@
#include "debug.h" #include "debug.h"
#include "format.h" #include "format.h"
#include "support/filename.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/FileMonitor.h" #include "support/FileMonitor.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
@ -30,6 +31,7 @@
namespace lyx { namespace lyx {
using support::FileMonitor; using support::FileMonitor;
using support::FileName;
using support::isFileReadable; using support::isFileReadable;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::onlyFilename; using support::onlyFilename;
@ -48,7 +50,7 @@ class CacheItem::Impl : public boost::signals::trackable {
public: public:
/// ///
Impl(string const & file); Impl(FileName const & file);
/** Start the image conversion process, checking first that it is /** Start the image conversion process, checking first that it is
* necessary. If it is necessary, then a conversion task is started. * necessary. If it is necessary, then a conversion task is started.
@ -100,18 +102,18 @@ public:
void reset(); void reset();
/// The filename we refer too. /// The filename we refer too.
string const filename_; FileName const filename_;
/// ///
FileMonitor const monitor_; FileMonitor const monitor_;
/// Is the file compressed? /// Is the file compressed?
bool zipped_; bool zipped_;
/// If so, store the uncompressed file in this temporary file. /// If so, store the uncompressed file in this temporary file.
string unzipped_filename_; FileName unzipped_filename_;
/// The target format /// The target format
string to_; string to_;
/// What file are we trying to load? /// What file are we trying to load?
string file_to_load_; FileName file_to_load_;
/** Should we delete the file after loading? True if the file is /** Should we delete the file after loading? True if the file is
* the result of a conversion process. * the result of a conversion process.
*/ */
@ -136,7 +138,7 @@ public:
}; };
CacheItem::CacheItem(string const & file) CacheItem::CacheItem(FileName const & file)
: pimpl_(new Impl(file)) : pimpl_(new Impl(file))
{} {}
@ -145,7 +147,7 @@ CacheItem::~CacheItem()
{} {}
string const & CacheItem::filename() const FileName const & CacheItem::filename() const
{ {
return pimpl_->filename_; return pimpl_->filename_;
} }
@ -199,7 +201,7 @@ boost::signals::connection CacheItem::connect(slot_type const & slot) const
//------------------------------ //------------------------------
CacheItem::Impl::Impl(string const & file) CacheItem::Impl::Impl(FileName const & file)
: filename_(file), : filename_(file),
monitor_(file, 2000), monitor_(file, 2000),
zipped_(false), zipped_(false),
@ -264,7 +266,7 @@ void CacheItem::Impl::imageConverted(bool success)
lyxerr[Debug::GRAPHICS] << "Image conversion " << text << '.' << endl; lyxerr[Debug::GRAPHICS] << "Image conversion " << text << '.' << endl;
file_to_load_ = converter_.get() ? file_to_load_ = converter_.get() ?
converter_->convertedFile() : string(); FileName(converter_->convertedFile()) : FileName();
converter_.reset(); converter_.reset();
cc_.disconnect(); cc_.disconnect();
@ -381,21 +383,21 @@ void CacheItem::Impl::convertToDisplayFormat()
} }
// Make a local copy in case we unzip it // Make a local copy in case we unzip it
string filename; FileName filename;
zipped_ = zippedFile(filename_); zipped_ = zippedFile(filename_);
if (zipped_) { if (zipped_) {
unzipped_filename_ = tempName(string(), filename_); unzipped_filename_ = FileName(tempName(string(), filename_.toFilesystemEncoding()));
if (unzipped_filename_.empty()) { if (unzipped_filename_.empty()) {
setStatus(ErrorConverting); setStatus(ErrorConverting);
lyxerr[Debug::GRAPHICS] lyxerr[Debug::GRAPHICS]
<< "\tCould not create temporary file." << endl; << "\tCould not create temporary file." << endl;
return; return;
} }
filename = unzipFile(filename_, unzipped_filename_); filename = unzipFile(filename_, unzipped_filename_.toFilesystemEncoding());
} else } else
filename = filename_; filename = filename_;
docstring const displayed_filename = makeDisplayPath(filename_); docstring const displayed_filename = makeDisplayPath(filename_.absFilename());
lyxerr[Debug::GRAPHICS] << "[GrahicsCacheItem::convertToDisplayFormat]\n" lyxerr[Debug::GRAPHICS] << "[GrahicsCacheItem::convertToDisplayFormat]\n"
<< "\tAttempting to convert image file: " << filename << "\tAttempting to convert image file: " << filename
<< "\n\twith displayed filename: " << lyx::to_utf8(displayed_filename) << "\n\twith displayed filename: " << lyx::to_utf8(displayed_filename)
@ -436,7 +438,7 @@ void CacheItem::Impl::convertToDisplayFormat()
// Remove the temp file, we only want the name... // Remove the temp file, we only want the name...
// FIXME: This is unsafe! // FIXME: This is unsafe!
unlink(to_file_base); unlink(FileName(to_file_base));
// Connect a signal to this->imageConverted and pass this signal to // Connect a signal to this->imageConverted and pass this signal to
// the graphics converter so that we can load the modified file // the graphics converter so that we can load the modified file

View File

@ -36,6 +36,9 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
namespace graphics { namespace graphics {
class Image; class Image;
@ -45,13 +48,13 @@ class Converter;
class CacheItem : boost::noncopyable { class CacheItem : boost::noncopyable {
public: public:
/// ///
CacheItem(std::string const & file); CacheItem(support::FileName const & file);
/// Define an empty d-tor out-of-line to keep boost::scoped_ptr happy. /// Define an empty d-tor out-of-line to keep boost::scoped_ptr happy.
~CacheItem(); ~CacheItem();
/// ///
std::string const & filename() const; support::FileName const & filename() const;
/// It's in the cache. Now start the loading process. /// It's in the cache. Now start the loading process.
void startLoading() const; void startLoading() const;

View File

@ -31,6 +31,7 @@
namespace support = lyx::support; namespace support = lyx::support;
using support::changeExtension; using support::changeExtension;
using support::FileName;
using support::Forkedcall; using support::Forkedcall;
using support::ForkedCallQueue; using support::ForkedCallQueue;
using support::getExtension; using support::getExtension;
@ -56,7 +57,7 @@ namespace graphics {
class Converter::Impl : public boost::signals::trackable { class Converter::Impl : public boost::signals::trackable {
public: public:
/// ///
Impl(string const &, string const &, string const &, string const &); Impl(FileName const &, string const &, string const &, string const &);
/// ///
void startConversion(); void startConversion();
@ -78,9 +79,9 @@ public:
/// ///
string script_command_; string script_command_;
/// ///
string script_file_; FileName script_file_;
/// ///
string to_file_; FileName to_file_;
/// ///
bool valid_process_; bool valid_process_;
/// ///
@ -95,7 +96,7 @@ bool Converter::isReachable(string const & from_format_name,
} }
Converter::Converter(string const & from_file, string const & to_file_base, Converter::Converter(FileName const & from_file, string const & to_file_base,
string const & from_format, string const & to_format) string const & from_format, string const & to_format)
: pimpl_(new Impl(from_file, to_file_base, from_format, to_format)) : pimpl_(new Impl(from_file, to_file_base, from_format, to_format))
{} {}
@ -118,21 +119,21 @@ boost::signals::connection Converter::connect(slot_type const & slot) const
} }
string const & Converter::convertedFile() const FileName const & Converter::convertedFile() const
{ {
static string const empty; static FileName const empty;
return pimpl_->finished_ ? pimpl_->to_file_ : empty; return pimpl_->finished_ ? pimpl_->to_file_ : empty;
} }
/** Build the conversion script. /** Build the conversion script.
* The script is output to the stream \p script. * The script is output to the stream \p script.
*/ */
static void build_script(string const & from_file, string const & to_file_base, static void build_script(FileName const & from_file, string const & to_file_base,
string const & from_format, string const & to_format, string const & from_format, string const & to_format,
ostream & script); ostream & script);
Converter::Impl::Impl(string const & from_file, string const & to_file_base, Converter::Impl::Impl(FileName const & from_file, string const & to_file_base,
string const & from_format, string const & to_format) string const & from_format, string const & to_format)
: valid_process_(false), finished_(false) : valid_process_(false), finished_(false)
{ {
@ -145,7 +146,7 @@ Converter::Impl::Impl(string const & from_file, string const & to_file_base,
// The converted image is to be stored in this file (we do not // The converted image is to be stored in this file (we do not
// use ChangeExtension because this is a basename which may // use ChangeExtension because this is a basename which may
// nevertheless contain a '.') // nevertheless contain a '.')
to_file_ = to_file_base + '.' + formats.extension(to_format); to_file_ = FileName(to_file_base + '.' + formats.extension(to_format));
// The conversion commands are stored in a stringstream // The conversion commands are stored in a stringstream
ostringstream script; ostringstream script;
@ -157,10 +158,10 @@ Converter::Impl::Impl(string const & from_file, string const & to_file_base,
// Output the script to file. // Output the script to file.
static int counter = 0; static int counter = 0;
script_file_ = onlyPath(to_file_base) + "lyxconvert" + script_file_ = FileName(onlyPath(to_file_base) + "lyxconvert" +
convert<string>(counter++) + ".py"; convert<string>(counter++) + ".py");
std::ofstream fs(script_file_.c_str()); std::ofstream fs(script_file_.toFilesystemEncoding().c_str());
if (!fs.good()) { if (!fs.good()) {
lyxerr << "Unable to write the conversion script to \"" lyxerr << "Unable to write the conversion script to \""
<< script_file_ << '\n' << script_file_ << '\n'
@ -177,8 +178,8 @@ Converter::Impl::Impl(string const & from_file, string const & to_file_base,
// list of forked processes. // list of forked processes.
// Note: 'python ' is absolutely essential, or execvp will fail. // Note: 'python ' is absolutely essential, or execvp will fail.
script_command_ = support::os::python() + ' ' + script_command_ = support::os::python() + ' ' +
quoteName(script_file_) + ' ' + quoteName(script_file_.toFilesystemEncoding()) + ' ' +
quoteName(onlyFilename(from_file)) + ' ' + quoteName(onlyFilename(from_file.toFilesystemEncoding())) + ' ' +
quoteName(to_format); quoteName(to_format);
// All is ready to go // All is ready to go
valid_process_ = true; valid_process_ = true;
@ -269,7 +270,7 @@ static void build_conversion_command(string const & command, ostream & script)
} }
static void build_script(string const & from_file, static void build_script(FileName const & from_file,
string const & to_file_base, string const & to_file_base,
string const & from_format, string const & from_format,
string const & to_format, string const & to_format,
@ -302,14 +303,14 @@ static void build_script(string const & from_file,
static int counter = 0; static int counter = 0;
string const tmp = "gconvert" + convert<string>(counter++); string const tmp = "gconvert" + convert<string>(counter++);
string const to_base = tempName(string(), tmp); string const to_base = tempName(string(), tmp);
unlink(to_base); unlink(FileName(to_base));
// Create a copy of the file in case the original name contains // Create a copy of the file in case the original name contains
// problematic characters like ' or ". We can work around that problem // problematic characters like ' or ". We can work around that problem
// in python, but the converters might be shell scripts and have more // in python, but the converters might be shell scripts and have more
// troubles with it. // troubles with it.
string outfile = changeExtension(to_base, getExtension(from_file)); string outfile = changeExtension(to_base, getExtension(from_file.absFilename()));
script << "infile = " << quoteName(from_file, quote_python) << "\n" script << "infile = " << quoteName(from_file.absFilename(), quote_python) << "\n"
"outfile = " << quoteName(outfile, quote_python) << "\n" "outfile = " << quoteName(outfile, quote_python) << "\n"
"shutil.copy(infile, outfile)\n"; "shutil.copy(infile, outfile)\n";

View File

@ -22,6 +22,9 @@
#include <boost/utility.hpp> #include <boost/utility.hpp>
namespace lyx { namespace lyx {
namespace support { class FileName; }
namespace graphics { namespace graphics {
class Converter : boost::noncopyable { class Converter : boost::noncopyable {
@ -33,7 +36,7 @@ public:
/** One Converter per conversion ensures that the (hidden) signal /** One Converter per conversion ensures that the (hidden) signal
* is always connected to the expected slot. * is always connected to the expected slot.
*/ */
Converter(std::string const & from_file, std::string const & to_file_base, Converter(support::FileName const & from_file, std::string const & to_file_base,
std::string const & from_format, std::string const & to_format); std::string const & from_format, std::string const & to_format);
/// Define an empty d-tor out-of-line to keep boost::scoped_ptr happy. /// Define an empty d-tor out-of-line to keep boost::scoped_ptr happy.
@ -56,7 +59,7 @@ public:
* If conversion fails or has not been completed, however, it * If conversion fails or has not been completed, however, it
* returns an empty string. * returns an empty string.
*/ */
std::string const & convertedFile() const; support::FileName const & convertedFile() const;
private: private:
/// Use the Pimpl idiom to hide the internals. /// Use the Pimpl idiom to hide the internals.

View File

@ -32,6 +32,9 @@
#include <utility> #include <utility>
namespace lyx { namespace lyx {
namespace support { class FileName; }
namespace graphics { namespace graphics {
class Params; class Params;
@ -76,7 +79,7 @@ public:
* The caller should expect this process to be asynchronous and * The caller should expect this process to be asynchronous and
* so should connect to the "finished" signal above. * so should connect to the "finished" signal above.
*/ */
void load(std::string const & filename); void load(support::FileName const & filename);
/** Generate the pixmap. /** Generate the pixmap.
* Uses the params to decide on color, grayscale etc. * Uses the params to decide on color, grayscale etc.
@ -122,7 +125,7 @@ private:
* The caller should expect this process to be asynchronous and * The caller should expect this process to be asynchronous and
* so should connect to the "finished" signal above. * so should connect to the "finished" signal above.
*/ */
virtual void load_impl(std::string const & filename) = 0; virtual void load_impl(support::FileName const & filename) = 0;
/** Generate the pixmap. /** Generate the pixmap.
* Uses the params to decide on color, grayscale etc. * Uses the params to decide on color, grayscale etc.
@ -170,7 +173,7 @@ bool Image::isDrawable() const
inline inline
void Image::load(std::string const & filename) void Image::load(support::FileName const & filename)
{ {
return load_impl(filename); return load_impl(filename);
} }

View File

@ -17,6 +17,8 @@
#include "GraphicsParams.h" #include "GraphicsParams.h"
#include "LoaderQueue.h" #include "LoaderQueue.h"
#include "support/filename.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
@ -24,6 +26,9 @@ using std::string;
namespace lyx { namespace lyx {
using support::FileName;
namespace graphics { namespace graphics {
class Loader::Impl : public boost::signals::trackable { class Loader::Impl : public boost::signals::trackable {
@ -33,7 +38,7 @@ public:
/// ///
~Impl(); ~Impl();
/// ///
void resetFile(string const &); void resetFile(FileName const &);
/// ///
void resetParams(Params const &); void resetParams(Params const &);
/// ///
@ -70,14 +75,14 @@ Loader::Loader()
{} {}
Loader::Loader(string const & file, DisplayType type) Loader::Loader(FileName const & file, DisplayType type)
: pimpl_(new Impl) : pimpl_(new Impl)
{ {
reset(file, type); reset(file, type);
} }
Loader::Loader(string const & file, Params const & params) Loader::Loader(FileName const & file, Params const & params)
: pimpl_(new Impl) : pimpl_(new Impl)
{ {
reset(file, params); reset(file, params);
@ -106,7 +111,7 @@ Loader & Loader::operator=(Loader const & other)
} }
void Loader::reset(string const & file, DisplayType type) const void Loader::reset(FileName const & file, DisplayType type) const
{ {
Params params; Params params;
params.display = type; params.display = type;
@ -117,7 +122,7 @@ void Loader::reset(string const & file, DisplayType type) const
} }
void Loader::reset(string const & file, Params const & params) const void Loader::reset(FileName const & file, Params const & params) const
{ {
pimpl_->resetParams(params); pimpl_->resetParams(params);
pimpl_->resetFile(file); pimpl_->resetFile(file);
@ -167,9 +172,9 @@ unsigned long Loader::checksum() const
} }
string const & Loader::filename() const FileName const & Loader::filename() const
{ {
static string const empty; static FileName const empty;
return pimpl_->cached_item_.get() ? return pimpl_->cached_item_.get() ?
pimpl_->cached_item_->filename() : empty; pimpl_->cached_item_->filename() : empty;
} }
@ -201,14 +206,14 @@ Loader::Impl::Impl()
Loader::Impl::~Impl() Loader::Impl::~Impl()
{ {
resetFile(string()); resetFile(FileName());
} }
void Loader::Impl::resetFile(string const & file) void Loader::Impl::resetFile(FileName const & file)
{ {
string const old_file = cached_item_.get() ? FileName const old_file = cached_item_.get() ?
cached_item_->filename() : string(); cached_item_->filename() : FileName();
if (file == old_file) if (file == old_file)
return; return;

View File

@ -30,6 +30,9 @@
#include <boost/signal.hpp> #include <boost/signal.hpp>
namespace lyx { namespace lyx {
namespace support { class FileName; }
namespace graphics { namespace graphics {
class Image; class Image;
@ -40,9 +43,9 @@ public:
/// Must use the reset methods to make this instance usable. /// Must use the reset methods to make this instance usable.
Loader(); Loader();
/// The image is not transformed, just displayed as-is. /// The image is not transformed, just displayed as-is.
Loader(std::string const & file_with_path, DisplayType = ColorDisplay); Loader(support::FileName const & file_with_path, DisplayType = ColorDisplay);
/// The image is transformed before display. /// The image is transformed before display.
Loader(std::string const & file_with_path, Params const &); Loader(support::FileName const & file_with_path, Params const &);
/// ///
Loader(Loader const &); Loader(Loader const &);
@ -52,17 +55,16 @@ public:
Loader & operator=(Loader const &); Loader & operator=(Loader const &);
/// The file can be changed, or the display params, or both. /// The file can be changed, or the display params, or both.
void reset(std::string const & file_with_path, void reset(support::FileName const & file_with_path,
DisplayType = ColorDisplay) const; DisplayType = ColorDisplay) const;
/// ///
void reset(std::string const & file_with_path, Params const &) const; void reset(support::FileName const & file_with_path, Params const &) const;
/// ///
void reset(Params const &) const; void reset(Params const &) const;
/// Returns the absolute path of the loaded (loading?) file. /// Returns the absolute path of the loaded (loading?) file.
std::string const & filename() const; support::FileName const & filename() const;
/// ///
bool empty() const { return filename().empty(); }
/** starting loading of the image is done by a urgency-based /** starting loading of the image is done by a urgency-based
* decision. Here we only call LoaderQueue::touch to request it. * decision. Here we only call LoaderQueue::touch to request it.

View File

@ -16,6 +16,8 @@
#include "GraphicsTypes.h" #include "GraphicsTypes.h"
#include "support/filename.h"
#include <string> #include <string>
#include <iosfwd> #include <iosfwd>
@ -57,7 +59,7 @@ public:
unsigned int scale; unsigned int scale;
/// The image filename. /// The image filename.
std::string filename; support::FileName filename;
/** Note that the BoundingBox is always relative to the BoundingBox /** Note that the BoundingBox is always relative to the BoundingBox
* as stored in the EPS file. * as stored in the EPS file.

View File

@ -15,23 +15,25 @@
#include "GraphicsLoader.h" #include "GraphicsLoader.h"
#include "PreviewLoader.h" #include "PreviewLoader.h"
#include "support/filename.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
namespace support = lyx::support;
using std::string; using std::string;
namespace lyx { namespace lyx {
using support::FileName;
namespace graphics { namespace graphics {
class PreviewImage::Impl : public boost::signals::trackable { class PreviewImage::Impl : public boost::signals::trackable {
public: public:
/// ///
Impl(PreviewImage & p, PreviewLoader & l, Impl(PreviewImage & p, PreviewLoader & l,
string const & s, string const & f, double af); string const & s, FileName const & f, double af);
/// ///
~Impl(); ~Impl();
/// ///
@ -54,7 +56,7 @@ public:
PreviewImage::PreviewImage(PreviewLoader & l, PreviewImage::PreviewImage(PreviewLoader & l,
string const & s, string const & s,
string const & f, FileName const & f,
double af) double af)
: pimpl_(new Impl(*this, l, s, f, af)) : pimpl_(new Impl(*this, l, s, f, af))
{} {}
@ -106,7 +108,7 @@ Image const * PreviewImage::image() const
PreviewImage::Impl::Impl(PreviewImage & p, PreviewLoader & l, PreviewImage::Impl::Impl(PreviewImage & p, PreviewLoader & l,
string const & s, string const & s,
string const & bf, FileName const & bf,
double af) double af)
: parent_(p), ploader_(l), iloader_(bf), : parent_(p), ploader_(l), iloader_(bf),
snippet_(s), ascent_frac_(af) snippet_(s), ascent_frac_(af)

View File

@ -16,6 +16,9 @@
#include <string> #include <string>
namespace lyx { namespace lyx {
namespace support { class FileName; }
namespace graphics { namespace graphics {
class PreviewLoader; class PreviewLoader;
@ -28,7 +31,7 @@ public:
*/ */
PreviewImage(PreviewLoader & parent, PreviewImage(PreviewLoader & parent,
std::string const & latex_snippet, std::string const & latex_snippet,
std::string const & bitmap_file, support::FileName const & bitmap_file,
double ascent_frac); double ascent_frac);
/// ///
~PreviewImage(); ~PreviewImage();

View File

@ -41,6 +41,8 @@
#include <fstream> #include <fstream>
#include <iomanip> #include <iomanip>
using lyx::support::FileName;
using std::endl; using std::endl;
using std::find; using std::find;
using std::fill; using std::fill;
@ -60,13 +62,13 @@ using std::string;
namespace { namespace {
typedef pair<string, string> StrPair; typedef pair<string, FileName> SnippetPair;
// A list of alll snippets to be converted to previews // A list of alll snippets to be converted to previews
typedef list<string> PendingSnippets; typedef list<string> PendingSnippets;
// Each item in the vector is a pair<snippet, image file name>. // Each item in the vector is a pair<snippet, image file name>.
typedef vector<StrPair> BitmapFile; typedef vector<SnippetPair> BitmapFile;
string const unique_filename(string const & bufferpath) string const unique_filename(string const & bufferpath)
@ -110,7 +112,7 @@ lyx::Converter const * setConverter()
void setAscentFractions(vector<double> & ascent_fractions, void setAscentFractions(vector<double> & ascent_fractions,
string const & metrics_file) FileName const & metrics_file)
{ {
// If all else fails, then the images will have equal ascents and // If all else fails, then the images will have equal ascents and
// descents. // descents.
@ -118,7 +120,7 @@ void setAscentFractions(vector<double> & ascent_fractions,
vector<double>::iterator end = ascent_fractions.end(); vector<double>::iterator end = ascent_fractions.end();
fill(it, end, 0.5); fill(it, end, 0.5);
ifstream in(metrics_file.c_str()); ifstream in(metrics_file.toFilesystemEncoding().c_str());
if (!in.good()) { if (!in.good()) {
lyx::lyxerr[lyx::Debug::GRAPHICS] lyx::lyxerr[lyx::Debug::GRAPHICS]
<< "setAscentFractions(" << metrics_file << ")\n" << "setAscentFractions(" << metrics_file << ")\n"
@ -162,10 +164,10 @@ void setAscentFractions(vector<double> & ascent_fractions,
} }
class FindFirst : public std::unary_function<StrPair, bool> { class FindFirst : public std::unary_function<SnippetPair, bool> {
public: public:
FindFirst(string const & comp) : comp_(comp) {} FindFirst(string const & comp) : comp_(comp) {}
bool operator()(StrPair const & sp) const bool operator()(SnippetPair const & sp) const
{ {
return sp.first == comp_; return sp.first == comp_;
} }
@ -191,7 +193,7 @@ public:
/// ///
string command; string command;
/// ///
string metrics_file; FileName metrics_file;
/// ///
BitmapFile snippets; BitmapFile snippets;
}; };
@ -349,13 +351,13 @@ public:
: to_format_(to_format), base_(filename_base), counter_(1) : to_format_(to_format), base_(filename_base), counter_(1)
{} {}
StrPair const operator()(string const & snippet) SnippetPair const operator()(string const & snippet)
{ {
ostringstream os; ostringstream os;
os << base_ << counter_++ << '.' << to_format_; os << base_ << counter_++ << '.' << to_format_;
string const file = os.str(); string const file = os.str();
return make_pair(snippet, file); return make_pair(snippet, FileName(file));
} }
private: private:
@ -369,7 +371,7 @@ InProgress::InProgress(string const & filename_base,
PendingSnippets const & pending, PendingSnippets const & pending,
string const & to_format) string const & to_format)
: pid(0), : pid(0),
metrics_file(filename_base + ".metrics"), metrics_file(FileName(filename_base + ".metrics")),
snippets(pending.size()) snippets(pending.size())
{ {
PendingSnippets::const_iterator pit = pending.begin(); PendingSnippets::const_iterator pit = pending.begin();
@ -649,7 +651,7 @@ void PreviewLoader::Impl::finishedGenerating(pid_t pid, int retval)
int metrics_counter = 0; int metrics_counter = 0;
for (; it != end; ++it, ++metrics_counter) { for (; it != end; ++it, ++metrics_counter) {
string const & snip = it->first; string const & snip = it->first;
string const & file = it->second; FileName const & file = it->second;
double af = ascent_fractions[metrics_counter]; double af = ascent_fractions[metrics_counter];
PreviewImagePtr ptr(new PreviewImage(parent_, snip, file, af)); PreviewImagePtr ptr(new PreviewImage(parent_, snip, file, af));

View File

@ -32,6 +32,7 @@ namespace lyx {
using support::bformat; using support::bformat;
using support::changeExtension; using support::changeExtension;
using support::FileName;
using support::makeDisplayPath; using support::makeDisplayPath;
using std::find; using std::find;
@ -56,8 +57,8 @@ bool Importer::Import(LyXView * lv, string const & filename,
string const tofile = string const tofile =
changeExtension(filename, changeExtension(filename,
formats.extension(*it)); formats.extension(*it));
if (!converters.convert(0, filename, tofile, if (!converters.convert(0, FileName(filename), FileName(tofile),
filename, format, *it, errorList)) FileName(filename), format, *it, errorList))
return false; return false;
loader_format = *it; loader_format = *it;
break; break;

View File

@ -30,7 +30,6 @@
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/os.h" #include "support/os.h"
#include "support/package.h" #include "support/package.h"
#include "support/path.h"
using std::endl; using std::endl;
using std::string; using std::string;
@ -38,6 +37,9 @@ using std::vector;
namespace lyx { namespace lyx {
using support::FileName;
namespace external { namespace external {
Template const * getTemplatePtr(InsetExternalParams const & params) Template const * getTemplatePtr(InsetExternalParams const & params)
@ -49,9 +51,8 @@ Template const * getTemplatePtr(InsetExternalParams const & params)
void editExternal(InsetExternalParams const & params, Buffer const & buffer) void editExternal(InsetExternalParams const & params, Buffer const & buffer)
{ {
string const file_with_path = params.filename.absFilename(); formats.edit(buffer, params.filename,
formats.edit(buffer, file_with_path, formats.getFormatFromFile(params.filename));
formats.getFormatFromFile(file_with_path));
} }
@ -154,7 +155,7 @@ string const doSubstitution(InsetExternalParams const & params,
support::PROTECT_EXTENSION, support::ESCAPE_DOTS); support::PROTECT_EXTENSION, support::ESCAPE_DOTS);
result = subst_path(result, "$$Extension", result = subst_path(result, "$$Extension",
'.' + support::getExtension(filename), use_latex_path); '.' + support::getExtension(filename), use_latex_path);
result = subst_path(result, "$$Tempname", params.tempname(), use_latex_path); result = subst_path(result, "$$Tempname", params.tempname().absFilename(), use_latex_path);
result = subst_path(result, "$$Sysdir", result = subst_path(result, "$$Sysdir",
support::package().system_support(), use_latex_path); support::package().system_support(), use_latex_path);
@ -166,12 +167,10 @@ string const doSubstitution(InsetExternalParams const & params,
string const file = result.substr(pos + 12, end - (pos + 12)); string const file = result.substr(pos + 12, end - (pos + 12));
string contents; string contents;
string const filepath = support::isFileReadable(file) ? FileName const absfile = FileName(
buffer.filePath() : m_buffer->temppath(); support::makeAbsPath(file, m_buffer->temppath()));
support::Path p(filepath); if (support::isFileReadable(absfile))
contents = support::getFileContents(absfile);
if (support::isFileReadable(file))
contents = support::getFileContents(file);
result = support::subst(result, result = support::subst(result,
("$$Contents(\"" + file + "\")").c_str(), ("$$Contents(\"" + file + "\")").c_str(),
@ -214,14 +213,12 @@ void updateExternal(InsetExternalParams const & params,
if (from_format.empty()) if (from_format.empty())
return; // NOT_NEEDED return; // NOT_NEEDED
string abs_from_file = params.filename.absFilename();
if (from_format == "*") { if (from_format == "*") {
if (abs_from_file.empty()) if (params.filename.empty())
return; // NOT_NEEDED return; // NOT_NEEDED
// Try and ascertain the file format from its contents. // Try and ascertain the file format from its contents.
from_format = formats.getFormatFromFile(abs_from_file); from_format = formats.getFormatFromFile(params.filename);
if (from_format.empty()) if (from_format.empty())
return; // FAILURE return; // FAILURE
@ -245,20 +242,20 @@ void updateExternal(InsetExternalParams const & params,
// We copy the source file to the temp dir and do the conversion // We copy the source file to the temp dir and do the conversion
// there if necessary // there if necessary
string const temp_file = FileName const temp_file = FileName(
support::makeAbsPath(params.filename.mangledFilename(), support::makeAbsPath(params.filename.mangledFilename(),
m_buffer->temppath()); m_buffer->temppath()));
if (!abs_from_file.empty()) { if (!params.filename.empty()) {
unsigned long const from_checksum = support::sum(abs_from_file); unsigned long const from_checksum = support::sum(params.filename);
unsigned long const temp_checksum = support::sum(temp_file); unsigned long const temp_checksum = support::sum(temp_file);
if (from_checksum != temp_checksum) { if (from_checksum != temp_checksum) {
Mover const & mover = movers(from_format); Mover const & mover = movers(from_format);
if (!mover.copy(abs_from_file, temp_file)) { if (!mover.copy(params.filename, temp_file)) {
lyxerr[Debug::EXTERNAL] lyxerr[Debug::EXTERNAL]
<< "external::updateExternal. " << "external::updateExternal. "
<< "Unable to copy " << "Unable to copy "
<< abs_from_file << " to " << temp_file << endl; << params.filename << " to " << temp_file << endl;
return; // FAILURE return; // FAILURE
} }
} }
@ -268,8 +265,8 @@ void updateExternal(InsetExternalParams const & params,
string const to_file = doSubstitution(params, buffer, string const to_file = doSubstitution(params, buffer,
outputFormat.updateResult, outputFormat.updateResult,
false, true); false, true);
string const abs_to_file = FileName const abs_to_file = FileName(
support::makeAbsPath(to_file, m_buffer->temppath()); support::makeAbsPath(to_file, m_buffer->temppath()));
// Record the referenced files for the exporter. // Record the referenced files for the exporter.
// The exporter will copy them to the export dir. // The exporter will copy them to the export dir.
@ -280,10 +277,10 @@ void updateExternal(InsetExternalParams const & params,
vector<string>::const_iterator fit = rit->second.begin(); vector<string>::const_iterator fit = rit->second.begin();
vector<string>::const_iterator fend = rit->second.end(); vector<string>::const_iterator fend = rit->second.end();
for (; fit != fend; ++fit) { for (; fit != fend; ++fit) {
string const source = support::makeAbsPath( FileName const source(support::makeAbsPath(
doSubstitution(params, buffer, *fit, doSubstitution(params, buffer, *fit,
false, true), false, true),
m_buffer->temppath()); m_buffer->temppath()));
// The path of the referenced file is never the // The path of the referenced file is never the
// temp path, but the filename may be the mangled // temp path, but the filename may be the mangled
// or the real name. Therefore we substitute the // or the real name. Therefore we substitute the
@ -310,7 +307,7 @@ void updateExternal(InsetExternalParams const & params,
ErrorList el; ErrorList el;
/* bool const success = */ /* bool const success = */
converters.convert(&buffer, temp_file, abs_to_file, converters.convert(&buffer, temp_file, abs_to_file,
abs_from_file, from_format, to_format, el, params.filename, from_format, to_format, el,
Converters::try_default | Converters::try_cache); Converters::try_default | Converters::try_cache);
// return success // return success
} }

View File

@ -253,7 +253,7 @@ void TemplateManager::readTemplates(string const & path)
LyXLex lex(templatetags, TM_TEMPLATE_END); LyXLex lex(templatetags, TM_TEMPLATE_END);
string filename = support::libFileSearch("", "external_templates"); support::FileName const filename = support::libFileSearch("", "external_templates");
if (filename.empty() || !lex.setFile(filename)) { if (filename.empty() || !lex.setFile(filename)) {
lex.printError("external::TemplateManager::readTemplates: " lex.printError("external::TemplateManager::readTemplates: "
"No template file"); "No template file");

View File

@ -24,7 +24,6 @@
#include "frontends/Alert.h" #include "frontends/Alert.h"
#include "support/filename.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
@ -45,6 +44,7 @@ using support::changeExtension;
using support::contains; using support::contains;
using support::copy; using support::copy;
using support::DocFileName; using support::DocFileName;
using support::FileName;
using support::findtexfile; using support::findtexfile;
using support::isFileReadable; using support::isFileReadable;
using support::latex_path; using support::latex_path;
@ -117,7 +117,7 @@ string normalize_name(Buffer const & buffer, OutputParams const & runparams,
string const & name, string const & ext) string const & name, string const & ext)
{ {
string const fname = makeAbsPath(name, buffer.filePath()); string const fname = makeAbsPath(name, buffer.filePath());
if (absolutePath(name) || !isFileReadable(fname + ext)) if (absolutePath(name) || !isFileReadable(FileName(fname + ext)))
return name; return name;
else if (!runparams.nice) else if (!runparams.nice)
return fname; return fname;
@ -169,15 +169,17 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
string utf8input(to_utf8(input)); string utf8input(to_utf8(input));
string database = string database =
normalize_name(buffer, runparams, utf8input, ".bib"); normalize_name(buffer, runparams, utf8input, ".bib");
string const in_file = database + ".bib"; string const try_in_file = makeAbsPath(database + ".bib", buffer.filePath());
bool const not_from_texmf = isFileReadable(FileName(try_in_file));
if (!runparams.inComment && !runparams.dryrun && !runparams.nice && if (!runparams.inComment && !runparams.dryrun && !runparams.nice &&
isFileReadable(in_file)) { not_from_texmf) {
// mangledFilename() needs the extension // mangledFilename() needs the extension
database = removeExtension(DocFileName(in_file).mangledFilename()); DocFileName const in_file = DocFileName(try_in_file);
string const out_file = makeAbsPath(database + ".bib", database = removeExtension(in_file.mangledFilename());
buffer.getMasterBuffer()->temppath()); FileName const out_file = FileName(makeAbsPath(database + ".bib",
buffer.getMasterBuffer()->temppath()));
bool const success = copy(in_file, out_file); bool const success = copy(in_file, out_file);
if (!success) { if (!success) {
@ -222,18 +224,19 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
if (!style.empty()) { if (!style.empty()) {
string base = string base =
normalize_name(buffer, runparams, style, ".bst"); normalize_name(buffer, runparams, style, ".bst");
string const in_file = base + ".bst"; string const try_in_file = makeAbsPath(base + ".bst", buffer.filePath());
bool const not_from_texmf = isFileReadable(FileName(try_in_file));
// If this style does not come from texmf and we are not // If this style does not come from texmf and we are not
// exporting to .tex copy it to the tmp directory. // exporting to .tex copy it to the tmp directory.
// This prevents problems with spaces and 8bit charcaters // This prevents problems with spaces and 8bit charcaters
// in the file name. // in the file name.
if (!runparams.inComment && !runparams.dryrun && !runparams.nice && if (!runparams.inComment && !runparams.dryrun && !runparams.nice &&
isFileReadable(in_file)) { not_from_texmf) {
// use new style name // use new style name
base = removeExtension( DocFileName const in_file = DocFileName(try_in_file);
DocFileName(in_file).mangledFilename()); base = removeExtension(in_file.mangledFilename());
string const out_file = makeAbsPath(base + ".bst", FileName const out_file = FileName(makeAbsPath(base + ".bst",
buffer.getMasterBuffer()->temppath()); buffer.getMasterBuffer()->temppath()));
bool const success = copy(in_file, out_file); bool const success = copy(in_file, out_file);
if (!success) { if (!success) {
lyxerr << "Failed to copy '" << in_file lyxerr << "Failed to copy '" << in_file

View File

@ -70,11 +70,11 @@ namespace external {
TempName::TempName() TempName::TempName()
{ {
tempname_ = support::tempName(string(), "lyxext"); string const tempname = support::tempName(string(), "lyxext");
// FIXME: This is unsafe // FIXME: This is unsafe
support::unlink(tempname_); support::unlink(support::FileName(tempname));
// must have an extension for the converter code to work correctly. // must have an extension for the converter code to work correctly.
tempname_ += ".tmp"; tempname_ = support::FileName(tempname + ".tmp");
} }
@ -529,7 +529,7 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams)
{ {
graphics::Params gparams; graphics::Params gparams;
gparams.filename = eparams.filename.absFilename(); gparams.filename = eparams.filename;
gparams.scale = eparams.lyxscale; gparams.scale = eparams.lyxscale;
if (eparams.clipdata.clip) if (eparams.clipdata.clip)
gparams.bb = eparams.clipdata.bbox; gparams.bb = eparams.clipdata.bbox;
@ -791,9 +791,8 @@ namespace {
bool preview_wanted(InsetExternalParams const & params) bool preview_wanted(InsetExternalParams const & params)
{ {
string const included_file = params.filename.absFilename();
return params.display == external::PreviewDisplay && return params.display == external::PreviewDisplay &&
support::isFileReadable(included_file); support::isFileReadable(params.filename);
} }
@ -815,7 +814,7 @@ void add_preview_and_start_loading(RenderMonitoredPreview & renderer,
if (RenderPreview::status() != LyXRC::PREVIEW_OFF && if (RenderPreview::status() != LyXRC::PREVIEW_OFF &&
preview_wanted(params)) { preview_wanted(params)) {
renderer.setAbsFile(params.filename.absFilename()); renderer.setAbsFile(params.filename);
docstring const snippet = latex_string(inset, buffer); docstring const snippet = latex_string(inset, buffer);
renderer.addPreview(snippet, buffer); renderer.addPreview(snippet, buffer);
renderer.startLoading(buffer); renderer.startLoading(buffer);
@ -832,7 +831,7 @@ void InsetExternal::addPreview(graphics::PreviewLoader & ploader) const
return; return;
if (preview_wanted(params())) { if (preview_wanted(params())) {
ptr->setAbsFile(params_.filename.absFilename()); ptr->setAbsFile(params_.filename);
docstring const snippet = latex_string(*this, ploader.buffer()); docstring const snippet = latex_string(*this, ploader.buffer());
ptr->addPreview(snippet, ploader); ptr->addPreview(snippet, ploader);
} }

View File

@ -41,9 +41,9 @@ public:
TempName(TempName const &); TempName(TempName const &);
~TempName(); ~TempName();
TempName & operator=(TempName const &); TempName & operator=(TempName const &);
std::string const & operator()() const { return tempname_; } support::FileName const & operator()() const { return tempname_; }
private: private:
std::string tempname_; support::FileName tempname_;
}; };
/// How is the image to be displayed on the LyX screen? /// How is the image to be displayed on the LyX screen?
@ -72,7 +72,7 @@ public:
bool read(Buffer const &, LyXLex &); bool read(Buffer const &, LyXLex &);
/// The name of the tempfile used for manipulations. /// The name of the tempfile used for manipulations.
std::string const & tempname() const { return tempname_(); } support::FileName const & tempname() const { return tempname_(); }
/// The template currently in use. /// The template currently in use.
void settemplate(std::string const &); void settemplate(std::string const &);

View File

@ -90,12 +90,12 @@ TODO
namespace lyx { namespace lyx {
using support::absolutePath;
using support::bformat; using support::bformat;
using support::changeExtension; using support::changeExtension;
using support::compare_timestamps; using support::compare_timestamps;
using support::contains; using support::contains;
using support::DocFileName; using support::DocFileName;
using support::FileName;
using support::float_equal; using support::float_equal;
using support::getExtension; using support::getExtension;
using support::isFileReadable; using support::isFileReadable;
@ -453,12 +453,9 @@ enum CopyStatus {
}; };
std::pair<CopyStatus, string> const std::pair<CopyStatus, FileName> const
copyFileIfNeeded(string const & file_in, string const & file_out) copyFileIfNeeded(FileName const & file_in, FileName const & file_out)
{ {
BOOST_ASSERT(absolutePath(file_in));
BOOST_ASSERT(absolutePath(file_out));
unsigned long const checksum_in = support::sum(file_in); unsigned long const checksum_in = support::sum(file_in);
unsigned long const checksum_out = support::sum(file_out); unsigned long const checksum_out = support::sum(file_out);
@ -473,7 +470,7 @@ copyFileIfNeeded(string const & file_in, string const & file_out)
lyxerr[Debug::GRAPHICS] lyxerr[Debug::GRAPHICS]
<< to_utf8(support::bformat(_("Could not copy the file\n%1$s\n" << to_utf8(support::bformat(_("Could not copy the file\n%1$s\n"
"into the temporary directory."), "into the temporary directory."),
from_utf8(file_in))) from_utf8(file_in.absFilename())))
<< std::endl; << std::endl;
} }
@ -482,7 +479,7 @@ copyFileIfNeeded(string const & file_in, string const & file_out)
} }
std::pair<CopyStatus, string> const std::pair<CopyStatus, FileName> const
copyToDirIfNeeded(DocFileName const & file, string const & dir) copyToDirIfNeeded(DocFileName const & file, string const & dir)
{ {
using support::rtrim; using support::rtrim;
@ -506,7 +503,7 @@ copyToDirIfNeeded(DocFileName const & file, string const & dir)
} }
string const file_out = support::makeAbsPath(mangled, dir); string const file_out = support::makeAbsPath(mangled, dir);
return copyFileIfNeeded(file_in, file_out); return copyFileIfNeeded(file, FileName(file_out));
} }
@ -563,7 +560,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
// temp_file will contain the file for LaTeX to act on if, for example, // temp_file will contain the file for LaTeX to act on if, for example,
// we move it to a temp dir or uncompress it. // we move it to a temp dir or uncompress it.
string temp_file = orig_file; FileName temp_file = params().filename;
// The master buffer. This is useful when there are multiple levels // The master buffer. This is useful when there are multiple levels
// of include files // of include files
@ -573,7 +570,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
// not exist. // not exist.
// We are not going to change the extension or using the name of the // We are not going to change the extension or using the name of the
// temporary file, the code is already complicated enough. // temporary file, the code is already complicated enough.
if (runparams.inComment || !isFileReadable(orig_file)) if (runparams.inComment || !isFileReadable(params().filename))
return params().filename.outputFilename(m_buffer->filePath()); return params().filename.outputFilename(m_buffer->filePath());
// We place all temporary files in the master buffer's temp dir. // We place all temporary files in the master buffer's temp dir.
@ -594,8 +591,8 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
// run through the LaTeX compiler. // run through the LaTeX compiler.
string output_file = support::os::external_path(runparams.nice ? string output_file = support::os::external_path(runparams.nice ?
params().filename.outputFilename(m_buffer->filePath()) : params().filename.outputFilename(m_buffer->filePath()) :
onlyFilename(temp_file)); onlyFilename(temp_file.absFilename()));
string source_file = runparams.nice ? orig_file : temp_file; FileName source_file = runparams.nice ? FileName(params().filename) : temp_file;
string const tex_format = (runparams.flavor == OutputParams::LATEX) ? string const tex_format = (runparams.flavor == OutputParams::LATEX) ?
"latex" : "pdflatex"; "latex" : "pdflatex";
@ -611,7 +608,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
lyxerr[Debug::GRAPHICS] lyxerr[Debug::GRAPHICS]
<< "\tpass zipped file to LaTeX.\n"; << "\tpass zipped file to LaTeX.\n";
string const bb_orig_file = changeExtension(orig_file, "bb"); FileName const bb_orig_file = FileName(changeExtension(orig_file, "bb"));
if (runparams.nice) { if (runparams.nice) {
runparams.exportdata->addExternalFile(tex_format, runparams.exportdata->addExternalFile(tex_format,
bb_orig_file, bb_orig_file,
@ -619,7 +616,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
} else { } else {
// LaTeX needs the bounding box file in the // LaTeX needs the bounding box file in the
// tmp dir // tmp dir
string bb_file = changeExtension(temp_file, "bb"); FileName bb_file = FileName(changeExtension(temp_file.absFilename(), "bb"));
boost::tie(status, bb_file) = boost::tie(status, bb_file) =
copyFileIfNeeded(bb_orig_file, bb_file); copyFileIfNeeded(bb_orig_file, bb_file);
if (status == FAILURE) if (status == FAILURE)
@ -637,9 +634,10 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
support::EXCLUDE_EXTENSION); support::EXCLUDE_EXTENSION);
} }
string const unzipped_temp_file = unzippedFileName(temp_file); FileName const unzipped_temp_file =
FileName(unzippedFileName(temp_file.absFilename()));
output_file = unzippedFileName(output_file); output_file = unzippedFileName(output_file);
source_file = unzippedFileName(source_file); source_file = FileName(unzippedFileName(source_file.absFilename()));
if (compare_timestamps(unzipped_temp_file, temp_file) > 0) { if (compare_timestamps(unzipped_temp_file, temp_file) > 0) {
// temp_file has been unzipped already and // temp_file has been unzipped already and
// orig_file has not changed in the meantime. // orig_file has not changed in the meantime.
@ -673,15 +671,15 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
<< "\tthe orig file is: " << orig_file << endl; << "\tthe orig file is: " << orig_file << endl;
if (from == to) { if (from == to) {
if (!runparams.nice && getExtension(temp_file) != ext) { if (!runparams.nice && getExtension(temp_file.absFilename()) != ext) {
// The LaTeX compiler will not be able to determine // The LaTeX compiler will not be able to determine
// the file format from the extension, so we must // the file format from the extension, so we must
// change it. // change it.
string const new_file = changeExtension(temp_file, ext); FileName const new_file = FileName(changeExtension(temp_file.absFilename(), ext));
if (support::rename(temp_file, new_file)) { if (support::rename(temp_file, new_file)) {
temp_file = new_file; temp_file = new_file;
output_file = changeExtension(output_file, ext); output_file = changeExtension(output_file, ext);
source_file = changeExtension(source_file, ext); source_file = FileName(changeExtension(source_file.absFilename(), ext));
} else } else
lyxerr[Debug::GRAPHICS] lyxerr[Debug::GRAPHICS]
<< "Could not rename file `" << "Could not rename file `"
@ -696,7 +694,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
return stripExtensionIfPossible(output_file, to); return stripExtensionIfPossible(output_file, to);
} }
string const to_file = changeExtension(temp_file, ext); FileName const to_file = FileName(changeExtension(temp_file.absFilename(), ext));
string const output_to_file = changeExtension(output_file, ext); string const output_to_file = changeExtension(output_file, ext);
// Do we need to perform the conversion? // Do we need to perform the conversion?
@ -722,7 +720,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf,
// FIXME (Abdel 12/08/06): Is there a need to show these errors? // FIXME (Abdel 12/08/06): Is there a need to show these errors?
ErrorList el; ErrorList el;
if (converters.convert(&buf, temp_file, to_file, orig_file, if (converters.convert(&buf, temp_file, to_file, params().filename,
from, to, el, from, to, el,
Converters::try_default | Converters::try_cache)) { Converters::try_default | Converters::try_cache)) {
runparams.exportdata->addExternalFile(tex_format, runparams.exportdata->addExternalFile(tex_format,
@ -747,8 +745,8 @@ int InsetGraphics::latex(Buffer const & buf, odocstream & os,
string const relative_file = string const relative_file =
params().filename.relFilename(buf.filePath()); params().filename.relFilename(buf.filePath());
string const file_ = params().filename.absFilename(); bool const file_exists = !params().filename.empty() &&
bool const file_exists = !file_.empty() && isFileReadable(file_); isFileReadable(params().filename);
string const message = file_exists ? string const message = file_exists ?
string() : string("bb = 0 0 200 100, draft, type=eps"); string() : string("bb = 0 0 200 100, draft, type=eps");
// if !message.empty() then there was no existing file // if !message.empty() then there was no existing file
@ -866,10 +864,10 @@ int InsetGraphics::docbook(Buffer const &, odocstream & os,
// easier to use. // easier to use.
if (runparams.flavor == OutputParams::XML) { if (runparams.flavor == OutputParams::XML) {
runparams.exportdata->addExternalFile("docbook-xml", runparams.exportdata->addExternalFile("docbook-xml",
params().filename.absFilename()); params().filename);
} else { } else {
runparams.exportdata->addExternalFile("docbook", runparams.exportdata->addExternalFile("docbook",
params().filename.absFilename()); params().filename);
} }
os << "<inlinemediaobject>"; os << "<inlinemediaobject>";
@ -934,9 +932,8 @@ InsetGraphicsParams const & InsetGraphics::params() const
void InsetGraphics::editGraphics(InsetGraphicsParams const & p, void InsetGraphics::editGraphics(InsetGraphicsParams const & p,
Buffer const & buffer) const Buffer const & buffer) const
{ {
string const file_with_path = p.filename.absFilename(); formats.edit(buffer, p.filename,
formats.edit(buffer, file_with_path, formats.getFormatFromFile(p.filename));
formats.getFormatFromFile(file_with_path));
} }

View File

@ -266,7 +266,7 @@ bool InsetGraphicsParams::Read(LyXLex & lex, string const & token, string const
graphics::Params InsetGraphicsParams::as_grfxParams() const graphics::Params InsetGraphicsParams::as_grfxParams() const
{ {
graphics::Params pars; graphics::Params pars;
pars.filename = filename.absFilename(); pars.filename = filename;
pars.scale = lyxscale; pars.scale = lyxscale;
pars.angle = convert<double>(rotateAngle); pars.angle = convert<double>(rotateAngle);
@ -274,7 +274,7 @@ graphics::Params InsetGraphicsParams::as_grfxParams() const
pars.bb = bb; pars.bb = bb;
// Get the original Bounding Box from the file // Get the original Bounding Box from the file
string const tmp = readBB_from_PSFile(filename.absFilename()); string const tmp = readBB_from_PSFile(filename);
lyxerr[Debug::GRAPHICS] << "BB_from_File: " << tmp << std::endl; lyxerr[Debug::GRAPHICS] << "BB_from_File: " << tmp << std::endl;
if (!tmp.empty()) { if (!tmp.empty()) {
#ifdef WITH_WARNINGS #ifdef WITH_WARNINGS

View File

@ -40,7 +40,6 @@
#include "insets/render_preview.h" #include "insets/render_preview.h"
#include "support/filename.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" // contains #include "support/lstrings.h" // contains
#include "support/lyxalgo.h" #include "support/lyxalgo.h"
@ -60,6 +59,7 @@ using support::changeExtension;
using support::contains; using support::contains;
using support::copy; using support::copy;
using support::DocFileName; using support::DocFileName;
using support::FileName;
using support::getFileContents; using support::getFileContents;
using support::isFileReadable; using support::isFileReadable;
using support::isLyXFilename; using support::isLyXFilename;
@ -378,21 +378,21 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
if (incfile.empty()) if (incfile.empty())
return 0; return 0;
string const included_file = includedFilename(buffer, params_); FileName const included_file(includedFilename(buffer, params_));
Buffer const * const m_buffer = buffer.getMasterBuffer(); Buffer const * const m_buffer = buffer.getMasterBuffer();
// if incfile is relative, make it relative to the master // if incfile is relative, make it relative to the master
// buffer directory. // buffer directory.
if (!absolutePath(incfile)) { if (!absolutePath(incfile)) {
incfile = makeRelPath(included_file, incfile = makeRelPath(included_file.absFilename(),
m_buffer->filePath()); m_buffer->filePath());
} }
// write it to a file (so far the complete file) // write it to a file (so far the complete file)
string const exportfile = changeExtension(incfile, ".tex"); string const exportfile = changeExtension(incfile, ".tex");
string const mangled = DocFileName(changeExtension(included_file, string const mangled = DocFileName(changeExtension(included_file.absFilename(),
".tex")).mangledFilename(); ".tex")).mangledFilename();
string const writefile = makeAbsPath(mangled, m_buffer->temppath()); FileName const writefile(makeAbsPath(mangled, m_buffer->temppath()));
if (!runparams.nice) if (!runparams.nice)
incfile = mangled; incfile = mangled;
@ -404,14 +404,14 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
// Don't try to load or copy the file // Don't try to load or copy the file
; ;
else if (loadIfNeeded(buffer, params_)) { else if (loadIfNeeded(buffer, params_)) {
Buffer * tmp = theBufferList().getBuffer(included_file); Buffer * tmp = theBufferList().getBuffer(included_file.absFilename());
if (tmp->params().textclass != m_buffer->params().textclass) { if (tmp->params().textclass != m_buffer->params().textclass) {
// FIXME UNICODE // FIXME UNICODE
docstring text = bformat(_("Included file `%1$s'\n" docstring text = bformat(_("Included file `%1$s'\n"
"has textclass `%2$s'\n" "has textclass `%2$s'\n"
"while parent file has textclass `%3$s'."), "while parent file has textclass `%3$s'."),
makeDisplayPath(included_file), makeDisplayPath(included_file.absFilename()),
from_utf8(tmp->params().getLyXTextClass().name()), from_utf8(tmp->params().getLyXTextClass().name()),
from_utf8(m_buffer->params().getLyXTextClass().name())); from_utf8(m_buffer->params().getLyXTextClass().name()));
Alert::warning(_("Different textclasses"), text); Alert::warning(_("Different textclasses"), text);
@ -427,7 +427,7 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
// argument. Should we set it to string(), or should makeLaTeXFile // argument. Should we set it to string(), or should makeLaTeXFile
// make use of it somehow? (JMarc 20031002) // make use of it somehow? (JMarc 20031002)
#endif #endif
tmp->makeLaTeXFile(writefile, tmp->makeLaTeXFile(writefile.absFilename(),
onlyPath(masterFilename(buffer)), onlyPath(masterFilename(buffer)),
runparams, false); runparams, false);
} else { } else {
@ -443,7 +443,7 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
lyxerr[Debug::LATEX] lyxerr[Debug::LATEX]
<< to_utf8(bformat(_("Could not copy the file\n%1$s\n" << to_utf8(bformat(_("Could not copy the file\n%1$s\n"
"into the temporary directory."), "into the temporary directory."),
from_utf8(included_file))) from_utf8(included_file.absFilename())))
<< endl; << endl;
return 0; return 0;
} }
@ -462,7 +462,7 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
exportfile); exportfile);
// \input wants file with extension (default is .tex) // \input wants file with extension (default is .tex)
if (!isLyXFilename(included_file)) { if (!isLyXFilename(included_file.absFilename())) {
incfile = latex_path(incfile); incfile = latex_path(incfile);
// FIXME UNICODE // FIXME UNICODE
os << '\\' << from_ascii(params_.getCmdName()) os << '\\' << from_ascii(params_.getCmdName())
@ -497,7 +497,7 @@ int InsetInclude::plaintext(Buffer const & buffer, odocstream & os,
if (isVerbatim(params_)) { if (isVerbatim(params_)) {
// FIXME: We don't know the encoding of the file // FIXME: We don't know the encoding of the file
docstring const str = from_utf8( docstring const str = from_utf8(
getFileContents(includedFilename(buffer, params_))); getFileContents(FileName(includedFilename(buffer, params_))));
os << str; os << str;
// Return how many newlines we issued. // Return how many newlines we issued.
return int(lyx::count(str.begin(), str.end(), '\n')); return int(lyx::count(str.begin(), str.end(), '\n'));
@ -519,12 +519,12 @@ int InsetInclude::docbook(Buffer const & buffer, odocstream & os,
// write it to a file (so far the complete file) // write it to a file (so far the complete file)
string const exportfile = changeExtension(incfile, ".sgml"); string const exportfile = changeExtension(incfile, ".sgml");
string writefile = changeExtension(included_file, ".sgml"); DocFileName writefile(changeExtension(included_file, ".sgml"));
if (loadIfNeeded(buffer, params_)) { if (loadIfNeeded(buffer, params_)) {
Buffer * tmp = theBufferList().getBuffer(included_file); Buffer * tmp = theBufferList().getBuffer(included_file);
string const mangled = DocFileName(writefile).mangledFilename(); string const mangled = writefile.mangledFilename();
writefile = makeAbsPath(mangled, writefile = makeAbsPath(mangled,
buffer.getMasterBuffer()->temppath()); buffer.getMasterBuffer()->temppath());
if (!runparams.nice) if (!runparams.nice)
@ -534,7 +534,7 @@ int InsetInclude::docbook(Buffer const & buffer, odocstream & os,
lyxerr[Debug::LATEX] << "exportfile:" << exportfile << endl; lyxerr[Debug::LATEX] << "exportfile:" << exportfile << endl;
lyxerr[Debug::LATEX] << "writefile:" << writefile << endl; lyxerr[Debug::LATEX] << "writefile:" << writefile << endl;
tmp->makeDocBookFile(writefile, runparams, true); tmp->makeDocBookFile(writefile.absFilename(), runparams, true);
} }
runparams.exportdata->addExternalFile("docbook", writefile, runparams.exportdata->addExternalFile("docbook", writefile,
@ -727,7 +727,7 @@ bool preview_wanted(InsetCommandParams const & params, Buffer const & buffer)
string const included_file = includedFilename(buffer, params); string const included_file = includedFilename(buffer, params);
return type(params) == INPUT && params.preview() && return type(params) == INPUT && params.preview() &&
isFileReadable(included_file); isFileReadable(FileName(included_file));
} }
@ -748,7 +748,7 @@ void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset,
InsetCommandParams const & params = inset.params(); InsetCommandParams const & params = inset.params();
if (RenderPreview::status() != LyXRC::PREVIEW_OFF && if (RenderPreview::status() != LyXRC::PREVIEW_OFF &&
preview_wanted(params, buffer)) { preview_wanted(params, buffer)) {
renderer.setAbsFile(includedFilename(buffer, params)); renderer.setAbsFile(FileName(includedFilename(buffer, params)));
docstring const snippet = latex_string(inset, buffer); docstring const snippet = latex_string(inset, buffer);
renderer.addPreview(snippet, buffer); renderer.addPreview(snippet, buffer);
} }
@ -761,7 +761,7 @@ void InsetInclude::addPreview(graphics::PreviewLoader & ploader) const
{ {
Buffer const & buffer = ploader.buffer(); Buffer const & buffer = ploader.buffer();
if (preview_wanted(params(), buffer)) { if (preview_wanted(params(), buffer)) {
preview_->setAbsFile(includedFilename(buffer, params())); preview_->setAbsFile(FileName(includedFilename(buffer, params())));
docstring const snippet = latex_string(*this, buffer); docstring const snippet = latex_string(*this, buffer);
preview_->addPreview(snippet, ploader); preview_->addPreview(snippet, ploader);
} }

View File

@ -32,7 +32,6 @@
namespace lyx { namespace lyx {
using support::absolutePath;
using support::onlyFilename; using support::onlyFilename;
using std::string; using std::string;
@ -68,7 +67,6 @@ void RenderGraphic::update(graphics::Params const & params)
params_ = params; params_ = params;
if (!params_.filename.empty()) { if (!params_.filename.empty()) {
BOOST_ASSERT(absolutePath(params_.filename));
loader_.reset(params_.filename, params_); loader_.reset(params_.filename, params_);
} }
} }
@ -160,7 +158,7 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
// FIXME UNICODE // FIXME UNICODE
docstring const justname = docstring const justname =
from_utf8(onlyFilename(params_.filename)); from_utf8(onlyFilename(params_.filename.absFilename()));
if (!justname.empty()) { if (!justname.empty()) {
msgFont.setSize(LyXFont::SIZE_FOOTNOTE); msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
font_width = theFontMetrics(msgFont) font_width = theFontMetrics(msgFont)
@ -210,7 +208,7 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
// Print the file name. // Print the file name.
LyXFont msgFont = pi.base.font; LyXFont msgFont = pi.base.font;
msgFont.setFamily(LyXFont::SANS_FAMILY); msgFont.setFamily(LyXFont::SANS_FAMILY);
string const justname = onlyFilename(params_.filename); string const justname = onlyFilename(params_.filename.absFilename());
if (!justname.empty()) { if (!justname.empty()) {
msgFont.setSize(LyXFont::SIZE_FOOTNOTE); msgFont.setSize(LyXFont::SIZE_FOOTNOTE);

View File

@ -28,6 +28,7 @@
#include "graphics/PreviewLoader.h" #include "graphics/PreviewLoader.h"
#include "graphics/Previews.h" #include "graphics/Previews.h"
#include "support/filename.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
@ -35,6 +36,8 @@
namespace lyx { namespace lyx {
using support::FileName;
using std::string; using std::string;
using std::auto_ptr; using std::auto_ptr;
@ -238,11 +241,11 @@ void RenderPreview::imageReady(graphics::PreviewImage const & pimage)
RenderMonitoredPreview::RenderMonitoredPreview(InsetBase const * inset) RenderMonitoredPreview::RenderMonitoredPreview(InsetBase const * inset)
: RenderPreview(inset), : RenderPreview(inset),
monitor_(std::string(), 2000) monitor_(FileName(), 2000)
{} {}
void RenderMonitoredPreview::setAbsFile(string const & file) void RenderMonitoredPreview::setAbsFile(FileName const & file)
{ {
monitor_.reset(file); monitor_.reset(file);
} }

View File

@ -32,6 +32,8 @@ class LyXRC_PreviewStatus;
class MetricsInfo; class MetricsInfo;
class PainterInfo; class PainterInfo;
namespace support { class FileName; }
namespace graphics { namespace graphics {
class PreviewImage; class PreviewImage;
@ -108,7 +110,7 @@ public:
/// ///
void draw(PainterInfo & pi, int x, int y) const; void draw(PainterInfo & pi, int x, int y) const;
/// ///
void setAbsFile(std::string const & file); void setAbsFile(support::FileName const & file);
/// ///
bool monitoring() const { return monitor_.monitoring(); } bool monitoring() const { return monitor_.monitoring(); }
void startMonitoring() const { monitor_.start(); } void startMonitoring() const { monitor_.start(); }

View File

@ -29,6 +29,7 @@
namespace lyx { namespace lyx {
using support::FileName;
using support::i18nLibFileSearch; using support::i18nLibFileSearch;
using std::endl; using std::endl;
@ -106,7 +107,7 @@ bool kb_keymap::read(string const & bind_file)
if (lyxerr.debugging(Debug::PARSER)) if (lyxerr.debugging(Debug::PARSER))
lexrc.printTable(lyxerr); lexrc.printTable(lyxerr);
string const tmp = i18nLibFileSearch("bind", bind_file, "bind"); FileName const tmp(i18nLibFileSearch("bind", bind_file, "bind"));
lexrc.setFile(tmp); lexrc.setFile(tmp);
if (!lexrc.isOK()) { if (!lexrc.isOK()) {
lyxerr << "kb_keymap::read: cannot open bind file:" lyxerr << "kb_keymap::read: cannot open bind file:"

View File

@ -19,6 +19,8 @@
#include "lyxlex.h" #include "lyxlex.h"
#include "lyxrc.h" #include "lyxrc.h"
#include "support/filename.h"
namespace lyx { namespace lyx {
@ -35,7 +37,7 @@ Language latex_lang("latex", "latex", "Latex", false, "", 0, "latex", "");
Language const * latex_language = &latex_lang; Language const * latex_language = &latex_lang;
void Languages::read(string const & filename) void Languages::read(support::FileName const & filename)
{ {
// We need to set the encoding of latex_lang // We need to set the encoding of latex_lang
latex_lang = Language("latex", "latex", "Latex", false, "iso8859-1", latex_lang = Language("latex", "latex", "Latex", false, "iso8859-1",

View File

@ -21,6 +21,7 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
class Encoding; class Encoding;
@ -81,7 +82,7 @@ public:
/// ///
typedef LanguageList::size_type size_type; typedef LanguageList::size_type size_type;
/// ///
void read(std::string const & filename); void read(support::FileName const & filename);
/// ///
Language const * getLanguage(std::string const & language) const; Language const * getLanguage(std::string const & language) const;
/// ///

View File

@ -62,6 +62,7 @@ namespace lyx {
using support::addName; using support::addName;
using support::bformat; using support::bformat;
using support::FileFilterList; using support::FileFilterList;
using support::FileName;
using support::ForkedProcess; using support::ForkedProcess;
using support::isLyXFilename; using support::isLyXFilename;
using support::libFileSearch; using support::libFileSearch;
@ -193,7 +194,7 @@ namespace {
class AutoSaveBuffer : public ForkedProcess { class AutoSaveBuffer : public ForkedProcess {
public: public:
/// ///
AutoSaveBuffer(BufferView & bv, string const & fname) AutoSaveBuffer(BufferView & bv, FileName const & fname)
: bv_(bv), fname_(fname) {} : bv_(bv), fname_(fname) {}
/// ///
virtual shared_ptr<ForkedProcess> clone() const virtual shared_ptr<ForkedProcess> clone() const
@ -207,13 +208,13 @@ private:
virtual int generateChild(); virtual int generateChild();
/// ///
BufferView & bv_; BufferView & bv_;
string fname_; FileName fname_;
}; };
int AutoSaveBuffer::start() int AutoSaveBuffer::start()
{ {
command_ = to_utf8(bformat(_("Auto-saving %1$s"), from_utf8(fname_))); command_ = to_utf8(bformat(_("Auto-saving %1$s"), from_utf8(fname_.absFilename())));
return run(DontWait); return run(DontWait);
} }
@ -231,9 +232,9 @@ int AutoSaveBuffer::generateChild()
// anyway. // anyway.
bool failed = false; bool failed = false;
string const tmp_ret = tempName(string(), "lyxauto"); FileName const tmp_ret(tempName(string(), "lyxauto"));
if (!tmp_ret.empty()) { if (!tmp_ret.empty()) {
bv_.buffer()->writeFile(tmp_ret); bv_.buffer()->writeFile(tmp_ret.absFilename());
// assume successful write of tmp_ret // assume successful write of tmp_ret
if (!rename(tmp_ret, fname_)) { if (!rename(tmp_ret, fname_)) {
failed = true; failed = true;
@ -248,7 +249,7 @@ int AutoSaveBuffer::generateChild()
if (failed) { if (failed) {
// failed to write/rename tmp_ret so try writing direct // failed to write/rename tmp_ret so try writing direct
if (!bv_.buffer()->writeFile(fname_)) { if (!bv_.buffer()->writeFile(fname_.absFilename())) {
// It is dangerous to do this in the child, // It is dangerous to do this in the child,
// but safe in the parent, so... // but safe in the parent, so...
if (pid == -1) if (pid == -1)
@ -288,7 +289,7 @@ void autoSave(BufferView * bv)
fname += onlyFilename(bv->buffer()->fileName()); fname += onlyFilename(bv->buffer()->fileName());
fname += '#'; fname += '#';
AutoSaveBuffer autosave(*bv, fname); AutoSaveBuffer autosave(*bv, FileName(fname));
autosave.start(); autosave.start();
bv->buffer()->markBakClean(); bv->buffer()->markBakClean();

View File

@ -74,6 +74,7 @@ using support::bformat;
using support::createDirectory; using support::createDirectory;
using support::createLyXTmpDir; using support::createLyXTmpDir;
using support::destroyDir; using support::destroyDir;
using support::FileName;
using support::fileSearch; using support::fileSearch;
using support::getEnv; using support::getEnv;
using support::i18nLibFileSearch; using support::i18nLibFileSearch;
@ -480,7 +481,7 @@ int LyX::loadFiles(int & argc, char * argv[],
} }
if (first_start) if (first_start)
files.push_back(i18nLibFileSearch("examples", "splash.lyx")); files.push_back(i18nLibFileSearch("examples", "splash.lyx").absFilename());
Buffer * last_loaded = 0; Buffer * last_loaded = 0;
@ -490,7 +491,7 @@ int LyX::loadFiles(int & argc, char * argv[],
for (; it != end; ++it) { for (; it != end; ++it) {
// get absolute path of file and add ".lyx" to // get absolute path of file and add ".lyx" to
// the filename if necessary // the filename if necessary
string s = fileSearch(string(), *it, "lyx"); string s = fileSearch(string(), *it, "lyx").absFilename();
if (s.empty()) { if (s.empty()) {
Buffer * const b = newFile(*it, string(), true); Buffer * const b = newFile(*it, string(), true);
if (b) if (b)
@ -820,7 +821,7 @@ bool LyX::init()
fs::is_directory(lyxrc.document_path)) fs::is_directory(lyxrc.document_path))
package().document_dir() = lyxrc.document_path; package().document_dir() = lyxrc.document_path;
package().temp_dir() = createLyXTmpDir(lyxrc.tempdir_path); package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path)).absFilename();
if (package().temp_dir().empty()) { if (package().temp_dir().empty()) {
Alert::error(_("Could not create temporary directory"), Alert::error(_("Could not create temporary directory"),
bformat(_("Could not create a temporary directory in\n" bformat(_("Could not create a temporary directory in\n"
@ -1011,7 +1012,7 @@ bool LyX::readRcFile(string const & name)
{ {
lyxerr[Debug::INIT] << "About to read " << name << "... "; lyxerr[Debug::INIT] << "About to read " << name << "... ";
string const lyxrc_path = libFileSearch(string(), name); FileName const lyxrc_path = libFileSearch(string(), name);
if (!lyxrc_path.empty()) { if (!lyxrc_path.empty()) {
lyxerr[Debug::INIT] << "Found in " << lyxrc_path << endl; lyxerr[Debug::INIT] << "Found in " << lyxrc_path << endl;
@ -1060,7 +1061,7 @@ bool LyX::readUIFile(string const & name)
lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
string const ui_path = libFileSearch("ui", name, "ui"); FileName const ui_path = libFileSearch("ui", name, "ui");
if (ui_path.empty()) { if (ui_path.empty()) {
lyxerr[Debug::INIT] << "Could not find " << name << endl; lyxerr[Debug::INIT] << "Could not find " << name << endl;
@ -1118,7 +1119,7 @@ bool LyX::readLanguagesFile(string const & name)
{ {
lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
string const lang_path = libFileSearch(string(), name); FileName const lang_path = libFileSearch(string(), name);
if (lang_path.empty()) { if (lang_path.empty()) {
showFileError(name); showFileError(name);
return false; return false;
@ -1133,7 +1134,7 @@ bool LyX::readEncodingsFile(string const & name)
{ {
lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
string const enc_path = libFileSearch(string(), name); FileName const enc_path = libFileSearch(string(), name);
if (enc_path.empty()) { if (enc_path.empty()) {
showFileError(name); showFileError(name);
return false; return false;

View File

@ -113,6 +113,7 @@ using support::bformat;
using support::changeExtension; using support::changeExtension;
using support::contains; using support::contains;
using support::FileFilterList; using support::FileFilterList;
using support::FileName;
using support::fileSearch; using support::fileSearch;
using support::ForkedcallsController; using support::ForkedcallsController;
using support::i18nLibFileSearch; using support::i18nLibFileSearch;
@ -540,7 +541,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
else if (name == "character" || name == "mathpanel") else if (name == "character" || name == "mathpanel")
enable = cur.inset().lyxCode() != InsetBase::ERT_CODE; enable = cur.inset().lyxCode() != InsetBase::ERT_CODE;
else if (name == "latexlog") else if (name == "latexlog")
enable = isFileReadable(buf->getLogName().second); enable = isFileReadable(FileName(buf->getLogName().second));
#if !defined (USE_ASPELL) && !defined (USE_ISPELL) && !defined (USE_PSPELL) #if !defined (USE_ASPELL) && !defined (USE_ISPELL) && !defined (USE_PSPELL)
else if (name == "spellchecker") else if (name == "spellchecker")
enable = false; enable = false;
@ -1075,7 +1076,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
setErrorMessage(_("Missing argument")); setErrorMessage(_("Missing argument"));
break; break;
} }
string const fname = i18nLibFileSearch("doc", arg, "lyx"); string const fname = i18nLibFileSearch("doc", arg, "lyx").absFilename();
if (fname.empty()) { if (fname.empty()) {
lyxerr << "LyX: unable to find documentation file `" lyxerr << "LyX: unable to find documentation file `"
<< arg << "'. Bad installation?" << endl; << arg << "'. Bad installation?" << endl;
@ -1881,7 +1882,7 @@ void LyXFunc::open(string const & fname)
// get absolute path of file and add ".lyx" to the filename if // get absolute path of file and add ".lyx" to the filename if
// necessary // necessary
string const fullpath = fileSearch(string(), filename, "lyx"); string const fullpath = fileSearch(string(), filename, "lyx").absFilename();
if (!fullpath.empty()) { if (!fullpath.empty()) {
filename = fullpath; filename = fullpath;
} }

View File

@ -99,7 +99,7 @@ void LyXLex::printError(string const & message) const
} }
bool LyXLex::setFile(string const & filename) bool LyXLex::setFile(support::FileName const & filename)
{ {
return pimpl_->setFile(filename); return pimpl_->setFile(filename);
} }

View File

@ -26,6 +26,7 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
/// ///
struct keyword_item { struct keyword_item {
@ -66,7 +67,7 @@ public:
/// stream is not ok /// stream is not ok
bool operator!() const; bool operator!() const;
/// return true if able to open file, else false /// return true if able to open file, else false
bool setFile(std::string const & filename); bool setFile(support::FileName const & filename);
/// ///
void setStream(std::istream & is); void setStream(std::istream & is);
/// ///

View File

@ -28,6 +28,7 @@
namespace lyx { namespace lyx {
using support::compare_ascii_no_case; using support::compare_ascii_no_case;
using support::FileName;
using support::getFormatFromContents; using support::getFormatFromContents;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::split; using support::split;
@ -143,7 +144,7 @@ void LyXLex::Pimpl::popTable()
} }
bool LyXLex::Pimpl::setFile(string const & filename) bool LyXLex::Pimpl::setFile(FileName const & filename)
{ {
// Check the format of the file. // Check the format of the file.
string const format = getFormatFromContents(filename); string const format = getFormatFromContents(filename);
@ -158,9 +159,9 @@ bool LyXLex::Pimpl::setFile(string const & filename)
lyxerr[Debug::LYXLEX] << "Error in LyXLex::setFile: " lyxerr[Debug::LYXLEX] << "Error in LyXLex::setFile: "
"file or stream already set." << endl; "file or stream already set." << endl;
gz_.push(io::gzip_decompressor()); gz_.push(io::gzip_decompressor());
gz_.push(io::file_source(filename)); gz_.push(io::file_source(filename.toFilesystemEncoding()));
is.rdbuf(&gz_); is.rdbuf(&gz_);
name = filename; name = filename.absFilename();
lineno = 0; lineno = 0;
return gz_.component<io::file_source>(1)->is_open() && is.good(); return gz_.component<io::file_source>(1)->is_open() && is.good();
} else { } else {
@ -172,9 +173,9 @@ bool LyXLex::Pimpl::setFile(string const & filename)
if (fb_.is_open() || istream::off_type(is.tellg()) > 0) if (fb_.is_open() || istream::off_type(is.tellg()) > 0)
lyxerr[Debug::LYXLEX] << "Error in LyXLex::setFile: " lyxerr[Debug::LYXLEX] << "Error in LyXLex::setFile: "
"file or stream already set." << endl; "file or stream already set." << endl;
fb_.open(filename.c_str(), ios::in); fb_.open(filename.toFilesystemEncoding().c_str(), ios::in);
is.rdbuf(&fb_); is.rdbuf(&fb_);
name = filename; name = filename.absFilename();
lineno = 0; lineno = 0;
return fb_.is_open() && is.good(); return fb_.is_open() && is.good();
} }

View File

@ -31,6 +31,8 @@ namespace io = boost::iostreams;
namespace lyx { namespace lyx {
namespace support { class FileName; }
/// ///
class LyXLex::Pimpl : boost::noncopyable { class LyXLex::Pimpl : boost::noncopyable {
public: public:
@ -49,7 +51,7 @@ public:
/// ///
void popTable(); void popTable();
/// ///
bool setFile(std::string const & filename); bool setFile(support::FileName const & filename);
/// ///
void setStream(std::istream & i); void setStream(std::istream & i);
/// ///

View File

@ -48,6 +48,7 @@ namespace os = support::os;
using support::ascii_lowercase; using support::ascii_lowercase;
using support::bformat; using support::bformat;
using support::expandPath; using support::expandPath;
using support::FileName;
using support::getEnv; using support::getEnv;
using support::libFileSearch; using support::libFileSearch;
using support::token; using support::token;
@ -315,7 +316,7 @@ void oldFontFormat(string & family, string & foundry)
} // namespace anon } // namespace anon
int LyXRC::read(string const & filename) int LyXRC::read(FileName const & filename)
{ {
LyXLex lexrc(lyxrcTags, lyxrcCount); LyXLex lexrc(lyxrcTags, lyxrcCount);
if (lyxerr.debugging(Debug::PARSER)) if (lyxerr.debugging(Debug::PARSER))
@ -369,12 +370,12 @@ int LyXRC::read(LyXLex & lexrc)
switch (static_cast<LyXRCTags>(le)) { switch (static_cast<LyXRCTags>(le)) {
case RC_INPUT: // Include file case RC_INPUT: // Include file
if (lexrc.next()) { if (lexrc.next()) {
string const tmp = FileName const tmp =
libFileSearch(string(), libFileSearch(string(),
lexrc.getString()); lexrc.getString());
if (read(tmp)) { if (read(tmp)) {
lexrc.printError("Error reading " lexrc.printError("Error reading "
"included file: "+tmp); "included file: " + tmp.absFilename());
} }
} }
break; break;

View File

@ -27,6 +27,8 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
class LyXLex; class LyXLex;
/// This contains the runtime configuration of LyX /// This contains the runtime configuration of LyX
@ -152,7 +154,7 @@ public:
/// ///
void setDefaults(); void setDefaults();
/// ///
int read(std::string const & filename); int read(support::FileName const & filename);
/// ///
int read(std::istream &); int read(std::istream &);
private: private:

View File

@ -45,6 +45,8 @@
#include "LyXAction.h" #include "LyXAction.h"
#include "lyxfunc.h" #include "lyxfunc.h"
#include "frontends/Application.h" #include "frontends/Application.h"
#include "support/filename.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
@ -60,6 +62,7 @@
namespace lyx { namespace lyx {
using support::compare; using support::compare;
using support::FileName;
using support::rtrim; using support::rtrim;
using support::split; using support::split;
using support::unlink; using support::unlink;
@ -166,9 +169,10 @@ void LyXComm::closeConnection()
} }
int LyXComm::startPipe(string const & filename, bool write) int LyXComm::startPipe(string const & file, bool write)
{ {
if (::access(filename.c_str(), F_OK) == 0) { FileName const filename(file);
if (::access(filename.toFilesystemEncoding().c_str(), F_OK) == 0) {
lyxerr << "LyXComm: Pipe " << filename << " already exists.\n" lyxerr << "LyXComm: Pipe " << filename << " already exists.\n"
<< "If no other LyX program is active, please delete" << "If no other LyX program is active, please delete"
" the pipe by hand and try again." << endl; " the pipe by hand and try again." << endl;
@ -176,12 +180,12 @@ int LyXComm::startPipe(string const & filename, bool write)
return -1; return -1;
} }
if (::mkfifo(filename.c_str(), 0600) < 0) { if (::mkfifo(filename.toFilesystemEncoding().c_str(), 0600) < 0) {
lyxerr << "LyXComm: Could not create pipe " << filename << '\n' lyxerr << "LyXComm: Could not create pipe " << filename << '\n'
<< strerror(errno) << endl; << strerror(errno) << endl;
return -1; return -1;
}; };
int const fd = ::open(filename.c_str(), int const fd = ::open(filename.toFilesystemEncoding().c_str(),
write ? (O_RDWR) : (O_RDONLY|O_NONBLOCK)); write ? (O_RDWR) : (O_RDONLY|O_NONBLOCK));
if (fd < 0) { if (fd < 0) {
@ -214,7 +218,7 @@ void LyXComm::endPipe(int & fd, string const & filename, bool write)
<< '\n' << strerror(errno) << endl; << '\n' << strerror(errno) << endl;
} }
if (unlink(filename) < 0) { if (unlink(FileName(filename)) < 0) {
lyxerr << "LyXComm: Could not remove pipe " << filename lyxerr << "LyXComm: Could not remove pipe " << filename
<< '\n' << strerror(errno) << endl; << '\n' << strerror(errno) << endl;
}; };

View File

@ -24,6 +24,7 @@
#include "frontends/Application.h" #include "frontends/Application.h"
#include "support/environment.h" #include "support/environment.h"
#include "support/filename.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/socktools.h" #include "support/socktools.h"
@ -83,7 +84,7 @@ LyXServerSocket::~LyXServerSocket()
lyxerr << "lyx: Server socket " << fd_ lyxerr << "lyx: Server socket " << fd_
<< " IO error on closing: " << strerror(errno); << " IO error on closing: " << strerror(errno);
} }
support::unlink(address_); support::unlink(support::FileName(address_));
lyxerr[Debug::LYXSERVER] << "lyx: Server socket quitting" << endl; lyxerr[Debug::LYXSERVER] << "lyx: Server socket quitting" << endl;
} }

View File

@ -34,6 +34,7 @@ namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
using support::FileName;
using support::libFileSearch; using support::libFileSearch;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::quoteName; using support::quoteName;
@ -67,9 +68,9 @@ private:
int const FORMAT = 2; int const FORMAT = 2;
bool layout2layout(string const & filename, string const & tempfile) bool layout2layout(FileName const & filename, FileName const & tempfile)
{ {
string const script = libFileSearch("scripts", "layout2layout.py"); FileName const script = libFileSearch("scripts", "layout2layout.py");
if (script.empty()) { if (script.empty()) {
lyxerr << "Could not find layout conversion " lyxerr << "Could not find layout conversion "
"script layout2layout.py." << endl; "script layout2layout.py." << endl;
@ -77,9 +78,9 @@ bool layout2layout(string const & filename, string const & tempfile)
} }
std::ostringstream command; std::ostringstream command;
command << support::os::python() << ' ' << quoteName(script) command << support::os::python() << ' ' << quoteName(script.toFilesystemEncoding())
<< ' ' << quoteName(filename) << ' ' << quoteName(filename.toFilesystemEncoding())
<< ' ' << quoteName(tempfile); << ' ' << quoteName(tempfile.toFilesystemEncoding());
string const command_str = command.str(); string const command_str = command.str();
lyxerr[Debug::TCLASS] << "Running `" << command_str << '\'' << endl; lyxerr[Debug::TCLASS] << "Running `" << command_str << '\'' << endl;
@ -173,7 +174,7 @@ enum TextClassTags {
// Reads a textclass structure from file. // Reads a textclass structure from file.
bool LyXTextClass::read(string const & filename, bool merge) bool LyXTextClass::read(FileName const & filename, bool merge)
{ {
if (!support::isFileReadable(filename)) { if (!support::isFileReadable(filename)) {
lyxerr << "Cannot read layout file `" << filename << "'." lyxerr << "Cannot read layout file `" << filename << "'."
@ -213,11 +214,11 @@ bool LyXTextClass::read(string const & filename, bool merge)
if (!merge) if (!merge)
lyxerr[Debug::TCLASS] << "Reading textclass " lyxerr[Debug::TCLASS] << "Reading textclass "
<< to_utf8(makeDisplayPath(filename)) << to_utf8(makeDisplayPath(filename.absFilename()))
<< endl; << endl;
else else
lyxerr[Debug::TCLASS] << "Reading input file " lyxerr[Debug::TCLASS] << "Reading input file "
<< to_utf8(makeDisplayPath(filename)) << to_utf8(makeDisplayPath(filename.absFilename()))
<< endl; << endl;
LyXLex lexrc(textClassTags, LyXLex lexrc(textClassTags,
@ -260,7 +261,7 @@ bool LyXTextClass::read(string const & filename, bool merge)
case TC_INPUT: // Include file case TC_INPUT: // Include file
if (lexrc.next()) { if (lexrc.next()) {
string const inc = lexrc.getString(); string const inc = lexrc.getString();
string tmp = libFileSearch("layouts", inc, FileName tmp = libFileSearch("layouts", inc,
"layout"); "layout");
if (tmp.empty()) { if (tmp.empty()) {
@ -269,7 +270,7 @@ bool LyXTextClass::read(string const & filename, bool merge)
error = true; error = true;
} else if (read(tmp, true)) { } else if (read(tmp, true)) {
lexrc.printError("Error reading input" lexrc.printError("Error reading input"
"file: "+tmp); "file: " + tmp.absFilename());
error = true; error = true;
} }
} }
@ -444,7 +445,7 @@ bool LyXTextClass::read(string const & filename, bool merge)
if (format != FORMAT) { if (format != FORMAT) {
lyxerr[Debug::TCLASS] << "Converting layout file from format " lyxerr[Debug::TCLASS] << "Converting layout file from format "
<< format << " to " << FORMAT << endl; << format << " to " << FORMAT << endl;
string const tempfile = support::tempName(); FileName const tempfile(support::tempName());
error = !layout2layout(filename, tempfile); error = !layout2layout(filename, tempfile);
if (!error) if (!error)
error = read(tempfile, merge); error = read(tempfile, merge);
@ -454,7 +455,7 @@ bool LyXTextClass::read(string const & filename, bool merge)
if (!merge) { // we are at top level here. if (!merge) { // we are at top level here.
lyxerr[Debug::TCLASS] << "Finished reading textclass " lyxerr[Debug::TCLASS] << "Finished reading textclass "
<< to_utf8(makeDisplayPath(filename)) << to_utf8(makeDisplayPath(filename.absFilename()))
<< endl; << endl;
if (defaultlayout_.empty()) { if (defaultlayout_.empty()) {
lyxerr << "Error: Textclass '" << name_ lyxerr << "Error: Textclass '" << name_
@ -484,7 +485,7 @@ bool LyXTextClass::read(string const & filename, bool merge)
} else } else
lyxerr[Debug::TCLASS] << "Finished reading input file " lyxerr[Debug::TCLASS] << "Finished reading input file "
<< to_utf8(makeDisplayPath(filename)) << to_utf8(makeDisplayPath(filename.absFilename()))
<< endl; << endl;
return error; return error;
@ -925,16 +926,16 @@ bool LyXTextClass::load(string const & path) const
return true; return true;
// Read style-file, provided path is searched before the system ones // Read style-file, provided path is searched before the system ones
string layout_file; FileName layout_file;
if (!path.empty()) if (!path.empty())
layout_file = addName(path, name_ + ".layout"); layout_file = FileName(addName(path, name_ + ".layout"));
if (layout_file.empty() || !fs::exists(layout_file)) if (layout_file.empty() || !fs::exists(layout_file.toFilesystemEncoding()))
layout_file = libFileSearch("layouts", name_, "layout"); layout_file = libFileSearch("layouts", name_, "layout");
loaded_ = const_cast<LyXTextClass*>(this)->read(layout_file) == 0; loaded_ = const_cast<LyXTextClass*>(this)->read(layout_file) == 0;
if (!loaded_) { if (!loaded_) {
lyxerr << "Error reading `" lyxerr << "Error reading `"
<< to_utf8(makeDisplayPath(layout_file)) << to_utf8(makeDisplayPath(layout_file.absFilename()))
<< "'\n(Check `" << name_ << "'\n(Check `" << name_
<< "')\nCheck your installation and " << "')\nCheck your installation and "
"try Options/Reconfigure..." << endl; "try Options/Reconfigure..." << endl;

View File

@ -20,6 +20,8 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
class LyXLex; class LyXLex;
class Counters; class Counters;
class FloatList; class FloatList;
@ -65,7 +67,7 @@ public:
const_iterator end() const { return layoutlist_.end(); } const_iterator end() const { return layoutlist_.end(); }
/// Performs the read of the layout file. /// Performs the read of the layout file.
bool read(std::string const & filename, bool merge = false); bool read(support::FileName const & filename, bool merge = false);
/// ///
void readOutputType(LyXLex &); void readOutputType(LyXLex &);
/// ///

View File

@ -99,13 +99,14 @@ public:
bool LyXTextClassList::read() bool LyXTextClassList::read()
{ {
LyXLex lex(0, 0); LyXLex lex(0, 0);
string real_file = libFileSearch("", "textclass.lst"); support::FileName const real_file = libFileSearch("", "textclass.lst");
lyxerr[Debug::TCLASS] << "Reading textclasses from `" lyxerr[Debug::TCLASS] << "Reading textclasses from `"
<< real_file << '\'' << endl; << real_file << '\'' << endl;
if (real_file.empty()) { if (real_file.empty()) {
lyxerr << "LyXTextClassList::Read: unable to find " lyxerr << "LyXTextClassList::Read: unable to find "
"textclass file `" << to_utf8(makeDisplayPath(real_file, 1000)) "textclass file `"
<< to_utf8(makeDisplayPath(real_file.absFilename(), 1000))
<< "'. Exiting." << endl; << "'. Exiting." << endl;
return false; return false;
// This causes LyX to end... Not a desirable behaviour. Lgb // This causes LyX to end... Not a desirable behaviour. Lgb
@ -123,7 +124,8 @@ bool LyXTextClassList::read()
if (!lex.isOK()) { if (!lex.isOK()) {
lyxerr << "LyXTextClassList::Read: unable to open " lyxerr << "LyXTextClassList::Read: unable to open "
"textclass file `" << to_utf8(makeDisplayPath(real_file, 1000)) "textclass file `"
<< to_utf8(makeDisplayPath(real_file.absFilename(), 1000))
<< "'\nCheck your installation. LyX can't continue." << "'\nCheck your installation. LyX can't continue."
<< endl; << endl;
return false; return false;

View File

@ -30,7 +30,9 @@
namespace lyx { namespace lyx {
using support::bformat; using support::bformat;
using support::FileName;
using support::isFileReadable; using support::isFileReadable;
using support::makeAbsPath;
using support::makeDisplayPath; using support::makeDisplayPath;
using support::tempName; using support::tempName;
@ -94,7 +96,7 @@ void LyXVC::registrer()
string const filename = owner_->fileName(); string const filename = owner_->fileName();
// there must be a file to save // there must be a file to save
if (!isFileReadable(filename)) { if (!isFileReadable(FileName(makeAbsPath(filename)))) {
Alert::error(_("Document not saved"), Alert::error(_("Document not saved"),
_("You must save the document " _("You must save the document "
"before it can be registered.")); "before it can be registered."));
@ -105,7 +107,7 @@ void LyXVC::registrer()
if (!vcs) { if (!vcs) {
string const cvs_entries = "CVS/Entries"; string const cvs_entries = "CVS/Entries";
if (isFileReadable(cvs_entries)) { if (isFileReadable(FileName(makeAbsPath(cvs_entries)))) {
lyxerr[Debug::LYXVC] lyxerr[Debug::LYXVC]
<< "LyXVC: registering " << "LyXVC: registering "
<< to_utf8(makeDisplayPath(filename)) << to_utf8(makeDisplayPath(filename))

View File

@ -146,14 +146,14 @@ Corrections theCorrections;
void initAutoCorrect() void initAutoCorrect()
{ {
lyxerr[Debug::MATHED] << "reading autocorrect file" << endl; lyxerr[Debug::MATHED] << "reading autocorrect file" << endl;
string const file = libFileSearch(string(), "autocorrect"); support::FileName const file = libFileSearch(string(), "autocorrect");
if (file.empty()) { if (file.empty()) {
lyxerr << "Could not find autocorrect file" << endl; lyxerr << "Could not find autocorrect file" << endl;
return; return;
} }
string line; string line;
ifstream is(file.c_str()); ifstream is(file.toFilesystemEncoding().c_str());
while (getline(is, line)) { while (getline(is, line)) {
if (line.size() == 0 || line[0] == '#') { if (line.size() == 0 || line[0] == '#') {
//lyxerr[Debug::MATHED] << "ignoring line '" << line << '\'' << endl; //lyxerr[Debug::MATHED] << "ignoring line '" << line << '\'' << endl;

View File

@ -1414,14 +1414,14 @@ MathArray pipeThroughExtern(string const & lang, docstring const & extra,
string data = to_utf8(os.str()); string data = to_utf8(os.str());
// search external script // search external script
string file = libFileSearch("mathed", "extern_" + lang); support::FileName const file = libFileSearch("mathed", "extern_" + lang);
if (file.empty()) { if (file.empty()) {
lyxerr << "converter to '" << lang << "' not found" << endl; lyxerr << "converter to '" << lang << "' not found" << endl;
return MathArray(); return MathArray();
} }
// run external sript // run external sript
string out = captureOutput(file, data); string out = captureOutput(file.absFilename(), data);
MathArray res; MathArray res;
mathed_parse_cell(res, from_utf8(out)); mathed_parse_cell(res, from_utf8(out));
return res; return res;

View File

@ -111,14 +111,14 @@ bool math_font_available(docstring & name)
void initSymbols() void initSymbols()
{ {
string const filename = libFileSearch(string(), "symbols"); support::FileName const filename = libFileSearch(string(), "symbols");
lyxerr[Debug::MATHED] << "read symbols from " << filename << endl; lyxerr[Debug::MATHED] << "read symbols from " << filename << endl;
if (filename.empty()) { if (filename.empty()) {
lyxerr << "Could not find symbols file" << endl; lyxerr << "Could not find symbols file" << endl;
return; return;
} }
std::ifstream fs(filename.c_str()); std::ifstream fs(filename.toFilesystemEncoding().c_str());
string line; string line;
bool skip = false; bool skip = false;
while (getline(fs, line)) { while (getline(fs, line)) {

View File

@ -30,28 +30,42 @@ Movers movers;
Movers system_movers; Movers system_movers;
bool Mover::do_copy(string const & from, string const & to, bool Mover::copy(support::FileName const & from, support::FileName const & to,
unsigned long int mode) const
{
return do_copy(from, to, to.absFilename(), mode);
}
bool Mover::do_copy(support::FileName const & from, support::FileName const & to,
string const &, unsigned long int mode) const string const &, unsigned long int mode) const
{ {
return support::copy(from, to, mode); return support::copy(from, to, mode);
} }
bool Mover::do_rename(string const & from, string const & to, bool Mover::rename(support::FileName const & from,
support::FileName const & to) const
{
return do_rename(from, to, to.absFilename());
}
bool Mover::do_rename(support::FileName const & from, support::FileName const & to,
string const &) const string const &) const
{ {
return support::rename(from, to); return support::rename(from, to);
} }
bool SpecialisedMover::do_copy(string const & from, string const & to, bool SpecialisedMover::do_copy(support::FileName const & from, support::FileName const & to,
string const & latex, unsigned long int mode) const string const & latex, unsigned long int mode) const
{ {
if (command_.empty()) if (command_.empty())
return Mover::do_copy(from, to, latex, mode); return Mover::do_copy(from, to, latex, mode);
if (mode != (unsigned long int)-1) { if (mode != (unsigned long int)-1) {
std::ofstream ofs(to.c_str(), ios::binary | ios::out | ios::trunc); std::ofstream ofs(to.toFilesystemEncoding().c_str(), ios::binary | ios::out | ios::trunc);
if (!ofs) if (!ofs)
return false; return false;
ofs.close(); ofs.close();
@ -60,8 +74,8 @@ bool SpecialisedMover::do_copy(string const & from, string const & to,
} }
string command = support::libScriptSearch(command_); string command = support::libScriptSearch(command_);
command = support::subst(command, "$$i", from); command = support::subst(command, "$$i", from.toFilesystemEncoding());
command = support::subst(command, "$$o", to); command = support::subst(command, "$$o", to.toFilesystemEncoding());
command = support::subst(command, "$$l", latex); command = support::subst(command, "$$l", latex);
support::Systemcall one; support::Systemcall one;
@ -69,7 +83,7 @@ bool SpecialisedMover::do_copy(string const & from, string const & to,
} }
bool SpecialisedMover::do_rename(string const & from, string const & to, bool SpecialisedMover::do_rename(support::FileName const & from, support::FileName const & to,
string const & latex) const string const & latex) const
{ {
if (command_.empty()) if (command_.empty())

View File

@ -18,6 +18,8 @@
namespace lyx { namespace lyx {
namespace support { class FileName; }
/** /**
* Utility to copy a file of a specified format from one place to another. * Utility to copy a file of a specified format from one place to another.
* This base class simply invokes the command support::copy(). * This base class simply invokes the command support::copy().
@ -34,11 +36,8 @@ public:
* \returns true if successful. * \returns true if successful.
*/ */
bool bool
copy(std::string const & from, std::string const & to, copy(support::FileName const & from, support::FileName const & to,
unsigned long int mode = (unsigned long int)-1) const unsigned long int mode = (unsigned long int)-1) const;
{
return do_copy(from, to, to, mode);
}
/** Copy file @c from to @c to. /** Copy file @c from to @c to.
* \see SpecialisedMover::SpecialisedMover() for an explanation of * \see SpecialisedMover::SpecialisedMover() for an explanation of
@ -49,7 +48,7 @@ public:
* \returns true if successful. * \returns true if successful.
*/ */
bool bool
copy(std::string const & from, std::string const & to, copy(support::FileName const & from, support::FileName const & to,
std::string const & latex, std::string const & latex,
unsigned long int mode = (unsigned long int)-1) const unsigned long int mode = (unsigned long int)-1) const
{ {
@ -63,10 +62,7 @@ public:
* \returns true if successful. * \returns true if successful.
*/ */
bool bool
rename(std::string const & from, std::string const & to) const rename(support::FileName const & from, support::FileName const & to) const;
{
return do_rename(from, to, to);
}
/** Rename file @c from as @c to. /** Rename file @c from as @c to.
* \see SpecialisedMover::SpecialisedMover() for an explanation of * \see SpecialisedMover::SpecialisedMover() for an explanation of
@ -77,7 +73,7 @@ public:
* \returns true if successful. * \returns true if successful.
*/ */
bool bool
rename(std::string const & from, std::string const & to, rename(support::FileName const & from, support::FileName const & to,
std::string const & latex) const std::string const & latex) const
{ {
return do_rename(from, to, latex); return do_rename(from, to, latex);
@ -85,11 +81,11 @@ public:
protected: protected:
virtual bool virtual bool
do_copy(std::string const & from, std::string const & to, do_copy(support::FileName const & from, support::FileName const & to,
std::string const &, unsigned long int mode) const; std::string const &, unsigned long int mode) const;
virtual bool virtual bool
do_rename(std::string const & from, std::string const & to, do_rename(support::FileName const & from, support::FileName const & to,
std::string const &) const; std::string const &) const;
}; };
@ -132,11 +128,11 @@ public:
private: private:
virtual bool virtual bool
do_copy(std::string const & from, std::string const & to, do_copy(support::FileName const & from, support::FileName const & to,
std::string const & latex, unsigned long int mode) const; std::string const & latex, unsigned long int mode) const;
virtual bool virtual bool
do_rename(std::string const & from, std::string const & to, do_rename(support::FileName const & from, support::FileName const & to,
std::string const & latex) const; std::string const & latex) const;
std::string command_; std::string command_;

View File

@ -11,6 +11,7 @@
#include <config.h> #include <config.h>
#include "support/FileMonitor.h" #include "support/FileMonitor.h"
#include "support/filename.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
// FIXME Interface violation // FIXME Interface violation
@ -32,13 +33,13 @@ class FileMonitor::Impl : public boost::signals::trackable {
public: public:
/// ///
Impl(string const & file_with_path, int interval); Impl(FileName const & file_with_path, int interval);
/// ///
void monitorFile(); void monitorFile();
/// ///
string filename_; FileName filename_;
/// ///
Timeout timer_; Timeout timer_;
@ -55,7 +56,7 @@ public:
}; };
FileMonitor::FileMonitor(string const & file_with_path, int interval) FileMonitor::FileMonitor(FileName const & file_with_path, int interval)
: pimpl_(new Impl(file_with_path, interval)) : pimpl_(new Impl(file_with_path, interval))
{} {}
@ -64,7 +65,7 @@ FileMonitor::~FileMonitor()
{} {}
void FileMonitor::reset(string const & file_with_path) const void FileMonitor::reset(FileName const & file_with_path) const
{ {
if (pimpl_->filename_ == file_with_path) if (pimpl_->filename_ == file_with_path)
return; return;
@ -80,7 +81,7 @@ void FileMonitor::reset(string const & file_with_path) const
} }
string const & FileMonitor::filename() const FileName const & FileMonitor::filename() const
{ {
return pimpl_->filename_; return pimpl_->filename_;
} }
@ -91,10 +92,10 @@ void FileMonitor::start() const
if (monitoring()) if (monitoring())
return; return;
if (!fs::exists(pimpl_->filename_)) if (!fs::exists(pimpl_->filename_.toFilesystemEncoding()))
return; return;
pimpl_->timestamp_ = fs::last_write_time(pimpl_->filename_); pimpl_->timestamp_ = fs::last_write_time(pimpl_->filename_.toFilesystemEncoding());
pimpl_->checksum_ = sum(pimpl_->filename_); pimpl_->checksum_ = sum(pimpl_->filename_);
if (pimpl_->timestamp_ && pimpl_->checksum_) { if (pimpl_->timestamp_ && pimpl_->checksum_) {
@ -142,7 +143,7 @@ boost::signals::connection FileMonitor::connect(slot_type const & slot) const
//------------------------------ //------------------------------
FileMonitor::Impl::Impl(string const & file_with_path, int interval) FileMonitor::Impl::Impl(FileName const & file_with_path, int interval)
: filename_(file_with_path), : filename_(file_with_path),
timer_(interval, Timeout::ONETIME), timer_(interval, Timeout::ONETIME),
timestamp_(0), timestamp_(0),
@ -156,13 +157,13 @@ void FileMonitor::Impl::monitorFile()
{ {
bool changed = false; bool changed = false;
if (!fs::exists(filename_)) { if (!fs::exists(filename_.toFilesystemEncoding())) {
changed = timestamp_ || checksum_; changed = timestamp_ || checksum_;
timestamp_ = 0; timestamp_ = 0;
checksum_ = 0; checksum_ = 0;
} else { } else {
time_t const new_timestamp = fs::last_write_time(filename_); time_t const new_timestamp = fs::last_write_time(filename_.toFilesystemEncoding());
if (new_timestamp != timestamp_) { if (new_timestamp != timestamp_) {
timestamp_ = new_timestamp; timestamp_ = new_timestamp;

View File

@ -22,21 +22,23 @@
namespace lyx { namespace lyx {
namespace support { namespace support {
class FileName;
class FileMonitor : boost::noncopyable { class FileMonitor : boost::noncopyable {
public: public:
/** Once monitoring begins, the file will be monitored every /** Once monitoring begins, the file will be monitored every
* interval ms. * interval ms.
*/ */
FileMonitor(std::string const & file_with_path, int interval); FileMonitor(FileName const & file_with_path, int interval);
/// Define an empty d-tor out-of-line to keep boost::scoped_ptr happy. /// Define an empty d-tor out-of-line to keep boost::scoped_ptr happy.
~FileMonitor(); ~FileMonitor();
/// ///
void reset(std::string const & file_with_path) const; void reset(FileName const & file_with_path) const;
/// ///
std::string const & filename() const; FileName const & filename() const;
/// Begin monitoring the file /// Begin monitoring the file
void start() const; void start() const;

View File

@ -12,6 +12,8 @@
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/filename.h"
namespace lyx { namespace lyx {
@ -23,12 +25,12 @@ namespace lyx {
# include <windows.h> # include <windows.h>
#endif #endif
int lyx::support::chdir(std::string const & name) int support::chdir(FileName const & name)
{ {
#ifdef _WIN32 #ifdef _WIN32
return SetCurrentDirectory(name.c_str()) != 0 ? 0 : -1; return SetCurrentDirectory(name.toFilesystemEncoding().c_str()) != 0 ? 0 : -1;
#else #else
return ::chdir(name.c_str()); return ::chdir(name.toFilesystemEncoding().c_str());
#endif #endif
} }

View File

@ -12,6 +12,7 @@
#include <fstream> #include <fstream>
#include "support/filename.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#ifdef HAVE_SYS_STAT_H #ifdef HAVE_SYS_STAT_H
@ -31,10 +32,10 @@ using std::ios;
using std::string; using std::string;
bool lyx::support::chmod(string const & file, unsigned long int mode) bool lyx::support::chmod(FileName const & file, unsigned long int mode)
{ {
#if defined (HAVE_CHMOD) && defined (HAVE_MODE_T) #if defined (HAVE_CHMOD) && defined (HAVE_MODE_T)
if (::chmod(file.c_str(), mode_t(mode)) != 0) if (::chmod(file.toFilesystemEncoding().c_str(), mode_t(mode)) != 0)
return false; return false;
#else #else
# ifdef WITH_WARNINGS # ifdef WITH_WARNINGS
@ -45,14 +46,14 @@ bool lyx::support::chmod(string const & file, unsigned long int mode)
} }
bool lyx::support::copy(string const & from, string const & to, unsigned long int mode) bool lyx::support::copy(FileName const & from, FileName const & to, unsigned long int mode)
{ {
ifstream ifs(from.c_str(), ios::binary | ios::in); ifstream ifs(from.toFilesystemEncoding().c_str(), ios::binary | ios::in);
if (!ifs) if (!ifs)
return false; return false;
if (mode != (unsigned long int)-1) { if (mode != (unsigned long int)-1) {
ofstream ofs(to.c_str(), ios::binary | ios::out | ios::trunc); ofstream ofs(to.toFilesystemEncoding().c_str(), ios::binary | ios::out | ios::trunc);
if (!ofs) if (!ofs)
return false; return false;
ofs.close(); ofs.close();
@ -60,7 +61,7 @@ bool lyx::support::copy(string const & from, string const & to, unsigned long in
return false; return false;
} }
ofstream ofs(to.c_str(), ios::binary | ios::out | ios::trunc); ofstream ofs(to.toFilesystemEncoding().c_str(), ios::binary | ios::out | ios::trunc);
if (!ofs) if (!ofs)
return false; return false;

View File

@ -34,6 +34,10 @@ FileName::FileName()
{} {}
FileName::~FileName()
{}
FileName::FileName(string const & abs_filename) FileName::FileName(string const & abs_filename)
: name_(abs_filename) : name_(abs_filename)
{ {
@ -41,6 +45,26 @@ FileName::FileName(string const & abs_filename)
} }
void FileName::set(string const & name)
{
name_ = name;
BOOST_ASSERT(absolutePath(name_));
}
void FileName::erase()
{
name_.erase();
}
string const FileName::toFilesystemEncoding() const
{
// FIXME UNICODE: correct encoding not implemented yet
return name_;
}
bool operator==(FileName const & lhs, FileName const & rhs) bool operator==(FileName const & lhs, FileName const & rhs)
{ {
return lhs.absFilename() == rhs.absFilename(); return lhs.absFilename() == rhs.absFilename();
@ -53,6 +77,24 @@ bool operator!=(FileName const & lhs, FileName const & rhs)
} }
bool operator<(FileName const & lhs, FileName const & rhs)
{
return lhs.absFilename() < rhs.absFilename();
}
bool operator>(FileName const & lhs, FileName const & rhs)
{
return lhs.absFilename() > rhs.absFilename();
}
std::ostream & operator<<(std::ostream & os, FileName const & filename)
{
return os << filename.absFilename();
}
DocFileName::DocFileName() DocFileName::DocFileName()
: save_abs_path_(true) : save_abs_path_(true)
{} {}
@ -149,7 +191,7 @@ string const DocFileName::mangledFilename(std::string const & dir) const
bool DocFileName::isZipped() const bool DocFileName::isZipped() const
{ {
if (!zipped_valid_) { if (!zipped_valid_) {
zipped_ = zippedFile(name_); zipped_ = zippedFile(*this);
zipped_valid_ = true; zipped_valid_ = true;
} }
return zipped_; return zipped_;

View File

@ -25,18 +25,27 @@ namespace support {
* The file may or may not exist. * The file may or may not exist.
*/ */
class FileName { class FileName {
protected:
/// Constructor for empty filenames (only needed for DocFileName)
FileName();
public: public:
/// Constructor for empty filenames
FileName();
/** Constructor for nonempty filenames. /** Constructor for nonempty filenames.
* explicit because we don't want implicit conversion of relative
* paths in function arguments (e.g. of unlink).
* \param abs_filename the file in question. Must have an absolute path. * \param abs_filename the file in question. Must have an absolute path.
*/ */
FileName(std::string const & abs_filename); explicit FileName(std::string const & abs_filename);
virtual ~FileName();
virtual void set(std::string const & filename);
virtual void erase();
/// Is this filename empty? /// Is this filename empty?
bool empty() const { return name_.empty(); } bool empty() const { return name_.empty(); }
/// get the absolute file name /// get the absolute file name
std::string const absFilename() const { return name_; } std::string const absFilename() const { return name_; }
/**
* Get the file name in the encoding used by the file system.
* Only use this for accessing the file, e.g. with an fstream.
*/
std::string const toFilesystemEncoding() const;
protected: protected:
/// The absolute file name. /// The absolute file name.
/// The encoding is currently unspecified, anything else than ASCII /// The encoding is currently unspecified, anything else than ASCII
@ -47,6 +56,9 @@ protected:
bool operator==(FileName const &, FileName const &); bool operator==(FileName const &, FileName const &);
bool operator!=(FileName const &, FileName const &); bool operator!=(FileName const &, FileName const &);
bool operator<(FileName const &, FileName const &);
bool operator>(FileName const &, FileName const &);
std::ostream & operator<<(std::ostream &, FileName const &);
/** /**

View File

@ -156,9 +156,9 @@ string const quoteName(string const & name, quote_style style)
} }
// Is a file readable ? bool isFileReadable(FileName const & filename)
bool isFileReadable(string const & path)
{ {
std::string const path = filename.toFilesystemEncoding();
return fs::exists(path) && !fs::is_directory(path) && fs::is_readable(path); return fs::exists(path) && !fs::is_directory(path) && fs::is_readable(path);
} }
@ -174,7 +174,7 @@ bool isDirWriteable(string const & path)
if (tmpfl.empty()) if (tmpfl.empty())
return false; return false;
unlink(tmpfl); unlink(FileName(tmpfl));
return true; return true;
} }
@ -184,10 +184,10 @@ bool isDirWriteable(string const & path)
// If path entry begins with $$LyX/, use system_lyxdir // If path entry begins with $$LyX/, use system_lyxdir
// If path entry begins with $$User/, use user_lyxdir // If path entry begins with $$User/, use user_lyxdir
// Example: "$$User/doc;$$LyX/doc" // Example: "$$User/doc;$$LyX/doc"
string const fileOpenSearch(string const & path, string const & name, FileName const fileOpenSearch(string const & path, string const & name,
string const & ext) string const & ext)
{ {
string real_file; FileName real_file;
string path_element; string path_element;
bool notfound = true; bool notfound = true;
string tmppath = split(path, path_element, ';'); string tmppath = split(path, path_element, ';');
@ -247,22 +247,20 @@ vector<string> const dirList(string const & dir, string const & ext)
// Returns the real name of file name in directory path, with optional // Returns the real name of file name in directory path, with optional
// extension ext. // extension ext.
string const fileSearch(string const & path, string const & name, FileName const fileSearch(string const & path, string const & name,
string const & ext) string const & ext)
{ {
// if `name' is an absolute path, we ignore the setting of `path' // if `name' is an absolute path, we ignore the setting of `path'
// Expand Environmentvariables in 'name' // Expand Environmentvariables in 'name'
string const tmpname = replaceEnvironmentPath(name); string const tmpname = replaceEnvironmentPath(name);
string fullname = makeAbsPath(tmpname, path); FileName fullname(makeAbsPath(tmpname, path));
// search first without extension, then with it. // search first without extension, then with it.
if (isFileReadable(fullname)) if (isFileReadable(fullname))
return fullname; return fullname;
if (ext.empty()) if (ext.empty())
return string(); return FileName();
// Is it not more reasonable to use ChangeExtension()? (SMiyata) fullname = FileName(changeExtension(fullname.absFilename(), ext));
fullname += '.'; return isFileReadable(fullname) ? fullname : FileName();
fullname += ext;
return isFileReadable(fullname) ? fullname : string();
} }
@ -270,10 +268,10 @@ string const fileSearch(string const & path, string const & name,
// 1) user_lyxdir // 1) user_lyxdir
// 2) build_lyxdir (if not empty) // 2) build_lyxdir (if not empty)
// 3) system_lyxdir // 3) system_lyxdir
string const libFileSearch(string const & dir, string const & name, FileName const libFileSearch(string const & dir, string const & name,
string const & ext) string const & ext)
{ {
string fullname = fileSearch(addPath(package().user_support(), dir), FileName fullname = fileSearch(addPath(package().user_support(), dir),
name, ext); name, ext);
if (!fullname.empty()) if (!fullname.empty())
return fullname; return fullname;
@ -288,7 +286,7 @@ string const libFileSearch(string const & dir, string const & name,
} }
string const i18nLibFileSearch(string const & dir, string const & name, FileName const i18nLibFileSearch(string const & dir, string const & name,
string const & ext) string const & ext)
{ {
// the following comments are from intl/dcigettext.c. We try // the following comments are from intl/dcigettext.c. We try
@ -316,7 +314,7 @@ string const i18nLibFileSearch(string const & dir, string const & name,
string l; string l;
lang = split(lang, l, ':'); lang = split(lang, l, ':');
while (!l.empty() && l != "C" && l != "POSIX") { while (!l.empty() && l != "C" && l != "POSIX") {
string const tmp = libFileSearch(dir, FileName const tmp = libFileSearch(dir,
token(l, '_', 0) + '_' + name, token(l, '_', 0) + '_' + name,
ext); ext);
if (!tmp.empty()) if (!tmp.empty())
@ -346,7 +344,7 @@ string const libScriptSearch(string const & command_in, quote_style style)
// Does this script file exist? // Does this script file exist?
string const script = string const script =
libFileSearch(".", command.substr(start_script, size_script)); libFileSearch(".", command.substr(start_script, size_script)).absFilename();
if (script.empty()) { if (script.empty()) {
// Replace "$$s/" with "" // Replace "$$s/" with ""
@ -363,26 +361,26 @@ string const libScriptSearch(string const & command_in, quote_style style)
namespace { namespace {
string const createTmpDir(string const & tempdir, string const & mask) FileName const createTmpDir(FileName const & tempdir, string const & mask)
{ {
lyxerr[Debug::FILES] lyxerr[Debug::FILES]
<< "createTmpDir: tempdir=`" << tempdir << "'\n" << "createTmpDir: tempdir=`" << tempdir << "'\n"
<< "createTmpDir: mask=`" << mask << '\'' << endl; << "createTmpDir: mask=`" << mask << '\'' << endl;
string const tmpfl = tempName(tempdir, mask); string const tmpfl = tempName(tempdir.absFilename(), mask);
// lyx::tempName actually creates a file to make sure that it // lyx::tempName actually creates a file to make sure that it
// stays unique. So we have to delete it before we can create // stays unique. So we have to delete it before we can create
// a dir with the same name. Note also that we are not thread // a dir with the same name. Note also that we are not thread
// safe because of the gap between unlink and mkdir. (Lgb) // safe because of the gap between unlink and mkdir. (Lgb)
unlink(tmpfl); unlink(FileName(tmpfl));
if (tmpfl.empty() || mkdir(tmpfl, 0700)) { if (tmpfl.empty() || mkdir(FileName(tmpfl), 0700)) {
lyxerr << "LyX could not create the temporary directory '" lyxerr << "LyX could not create the temporary directory '"
<< tmpfl << "'" << endl; << tmpfl << "'" << endl;
return string(); return FileName();
} }
return makeAbsPath(tmpfl); return FileName(tmpfl);
} }
} // namespace anon } // namespace anon
@ -409,7 +407,7 @@ string const createBufferTmpDir()
package().temp_dir() + "/lyx_tmpbuf" + package().temp_dir() + "/lyx_tmpbuf" +
convert<string>(count++); convert<string>(count++);
if (mkdir(tmpfl, 0777)) { if (mkdir(FileName(tmpfl), 0777)) {
lyxerr << "LyX could not create the temporary directory '" lyxerr << "LyX could not create the temporary directory '"
<< tmpfl << "'" << endl; << tmpfl << "'" << endl;
return string(); return string();
@ -418,23 +416,23 @@ string const createBufferTmpDir()
} }
string const createLyXTmpDir(string const & deflt) FileName const createLyXTmpDir(FileName const & deflt)
{ {
if (!deflt.empty() && deflt != "/tmp") { if (!deflt.empty() && deflt.absFilename() != "/tmp") {
if (mkdir(deflt, 0777)) { if (mkdir(deflt, 0777)) {
if (isDirWriteable(deflt)) { if (isDirWriteable(deflt.absFilename())) {
// deflt could not be created because it // deflt could not be created because it
// did exist already, so let's create our own // did exist already, so let's create our own
// dir inside deflt. // dir inside deflt.
return createTmpDir(deflt, "lyx_tmpdir"); return createTmpDir(deflt, "lyx_tmpdir");
} else { } else {
// some other error occured. // some other error occured.
return createTmpDir("/tmp", "lyx_tmpdir"); return createTmpDir(FileName("/tmp"), "lyx_tmpdir");
} }
} else } else
return deflt; return deflt;
} else { } else {
return createTmpDir("/tmp", "lyx_tmpdir"); return createTmpDir(FileName("/tmp"), "lyx_tmpdir");
} }
} }
@ -443,7 +441,7 @@ bool createDirectory(string const & path, int permission)
{ {
string temp = rtrim(os::internal_path(path), "/"); string temp = rtrim(os::internal_path(path), "/");
BOOST_ASSERT(!temp.empty()); BOOST_ASSERT(!temp.empty());
return mkdir(temp, permission) == 0; return mkdir(FileName(temp), permission) == 0;
} }
@ -608,10 +606,11 @@ string const normalizePath(string const & path)
} }
string const getFileContents(string const & fname) string const getFileContents(FileName const & fname)
{ {
if (fs::exists(fname)) { string const encodedname = fname.toFilesystemEncoding();
ifstream ifs(fname.c_str()); if (fs::exists(encodedname)) {
ifstream ifs(encodedname.c_str());
ostringstream ofs; ostringstream ofs;
if (ifs && ofs) { if (ifs && ofs) {
ofs << ifs.rdbuf(); ofs << ifs.rdbuf();
@ -790,13 +789,13 @@ string const getExtension(string const & name)
// ZIP PK... http://www.halyava.ru/document/ind_arch.htm // ZIP PK... http://www.halyava.ru/document/ind_arch.htm
// Z \037\235 UNIX compress // Z \037\235 UNIX compress
string const getFormatFromContents(string const & filename) string const getFormatFromContents(FileName const & filename)
{ {
// paranoia check // paranoia check
if (filename.empty() || !isFileReadable(filename)) if (filename.empty() || !isFileReadable(filename))
return string(); return string();
ifstream ifs(filename.c_str()); ifstream ifs(filename.toFilesystemEncoding().c_str());
if (!ifs) if (!ifs)
// Couldn't open file... // Couldn't open file...
return string(); return string();
@ -943,7 +942,7 @@ string const getFormatFromContents(string const & filename)
/// check for zipped file /// check for zipped file
bool zippedFile(string const & name) bool zippedFile(FileName const & name)
{ {
string const type = getFormatFromContents(name); string const type = getFormatFromContents(name);
if (contains("gzip zip compress", type) && !type.empty()) if (contains("gzip zip compress", type) && !type.empty())
@ -961,12 +960,15 @@ string const unzippedFileName(string const & zipped_file)
} }
string const unzipFile(string const & zipped_file, string const & unzipped_file) FileName const unzipFile(FileName const & zipped_file, string const & unzipped_file)
{ {
string const tempfile = unzipped_file.empty() ? FileName const tempfile = FileName(unzipped_file.empty() ?
unzippedFileName(zipped_file) : unzipped_file; unzippedFileName(zipped_file.toFilesystemEncoding()) :
unzipped_file);
// Run gunzip // Run gunzip
string const command = "gunzip -c " + zipped_file + " > " + tempfile; string const command = "gunzip -c " +
zipped_file.toFilesystemEncoding() + " > " +
tempfile.toFilesystemEncoding();
Systemcall one; Systemcall one;
one.startscript(Systemcall::Wait, command); one.startscript(Systemcall::Wait, command);
// test that command was executed successfully (anon) // test that command was executed successfully (anon)
@ -1135,12 +1137,13 @@ void removeAutosaveFile(string const & filename)
a += '#'; a += '#';
a += onlyFilename(filename); a += onlyFilename(filename);
a += '#'; a += '#';
if (fs::exists(a)) FileName const autosave(a);
unlink(a); if (fs::exists(autosave.toFilesystemEncoding()))
unlink(autosave);
} }
void readBB_lyxerrMessage(string const & file, bool & zipped, void readBB_lyxerrMessage(FileName const & file, bool & zipped,
string const & message) string const & message)
{ {
lyxerr[Debug::GRAPHICS] << "[readBB_from_PSFile] " lyxerr[Debug::GRAPHICS] << "[readBB_from_PSFile] "
@ -1153,7 +1156,7 @@ void readBB_lyxerrMessage(string const & file, bool & zipped,
} }
string const readBB_from_PSFile(string const & file) string const readBB_from_PSFile(FileName const & file)
{ {
// in a (e)ps-file it's an entry like %%BoundingBox:23 45 321 345 // in a (e)ps-file it's an entry like %%BoundingBox:23 45 321 345
// It seems that every command in the header has an own line, // It seems that every command in the header has an own line,
@ -1163,7 +1166,7 @@ string const readBB_from_PSFile(string const & file)
// %%BoundingBox: (atend) // %%BoundingBox: (atend)
// In this case we must check the end. // In this case we must check the end.
bool zipped = zippedFile(file); bool zipped = zippedFile(file);
string const file_ = zipped ? unzipFile(file) : file; FileName const file_ = zipped ? unzipFile(file) : file;
string const format = getFormatFromContents(file_); string const format = getFormatFromContents(file_);
if (format != "eps" && format != "ps") { if (format != "eps" && format != "ps") {
@ -1173,7 +1176,7 @@ string const readBB_from_PSFile(string const & file)
static boost::regex bbox_re( static boost::regex bbox_re(
"^%%BoundingBox:\\s*([[:digit:]]+)\\s+([[:digit:]]+)\\s+([[:digit:]]+)\\s+([[:digit:]]+)"); "^%%BoundingBox:\\s*([[:digit:]]+)\\s+([[:digit:]]+)\\s+([[:digit:]]+)\\s+([[:digit:]]+)");
std::ifstream is(file_.c_str()); std::ifstream is(file_.toFilesystemEncoding().c_str());
while (is) { while (is) {
string s; string s;
getline(is,s); getline(is,s);
@ -1196,14 +1199,13 @@ string const readBB_from_PSFile(string const & file)
} }
int compare_timestamps(string const & file1, string const & file2) int compare_timestamps(FileName const & filename1, FileName const & filename2)
{ {
BOOST_ASSERT(absolutePath(file1));
BOOST_ASSERT(absolutePath(file2));
// If the original is newer than the copy, then copy the original // If the original is newer than the copy, then copy the original
// to the new directory. // to the new directory.
string const file1 = filename1.toFilesystemEncoding();
string const file2 = filename2.toFilesystemEncoding();
int cmp = 0; int cmp = 0;
if (fs::exists(file1) && fs::exists(file2)) { if (fs::exists(file1) && fs::exists(file2)) {
double const tmp = difftime(fs::last_write_time(file1), double const tmp = difftime(fs::last_write_time(file1),

View File

@ -13,6 +13,7 @@
#define LYX_FILETOOL_H #define LYX_FILETOOL_H
#include "support/docstring.h" #include "support/docstring.h"
#include "support/filename.h"
#include <vector> #include <vector>
#include <utility> #include <utility>
@ -36,7 +37,7 @@ bool createDirectory(std::string const & name, int permissions);
created and used as the temporary directory. created and used as the temporary directory.
\return the tmp dir name or string() if something went wrong. \return the tmp dir name or string() if something went wrong.
*/ */
std::string const createLyXTmpDir(std::string const & deflt); FileName const createLyXTmpDir(FileName const & deflt);
/** Find file by searching several directories. /** Find file by searching several directories.
Uses a string of paths separated by ";"s to find a file to open. Uses a string of paths separated by ";"s to find a file to open.
@ -45,7 +46,7 @@ std::string const createLyXTmpDir(std::string const & deflt);
If path entry begins with $$User/, use user_lyxdir. If path entry begins with $$User/, use user_lyxdir.
Example: "$$User/doc;$$LyX/doc". Example: "$$User/doc;$$LyX/doc".
*/ */
std::string const fileOpenSearch(std::string const & path, FileName const fileOpenSearch(std::string const & path,
std::string const & name, std::string const & name,
std::string const & ext = std::string()); std::string const & ext = std::string());
@ -54,7 +55,7 @@ std::string const fileOpenSearch(std::string const & path,
The file is searched in the given path (unless it is an absolute The file is searched in the given path (unless it is an absolute
file name), first directly, and then with extension .ext (if given). file name), first directly, and then with extension .ext (if given).
*/ */
std::string const fileSearch(std::string const & path, FileName const fileSearch(std::string const & path,
std::string const & name, std::string const & name,
std::string const & ext = std::string()); std::string const & ext = std::string());
@ -72,7 +73,7 @@ bool isDirWriteable(std::string const & path);
/** Is a file readable ? /** Is a file readable ?
Returns true if the file `path' is readable. Returns true if the file `path' is readable.
*/ */
bool isFileReadable (std::string const & path); bool isFileReadable(FileName const & path);
/// ///
bool isLyXFilename(std::string const & filename); bool isLyXFilename(std::string const & filename);
@ -87,7 +88,7 @@ bool isSGMLFilename(std::string const & filename);
-# system_lyxdir -# system_lyxdir
The third parameter `ext' is optional. The third parameter `ext' is optional.
*/ */
std::string const libFileSearch(std::string const & dir, FileName const libFileSearch(std::string const & dir,
std::string const & name, std::string const & name,
std::string const & ext = std::string()); std::string const & ext = std::string());
@ -95,7 +96,7 @@ std::string const libFileSearch(std::string const & dir,
internationalized version of the file by prepending $LANG_ to the internationalized version of the file by prepending $LANG_ to the
name name
*/ */
std::string const FileName const
i18nLibFileSearch(std::string const & dir, i18nLibFileSearch(std::string const & dir,
std::string const & name, std::string const & name,
std::string const & ext = std::string()); std::string const & ext = std::string());
@ -186,10 +187,10 @@ std::string const getExtension(std::string const & name);
Normally you don't want to use this directly, but rather Normally you don't want to use this directly, but rather
Formats::getFormatFromFile(). Formats::getFormatFromFile().
*/ */
std::string const getFormatFromContents(std::string const & name); std::string const getFormatFromContents(FileName const & name);
/// check for zipped file /// check for zipped file
bool zippedFile(std::string const & name); bool zippedFile(FileName const & name);
/** \return the name that LyX will give to the unzipped file \p zipped_file /** \return the name that LyX will give to the unzipped file \p zipped_file
if the second argument of unzipFile() is empty. if the second argument of unzipFile() is empty.
@ -201,8 +202,8 @@ std::string const unzippedFileName(std::string const & zipped_file);
empty, and unzippedFileName(\p zipped_file) otherwise. empty, and unzippedFileName(\p zipped_file) otherwise.
Will overwrite an already existing unzipped file without warning. Will overwrite an already existing unzipped file without warning.
*/ */
std::string const unzipFile(std::string const & zipped_file, FileName const unzipFile(FileName const & zipped_file,
std::string const & unzipped_file = std::string()); std::string const & unzipped_file = std::string());
/// Returns true is path is absolute /// Returns true is path is absolute
bool absolutePath(std::string const & path); bool absolutePath(std::string const & path);
@ -245,7 +246,7 @@ std::string const normalizePath(std::string const & path);
std::string const onlyFilename(std::string const & fname); std::string const onlyFilename(std::string const & fname);
/// Get the contents of a file as a huge std::string /// Get the contents of a file as a huge std::string
std::string const getFileContents(std::string const & fname); std::string const getFileContents(FileName const & fname);
/** Check and Replace Environmentvariables ${NAME} in Path. /** Check and Replace Environmentvariables ${NAME} in Path.
Replaces all occurences of these, if they are found in the Replaces all occurences of these, if they are found in the
@ -269,7 +270,7 @@ std::string const findtexfile(std::string const & fil,
void removeAutosaveFile(std::string const & filename); void removeAutosaveFile(std::string const & filename);
/// read the BoundingBox entry from a ps/eps/pdf-file /// read the BoundingBox entry from a ps/eps/pdf-file
std::string const readBB_from_PSFile(std::string const & file); std::string const readBB_from_PSFile(FileName const & file);
/** \param file1, file2 the two files to be compared. Must have absolute paths. /** \param file1, file2 the two files to be compared. Must have absolute paths.
* \returns 1 if \c file1 has a more recent timestamp than \c file2, * \returns 1 if \c file1 has a more recent timestamp than \c file2,
@ -278,7 +279,7 @@ std::string const readBB_from_PSFile(std::string const & file);
* If one of the files does not exist, the return value indicates the file * If one of the files does not exist, the return value indicates the file
* which does exist. Eg, if \c file1 exists but \c file2 does not, return 1. * which does exist. Eg, if \c file1 exists but \c file2 does not, return 1.
*/ */
int compare_timestamps(std::string const & file1, std::string const & file2); int compare_timestamps(FileName const & file1, FileName const & file2);
typedef std::pair<int, std::string> cmd_ret; typedef std::pair<int, std::string> cmd_ret;

View File

@ -21,30 +21,32 @@
namespace lyx { namespace lyx {
namespace support { namespace support {
class FileName;
/// get the current working directory /// get the current working directory
std::string const getcwd(); std::string const getcwd();
/// change to a directory, 0 is returned on success. /// change to a directory, 0 is returned on success.
int chdir(std::string const & name); int chdir(FileName const & name);
/// Change file permissions /// Change file permissions
bool chmod(std::string const & file, unsigned long int mode); bool chmod(FileName const & file, unsigned long int mode);
/** /**
* rename a file, returns false if it fails. * rename a file, returns false if it fails.
* It can handle renames across partitions. * It can handle renames across partitions.
*/ */
bool rename(std::string const & from, std::string const & to); bool rename(FileName const & from, FileName const & to);
/// copy a file, returns false it it fails /// copy a file, returns false it it fails
bool copy(std::string const & from, std::string const & to, bool copy(FileName const & from, FileName const & to,
unsigned long int mode = (unsigned long int)-1); unsigned long int mode = (unsigned long int)-1);
/// generates a checksum of a file /// generates a checksum of a file
unsigned long sum(std::string const & file); unsigned long sum(FileName const & file);
/// FIXME: some point to this hmm ? /// FIXME: some point to this hmm ?
int kill(int pid, int sig); int kill(int pid, int sig);
/// FIXME: same here /// FIXME: same here
void abort(); void abort();
/// create the given directory with the given mode /// create the given directory with the given mode
int mkdir(std::string const & pathname, unsigned long int mode); int mkdir(FileName const & pathname, unsigned long int mode);
/// unlink the given file /// unlink the given file
int unlink(std::string const & file); int unlink(FileName const & file);
/// (securely) create a temporary file in the given dir with the given prefix /// (securely) create a temporary file in the given dir with the given prefix
std::string const tempName(std::string const & dir = std::string(), std::string const tempName(std::string const & dir = std::string(),
std::string const & mask = std::string()); std::string const & mask = std::string());

View File

@ -14,6 +14,8 @@
#include "debug.h" #include "debug.h"
#include "support/filename.h"
#include <boost/crc.hpp> #include <boost/crc.hpp>
#include <algorithm> #include <algorithm>
@ -54,13 +56,14 @@ template struct boost::detail::crc_table_t<32, 0x04C11DB7, true>;
namespace lyx { namespace lyx {
namespace support {
unsigned long support::sum(string const & file) unsigned long sum(FileName const & file)
{ {
lyxerr[Debug::FILES] << "lyx::sum() using mmap (lightning fast)" lyxerr[Debug::FILES] << "lyx::sum() using mmap (lightning fast)"
<< endl; << endl;
int fd = open(file.c_str(), O_RDONLY); int fd = open(file.toFilesystemEncoding().c_str(), O_RDONLY);
if (!fd) if (!fd)
return 0; return 0;
@ -88,6 +91,7 @@ unsigned long support::sum(string const & file)
return result; return result;
} }
} // namespace support
} // namespace lyx } // namespace lyx
#else // No mmap #else // No mmap
@ -111,17 +115,18 @@ unsigned long do_crc(InputIterator first, InputIterator last)
namespace lyx { namespace lyx {
namespace support {
using std::ifstream; using std::ifstream;
#if HAVE_DECL_ISTREAMBUF_ITERATOR #if HAVE_DECL_ISTREAMBUF_ITERATOR
using std::istreambuf_iterator; using std::istreambuf_iterator;
unsigned long support::sum(string const & file) unsigned long sum(FileName const & file)
{ {
lyxerr[Debug::FILES] << "lyx::sum() using istreambuf_iterator (fast)" lyxerr[Debug::FILES] << "lyx::sum() using istreambuf_iterator (fast)"
<< endl; << endl;
ifstream ifs(file.c_str()); ifstream ifs(file.toFilesystemEncoding().c_str());
if (!ifs) return 0; if (!ifs) return 0;
istreambuf_iterator<char> beg(ifs); istreambuf_iterator<char> beg(ifs);
@ -134,13 +139,13 @@ unsigned long support::sum(string const & file)
using std::istream_iterator; using std::istream_iterator;
using std::ios; using std::ios;
unsigned long support::sum(string const & file) unsigned long sum(FileName const & file)
{ {
lyxerr[Debug::FILES] lyxerr[Debug::FILES]
<< "lyx::sum() using istream_iterator (slow as a snail)" << "lyx::sum() using istream_iterator (slow as a snail)"
<< endl; << endl;
ifstream ifs(file.c_str()); ifstream ifs(file.toFilesystemEncoding().c_str());
if (!ifs) return 0; if (!ifs) return 0;
ifs.unsetf(ios::skipws); ifs.unsetf(ios::skipws);
@ -151,6 +156,7 @@ unsigned long support::sum(string const & file)
} }
#endif #endif
} // namespace support
} // namespace lyx } // namespace lyx
#endif // mmap #endif // mmap

View File

@ -11,6 +11,7 @@
#include <config.h> #include <config.h>
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/filename.h"
#ifdef HAVE_SYS_STAT_H #ifdef HAVE_SYS_STAT_H
# include <sys/stat.h> # include <sys/stat.h>
@ -30,30 +31,31 @@
#endif #endif
namespace lyx { namespace lyx {
namespace support {
int lyx::support::mkdir(std::string const & pathname, unsigned long int mode) int mkdir(FileName const & pathname, unsigned long int mode)
{ {
// FIXME: why don't we have mode_t in lyx::mkdir prototype ?? // FIXME: why don't we have mode_t in lyx::mkdir prototype ??
#if HAVE_MKDIR #if HAVE_MKDIR
# if MKDIR_TAKES_ONE_ARG # if MKDIR_TAKES_ONE_ARG
// MinGW32 // MinGW32
return ::mkdir(pathname.c_str()); return ::mkdir(pathname.toFilesystemEncoding().c_str());
# ifdef WITH_WARNINGS # ifdef WITH_WARNINGS
# warning "Permissions of created directories are ignored on this system." # warning "Permissions of created directories are ignored on this system."
# endif # endif
# else # else
// POSIX // POSIX
return ::mkdir(pathname.c_str(), mode_t(mode)); return ::mkdir(pathname.toFilesystemEncoding().c_str(), mode_t(mode));
# endif # endif
#elif defined(_WIN32) #elif defined(_WIN32)
// plain Windows 32 // plain Windows 32
return CreateDirectory(pathname.c_str(), 0) != 0 ? 0 : -1; return CreateDirectory(pathname.toFilesystemEncoding().c_str(), 0) != 0 ? 0 : -1;
# ifdef WITH_WARNINGS # ifdef WITH_WARNINGS
# warning "Permissions of created directories are ignored on this system." # warning "Permissions of created directories are ignored on this system."
# endif # endif
#elif HAVE__MKDIR #elif HAVE__MKDIR
return ::_mkdir(pathname.c_str()); return ::_mkdir(pathname.toFilesystemEncoding().c_str());
# ifdef WITH_WARNINGS # ifdef WITH_WARNINGS
# warning "Permissions of created directories are ignored on this system." # warning "Permissions of created directories are ignored on this system."
# endif # endif
@ -63,4 +65,5 @@ int lyx::support::mkdir(std::string const & pathname, unsigned long int mode)
} }
} // namespace support
} // namespace lyx } // namespace lyx

View File

@ -642,7 +642,7 @@ bool check_command_line_dir(string const & dir,
string const & file, string const & file,
string const & command_line_switch) string const & command_line_switch)
{ {
string const abs_path = fileSearch(dir, file); FileName const abs_path = fileSearch(dir, file);
if (abs_path.empty()) { if (abs_path.empty()) {
// FIXME UNICODE // FIXME UNICODE
lyxerr << lyx::to_utf8(bformat(_("Invalid %1$s switch.\n" lyxerr << lyx::to_utf8(bformat(_("Invalid %1$s switch.\n"
@ -670,7 +670,7 @@ bool check_env_var_dir(string const & dir,
string const & file, string const & file,
string const & env_var) string const & env_var)
{ {
string const abs_path = fileSearch(dir, file); FileName const abs_path = fileSearch(dir, file);
if (abs_path.empty()) { if (abs_path.empty()) {
// FIXME UNICODE // FIXME UNICODE
lyxerr << lyx::to_utf8(bformat(_("Invalid %1$s environment variable.\n" lyxerr << lyx::to_utf8(bformat(_("Invalid %1$s environment variable.\n"

View File

@ -14,6 +14,7 @@
#define PATH_C #define PATH_C
#include "support/path.h" #include "support/path.h"
#include "support/filename.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
@ -29,7 +30,7 @@ Path::Path(string const & path)
if (!path.empty()) { if (!path.empty()) {
pushedDir_ = getcwd(); pushedDir_ = getcwd();
if (pushedDir_.empty() || chdir(path)) { if (pushedDir_.empty() || chdir(FileName(path))) {
/* FIXME: throw */ /* FIXME: throw */
} }
} else { } else {
@ -52,7 +53,7 @@ int Path::pop()
return 0; return 0;
} }
if (chdir(pushedDir_)) { if (chdir(FileName(pushedDir_))) {
// should throw an exception // should throw an exception
// throw DirChangeError(); // throw DirChangeError();
} }

View File

@ -11,19 +11,21 @@
#include <config.h> #include <config.h>
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/filename.h"
#include <cstdio> #include <cstdio>
namespace lyx { namespace lyx {
namespace support {
using std::string; using std::string;
bool lyx::support::rename(string const & from, string const & to) bool rename(FileName const & from, FileName const & to)
{ {
if (::rename(from.c_str(), to.c_str()) == -1) if (::rename(from.toFilesystemEncoding().c_str(), to.toFilesystemEncoding().c_str()) == -1)
if (copy(from, to)) { if (copy(from, to)) {
unlink(from); unlink(from);
return true; return true;
@ -33,4 +35,5 @@ bool lyx::support::rename(string const & from, string const & to)
} }
} // namespace support
} // namespace lyx } // namespace lyx

View File

@ -11,6 +11,7 @@
#include <config.h> #include <config.h>
#include "support/socktools.h" #include "support/socktools.h"
#include "support/filename.h"
#if !defined (HAVE_FCNTL) #if !defined (HAVE_FCNTL)
// We provide stubs because we don't (yet?) support the native OS API. // We provide stubs because we don't (yet?) support the native OS API.
@ -114,7 +115,7 @@ int listen(string const & name, int queue)
lyxerr << "lyx: Could not bind address '" << name lyxerr << "lyx: Could not bind address '" << name
<< "' to socket descriptor: " << strerror(errno) << endl; << "' to socket descriptor: " << strerror(errno) << endl;
::close(fd); ::close(fd);
lyx::support::unlink(name); unlink(FileName(name));
return -1; return -1;
} }
@ -127,7 +128,7 @@ int listen(string const & name, int queue)
lyxerr << "lyx: Could not put socket in 'listen' state: " lyxerr << "lyx: Could not put socket in 'listen' state: "
<< strerror(errno) << endl; << strerror(errno) << endl;
::close(fd); ::close(fd);
lyx::support::unlink(name); unlink(FileName(name));
return -1; return -1;
} }

View File

@ -11,18 +11,21 @@
#include <config.h> #include <config.h>
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/filename.h"
namespace lyx { namespace lyx {
namespace support {
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
# include <unistd.h> # include <unistd.h>
#endif #endif
int lyx::support::unlink(std::string const & pathname) int unlink(FileName const & pathname)
{ {
return ::unlink(pathname.c_str()); return ::unlink(pathname.toFilesystemEncoding().c_str());
} }
} // namespace support
} // namespace lyx } // namespace lyx

Some files were not shown because too many files have changed in this diff Show More