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),
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 `"
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
}
// 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))) {
// 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))) {
//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());
}
// 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;
}
// 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();
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
// 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) {
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());
<< 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();
}
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
{
// 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()),
'.' + 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(\"")) {
}
-void TemplateManager::readTemplates(string const & path)
+void TemplateManager::readTemplates(support::FileName const & path)
{
support::Path p(path);
namespace lyx {
+namespace support { class FileName; }
+
class LyXLex;
namespace external {
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;
vector<FileName> const InsetBibtex::getFiles(Buffer const & buffer) const
{
- Path p(buffer.filePath());
+ Path p(FileName(buffer.filePath()));
vector<FileName> vec;
// 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();
// 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);
}
}
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");
}
// 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);
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"
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));
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));
{
// 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;
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"))) {
}
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)) {
// 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
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));
case LFUN_PREFERENCES_SAVE: {
lyxrc.write(makeAbsPath("preferences",
- package().user_support()),
+ package().user_support().absFilename()),
false);
break;
}
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);
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),
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 += " (*.";
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:
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;
}
//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());
}
{
// 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();
}
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);
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);
}
// 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)) {
}
-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;
}
return getcwd().absFilename() + '/' + rTemp;
if (temp == "~")
- return package().home_dir() + '/' + rTemp;
+ return package().home_dir().absFilename() + '/' + rTemp;
if (temp == "..")
return makeAbsPath(copy).absFilename();
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, "~");
}
-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;
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
*/
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,
{
#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(
{
#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(
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 =
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 =
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);
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_) =
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;
}
// 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@");
}
} // 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;
}
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);
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;
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...";
// 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"
// 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.
}
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
// 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");
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
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();
// 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,
// 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;
}
// 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.
}
// 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.
}
// 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;
}
// 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
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);
// $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.
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
}
// 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)));
}
// 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) {
_("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;
#ifndef LYX_PACHAGE_H
#define LYX_PACHAGE_H
+#include "support/filename.h"
+
#include <string>
namespace lyx {
/** 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
/** 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)
* 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_;
};
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_;
}
}
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_;
}
#define PATH_C
#include "support/path.h"
-#include "support/filename.h"
#include "support/lyxlib.h"
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 {
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();
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());
{
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;
}