]> git.lyx.org Git - features.git/commitdiff
Use FileName instead of strings in support::Package.
authorGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Fri, 6 Apr 2007 13:09:54 +0000 (13:09 +0000)
committerGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Fri, 6 Apr 2007 13:09:54 +0000 (13:09 +0000)
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

28 files changed:
src/BufferView.C
src/ConverterCache.C
src/buffer.C
src/bufferlist.C
src/client/messages.C
src/converter.C
src/exporter.C
src/frontends/controllers/ControlAboutlyx.C
src/frontends/controllers/ControlGraphics.C
src/frontends/controllers/helper_funcs.C
src/insets/ExternalSupport.C
src/insets/ExternalTemplate.C
src/insets/ExternalTemplate.h
src/insets/insetbibtex.C
src/lyx_main.C
src/lyxfunc.C
src/messages.C
src/session.C
src/support/filetools.C
src/support/filetools.h
src/support/os_cygwin.C
src/support/os_win32.C
src/support/package.C.in
src/support/package.h
src/support/path.C
src/support/path.h
src/support/tempname.C
src/vc-backend.C

index 8a10db7bba263e23cd7815fa6ed496c6523e2f1f..4b288ba7f5f306ed78b89503496f98c510a52fb5 100644 (file)
@@ -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),
index 16a3e7a4cc0b9e401d691eea7368661462f8d63e..19931c2ea7724a8928de7ae31a6c9b9e424ef49a 100644 (file)
@@ -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 `"
index 8db2d6f02deefa360017bfd1626219cc9679d3e9..29383c44c5eeecf05ae9a2461f08c18c9b64a61c 100644 (file)
@@ -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
index f0c1d23f56c07f5ad8d3c7736f73a94d5097d1fa..11213b72542644847dfa50789ee74d823e8ebf52 100644 (file)
@@ -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))) {
index 6a041298ab9ca89b650211c7c4eb3a9394eb087c..cbec9e83635f01144dca96dcce6bb88e95a36e30 100644 (file)
@@ -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;
                }
 
index 11902f1637e2ea0aa0ec5e00b7be9d990f1838d9..3b4ccb6144e2759cac88732a656e4bba8f449681 100644 (file)
@@ -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
index ee96cee0d189e92a71e90f5379f811289355a413..164a6da9d0fbf323537d6d37644e51430f0b31fe 100644 (file)
@@ -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) {
index d6f9304221dfe6de5580f765d8dcc7b73b628652..edae750007da1d54fc0f2f33bd57f0b78570d376 100644 (file)
@@ -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();
 }
index 72ae744b7eb6ed9a817f8cd94758c54d23a127b5..cb9b92e7bf89fa3816e76008edb7c76945ac2824 100644 (file)
@@ -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<docstring, docstring> dir1(_("Clipart|#C#c"), from_utf8(clipdir));
        pair<docstring, docstring> dir2(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
        // Show the file browser dialog
index 27493d43b008a671fca02657028433ce34bea29e..52806173ae2f21c0d17bfa483fbf45f7b2c8985a 100644 (file)
@@ -100,10 +100,10 @@ docstring const browseLibFile(docstring const & dir,
 {
        // FIXME UNICODE
        pair<docstring, docstring> 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<docstring, docstring> 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()),
index eadfb59038f1836ee4739e60cf10eca64813f98a..1f7669b7045a1fed3984387c3598f52962a519d3 100644 (file)
@@ -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(\"")) {
index b27255d48dabffac411b0459834242459655f2eb..947e488a9dae4d9f00befd7e850372e5380f8710 100644 (file)
@@ -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);
 
index 45f1b348ff66f8307acbdd83a497247de8876d42..314ca06e6e94dbcd69fc70b518a5c84f1400ebb4 100644 (file)
@@ -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;
 
index 681b38824605bdfd0a3ce4e9d9d2e9be78ac2a93..537cdb972331434b3335737598c66bcbd7d3269b 100644 (file)
@@ -309,7 +309,7 @@ int InsetBibtex::latex(Buffer const & buffer, odocstream & os,
 
 vector<FileName> const InsetBibtex::getFiles(Buffer const & buffer) const
 {
-       Path p(buffer.filePath());
+       Path p(FileName(buffer.filePath()));
 
        vector<FileName> vec;
 
index c22e4c14ba72f736edbfaf662ad12280248fa217..fbdf15cf842c8621404b09f346fbae8adf2189d9 100644 (file)
@@ -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)) {
index 7d081dea7bf7061f1525f759c099440029d70912..9f32b16bbbbbd90db27f10e1cc448d2822502ffe 100644 (file)
@@ -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:
index 37f8814a435cba6e7dcee871b0158c70bb934408..b93ab6d1c7fa35dedbaccdbb4d7fbcecc568eafd 100644 (file)
@@ -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());
 
        }
 
index 11ee132a4c8275db139f002f8acd77c43ad0680e..4997d193c668a2dae3508eb2498b6a7bd797d6b0 100644 (file)
@@ -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();
 }
index 06845431091ed045b2def9d7150aa967031f4a97..0815d1b9c203f2195bbda529aa3f0b590274be70 100644 (file)
@@ -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<string>(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;
index bab3b1285726e62f807ffcfc526bc6df8e904dd2..99b32f101e6ea584cc4e5c4beaed37c10cf1fae3 100644 (file)
@@ -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,
index bc74cbaad5fd10f616a3a9c6da64861fbcf9cc52..71de4800778a2dc5c2c4ff5dc08828d62c8d57d0 100644 (file)
@@ -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(
index 6833a3a6a502ceb3d089f35a16e0572e2fb81abc..5cb256259ac7dad77bc62a3e967fdfbde78038e9 100644 (file)
@@ -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 =
index 7d8241677357e3b999a4d566a7fe7a6067bc3dfd..2680a9627940de0f3f27a2b17590cadfd5634b6a 100644 (file)
@@ -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<string, string> const
-get_build_dirs(string const & abs_binary,
+std::pair<FileName, FileName> 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<string, bool> const
-get_user_support_dir(string const & default_user_support_dir,
+std::pair<FileName, bool> 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]
                << "<package>\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'
                << "</package>\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<string, string> const
-get_build_dirs(string const & abs_binary,
+std::pair<FileName, FileName> 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 / <relative locale dir>
        // The <relative locale dir> 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<string> const path = getEnvPath("PATH");
        std::vector<string>::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<string> searched_dirs;
+       std::list<FileName> 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<string>::const_iterator iterator;
+       typedef std::list<FileName>::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<string, bool> const
-get_user_support_dir(string const & default_user_support_dir,
+std::pair<FileName, bool> 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<UInt8*>(store), PATH_MAX);
        if (status_code != 0)
-               return string();
+               return FileName();
 
-       return addPath(reinterpret_cast<char const *>(store), PACKAGE);
+       return FileName(addPath(reinterpret_cast<char const *>(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;
index 3e801dfd45b262319ed4f4b51bc2e2f066d9c9f2..1db12d6330fa05a265cacb96f3623f7f439fc81b 100644 (file)
@@ -15,6 +15,8 @@
 #ifndef LYX_PACHAGE_H
 #define LYX_PACHAGE_H
 
+#include "support/filename.h"
+
 #include <string>
 
 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_;
 }
index 4989dd6a196f4f4edf95e180d3f259474239aa51..dc246bc5094381a7a9aa861da9a1311f0484ee9e 100644 (file)
@@ -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 {
index 13296353aa6a87ce6b919773e6c2804915cb1663..ee878c7e76ca0967ca0935cf7756263095b8404f 100644 (file)
@@ -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();
index 6697b2c7d5d913db59d7df9fc180bb23830db4cb..c56e1b51a8af746dd8c424d9f248c5bd353bc475 100644 (file)
@@ -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<string>(getpid());
index 50ebd36903d94192d4287556aa9c3f535fa109f7..f4c5b50ce246e14533d9784041c714544f8e97b6 100644 (file)
@@ -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;
 }