From: Georg Baum Date: Fri, 6 Apr 2007 13:09:54 +0000 (+0000) Subject: Use FileName instead of strings in support::Package. X-Git-Tag: 1.6.10~10320 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=d4e8fdd7039b087a26bd1e15c35d3865a0093879;p=features.git Use FileName instead of strings in support::Package. This fixes some encoding problems, and hopefully also bug 3410. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@17746 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/BufferView.C b/src/BufferView.C index 8a10db7bba..4b288ba7f5 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -1555,7 +1555,7 @@ void BufferView::menuInsertLyXFile(string const & filenm) FileDialog fileDlg(_("Select LyX document to insert"), LFUN_FILE_INSERT, make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)), - make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support(), "examples")))); + make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support().absFilename(), "examples")))); FileDialog::Result result = fileDlg.open(from_utf8(initpath), diff --git a/src/ConverterCache.C b/src/ConverterCache.C index 16a3e7a4cc..19931c2ea7 100644 --- a/src/ConverterCache.C +++ b/src/ConverterCache.C @@ -189,7 +189,7 @@ void ConverterCache::init() return; // We do this here and not in the constructor because package() gets // initialized after all static variables. - cache_dir = FileName(addName(support::package().user_support(), "cache")); + cache_dir = FileName(addName(support::package().user_support().absFilename(), "cache")); if (!fs::exists(cache_dir.toFilesystemEncoding())) if (support::mkdir(cache_dir, 0700) != 0) { lyxerr << "Could not create cache directory `" diff --git a/src/buffer.C b/src/buffer.C index 8db2d6f02d..29383c44c5 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -1142,7 +1142,7 @@ int Buffer::runChktex() string const name = addName(path, getLatexName()); string const org_path = filePath(); - support::Path p(path); // path to LaTeX file + support::Path p(FileName(path)); // path to LaTeX file message(_("Running chktex...")); // Generate the LaTeX file if neccessary diff --git a/src/bufferlist.C b/src/bufferlist.C index f0c1d23f56..11213b7254 100644 --- a/src/bufferlist.C +++ b/src/bufferlist.C @@ -364,7 +364,7 @@ void BufferList::emergencyWrite(Buffer * buf) } // 2) In HOME directory. - string s = addName(package().home_dir(), buf->fileName()); + string s = addName(package().home_dir().absFilename(), buf->fileName()); s += ".emergency"; lyxerr << ' ' << s << endl; if (buf->writeFile(FileName(s))) { @@ -378,7 +378,7 @@ void BufferList::emergencyWrite(Buffer * buf) // 3) In "/tmp" directory. // MakeAbsPath to prepend the current // drive letter on OS/2 - s = addName(package().temp_dir(), buf->fileName()); + s = addName(package().temp_dir().absFilename(), buf->fileName()); s += ".emergency"; lyxerr << ' ' << s << endl; if (buf->writeFile(FileName(s))) { diff --git a/src/client/messages.C b/src/client/messages.C index 6a041298ab..cbec9e8363 100644 --- a/src/client/messages.C +++ b/src/client/messages.C @@ -48,8 +48,8 @@ public: //lyxerr << "Messages: language(" << l // << ") in dir(" << dir << ")" << std::endl; - cat_gl = mssg_gl.open(PACKAGE, loc_gl, - package().locale_dir().c_str()); + string const locale_dir = package().locale_dir().toFilesystemEncoding(); + cat_gl = mssg_gl.open(PACKAGE, loc_gl, locale_dir.c_str()); } @@ -112,14 +112,15 @@ public: // return what we got in. return from_ascii(m); errno = 0; - char const * c = bindtextdomain(PACKAGE, package().locale_dir().c_str()); + string const locale_dir = package().locale_dir().toFilesystemEncoding(); + char const * c = bindtextdomain(PACKAGE, locale_dir.c_str()); int e = errno; if (e) { LYXERR(Debug::DEBUG) << BOOST_CURRENT_FUNCTION << '\n' << "Error code: " << errno << '\n' << "Lang, mess: " << lang_ << " " << m << '\n' - << "Directory : " << package().locale_dir() << '\n' + << "Directory : " << package().locale_dir().absFilename() << '\n' << "Rtn value : " << c << endl; } diff --git a/src/converter.C b/src/converter.C index 11902f1637..3b4ccb6144 100644 --- a/src/converter.C +++ b/src/converter.C @@ -349,7 +349,7 @@ bool Converters::convert(Buffer const * buffer, // generated by the converter are deleted when LyX closes and do not // clutter the real working directory. string path = onlyPath(from_file.absFilename()); - Path p(path); + Path p(FileName(path)); // empty the error list before any new conversion takes place. errorList.clear(); @@ -431,7 +431,7 @@ bool Converters::convert(Buffer const * buffer, Systemcall one; int res; if (conv.original_dir) { - Path p(buffer->filePath()); + Path p(FileName(buffer->filePath())); res = one.startscript(type, to_filesystem8bit(from_utf8(command))); } else diff --git a/src/exporter.C b/src/exporter.C index ee96cee0d1..164a6da9d0 100644 --- a/src/exporter.C +++ b/src/exporter.C @@ -116,7 +116,7 @@ CopyStatus copyFile(string const & format, // overwrite themselves. This check could be changed to // boost::filesystem::equivalent(sourceFile, destFile) if export to // other directories than the document directory is desired. - if (!prefixIs(onlyPath(sourceFile.absFilename()), package().temp_dir())) + if (!prefixIs(onlyPath(sourceFile.absFilename()), package().temp_dir().absFilename())) return ret; if (!force) { diff --git a/src/frontends/controllers/ControlAboutlyx.C b/src/frontends/controllers/ControlAboutlyx.C index d6f9304221..edae750007 100644 --- a/src/frontends/controllers/ControlAboutlyx.C +++ b/src/frontends/controllers/ControlAboutlyx.C @@ -43,7 +43,7 @@ ControlAboutlyx::ControlAboutlyx(Dialog & parent) void ControlAboutlyx::getCredits(ostream & ss) const { - FileName const name = fileSearch(package().system_support(), "CREDITS"); + FileName const name = fileSearch(package().system_support().absFilename(), "CREDITS"); bool found(!name.empty()); @@ -90,10 +90,10 @@ string const ControlAboutlyx::getVersion() const << lyx_release_date << ")\n" << to_utf8(_("Library directory: ")) - << to_utf8(makeDisplayPath(package().system_support())) + << to_utf8(makeDisplayPath(package().system_support().absFilename())) << "\n" << to_utf8(_("User directory: ")) - << to_utf8(makeDisplayPath(package().user_support())); + << to_utf8(makeDisplayPath(package().user_support().absFilename())); return ss.str(); } diff --git a/src/frontends/controllers/ControlGraphics.C b/src/frontends/controllers/ControlGraphics.C index 72ae744b7e..cb9b92e7bf 100644 --- a/src/frontends/controllers/ControlGraphics.C +++ b/src/frontends/controllers/ControlGraphics.C @@ -87,11 +87,11 @@ docstring const ControlGraphics::browse(docstring const & in_name) const docstring const title = _("Select graphics file"); // Does user clipart directory exist? - string clipdir = addName(package().user_support(), "clipart"); + string clipdir = addName(package().user_support().absFilename(), "clipart"); string const encoded_clipdir = FileName(clipdir).toFilesystemEncoding(); if (!(fs::exists(encoded_clipdir) && fs::is_directory(encoded_clipdir))) // No - bail out to system clipart directory - clipdir = addName(package().system_support(), "clipart"); + clipdir = addName(package().system_support().absFilename(), "clipart"); pair dir1(_("Clipart|#C#c"), from_utf8(clipdir)); pair dir2(_("Documents|#o#O"), from_utf8(lyxrc.document_path)); // Show the file browser dialog diff --git a/src/frontends/controllers/helper_funcs.C b/src/frontends/controllers/helper_funcs.C index 27493d43b0..52806173ae 100644 --- a/src/frontends/controllers/helper_funcs.C +++ b/src/frontends/controllers/helper_funcs.C @@ -100,10 +100,10 @@ docstring const browseLibFile(docstring const & dir, { // FIXME UNICODE pair const dir1(_("System files|#S#s"), - from_utf8(addName(package().system_support(), to_utf8(dir)))); + from_utf8(addName(package().system_support().absFilename(), to_utf8(dir)))); pair const dir2(_("User files|#U#u"), - from_utf8(addName(package().user_support(), to_utf8(dir)))); + from_utf8(addName(package().user_support().absFilename(), to_utf8(dir)))); docstring const result = browseFile(from_utf8( libFileSearch(to_utf8(dir), to_utf8(name), to_utf8(ext)).absFilename()), diff --git a/src/insets/ExternalSupport.C b/src/insets/ExternalSupport.C index eadfb59038..1f7669b704 100644 --- a/src/insets/ExternalSupport.C +++ b/src/insets/ExternalSupport.C @@ -167,7 +167,7 @@ string const doSubstitution(InsetExternalParams const & params, '.' + support::getExtension(filename), use_latex_path); result = subst_path(result, "$$Tempname", params.tempname().absFilename(), use_latex_path); result = subst_path(result, "$$Sysdir", - support::package().system_support(), use_latex_path); + support::package().system_support().absFilename(), use_latex_path); // Handle the $$Contents(filename) syntax if (support::contains(result, "$$Contents(\"")) { diff --git a/src/insets/ExternalTemplate.C b/src/insets/ExternalTemplate.C index b27255d48d..947e488a9d 100644 --- a/src/insets/ExternalTemplate.C +++ b/src/insets/ExternalTemplate.C @@ -233,7 +233,7 @@ TemplateManager::getPreambleDefByName(string const & name) const } -void TemplateManager::readTemplates(string const & path) +void TemplateManager::readTemplates(support::FileName const & path) { support::Path p(path); diff --git a/src/insets/ExternalTemplate.h b/src/insets/ExternalTemplate.h index 45f1b348ff..314ca06e6e 100644 --- a/src/insets/ExternalTemplate.h +++ b/src/insets/ExternalTemplate.h @@ -19,6 +19,8 @@ namespace lyx { +namespace support { class FileName; } + class LyXLex; namespace external { @@ -117,7 +119,7 @@ public: std::string const getPreambleDefByName(std::string const & name) const; private: TemplateManager(); - void readTemplates(std::string const & path); + void readTemplates(support::FileName const & path); void dumpTemplates(std::ostream &) const; void dumpPreambleDefs(std::ostream &) const; diff --git a/src/insets/insetbibtex.C b/src/insets/insetbibtex.C index 681b388246..537cdb9723 100644 --- a/src/insets/insetbibtex.C +++ b/src/insets/insetbibtex.C @@ -309,7 +309,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os, vector const InsetBibtex::getFiles(Buffer const & buffer) const { - Path p(buffer.filePath()); + Path p(FileName(buffer.filePath())); vector vec; diff --git a/src/lyx_main.C b/src/lyx_main.C index c22e4c14ba..fbdf15cf84 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -456,7 +456,7 @@ int LyX::exec(int & argc, char * argv[]) // such that package().temp_dir() is properly initialized. pimpl_->lyx_server_.reset(new LyXServer(&pimpl_->lyxfunc_, lyxrc.lyxpipes)); pimpl_->lyx_socket_.reset(new LyXServerSocket(&pimpl_->lyxfunc_, - os::internal_path(package().temp_dir() + "/lyxsocket"))); + package().temp_dir().absFilename() + "/lyxsocket")); // Start the real execution loop. exit_status = pimpl_->application_->exec(); @@ -482,12 +482,12 @@ void LyX::prepareExit() // do any other cleanup procedures now if (package().temp_dir() != package().system_temp_dir()) { LYXERR(Debug::INFO) << "Deleting tmp dir " - << package().temp_dir() << endl; + << package().temp_dir().absFilename() << endl; - if (!destroyDir(FileName(package().temp_dir()))) { + if (!destroyDir(package().temp_dir())) { docstring const msg = bformat(_("Unable to remove the temporary directory %1$s"), - from_utf8(package().temp_dir())); + from_utf8(package().temp_dir().absFilename())); Alert::warning(_("Unable to remove temporary directory"), msg); } } @@ -812,11 +812,11 @@ bool LyX::init() signal(SIGTERM, error_handler); // SIGPIPE can be safely ignored. - lyxrc.tempdir_path = package().temp_dir(); - lyxrc.document_path = package().document_dir(); + lyxrc.tempdir_path = package().temp_dir().absFilename(); + lyxrc.document_path = package().document_dir().absFilename(); if (lyxrc.template_path.empty()) { - lyxrc.template_path = addPath(package().system_support(), + lyxrc.template_path = addPath(package().system_support().absFilename(), "templates"); } @@ -836,7 +836,7 @@ bool LyX::init() // Add the directory containing the LyX executable to the path // so that LyX can find things like tex2lyx. if (package().build_support().empty()) - prependEnvPath("PATH", package().binary_dir()); + prependEnvPath("PATH", package().binary_dir().absFilename()); #endif if (!lyxrc.path_prefix.empty()) prependEnvPath("PATH", lyxrc.path_prefix); @@ -906,9 +906,9 @@ bool LyX::init() FileName const document_path(lyxrc.document_path); if (fs::exists(document_path.toFilesystemEncoding()) && fs::is_directory(document_path.toFilesystemEncoding())) - package().document_dir() = lyxrc.document_path; + package().document_dir() = document_path; - package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path)).absFilename(); + package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path)); if (package().temp_dir().empty()) { Alert::error(_("Could not create temporary directory"), bformat(_("Could not create a temporary directory in\n" @@ -923,7 +923,9 @@ bool LyX::init() return false; } - LYXERR(Debug::INIT) << "LyX tmp dir: `" << package().temp_dir() << '\'' << endl; + LYXERR(Debug::INIT) << "LyX tmp dir: `" + << package().temp_dir().absFilename() + << '\'' << endl; LYXERR(Debug::INIT) << "Reading session information '.lyx/session'..." << endl; pimpl_->session_.reset(new Session(lyxrc.num_lastfiles)); @@ -1042,13 +1044,13 @@ bool needsUpdate(string const & file) static bool firstrun = true; if (firstrun) { configure_script = FileName(addName( - package().system_support(), + package().system_support().absFilename(), "configure.py")).toFilesystemEncoding(); firstrun = false; } string const absfile = FileName(addName( - package().user_support(), file)).toFilesystemEncoding(); + package().user_support().absFilename(), file)).toFilesystemEncoding(); return (! fs::exists(absfile)) || (fs::last_write_time(configure_script) > fs::last_write_time(absfile)); @@ -1061,7 +1063,7 @@ bool LyX::queryUserLyXDir(bool explicit_userdir) { // Does user directory exist? string const user_support = - FileName(package().user_support()).toFilesystemEncoding(); + package().user_support().toFilesystemEncoding(); if (fs::exists(user_support) && fs::is_directory(user_support)) { first_start = false; @@ -1080,7 +1082,7 @@ bool LyX::queryUserLyXDir(bool explicit_userdir) bformat(_("You have specified a non-existent user " "LyX directory, %1$s.\n" "It is needed to keep your own configuration."), - from_utf8(package().user_support())), + from_utf8(package().user_support().absFilename())), 1, 0, _("&Create directory"), _("&Exit LyX"))) { @@ -1089,7 +1091,7 @@ bool LyX::queryUserLyXDir(bool explicit_userdir) } lyxerr << to_utf8(bformat(_("LyX: Creating directory %1$s"), - from_utf8(package().user_support()))) + from_utf8(package().user_support().absFilename()))) << endl; if (!createDirectory(package().user_support(), 0755)) { diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 7d081dea7b..9f32b16bbb 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -1005,7 +1005,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) // Push directory path. string const path = buffer->temppath(); - support::Path p(path); + support::Path p(FileName(path)); // there are three cases here: // 1. we print to a file @@ -1227,7 +1227,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) int row; istringstream is(argument); is >> file_name >> row; - if (prefixIs(file_name, package().temp_dir())) { + if (prefixIs(file_name, package().temp_dir().absFilename())) { // Needed by inverse dvi search. If it is a file // in tmpdir, call the apropriated function lyx_view_->setBuffer(theBufferList().getBufferFromTmp(file_name)); @@ -1462,7 +1462,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_PREFERENCES_SAVE: { lyxrc.write(makeAbsPath("preferences", - package().user_support()), + package().user_support().absFilename()), false); break; } @@ -1588,7 +1588,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd) case LFUN_BUFFER_SAVE_AS_DEFAULT: { string const fname = - addName(addPath(package().user_support(), "templates/"), + addName(addPath(package().user_support().absFilename(), "templates/"), "defaults.lyx"); Buffer defaults(fname); @@ -1900,7 +1900,7 @@ void LyXFunc::open(string const & fname) FileDialog fileDlg(_("Select document to open"), LFUN_FILE_OPEN, make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)), - make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support(), "examples")))); + make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support().absFilename(), "examples")))); FileDialog::Result result = fileDlg.open(from_utf8(initpath), @@ -1974,7 +1974,7 @@ void LyXFunc::doImport(string const & argument) LFUN_BUFFER_IMPORT, make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)), make_pair(_("Examples|#E#e"), - from_utf8(addPath(package().system_support(), "examples")))); + from_utf8(addPath(package().system_support().absFilename(), "examples")))); docstring filter = formats.prettyName(format); filter += " (*."; @@ -2155,7 +2155,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) string const encoded = FileName( lyxrc_new.document_path).toFilesystemEncoding(); if (fs::exists(encoded) && fs::is_directory(encoded)) - support::package().document_dir() = lyxrc.document_path; + support::package().document_dir() = FileName(lyxrc.document_path); } case LyXRC::RC_ESC_CHARS: case LyXRC::RC_FONT_ENCODING: diff --git a/src/messages.C b/src/messages.C index 37f8814a43..b93ab6d1c7 100644 --- a/src/messages.C +++ b/src/messages.C @@ -112,14 +112,15 @@ docstring const Messages::get(string const & m) const setlocale(LC_CTYPE, lang_.c_str()); errno = 0; - char const * c = bindtextdomain(PACKAGE, package().locale_dir().c_str()); + string const locale_dir = package().locale_dir().toFilesystemEncoding(); + char const * c = bindtextdomain(PACKAGE, locale_dir.c_str()); int e = errno; if (e) { LYXERR(Debug::DEBUG) << BOOST_CURRENT_FUNCTION << '\n' << "Error code: " << errno << '\n' << "Lang, mess: " << lang_ << " " << m << '\n' - << "Directory : " << package().locale_dir() << '\n' + << "Directory : " << package().locale_dir().absFilename() << '\n' << "Rtn value : " << c << endl; } @@ -222,7 +223,8 @@ public: //lyxerr << "Messages: language(" << l // << ") in dir(" << dir << ")" << endl; - cat_gl = mssg_gl.open(PACKAGE, loc_gl, package().locale_dir().c_str()); + string const locale_dir = package().locale_dir().toFilesystemEncoding(); + cat_gl = mssg_gl.open(PACKAGE, loc_gl, locale_dir.c_str()); } diff --git a/src/session.C b/src/session.C index 11ee132a4c..4997d193c6 100644 --- a/src/session.C +++ b/src/session.C @@ -464,7 +464,7 @@ Session::Session(unsigned int num) : { // locate the session file // note that the session file name 'session' is hard-coded - session_file = FileName(addName(package().user_support(), "session")); + session_file = FileName(addName(package().user_support().absFilename(), "session")); // readFile(); } diff --git a/src/support/filetools.C b/src/support/filetools.C index 0684543109..0815d1b9c2 100644 --- a/src/support/filetools.C +++ b/src/support/filetools.C @@ -192,9 +192,9 @@ FileName const fileOpenSearch(string const & path, string const & name, if (!suffixIs(path_element, '/')) path_element += '/'; path_element = subst(path_element, "$$LyX", - package().system_support()); + package().system_support().absFilename()); path_element = subst(path_element, "$$User", - package().user_support()); + package().user_support().absFilename()); real_file = fileSearch(path_element, name, ext); @@ -274,18 +274,18 @@ FileName const fileSearch(string const & path, string const & name, FileName const libFileSearch(string const & dir, string const & name, string const & ext) { - FileName fullname = fileSearch(addPath(package().user_support(), dir), + FileName fullname = fileSearch(addPath(package().user_support().absFilename(), dir), name, ext); if (!fullname.empty()) return fullname; if (!package().build_support().empty()) - fullname = fileSearch(addPath(package().build_support(), dir), + fullname = fileSearch(addPath(package().build_support().absFilename(), dir), name, ext); if (!fullname.empty()) return fullname; - return fileSearch(addPath(package().system_support(), dir), name, ext); + return fileSearch(addPath(package().system_support().absFilename(), dir), name, ext); } @@ -417,7 +417,7 @@ string const createBufferTmpDir() // In fact I wrote this code to circumvent a problematic behaviour // (bug?) of EMX mkstemp(). string const tmpfl = - package().temp_dir() + "/lyx_tmpbuf" + + package().temp_dir().absFilename() + "/lyx_tmpbuf" + convert(count++); if (mkdir(FileName(tmpfl), 0777)) { @@ -450,11 +450,10 @@ FileName const createLyXTmpDir(FileName const & deflt) } -bool createDirectory(string const & path, int permission) +bool createDirectory(FileName const & path, int permission) { - string temp = rtrim(os::internal_path(path), "/"); - BOOST_ASSERT(!temp.empty()); - return mkdir(FileName(temp), permission) == 0; + BOOST_ASSERT(!path.empty()); + return mkdir(path, permission) == 0; } @@ -591,7 +590,7 @@ string const expandPath(string const & path) return getcwd().absFilename() + '/' + rTemp; if (temp == "~") - return package().home_dir() + '/' + rTemp; + return package().home_dir().absFilename() + '/' + rTemp; if (temp == "..") return makeAbsPath(copy).absFilename(); @@ -998,12 +997,12 @@ docstring const makeDisplayPath(string const & path, unsigned int threshold) string str = path; // If file is from LyXDir, display it as if it were relative. - string const system = package().system_support(); + string const system = package().system_support().absFilename(); if (prefixIs(str, system) && str != system) return from_utf8("[" + str.erase(0, system.length()) + "]"); // replace /home/blah with ~/ - string const home = package().home_dir(); + string const home = package().home_dir().absFilename(); if (!home.empty() && prefixIs(str, home)) str = subst(str, home, "~"); @@ -1033,20 +1032,18 @@ docstring const makeDisplayPath(string const & path, unsigned int threshold) } -bool readLink(string const & file, string & link, bool resolve) +bool readLink(FileName const & file, FileName & link) { #ifdef HAVE_READLINK char linkbuffer[512]; // Should be PATH_MAX but that needs autconf support - int const nRead = ::readlink(file.c_str(), + string const encoded = file.toFilesystemEncoding(); + int const nRead = ::readlink(encoded.c_str(), linkbuffer, sizeof(linkbuffer) - 1); if (nRead <= 0) return false; linkbuffer[nRead] = '\0'; // terminator - if (resolve) - link = makeAbsPath(linkbuffer, onlyPath(file)).absFilename(); - else - link = linkbuffer; + link = makeAbsPath(linkbuffer, onlyPath(file.absFilename())); return true; #else return false; diff --git a/src/support/filetools.h b/src/support/filetools.h index bab3b12857..99b32f101e 100644 --- a/src/support/filetools.h +++ b/src/support/filetools.h @@ -29,7 +29,7 @@ bool destroyDir(FileName const & tmpdir); std::string const createBufferTmpDir(); /// Creates directory. Returns true on success -bool createDirectory(std::string const & name, int permissions); +bool createDirectory(FileName const & name, int permissions); /** Creates the global LyX temp dir. \p deflt can be an existing directory name. In this case a new directory @@ -276,12 +276,10 @@ std::string const getFileContents(FileName const & fname); */ std::string const replaceEnvironmentPath(std::string const & path); -/* Set \c link to the path \c file points to as a symbolic link. - If \c resolve is true, then \c link is an absolute path - Returns true if successful */ -bool readLink(std::string const & file, - std::string & link, - bool resolve = false); +/** Set \c link to the path \c file points to as a symbolic link. + \return true if successful. + */ +bool readLink(FileName const & file, FileName & link); /** * Search a TeX file in all locations the latex compiler would search it, diff --git a/src/support/os_cygwin.C b/src/support/os_cygwin.C index bc74cbaad5..71de480077 100644 --- a/src/support/os_cygwin.C +++ b/src/support/os_cygwin.C @@ -328,7 +328,7 @@ void addFontResources() { #ifdef X_DISPLAY_MISSING // Windows only: Add BaKoMa TrueType font resources - string const fonts_dir = addPath(package().system_support(), "fonts"); + string const fonts_dir = addPath(package().system_support().absFilename(), "fonts"); for (int i = 0 ; i < num_fonts_truetype ; ++i) { string const font_current = to_local8bit(from_utf8(convert_path( @@ -344,7 +344,7 @@ void restoreFontResources() { #ifdef X_DISPLAY_MISSING // Windows only: Remove BaKoMa TrueType font resources - string const fonts_dir = addPath(package().system_support(), "fonts"); + string const fonts_dir = addPath(package().system_support().absFilename(), "fonts"); for(int i = 0 ; i < num_fonts_truetype ; ++i) { string const font_current = to_local8bit(from_utf8(convert_path( diff --git a/src/support/os_win32.C b/src/support/os_win32.C index 6833a3a6a5..5cb256259a 100644 --- a/src/support/os_win32.C +++ b/src/support/os_win32.C @@ -406,7 +406,7 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode) void addFontResources() { // Windows only: Add BaKoMa TrueType font resources - string const fonts_dir = addPath(package().system_support(), "fonts"); + string const fonts_dir = addPath(package().system_support().absFilename(), "fonts"); for (int i = 0 ; i < num_fonts_truetype ; ++i) { string const font_current = @@ -419,7 +419,7 @@ void addFontResources() void restoreFontResources() { // Windows only: Remove BaKoMa TrueType font resources - string const fonts_dir = addPath(package().system_support(), "fonts"); + string const fonts_dir = addPath(package().system_support().absFilename(), "fonts"); for(int i = 0 ; i < num_fonts_truetype ; ++i) { string const font_current = diff --git a/src/support/package.C.in b/src/support/package.C.in index 7d82416773..2680a96279 100644 --- a/src/support/package.C.in +++ b/src/support/package.C.in @@ -89,27 +89,27 @@ Package const & package() namespace { -string const abs_path_from_binary_name(string const & exe); +FileName const abs_path_from_binary_name(string const & exe); -std::pair const -get_build_dirs(string const & abs_binary, +std::pair const +get_build_dirs(FileName const & abs_binary, exe_build_dir_to_top_build_dir top_build_dir_location); -string const get_document_dir(string const & home_dir); +FileName const get_document_dir(FileName const & home_dir); -string const get_home_dir(); +FileName const get_home_dir(); -string const get_locale_dir(string const & system_support_dir); +FileName const get_locale_dir(FileName const & system_support_dir); -string const get_system_support_dir(string const & abs_binary, +FileName const get_system_support_dir(FileName const & abs_binary, string const & command_line_system_support_dir); -string const get_temp_dir(); +FileName const get_temp_dir(); -string const get_default_user_support_dir(string const & home_dir); +FileName const get_default_user_support_dir(FileName const & home_dir); -std::pair const -get_user_support_dir(string const & default_user_support_dir, +std::pair const +get_user_support_dir(FileName const & default_user_support_dir, string const & command_line_user_support_dir); @@ -129,8 +129,8 @@ Package::Package(string const & command_line_arg0, temp_dir_ = system_temp_dir_; document_dir_ = get_document_dir(home_dir_); - string const abs_binary = abs_path_from_binary_name(command_line_arg0); - binary_dir_ = onlyPath(abs_binary); + FileName const abs_binary = abs_path_from_binary_name(command_line_arg0); + binary_dir_ = FileName(onlyPath(abs_binary.absFilename())); // Is LyX being run in-place from the build tree? boost::tie(build_support_dir_, system_support_dir_) = @@ -143,26 +143,27 @@ Package::Package(string const & command_line_arg0, locale_dir_ = get_locale_dir(system_support_dir_); - string const default_user_support_dir = + FileName const default_user_support_dir = get_default_user_support_dir(home_dir_); boost::tie(user_support_dir_, explicit_user_support_dir_) = get_user_support_dir(default_user_support_dir, command_line_user_support_dir); - string const configure_script = addName(system_support(), "configure.py"); - configure_command_ = os::python() + ' ' + quoteName(configure_script) - + with_version_suffix(); + FileName const configure_script(addName(system_support().absFilename(), "configure.py")); + configure_command_ = os::python() + ' ' + + quoteName(configure_script.toFilesystemEncoding()) + + with_version_suffix(); lyxerr[Debug::INIT] << "\n" - << "\tbinary_dir " << binary_dir() << '\n' - << "\tsystem_support " << system_support() << '\n' - << "\tbuild_support " << build_support() << '\n' - << "\tuser_support " << user_support() << '\n' - << "\tlocale_dir " << locale_dir() << '\n' - << "\tdocument_dir " << document_dir() << '\n' - << "\ttemp_dir " << temp_dir() << '\n' - << "\thome_dir " << home_dir() << '\n' + << "\tbinary_dir " << binary_dir().absFilename() << '\n' + << "\tsystem_support " << system_support().absFilename() << '\n' + << "\tbuild_support " << build_support().absFilename() << '\n' + << "\tuser_support " << user_support().absFilename() << '\n' + << "\tlocale_dir " << locale_dir().absFilename() << '\n' + << "\tdocument_dir " << document_dir().absFilename() << '\n' + << "\ttemp_dir " << temp_dir().absFilename() << '\n' + << "\thome_dir " << home_dir().absFilename() << '\n' << "\n" << std::endl; } @@ -171,15 +172,19 @@ namespace { // These next functions contain the stuff that is substituted at // configuration-time. -string const hardcoded_localedir() +FileName const hardcoded_localedir() { - return string("@LOCALEDIR@"); + // FIXME UNICODE + // The build system needs to make sure that this is in utf8 encoding. + return FileName("@LOCALEDIR@"); } -string const hardcoded_system_support_dir() +FileName const hardcoded_system_support_dir() { - return string("@LYX_DIR@"); + // FIXME UNICODE + // The build system needs to make sure that this is in utf8 encoding. + return FileName("@LYX_DIR@"); } @@ -194,9 +199,11 @@ string const & with_version_suffix() } // namespace anon -string const & Package::top_srcdir() +FileName const & Package::top_srcdir() { - static string const dir("@TOP_SRCDIR@"); + // FIXME UNICODE + // The build system needs to make sure that this is in utf8 encoding. + static FileName const dir("@TOP_SRCDIR@"); return dir; } @@ -207,12 +214,12 @@ bool check_command_line_dir(string const & dir, string const & file, string const & command_line_switch); -string const extract_env_var_dir(string const & env_var); +FileName const extract_env_var_dir(string const & env_var); -bool check_env_var_dir(string const & dir, +bool check_env_var_dir(FileName const & dir, string const & env_var); -bool check_env_var_dir(string const & dir, +bool check_env_var_dir(FileName const & dir, string const & file, string const & env_var); @@ -221,8 +228,19 @@ string const relative_locale_dir(); string const relative_system_support_dir(); -std::string const -get_build_support_dir(std::string const & binary_dir, +/** + * Convert \p name to internal path and strip a trailing slash, since it + * comes from user input (commandline or environment). + * \p name is encoded in utf8. + */ +string const fix_dir_name(string const & name) +{ + return rtrim(os::internal_path(name), "/"); +} + + +FileName const +get_build_support_dir(string const & binary_dir, exe_build_dir_to_top_build_dir top_build_dir_location) { string indirection; @@ -235,12 +253,12 @@ get_build_support_dir(std::string const & binary_dir, break; } - return normalizePath(addPath(binary_dir, indirection)); + return FileName(normalizePath(addPath(binary_dir, indirection))); } -std::pair const -get_build_dirs(string const & abs_binary, +std::pair const +get_build_dirs(FileName const & abs_binary, exe_build_dir_to_top_build_dir top_build_dir_location) { string const check_text = "Checking whether LyX is run in place..."; @@ -253,17 +271,17 @@ get_build_dirs(string const & abs_binary, // Note that the name of the lyx binary may be a symbolic link. // If that is the case, then we follow the links too. - string binary = abs_binary; + FileName binary = abs_binary; while (true) { // Try and find "lyxrc.defaults". - string const binary_dir = onlyPath(binary); - string const build_support_dir = + string const binary_dir = onlyPath(binary.absFilename()); + FileName const build_support_dir = get_build_support_dir(binary_dir, top_build_dir_location); - if (!fileSearch(build_support_dir, "Makefile").empty()) { + if (!fileSearch(build_support_dir.absFilename(), "Makefile").empty()) { // Try and find "chkconfig.ltx". string const system_support_dir = - addPath(Package::top_srcdir(), "lib"); + addPath(Package::top_srcdir().absFilename(), "lib"); if (!fileSearch(system_support_dir, "chkconfig.ltx").empty()) { lyxerr[Debug::INIT] << check_text << " yes" @@ -274,11 +292,11 @@ get_build_dirs(string const & abs_binary, // Check whether binary is a symbolic link. // If so, resolve it and repeat the exercise. - if (!fs::symbolic_link_exists(FileName(binary).toFilesystemEncoding())) + if (!fs::symbolic_link_exists(binary.toFilesystemEncoding())) break; - string link; - if (readLink(binary, link, true)) { + FileName link; + if (readLink(binary, link)) { binary = link; } else { // Unable to resolve the link. @@ -287,18 +305,18 @@ get_build_dirs(string const & abs_binary, } lyxerr[Debug::INIT] << check_text << " no" << std::endl; - return std::make_pair(string(), string()); + return std::make_pair(FileName(), FileName()); } // Specification of document_dir_ may be reset by LyXRC, // but the default is fixed for a given OS. -string const get_document_dir(string const & home_dir) +FileName const get_document_dir(FileName const & home_dir) { #if defined (USE_WINDOWS_PACKAGING) (void)home_dir; // Silence warning about unused variable. os::GetFolderPath win32_folder_path; - return win32_folder_path(os::GetFolderPath::PERSONAL); + return FileName(win32_folder_path(os::GetFolderPath::PERSONAL)); #else // Posix-like. return home_dir; #endif @@ -308,7 +326,7 @@ string const get_document_dir(string const & home_dir) // The specification of home_dir_ is fixed for a given OS. // A typical example on Windows: "C:/Documents and Settings/USERNAME" // and on a Posix-like machine: "/home/USERNAME". -string const get_home_dir() +FileName const get_home_dir() { #if defined (USE_WINDOWS_PACKAGING) string const home_dir = getEnv("USERPROFILE"); @@ -316,66 +334,67 @@ string const get_home_dir() string const home_dir = getEnv("HOME"); #endif - return os::internal_path(home_dir); + return FileName(fix_dir_name(home_dir)); } // Several sources are probed to ascertain the locale directory. // The only requirement is that the result is indeed a directory. -string const get_locale_dir(string const & system_support_dir) +FileName const get_locale_dir(FileName const & system_support_dir) { // 1. Use the "LYX_LOCALEDIR" environment variable. - string const path_env = extract_env_var_dir("LYX_LOCALEDIR"); + FileName const path_env = extract_env_var_dir("LYX_LOCALEDIR"); if (!path_env.empty() && check_env_var_dir(path_env, "LYX_LOCALEDIR")) return path_env; // 2. Search for system_support_dir / // The is OS-dependent. (On Unix, it will // be "../locale/".) - FileName path(normalizePath(addPath(system_support_dir, relative_locale_dir()))); + FileName path(normalizePath(addPath(system_support_dir.absFilename(), + relative_locale_dir()))); if (fs::exists(path.toFilesystemEncoding()) && fs::is_directory(path.toFilesystemEncoding())) - return path.absFilename(); + return path; // 3. Fall back to the hard-coded LOCALEDIR. - path = FileName(hardcoded_localedir()); + path = hardcoded_localedir(); if (fs::exists(path.toFilesystemEncoding()) && fs::is_directory(path.toFilesystemEncoding())) - return path.absFilename(); + return path; - return string(); + return FileName(); } // Specification of temp_dir_ may be reset by LyXRC, // but the default is fixed for a given OS. -string const get_temp_dir() +FileName const get_temp_dir() { #if defined (USE_WINDOWS_PACKAGING) // Typical example: C:/TEMP/. char path[MAX_PATH]; GetTempPath(MAX_PATH, path); - return os::internal_path(path); + return FileName(os::internal_path(to_utf8(from_local8bit(path)))); #else // Posix-like. - return "/tmp"; + return FileName("/tmp"); #endif } // Extracts the absolute path from the foo of "-sysdir foo" or "-userdir foo" -string const abs_path_from_command_line(string const & command_line) +FileName const abs_path_from_command_line(string const & command_line) { if (command_line.empty()) - return string(); + return FileName(); - string const path = os::internal_path(command_line); - return os::is_absolute_path(path) ? path : makeAbsPath(path).absFilename(); + string const path = fix_dir_name(command_line); + return os::is_absolute_path(path) ? FileName(path) : makeAbsPath(path); } // Does the grunt work for abs_path_from_binary_name() -string const get_binary_path(string const & exe) +FileName const get_binary_path(string const & exe) { #if defined (USE_WINDOWS_PACKAGING) // The executable may have been invoked either with or @@ -388,19 +407,19 @@ string const get_binary_path(string const & exe) string const exe_path = os::internal_path(exe); #endif if (os::is_absolute_path(exe_path)) - return exe_path; + return FileName(exe_path); // Two possibilities present themselves. // 1. The binary is relative to the CWD. - string const abs_exe_path = makeAbsPath(exe_path).absFilename(); - if (fs::exists(FileName(abs_exe_path).toFilesystemEncoding())) + FileName const abs_exe_path = makeAbsPath(exe_path); + if (fs::exists(abs_exe_path.toFilesystemEncoding())) return abs_exe_path; // 2. exe must be the name of the binary only and it // can be found on the PATH. string const exe_name = onlyFilename(exe_path); if (exe_name != exe_path) - return string(); + return FileName(); std::vector const path = getEnvPath("PATH"); std::vector::const_iterator it = path.begin(); @@ -409,20 +428,20 @@ string const get_binary_path(string const & exe) // This will do nothing if *it is already absolute. string const exe_dir = makeAbsPath(*it).absFilename(); - string const exe_path = addName(exe_dir, exe_name); - if (fs::exists(FileName(exe_path).toFilesystemEncoding())) + FileName const exe_path(addName(exe_dir, exe_name)); + if (fs::exists(exe_path.toFilesystemEncoding())) return exe_path; } // Didn't find anything. - return string(); + return FileName(); } // Extracts the absolute path to the binary name received as argv[0]. -string const abs_path_from_binary_name(string const & exe) +FileName const abs_path_from_binary_name(string const & exe) { - string const abs_binary = get_binary_path(exe); + FileName const abs_binary = get_binary_path(exe); if (abs_binary.empty()) { // FIXME UNICODE throw ExceptionMessage(ErrorException, @@ -437,21 +456,21 @@ string const abs_path_from_binary_name(string const & exe) // A plethora of directories is searched to ascertain the system // lyxdir which is defined as the first directory to contain // "chkconfig.ltx". -string const -get_system_support_dir(string const & abs_binary, +FileName const +get_system_support_dir(FileName const & abs_binary, string const & command_line_system_support_dir) { string const chkconfig_ltx = "chkconfig.ltx"; // searched_dirs is used for diagnostic purposes only in the case // that "chkconfig.ltx" is not found. - std::list searched_dirs; + std::list searched_dirs; // 1. Use the -sysdir command line parameter. - string path = abs_path_from_command_line(command_line_system_support_dir); + FileName path = abs_path_from_command_line(command_line_system_support_dir); if (!path.empty()) { searched_dirs.push_back(path); - if (check_command_line_dir(path, chkconfig_ltx, "-sysdir")) + if (check_command_line_dir(path.absFilename(), chkconfig_ltx, "-sysdir")) return path; } @@ -472,27 +491,27 @@ get_system_support_dir(string const & abs_binary, // One subtlety to be aware of. The name of the lyx binary may be // a symbolic link. If that is the case, then we follow the links too. - string binary = abs_binary; + FileName binary = abs_binary; while (true) { // Try and find "chkconfig.ltx". - string const binary_dir = onlyPath(binary); + string const binary_dir = onlyPath(binary.absFilename()); - string const lyxdir = - normalizePath(addPath(binary_dir, relative_lyxdir)); + FileName const lyxdir( + normalizePath(addPath(binary_dir, relative_lyxdir))); searched_dirs.push_back(lyxdir); - if (!fileSearch(lyxdir, chkconfig_ltx).empty()) { + if (!fileSearch(lyxdir.absFilename(), chkconfig_ltx).empty()) { // Success! "chkconfig.ltx" has been found. return lyxdir; } // Check whether binary is a symbolic link. // If so, resolve it and repeat the exercise. - if (!fs::symbolic_link_exists(FileName(binary).toFilesystemEncoding())) + if (!fs::symbolic_link_exists(binary.toFilesystemEncoding())) break; - string link; - if (readLink(binary, link, true)) { + FileName link; + if (readLink(binary, link)) { binary = link; } else { // Unable to resolve the link. @@ -501,16 +520,16 @@ get_system_support_dir(string const & abs_binary, } // 4. Repeat the exercise on the directory itself. - string binary_dir = onlyPath(abs_binary); + FileName binary_dir(onlyPath(abs_binary.absFilename())); while (true) { // This time test whether the directory is a symbolic link // *before* looking for "chkconfig.ltx". // (We've looked relative to the original already.) - if (!fs::symbolic_link_exists(FileName(binary).toFilesystemEncoding())) + if (!fs::symbolic_link_exists(binary.toFilesystemEncoding())) break; - string link; - if (readLink(binary_dir, link, true)) { + FileName link; + if (readLink(binary_dir, link)) { binary_dir = link; } else { // Unable to resolve the link. @@ -518,11 +537,11 @@ get_system_support_dir(string const & abs_binary, } // Try and find "chkconfig.ltx". - string const lyxdir = - normalizePath(addPath(binary_dir, relative_lyxdir)); + FileName const lyxdir( + normalizePath(addPath(binary_dir.absFilename(), relative_lyxdir))); searched_dirs.push_back(lyxdir); - if (!fileSearch(lyxdir, chkconfig_ltx).empty()) { + if (!fileSearch(lyxdir.absFilename(), chkconfig_ltx).empty()) { // Success! "chkconfig.ltx" has been found. return lyxdir; } @@ -530,19 +549,19 @@ get_system_support_dir(string const & abs_binary, // 5. In desparation, try the hard-coded system support dir. path = hardcoded_system_support_dir(); - if (!fileSearch(path, chkconfig_ltx).empty()) + if (!fileSearch(path.absFilename(), chkconfig_ltx).empty()) return path; // Everything has failed :-( // So inform the user and exit. string searched_dirs_str; - typedef std::list::const_iterator iterator; + typedef std::list::const_iterator iterator; iterator const begin = searched_dirs.begin(); iterator const end = searched_dirs.end(); for (iterator it = begin; it != end; ++it) { if (it != begin) searched_dirs_str += "\n\t"; - searched_dirs_str += *it; + searched_dirs_str += it->absFilename(); } // FIXME UNICODE @@ -557,21 +576,21 @@ get_system_support_dir(string const & abs_binary, from_utf8(searched_dirs_str))); // Keep the compiler happy. - return string(); + return FileName(); } // Returns the absolute path to the user lyxdir, together with a flag // indicating whether this directory was specified explicitly (as -userdir // or through an environment variable) or whether it was deduced. -std::pair const -get_user_support_dir(string const & default_user_support_dir, +std::pair const +get_user_support_dir(FileName const & default_user_support_dir, string const & command_line_user_support_dir) { bool explicit_userdir = true; // 1. Use the -userdir command line parameter. - string path = + FileName path = abs_path_from_command_line(command_line_user_support_dir); if (!path.empty()) return std::make_pair(path, explicit_userdir); @@ -589,13 +608,13 @@ get_user_support_dir(string const & default_user_support_dir, // $HOME/.lyx on POSIX but on Win32 it will be something like // "C:/Documents and Settings/USERNAME/Application Data/LyX" -string const get_default_user_support_dir(string const & home_dir) +FileName const get_default_user_support_dir(FileName const & home_dir) { #if defined (USE_WINDOWS_PACKAGING) (void)home_dir; // Silence warning about unused variable. os::GetFolderPath win32_folder_path; - return addPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE); + return FileName(addPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE)); #elif defined (USE_MACOSX_PACKAGING) (void)home_dir; // Silence warning about unused variable. @@ -605,19 +624,20 @@ string const get_default_user_support_dir(string const & home_dir) FSFindFolder(kUserDomain, kApplicationSupportFolderType, kDontCreateFolder, &fsref); if (error_code != 0) - return string(); + return FileName(); + // FSRefMakePath returns the result in utf8 char store[PATH_MAX + 1]; OSStatus const status_code = FSRefMakePath(&fsref, reinterpret_cast(store), PATH_MAX); if (status_code != 0) - return string(); + return FileName(); - return addPath(reinterpret_cast(store), PACKAGE); + return FileName(addPath(reinterpret_cast(store), PACKAGE)); #else // USE_POSIX_PACKAGING - return addPath(home_dir, string(".") + PACKAGE); + return FileName(addPath(home_dir.absFilename(), string(".") + PACKAGE)); #endif } @@ -642,26 +662,26 @@ bool check_command_line_dir(string const & dir, // The environment variable @c env_var expands to a (single) file path. -string const extract_env_var_dir(string const & env_var) +FileName const extract_env_var_dir(string const & env_var) { - string const dir = os::internal_path(getEnv(env_var)); - return dir.empty() ? dir : makeAbsPath(dir).absFilename(); + string const dir = fix_dir_name(getEnv(env_var)); + return dir.empty() ? FileName() : makeAbsPath(dir); } // Check that directory @c dir contains @c file. // Else emit a warning about an invalid @c env_var. -bool check_env_var_dir(string const & dir, +bool check_env_var_dir(FileName const & dir, string const & file, string const & env_var) { - FileName const abs_path = fileSearch(dir, file); + FileName const abs_path = fileSearch(dir.absFilename(), file); if (abs_path.empty()) { // FIXME UNICODE throw ExceptionMessage(WarningException, _("File not found"), bformat( _("Invalid %1$s environment variable.\n" "Directory %2$s does not contain %3$s."), - from_utf8(env_var), from_utf8(dir), + from_utf8(env_var), from_utf8(dir.absFilename()), from_utf8(file))); } @@ -671,10 +691,10 @@ bool check_env_var_dir(string const & dir, // Check that directory @c dir is indeed a directory. // Else emit a warning about an invalid @c env_var. -bool check_env_var_dir(string const & dir, +bool check_env_var_dir(FileName const & dir, string const & env_var) { - string const encoded(FileName(dir).toFilesystemEncoding()); + string const encoded(dir.toFilesystemEncoding()); bool const success = (fs::exists(encoded) && fs::is_directory(encoded)); if (!success) { @@ -687,7 +707,7 @@ bool check_env_var_dir(string const & dir, _("Invalid %1$s environment variable.\n%2$s is not a directory."); throw ExceptionMessage(WarningException, _("Directory not found"), bformat( - fmt, from_utf8(env_var), from_utf8(dir))); + fmt, from_utf8(env_var), from_utf8(dir.absFilename()))); } return success; diff --git a/src/support/package.h b/src/support/package.h index 3e801dfd45..1db12d6330 100644 --- a/src/support/package.h +++ b/src/support/package.h @@ -15,6 +15,8 @@ #ifndef LYX_PACHAGE_H #define LYX_PACHAGE_H +#include "support/filename.h" + #include namespace lyx { @@ -69,25 +71,25 @@ public: /** The directory containing the LyX executable. */ - std::string const & binary_dir() const; + FileName const & binary_dir() const; /** The top of the LyX source code tree. */ - static std::string const & top_srcdir(); + static FileName const & top_srcdir(); /** The path to the system-level support files * we're actually going to use. */ - std::string const & system_support() const; + FileName const & system_support() const; /** The path to the autogenerated support files * when running in-place. */ - std::string const & build_support() const; + FileName const & build_support() const; /** The path to the user-level support files. */ - std::string const & user_support() const; + FileName const & user_support() const; /** The user_support directory was set explicitly using either * the -userdir command line switch or @@ -97,23 +99,23 @@ public: /** The path to the locale directory. */ - std::string const & locale_dir() const; + FileName const & locale_dir() const; /** The default document directory. * Can be reset by LyXRC. */ - std::string & document_dir() const; + FileName & document_dir() const; /** The path to the system temporary directory. * (Eg /tmp on *nix.) */ - std::string const & system_temp_dir() const; + FileName const & system_temp_dir() const; /** The path to the temporary directory used by LyX. * (Eg /tmp/lyx_tmpdir800nBI1z9 on *nix.) * Can be reset by LyXRC. */ - std::string & temp_dir() const; + FileName & temp_dir() const; /** Used when setting the user_support directory. * Used also when expanding "~/" or contracting to "~/". (filetools.C) @@ -121,21 +123,24 @@ public: * for the dump. * This may be empty (e. g. when run under a CGI environment) */ - std::string const & home_dir() const; + FileName const & home_dir() const; - /// Command to run the configure script + /** Command to run the configure script. + * Caution: This is "ready-to-run", i.e. in the locale encoding, not + * utf8. + */ std::string const & configure_command() const; private: - std::string binary_dir_; - std::string system_support_dir_; - std::string build_support_dir_; - std::string user_support_dir_; - std::string locale_dir_; - mutable std::string document_dir_; - mutable std::string temp_dir_; - std::string system_temp_dir_; - std::string home_dir_; + FileName binary_dir_; + FileName system_support_dir_; + FileName build_support_dir_; + FileName user_support_dir_; + FileName locale_dir_; + mutable FileName document_dir_; + mutable FileName temp_dir_; + FileName system_temp_dir_; + FileName home_dir_; std::string configure_command_; bool explicit_user_support_dir_; }; @@ -145,25 +150,25 @@ inline Package::Package() {} inline -std::string const & Package::binary_dir() const +FileName const & Package::binary_dir() const { return binary_dir_; } inline -std::string const & Package::system_support() const +FileName const & Package::system_support() const { return system_support_dir_; } inline -std::string const & Package::build_support() const +FileName const & Package::build_support() const { return build_support_dir_; } inline -std::string const & Package::user_support() const +FileName const & Package::user_support() const { return user_support_dir_; } @@ -175,31 +180,31 @@ bool Package::explicit_user_support() const } inline -std::string const & Package::locale_dir() const +FileName const & Package::locale_dir() const { return locale_dir_; } inline -std::string & Package::document_dir() const +FileName & Package::document_dir() const { return document_dir_; } inline -std::string & Package::temp_dir() const +FileName & Package::temp_dir() const { return temp_dir_; } inline -std::string const & Package::system_temp_dir() const +FileName const & Package::system_temp_dir() const { return system_temp_dir_; } inline -std::string const & Package::home_dir() const +FileName const & Package::home_dir() const { return home_dir_; } diff --git a/src/support/path.C b/src/support/path.C index 4989dd6a19..dc246bc509 100644 --- a/src/support/path.C +++ b/src/support/path.C @@ -14,7 +14,6 @@ #define PATH_C #include "support/path.h" -#include "support/filename.h" #include "support/lyxlib.h" @@ -24,13 +23,13 @@ using std::string; namespace lyx { namespace support { -Path::Path(string const & path) +Path::Path(FileName const & path) : popped_(false) { if (!path.empty()) { pushedDir_ = getcwd(); - if (pushedDir_.empty() || chdir(FileName(path))) { + if (pushedDir_.empty() || chdir(path)) { /* FIXME: throw */ } } else { diff --git a/src/support/path.h b/src/support/path.h index 13296353aa..ee878c7e76 100644 --- a/src/support/path.h +++ b/src/support/path.h @@ -37,7 +37,7 @@ namespace support { class Path : boost::noncopyable { public: /// change to the given directory - explicit Path(std::string const & path); + explicit Path(FileName const & path); /// set cwd to the previous value if needed ~Path(); diff --git a/src/support/tempname.C b/src/support/tempname.C index 6697b2c7d5..c56e1b51a8 100644 --- a/src/support/tempname.C +++ b/src/support/tempname.C @@ -80,8 +80,9 @@ int make_tempfile(char * templ) FileName const tempName(FileName const & dir, string const & mask) { - // FIXME UNICODE encoding of package().temp_dir() is probably wrong - string const tmpdir(dir.empty() ? package().temp_dir() : dir.toFilesystemEncoding()); + string const tmpdir(dir.empty() ? + package().temp_dir().toFilesystemEncoding() : + dir.toFilesystemEncoding()); string tmpfl(addName(tmpdir, mask)); #if defined (HAVE_GETPID) tmpfl += convert(getpid()); diff --git a/src/vc-backend.C b/src/vc-backend.C index 50ebd36903..f4c5b50ce2 100644 --- a/src/vc-backend.C +++ b/src/vc-backend.C @@ -60,7 +60,7 @@ int VCS::doVCCommand(string const & cmd, string const & path) { LYXERR(Debug::LYXVC) << "doVCCommand: " << cmd << endl; Systemcall one; - support::Path p(path); + support::Path p(FileName(path)); int const ret = one.startscript(Systemcall::Wait, cmd); return ret; }