mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
Fix several filename and environment variable encoding problems
* src/LaTeX.C (LaTeX::deplog): Assume that filenames in log files are stored in the file system encoding * src/frontends/qt4/qt_helpers.[Ch] (internal_path): delete * src/frontends/qt4/QGraphics.C: Adjust to change above * src/frontends/qt4/QPrefsDialog.C: ditto * src/frontends/qt4/QExternal.C: ditto * src/frontends/qt4/QInclude.C: ditto * src/support/os.h: Document the encoding of filename arguments * src/support/os_win32.h: ditto * src/support/filetools.C (findtexfile): Convert filename from file system encoding * src/support/os_win32.C: Convert filenames from utf8 to file system encoding and vice versa where needed * src/support/os_cygwin.C: ditto * src/support/getcwd.C (getcwd): Use internal_path() with correct encoding * src/support/docstring.[Ch] (from_filesystem8bit): new conversion function * src/support/environment.C (getEnv): convert environment variable from local 8bit encoding to utf8 (setEnv): convert environment variable from utf8 to local 8bit encoding * src/support/environment.h: document encoding of function arguments git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16753 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
51255d6598
commit
77b9dbd557
@ -836,6 +836,10 @@ void LaTeX::deplog(DepTable & head)
|
||||
|
||||
smatch sub;
|
||||
|
||||
// FIXME UNICODE: We assume that the file names in the log
|
||||
// file are in the file system encoding.
|
||||
token = to_utf8(from_filesystem8bit(token));
|
||||
|
||||
if (regex_match(token, sub, reg1)) {
|
||||
static regex reg1_1("\\(([^()]+)");
|
||||
smatch what;
|
||||
|
@ -455,8 +455,7 @@ void QExternal::apply()
|
||||
{
|
||||
InsetExternalParams params = controller().params();
|
||||
|
||||
// FIXME: UNICODE
|
||||
params.filename.set(to_utf8(internal_path(dialog_->fileED->text())),
|
||||
params.filename.set(internal_path(fromqstr(dialog_->fileED->text())),
|
||||
kernel().bufferFilepath());
|
||||
|
||||
params.settemplate(controller().getTemplate(
|
||||
|
@ -270,8 +270,7 @@ void QGraphics::apply()
|
||||
{
|
||||
InsetGraphicsParams & igp = controller().params();
|
||||
|
||||
// FIXME: UNICODE
|
||||
igp.filename.set(to_utf8(internal_path(dialog_->filename->text())),
|
||||
igp.filename.set(internal_path(fromqstr(dialog_->filename->text())),
|
||||
kernel().bufferFilepath());
|
||||
|
||||
// the bb section
|
||||
|
@ -103,7 +103,7 @@ void QInclude::apply()
|
||||
{
|
||||
InsetCommandParams params = controller().params();
|
||||
|
||||
params["filename"] = internal_path(dialog_->filenameED->text());
|
||||
params["filename"] = from_utf8(internal_path(fromqstr(dialog_->filenameED->text())));
|
||||
params.preview(dialog_->previewCB->isChecked());
|
||||
|
||||
int const item = dialog_->typeCO->currentIndex();
|
||||
|
@ -57,6 +57,10 @@
|
||||
#include <sstream>
|
||||
|
||||
using lyx::support::compare_no_case;
|
||||
using lyx::support::os::external_path;
|
||||
using lyx::support::os::external_path_list;
|
||||
using lyx::support::os::internal_path;
|
||||
using lyx::support::os::internal_path_list;
|
||||
|
||||
using std::distance;
|
||||
using std::endl;
|
||||
@ -163,24 +167,6 @@ void setComboxFont(QComboBox * cb, string const & family, string const & foundry
|
||||
<< foundry << "', '" << family << '\'' <<endl;
|
||||
}
|
||||
|
||||
|
||||
QString const external_path(string const & input)
|
||||
{
|
||||
return toqstr(lyx::support::os::external_path(input));
|
||||
}
|
||||
|
||||
|
||||
QString const external_path_list(string const & input)
|
||||
{
|
||||
return toqstr(lyx::support::os::external_path_list(input));
|
||||
}
|
||||
|
||||
|
||||
string const internal_path_list(QString const & input)
|
||||
{
|
||||
return lyx::support::os::internal_path_list(fromqstr(input));
|
||||
}
|
||||
|
||||
} // end namespace anon
|
||||
|
||||
|
||||
@ -249,9 +235,8 @@ void PrefKeyboard::apply(LyXRC & rc) const
|
||||
// FIXME: can derive CB from the two EDs
|
||||
rc.use_kbmap = keymapCB->isChecked();
|
||||
|
||||
// FIXME: UNICODE
|
||||
rc.primary_kbmap = to_utf8(internal_path(firstKeymapED->text()));
|
||||
rc.secondary_kbmap = to_utf8(internal_path(secondKeymapED->text()));
|
||||
rc.primary_kbmap = internal_path(fromqstr(firstKeymapED->text()));
|
||||
rc.secondary_kbmap = internal_path(fromqstr(secondKeymapED->text()));
|
||||
}
|
||||
|
||||
|
||||
@ -259,8 +244,8 @@ void PrefKeyboard::update(LyXRC const & rc)
|
||||
{
|
||||
// FIXME: can derive CB from the two EDs
|
||||
keymapCB->setChecked(rc.use_kbmap);
|
||||
firstKeymapED->setText(external_path(rc.primary_kbmap));
|
||||
secondKeymapED->setText(external_path(rc.secondary_kbmap));
|
||||
firstKeymapED->setText(toqstr(external_path(rc.primary_kbmap)));
|
||||
secondKeymapED->setText(toqstr(external_path(rc.secondary_kbmap)));
|
||||
}
|
||||
|
||||
|
||||
@ -679,32 +664,32 @@ PrefPaths::PrefPaths(QPrefs * form, QWidget * parent)
|
||||
|
||||
void PrefPaths::apply(LyXRC & rc) const
|
||||
{
|
||||
// FIXME: UNICODE
|
||||
rc.document_path = to_utf8(internal_path(workingDirED->text()));
|
||||
rc.template_path = to_utf8(internal_path(templateDirED->text()));
|
||||
rc.backupdir_path = to_utf8(internal_path(backupDirED->text()));
|
||||
rc.tempdir_path = to_utf8(internal_path(tempDirED->text()));
|
||||
rc.path_prefix = internal_path_list(pathPrefixED->text());
|
||||
rc.document_path = internal_path(fromqstr(workingDirED->text()));
|
||||
rc.template_path = internal_path(fromqstr(templateDirED->text()));
|
||||
rc.backupdir_path = internal_path(fromqstr(backupDirED->text()));
|
||||
rc.tempdir_path = internal_path(fromqstr(tempDirED->text()));
|
||||
rc.path_prefix = internal_path_list(fromqstr(pathPrefixED->text()));
|
||||
// FIXME: should be a checkbox only
|
||||
rc.lyxpipes = to_utf8(internal_path(lyxserverDirED->text()));
|
||||
rc.lyxpipes = internal_path(fromqstr(lyxserverDirED->text()));
|
||||
}
|
||||
|
||||
|
||||
void PrefPaths::update(LyXRC const & rc)
|
||||
{
|
||||
workingDirED->setText(external_path(rc.document_path));
|
||||
templateDirED->setText(external_path(rc.template_path));
|
||||
backupDirED->setText(external_path(rc.backupdir_path));
|
||||
tempDirED->setText(external_path(rc.tempdir_path));
|
||||
pathPrefixED->setText(external_path_list(rc.path_prefix));
|
||||
workingDirED->setText(toqstr(external_path(rc.document_path)));
|
||||
templateDirED->setText(toqstr(external_path(rc.template_path)));
|
||||
backupDirED->setText(toqstr(external_path(rc.backupdir_path)));
|
||||
tempDirED->setText(toqstr(external_path(rc.tempdir_path)));
|
||||
pathPrefixED->setText(toqstr(external_path_list(rc.path_prefix)));
|
||||
// FIXME: should be a checkbox only
|
||||
lyxserverDirED->setText(external_path(rc.lyxpipes));
|
||||
lyxserverDirED->setText(toqstr(external_path(rc.lyxpipes)));
|
||||
}
|
||||
|
||||
|
||||
void PrefPaths::select_templatedir()
|
||||
{
|
||||
docstring file(form_->controller().browsedir(
|
||||
internal_path(templateDirED->text()),
|
||||
from_utf8(internal_path(fromqstr(templateDirED->text()))),
|
||||
_("Select a document templates directory")));
|
||||
if (!file.empty())
|
||||
templateDirED->setText(toqstr(file));
|
||||
@ -714,7 +699,7 @@ void PrefPaths::select_templatedir()
|
||||
void PrefPaths::select_tempdir()
|
||||
{
|
||||
docstring file(form_->controller().browsedir(
|
||||
internal_path(tempDirED->text()),
|
||||
from_utf8(internal_path(fromqstr(tempDirED->text()))),
|
||||
_("Select a temporary directory")));
|
||||
if (!file.empty())
|
||||
tempDirED->setText(toqstr(file));
|
||||
@ -724,7 +709,7 @@ void PrefPaths::select_tempdir()
|
||||
void PrefPaths::select_backupdir()
|
||||
{
|
||||
docstring file(form_->controller().browsedir(
|
||||
internal_path(backupDirED->text()),
|
||||
from_utf8(internal_path(fromqstr(backupDirED->text()))),
|
||||
_("Select a backups directory")));
|
||||
if (!file.empty())
|
||||
backupDirED->setText(toqstr(file));
|
||||
@ -734,7 +719,7 @@ void PrefPaths::select_backupdir()
|
||||
void PrefPaths::select_workingdir()
|
||||
{
|
||||
docstring file(form_->controller().browsedir(
|
||||
internal_path(workingDirED->text()),
|
||||
from_utf8(internal_path(fromqstr(workingDirED->text()))),
|
||||
_("Select a document directory")));
|
||||
if (!file.empty())
|
||||
workingDirED->setText(toqstr(file));
|
||||
@ -744,7 +729,7 @@ void PrefPaths::select_workingdir()
|
||||
void PrefPaths::select_lyxpipe()
|
||||
{
|
||||
docstring file(form_->controller().browse(
|
||||
internal_path(lyxserverDirED->text()),
|
||||
from_utf8(internal_path(fromqstr(lyxserverDirED->text()))),
|
||||
_("Give a filename for the LyX server pipe")));
|
||||
if (!file.empty())
|
||||
lyxserverDirED->setText(toqstr(file));
|
||||
@ -807,9 +792,8 @@ void PrefSpellchecker::apply(LyXRC & rc) const
|
||||
// FIXME: remove isp_use_esc_chars
|
||||
rc.isp_esc_chars = fromqstr(escapeCharactersED->text());
|
||||
rc.isp_use_esc_chars = !rc.isp_esc_chars.empty();
|
||||
// FIXME: UNICODE
|
||||
// FIXME: remove isp_use_pers_dict
|
||||
rc.isp_pers_dict = to_utf8(internal_path(persDictionaryED->text()));
|
||||
rc.isp_pers_dict = internal_path(fromqstr(persDictionaryED->text()));
|
||||
rc.isp_use_pers_dict = !rc.isp_pers_dict.empty();
|
||||
rc.isp_accept_compound = compoundWordCB->isChecked();
|
||||
rc.isp_use_input_encoding = inputEncodingCB->isChecked();
|
||||
@ -839,7 +823,7 @@ void PrefSpellchecker::update(LyXRC const & rc)
|
||||
// FIXME: remove isp_use_esc_chars
|
||||
escapeCharactersED->setText(toqstr(rc.isp_esc_chars));
|
||||
// FIXME: remove isp_use_pers_dict
|
||||
persDictionaryED->setText(external_path(rc.isp_pers_dict));
|
||||
persDictionaryED->setText(toqstr(external_path(rc.isp_pers_dict)));
|
||||
compoundWordCB->setChecked(rc.isp_accept_compound);
|
||||
inputEncodingCB->setChecked(rc.isp_use_input_encoding);
|
||||
}
|
||||
@ -848,7 +832,7 @@ void PrefSpellchecker::update(LyXRC const & rc)
|
||||
void PrefSpellchecker::select_dict()
|
||||
{
|
||||
docstring file(form_->controller().browsedict(
|
||||
internal_path(persDictionaryED->text())));
|
||||
from_utf8(internal_path(fromqstr(persDictionaryED->text())))));
|
||||
if (!file.empty())
|
||||
persDictionaryED->setText(toqstr(file));
|
||||
}
|
||||
@ -1605,8 +1589,7 @@ void PrefPrinter::apply(LyXRC & rc) const
|
||||
rc.print_oddpage_flag = fromqstr(printerOddED->text());
|
||||
rc.print_collcopies_flag = fromqstr(printerCollatedED->text());
|
||||
rc.print_landscape_flag = fromqstr(printerLandscapeED->text());
|
||||
// FIXME: UNICODE
|
||||
rc.print_to_file = to_utf8(internal_path(printerToFileED->text()));
|
||||
rc.print_to_file = internal_path(fromqstr(printerToFileED->text()));
|
||||
rc.print_extra_options = fromqstr(printerExtraED->text());
|
||||
rc.print_spool_printerprefix = fromqstr(printerSpoolPrefixED->text());
|
||||
rc.print_paper_dimension_flag = fromqstr(printerPaperSizeED->text());
|
||||
@ -1630,7 +1613,7 @@ void PrefPrinter::update(LyXRC const & rc)
|
||||
printerOddED->setText(toqstr(rc.print_oddpage_flag));
|
||||
printerCollatedED->setText(toqstr(rc.print_collcopies_flag));
|
||||
printerLandscapeED->setText(toqstr(rc.print_landscape_flag));
|
||||
printerToFileED->setText(external_path(rc.print_to_file));
|
||||
printerToFileED->setText(toqstr(external_path(rc.print_to_file)));
|
||||
printerExtraED->setText(toqstr(rc.print_extra_options));
|
||||
printerSpoolPrefixED->setText(toqstr(rc.print_spool_printerprefix));
|
||||
printerPaperSizeED->setText(toqstr(rc.print_paper_dimension_flag));
|
||||
@ -1677,9 +1660,8 @@ PrefUserInterface::PrefUserInterface(QPrefs * form, QWidget * parent)
|
||||
|
||||
void PrefUserInterface::apply(LyXRC & rc) const
|
||||
{
|
||||
// FIXME: UNICODE
|
||||
rc.ui_file = to_utf8(internal_path(uiFileED->text()));
|
||||
rc.bind_file = to_utf8(internal_path(bindFileED->text()));
|
||||
rc.ui_file = internal_path(fromqstr(uiFileED->text()));
|
||||
rc.bind_file = internal_path(fromqstr(bindFileED->text()));
|
||||
rc.use_lastfilepos = restoreCursorCB->isChecked();
|
||||
rc.load_session = loadSessionCB->isChecked();
|
||||
if (loadWindowSizeCB->isChecked()) {
|
||||
@ -1699,8 +1681,8 @@ void PrefUserInterface::apply(LyXRC & rc) const
|
||||
|
||||
void PrefUserInterface::update(LyXRC const & rc)
|
||||
{
|
||||
uiFileED->setText(external_path(rc.ui_file));
|
||||
bindFileED->setText(external_path(rc.bind_file));
|
||||
uiFileED->setText(toqstr(external_path(rc.ui_file)));
|
||||
bindFileED->setText(toqstr(external_path(rc.bind_file)));
|
||||
restoreCursorCB->setChecked(rc.use_lastfilepos);
|
||||
loadSessionCB->setChecked(rc.load_session);
|
||||
bool loadWindowSize = rc.geometry_width == 0 && rc.geometry_height == 0;
|
||||
@ -1725,7 +1707,7 @@ void PrefUserInterface::update(LyXRC const & rc)
|
||||
void PrefUserInterface::select_ui()
|
||||
{
|
||||
docstring const name =
|
||||
internal_path(uiFileED->text());
|
||||
from_utf8(internal_path(fromqstr(uiFileED->text())));
|
||||
docstring file(form_->controller().browseUI(name));
|
||||
if (!file.empty())
|
||||
uiFileED->setText(toqstr(file));
|
||||
@ -1735,7 +1717,7 @@ void PrefUserInterface::select_ui()
|
||||
void PrefUserInterface::select_bind()
|
||||
{
|
||||
docstring const name =
|
||||
internal_path(bindFileED->text());
|
||||
from_utf8(internal_path(fromqstr(bindFileED->text())));
|
||||
docstring file(form_->controller().browsebind(name));
|
||||
if (!file.empty())
|
||||
bindFileED->setText(toqstr(file));
|
||||
|
@ -179,13 +179,4 @@ docstring const formatted(docstring const & text, int w)
|
||||
return sout;
|
||||
}
|
||||
|
||||
|
||||
docstring const internal_path(QString const & input)
|
||||
{
|
||||
// FIXME UNICODE
|
||||
return from_utf8(lyx::support::os::internal_path(
|
||||
to_utf8(qstring_to_ucs4(input))));
|
||||
}
|
||||
|
||||
|
||||
} // namespace lyx
|
||||
|
@ -59,9 +59,6 @@ QString const qt_(char const * str, const char * comment = 0);
|
||||
*/
|
||||
QString const qt_(std::string const & str);
|
||||
|
||||
///
|
||||
docstring const internal_path(QString const & input);
|
||||
|
||||
} // namespace lyx
|
||||
|
||||
#endif // QTHELPERS_H
|
||||
|
@ -457,7 +457,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_,
|
||||
support::os::internal_path(package().temp_dir() + "/lyxsocket")));
|
||||
os::internal_path(package().temp_dir() + "/lyxsocket")));
|
||||
|
||||
// Start the real execution loop.
|
||||
exit_status = pimpl_->application_->exec();
|
||||
|
@ -17,6 +17,8 @@
|
||||
#include <locale>
|
||||
#include <iostream>
|
||||
|
||||
#include <QFile>
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
|
||||
@ -116,6 +118,13 @@ std::string const to_local8bit(docstring const & s)
|
||||
}
|
||||
|
||||
|
||||
docstring const from_filesystem8bit(std::string const & s)
|
||||
{
|
||||
QByteArray const encoded(s.c_str(), s.length());
|
||||
return qstring_to_ucs4(QFile::decodeName(encoded));
|
||||
}
|
||||
|
||||
|
||||
bool operator==(lyx::docstring const & l, char const * r)
|
||||
{
|
||||
int const len = l.length();
|
||||
|
@ -56,6 +56,9 @@ public:
|
||||
*/
|
||||
std::string const to_local8bit(docstring const & s);
|
||||
|
||||
/// convert \p s from the encoding of the file system to ucs4.
|
||||
docstring const from_filesystem8bit(std::string const & s);
|
||||
|
||||
/// Compare a docstring with a C string of ASCII characters
|
||||
bool operator==(lyx::docstring const &, char const *);
|
||||
|
||||
|
@ -32,8 +32,7 @@ string const getEnv(string const & envname)
|
||||
{
|
||||
// f.ex. what about error checking?
|
||||
char const * const ch = getenv(envname.c_str());
|
||||
string const envstr = !ch ? "" : ch;
|
||||
return envstr;
|
||||
return ch ? to_utf8(from_local8bit(ch)) : string();
|
||||
}
|
||||
|
||||
|
||||
@ -61,13 +60,14 @@ bool setEnv(string const & name, string const & value)
|
||||
// CHECK Look at and fix this.
|
||||
// f.ex. what about error checking?
|
||||
|
||||
string const encoded(to_local8bit(from_utf8(value)));
|
||||
#if defined (HAVE_SETENV)
|
||||
int const retval = ::setenv(name.c_str(), value.c_str(), true);
|
||||
int const retval = ::setenv(name.c_str(), encoded.c_str(), true);
|
||||
|
||||
#elif defined (HAVE_PUTENV)
|
||||
static std::map<string, char *> varmap;
|
||||
|
||||
string envstr = name + '=' + value;
|
||||
string envstr = name + '=' + encoded;
|
||||
char * newptr = new char[envstr.size() + 1];
|
||||
envstr.copy(newptr, envstr.length());
|
||||
newptr[envstr.length()] = '\0';
|
||||
|
@ -18,11 +18,12 @@
|
||||
namespace lyx {
|
||||
namespace support {
|
||||
|
||||
/// @returns the contents of the environment variable @c name.
|
||||
/// @returns the contents of the environment variable @c name encoded in utf8.
|
||||
std::string const getEnv(std::string const & envname);
|
||||
|
||||
/** @returns the contents of the environment variable @c name,
|
||||
* split into path elements using the OS-dependent separator token.
|
||||
* split into path elements using the OS-dependent separator token
|
||||
* and encoded in utf8.
|
||||
* Each element is then passed through os::internal_path() to
|
||||
* guarantee that it is in the form of a unix-style path.
|
||||
* If the environment variable is not set, then the function returns
|
||||
@ -31,12 +32,13 @@ std::string const getEnv(std::string const & envname);
|
||||
std::vector<std::string> const getEnvPath(std::string const & name);
|
||||
|
||||
/** Set the contents of the environment variable @c name to @c value.
|
||||
* \p value is encoded in utf8.
|
||||
* @returns true if the variable was set successfully.
|
||||
*/
|
||||
bool setEnv(std::string const & name, std::string const & value);
|
||||
|
||||
/** Set the contents of the environment variable @c name
|
||||
* using the paths stored in the @c env vector.
|
||||
* using the paths stored in the @c env vector (encoded in utf8).
|
||||
* Each element is passed through os::external_path().
|
||||
* Multiple elements are concatenated into a single string using
|
||||
* os::path_separator().
|
||||
@ -45,8 +47,8 @@ void setEnvPath(std::string const & name, std::vector<std::string> const & env);
|
||||
|
||||
/** Prepend a list of paths to that returned by the environment variable.
|
||||
* Identical paths occurring later in the list are removed.
|
||||
* @param name the name of the environment variable.
|
||||
* @prefix the list of paths in OS-native syntax.
|
||||
* @param name the name of the environment variable (encoded in utf8).
|
||||
* @prefix the list of paths in OS-native syntax (encoded in utf8).
|
||||
* Eg "/foo/bar:/usr/bin:/usr/local/bin" on *nix,
|
||||
* "C:\foo\bar;C:\windows" on Windows.
|
||||
*/
|
||||
|
@ -999,7 +999,7 @@ docstring const makeDisplayPath(string const & path, unsigned int threshold)
|
||||
str = subst(str, home, "~");
|
||||
|
||||
if (str.length() <= threshold)
|
||||
return lyx::from_utf8(os::external_path(str));
|
||||
return from_utf8(os::external_path(str));
|
||||
|
||||
string const prefix = ".../";
|
||||
string temp;
|
||||
@ -1020,7 +1020,7 @@ docstring const makeDisplayPath(string const & path, unsigned int threshold)
|
||||
str = head + "..." + tail;
|
||||
}
|
||||
|
||||
return lyx::from_utf8(os::external_path(prefix + str));
|
||||
return from_utf8(os::external_path(prefix + str));
|
||||
}
|
||||
|
||||
|
||||
@ -1138,7 +1138,8 @@ FileName const findtexfile(string const & fil, string const & /*format*/)
|
||||
<< "kpse result = `" << rtrim(c.second, "\n\r")
|
||||
<< '\'' << endl;
|
||||
if (c.first != -1)
|
||||
return FileName(os::internal_path(rtrim(c.second, "\n\r")));
|
||||
return FileName(os::internal_path(rtrim(to_utf8(from_filesystem8bit(c.second)),
|
||||
"\n\r")));
|
||||
else
|
||||
return FileName();
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ FileName const getcwd()
|
||||
string result;
|
||||
if (err)
|
||||
result = tbuf.get();
|
||||
return FileName::fromFilesystemEncoding(os::internal_path(result));
|
||||
return FileName(os::internal_path(to_utf8(from_filesystem8bit(result))));
|
||||
}
|
||||
|
||||
} // namespace support
|
||||
|
@ -44,29 +44,36 @@ shell_type shell();
|
||||
std::string const python();
|
||||
|
||||
/// Extract the path common to both @c p1 and @c p2. DBCS aware!
|
||||
/// \p p1, \p p2 and the return value are encoded in utf8.
|
||||
std::string::size_type common_path(std::string const & p1, std::string const & p2);
|
||||
|
||||
/// Converts a unix style path to host OS style.
|
||||
/// \p p and the return value are encoded in utf8.
|
||||
std::string external_path(std::string const & p);
|
||||
|
||||
/// Converts a host OS style path to unix style.
|
||||
/// \p p and the return value are encoded in utf8.
|
||||
std::string internal_path(std::string const & p);
|
||||
|
||||
/// Converts a unix style path list to host OS style.
|
||||
/// \p p and the return value are encoded in utf8.
|
||||
std::string external_path_list(std::string const & p);
|
||||
|
||||
/// Converts a host OS style path list to unix style.
|
||||
/// \p p and the return value are encoded in utf8.
|
||||
std::string internal_path_list(std::string const & p);
|
||||
|
||||
/**
|
||||
* Converts a unix style path into a form suitable for inclusion in a LaTeX
|
||||
* document.
|
||||
* \p p is encoded in utf8.
|
||||
* Caution: This function handles only the OS specific part of that task.
|
||||
* Never use it directly, use lyx::support::latex_path instead.
|
||||
*/
|
||||
std::string latex_path(std::string const & p);
|
||||
|
||||
/// Is the path absolute?
|
||||
/// \p p is encoded in utf8.
|
||||
bool is_absolute_path(std::string const & p);
|
||||
|
||||
/** Returns a string suitable to be passed to popen when
|
||||
@ -98,7 +105,7 @@ enum auto_open_mode {
|
||||
bool canAutoOpenFile(std::string const & ext, auto_open_mode const mode = VIEW);
|
||||
|
||||
/** View or edit a file with the default viewer or editor.
|
||||
* \param filename file to open
|
||||
* \param filename file to open (encoded in utf8)
|
||||
* \param mode open in VIEW or EDIT mode
|
||||
* \returns whether or not the file is viewed (or edited) successfully.
|
||||
*/
|
||||
|
@ -78,6 +78,9 @@ enum PathStyle {
|
||||
};
|
||||
|
||||
|
||||
/// Convert a path to or from posix style.
|
||||
/// \p p is encoded in local 8bit encoding or utf8.
|
||||
/// The result is returned in the same encoding as \p p.
|
||||
string convert_path(string const & p, PathStyle const & target)
|
||||
{
|
||||
char path_buf[PATH_MAX];
|
||||
@ -88,6 +91,8 @@ string convert_path(string const & p, PathStyle const & target)
|
||||
|
||||
path_buf[0] = '\0';
|
||||
|
||||
// cygwin_conv_to_posix_path and cygwin_conv_to_win32_path do not
|
||||
// care about the encoding.
|
||||
if (target == posix)
|
||||
cygwin_conv_to_posix_path(p.c_str(), path_buf);
|
||||
else
|
||||
@ -97,6 +102,9 @@ string convert_path(string const & p, PathStyle const & target)
|
||||
}
|
||||
|
||||
|
||||
/// Convert a path list to or from posix style.
|
||||
/// \p p is encoded in local 8bit encoding or utf8.
|
||||
/// The result is returned in the same encoding as \p p.
|
||||
string convert_path_list(string const & p, PathStyle const & target)
|
||||
{
|
||||
if (p.empty())
|
||||
@ -113,6 +121,7 @@ string convert_path_list(string const & p, PathStyle const & target)
|
||||
char * ptr = new char[target_size];
|
||||
|
||||
if (ptr) {
|
||||
// FIXME: See comment in convert_path() above
|
||||
if (target == posix)
|
||||
cygwin_win32_to_posix_path_list(pc, ptr);
|
||||
else
|
||||
@ -308,7 +317,7 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode)
|
||||
{
|
||||
// reference: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc
|
||||
// /platform/shell/reference/functions/shellexecute.asp
|
||||
string const win_path = convert_path(filename, PathStyle(windows));
|
||||
string const win_path = to_local8bit(from_utf8(convert_path(filename, PathStyle(windows))));
|
||||
char const * action = (mode == VIEW) ? "open" : "edit";
|
||||
return reinterpret_cast<int>(ShellExecute(NULL, action,
|
||||
win_path.c_str(), NULL, NULL, 1)) > 32;
|
||||
@ -322,9 +331,9 @@ void addFontResources()
|
||||
string const fonts_dir = addPath(package().system_support(), "fonts");
|
||||
|
||||
for (int i = 0 ; i < num_fonts_truetype ; ++i) {
|
||||
string const font_current = convert_path(
|
||||
string const font_current = to_local8bit(from_utf8(convert_path(
|
||||
addName(fonts_dir, win_fonts_truetype[i] + ".ttf"),
|
||||
PathStyle(windows));
|
||||
PathStyle(windows))));
|
||||
AddFontResource(font_current.c_str());
|
||||
}
|
||||
#endif
|
||||
@ -338,9 +347,9 @@ void restoreFontResources()
|
||||
string const fonts_dir = addPath(package().system_support(), "fonts");
|
||||
|
||||
for(int i = 0 ; i < num_fonts_truetype ; ++i) {
|
||||
string const font_current = convert_path(
|
||||
string const font_current = to_local8bit(from_utf8(convert_path(
|
||||
addName(fonts_dir, win_fonts_truetype[i] + ".ttf"),
|
||||
PathStyle(windows));
|
||||
PathStyle(windows))));
|
||||
RemoveFontResource(font_current.c_str());
|
||||
}
|
||||
#endif
|
||||
|
@ -28,8 +28,6 @@
|
||||
#include <cstdlib>
|
||||
#include <vector>
|
||||
|
||||
#include <string>
|
||||
|
||||
/* The GetLongPathName macro may be defined on the compiling machine,
|
||||
* but we must use a bit of trickery if the resulting executable is
|
||||
* to run on a Win95 machine.
|
||||
@ -217,8 +215,11 @@ namespace {
|
||||
|
||||
string const get_long_path(string const & short_path)
|
||||
{
|
||||
// GetLongPathName needs the path in file system encoding.
|
||||
// We can use to_local8bit, since file system encoding and the
|
||||
// local 8 bit encoding are identical on windows.
|
||||
std::vector<char> long_path(MAX_PATH);
|
||||
DWORD result = GetLongPathName(short_path.c_str(),
|
||||
DWORD result = GetLongPathName(to_local8bit(from_utf8(short_path)).c_str(),
|
||||
&long_path[0], long_path.size());
|
||||
|
||||
if (result > long_path.size()) {
|
||||
@ -228,7 +229,7 @@ string const get_long_path(string const & short_path)
|
||||
BOOST_ASSERT(result <= long_path.size());
|
||||
}
|
||||
|
||||
return (result == 0) ? short_path : &long_path[0];
|
||||
return (result == 0) ? short_path : to_utf8(from_filesystem8bit(&long_path[0]));
|
||||
}
|
||||
|
||||
} // namespace anon
|
||||
@ -384,7 +385,7 @@ string const GetFolderPath::operator()(folder_id _id) const
|
||||
HRESULT const result = (folder_path_func_)(0, id, 0,
|
||||
SHGFP_TYPE_CURRENT,
|
||||
folder_path);
|
||||
return (result == 0) ? os::internal_path(folder_path) : string();
|
||||
return (result == 0) ? os::internal_path(to_utf8(from_filesystem8bit(folder_path))) : string();
|
||||
}
|
||||
|
||||
|
||||
@ -411,7 +412,7 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode)
|
||||
// /platform/shell/reference/functions/shellexecute.asp
|
||||
char const * action = (mode == VIEW) ? "open" : "edit";
|
||||
return reinterpret_cast<int>(ShellExecute(NULL, action,
|
||||
filename.c_str(), NULL, NULL, 1)) > 32;
|
||||
to_local8bit(from_utf8(filename)).c_str(), NULL, NULL, 1)) > 32;
|
||||
}
|
||||
|
||||
|
||||
@ -421,9 +422,9 @@ void addFontResources()
|
||||
string const fonts_dir = addPath(package().system_support(), "fonts");
|
||||
|
||||
for (int i = 0 ; i < num_fonts_truetype ; ++i) {
|
||||
string const font_current =
|
||||
string const font_current =
|
||||
addName(fonts_dir, win_fonts_truetype[i] + ".ttf");
|
||||
AddFontResource(external_path(font_current).c_str());
|
||||
AddFontResource(to_local8bit(from_utf8(external_path(font_current))).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@ -434,9 +435,9 @@ void restoreFontResources()
|
||||
string const fonts_dir = addPath(package().system_support(), "fonts");
|
||||
|
||||
for(int i = 0 ; i < num_fonts_truetype ; ++i) {
|
||||
string const font_current =
|
||||
string const font_current =
|
||||
addName(fonts_dir, win_fonts_truetype[i] + ".ttf");
|
||||
RemoveFontResource(external_path(font_current).c_str());
|
||||
RemoveFontResource(to_local8bit(from_utf8(external_path(font_current))).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public:
|
||||
~GetFolderPath();
|
||||
|
||||
/** Wrapper for SHGetFolderPathA, returning
|
||||
* the path asscociated with @c id.
|
||||
* the path asscociated with @c id in utf8 encoding.
|
||||
*/
|
||||
std::string const operator()(folder_id id) const;
|
||||
private:
|
||||
|
Loading…
Reference in New Issue
Block a user