#include "support/TempFile.h"
#include <QDir>
-#include <QTemporaryFile>
#include "support/lassert.h"
#include "support/regex.h"
magic_t magic_cookie = magic_open(MAGIC_MIME_ENCODING);
if (magic_cookie) {
bool detected = true;
- if (magic_load(magic_cookie, NULL) != 0) {
+ if (magic_load(magic_cookie, nullptr) != 0) {
LYXERR(Debug::FILES, "isBinaryFile: "
"Could not load magic database - "
<< magic_error(magic_cookie));
FileName const i18nLibFileSearch(string const & dir, string const & name,
string const & ext)
{
- /* The highest priority value is the `LANGUAGE' environment
- variable. But we don't use the value if the currently
- selected locale is the C locale. This is a GNU extension.
-
- Otherwise, w use a trick to guess what support/gettext.has done:
- each po file is able to tell us its name. (JMarc)
- */
-
+ // if the LANGUAGE variable is set, use it as a fallback for searching for files.
string lang = getGuiMessages().language();
string const language = getEnv("LANGUAGE");
- if (!lang.empty() && !language.empty())
- lang = language;
+ if (!language.empty())
+ lang += ":" + language;
- string l;
- lang = split(lang, l, ':');
- while (!l.empty()) {
+ for (auto const & l : getVectorFromString(lang, ":")) {
FileName tmp;
// First try with the full name
- tmp = libFileSearch(addPath(dir, l), name, ext);
+ // `en' files are not in a subdirectory
+ if (l == "en")
+ tmp = libFileSearch(dir, name, ext);
+ else
+ tmp = libFileSearch(addPath(dir, l), name, ext);
if (!tmp.empty())
return tmp;
if (!tmp.empty())
return tmp;
}
-
-#if 1
- // For compatibility, to be removed later (JMarc)
- tmp = libFileSearch(dir, token(l, '_', 0) + '_' + name,
- ext);
- if (!tmp.empty()) {
- lyxerr << "i18nLibFileSearch: File `" << tmp
- << "' has been found by the old method" <<endl;
- return tmp;
- }
-#endif
- lang = split(lang, l, ':');
}
return libFileSearch(dir, name, ext);
}
-FileName const tempFileName(string const & mask)
+FileName const tempFileName(FileName tempdir, string const & mask, bool const dir)
+{
+ return tempFileName(TempFile(tempdir, mask).name(), dir);
+}
+
+
+FileName const tempFileName(string const & mask, bool const dir)
+{
+ return tempFileName(TempFile(mask).name(), dir);
+}
+
+
+FileName const tempFileName(FileName tempfile, bool const dir)
{
- FileName tempfile = TempFile(mask).name();
// Since the QTemporaryFile object is destroyed at function return
// (which is what is intended here), the next call to this function
// may return the same file name again.
// OK, we need another name. Simply append digits.
FileName tmp = tempfile;
- tmp.changeExtension("");
+ string ext;
+ if (!dir) {
+ // Store and remove extensions
+ ext = "." + tempfile.extension();
+ tmp.changeExtension("");
+ }
for (int i = 1; i < INT_MAX ;++i) {
// Append digit to filename and re-add extension
- string const new_fn = tmp.absFileName() + convert<string>(i)
- + "." + tempfile.extension();
+ string const new_fn =
+ tmp.absFileName() + convert<string>(i) + ext;
if (tmp_names_.find(new_fn) == tmp_names_.end()) {
tmp_names_.insert(new_fn);
tempfile.set(new_fn);
}
-static string createTempFile(QString const & mask)
-{
- // FIXME: This is not safe. QTemporaryFile creates a file in open(),
- // but the file is deleted when qt_tmp goes out of scope.
- // Therefore the next call to createTempFile() may create the
- // same file again. To make this safe the QTemporaryFile object
- // needs to be kept for the whole life time of the temp file name.
- // This could be achieved by creating a class TempDir (like
- // TempFile, but using a currently non-existing
- // QTemporaryDirectory object).
- QTemporaryFile qt_tmp(mask + ".XXXXXXXXXXXX");
- if (qt_tmp.open()) {
- string const temp_file = fromqstr(qt_tmp.fileName());
- LYXERR(Debug::FILES, "Temporary file `" << temp_file << "' created.");
- return temp_file;
- }
- LYXERR(Debug::FILES, "Unable to create temporary file with following template: "
- << qt_tmp.fileTemplate());
- return string();
-}
-
-
static FileName createTmpDir(FileName const & tempdir, string const & mask)
{
LYXERR(Debug::FILES, "createTmpDir: tempdir=`" << tempdir << "'\n"
<< "createTmpDir: mask=`" << mask << '\'');
QFileInfo tmp_fi(QDir(toqstr(tempdir.absFileName())), toqstr(mask));
- FileName const tmpfl(createTempFile(tmp_fi.absoluteFilePath()));
+ FileName const tmpfl =
+ tempFileName(FileName(fromqstr(tmp_fi.absolutePath())),
+ fromqstr(tmp_fi.fileName()) + ".XXXXXXXXXXXX", true);
if (tmpfl.empty() || !tmpfl.createDirectory(0700)) {
LYXERR0("LyX could not create temporary directory in " << tempdir
if (path != "." && path != "./" && !path.empty()) {
buf = os::internal_path(path);
- if (!suffixIs(path, '/'))
+ if (!suffixIs(buf, '/'))
buf += '/';
}
// $[A-Za-z_][A-Za-z_0-9]*
static string const envvar = "[$]([A-Za-z_][A-Za-z_0-9]*)";
- static regex const envvar_br_re("(.*)" + envvar_br + "(.*)");
- static regex const envvar_re("(.*)" + envvar + "(.*)");
- string result = path;
- while (1) {
- smatch what;
- if (!regex_match(result, what, envvar_br_re)) {
- if (!regex_match(result, what, envvar_re))
- break;
+ // Coverity thinks that the regex constructor can return an
+ // exception. We know that it is not true since our regex are
+ // hardcoded, but we have to protect against that nevertheless.
+ try {
+ static regex const envvar_br_re("(.*)" + envvar_br + "(.*)");
+ static regex const envvar_re("(.*)" + envvar + "(.*)");
+ string result = path;
+ while (1) {
+ smatch what;
+ if (!regex_match(result, what, envvar_br_re)) {
+ if (!regex_match(result, what, envvar_re))
+ break;
+ }
+ string env_var = getEnv(what.str(2));
+ result = what.str(1) + env_var + what.str(3);
}
- string env_var = getEnv(what.str(2));
- result = what.str(1) + env_var + what.str(3);
+ return result;
+ } catch (exception const & e) {
+ LYXERR0("Something is very wrong: " << e.what());
+ return path;
}
- return result;
}
unzippedFileName(zipped_file.toFilesystemEncoding()) :
unzipped_file);
// Run gunzip
- string const command = "gunzip -c " +
- zipped_file.toFilesystemEncoding() + " > " +
- tempfile.toFilesystemEncoding();
+ string const command = "gunzip -c \"" +
+ zipped_file.toFilesystemEncoding() + "\" > \"" +
+ tempfile.toFilesystemEncoding() + "\"";
Systemcall one;
one.startscript(Systemcall::Wait, command);
// test that command was executed successfully (anon)
{
string str = path;
+ // Recode URL encoded chars.
+ str = from_percent_encoding(str);
+
// If file is from LyXDir, display it as if it were relative.
string const system = package().system_support().absFileName();
if (prefixIs(str, system) && str != system)
command = rtrim(command, "2>&1");
err2out = true;
}
- string const cmdarg = "/d /c " + command;
+ string const cmdarg = "/d /c \"" + command + "\"";
string const comspec = getEnv("COMSPEC");
security.nLength = sizeof(SECURITY_ATTRIBUTES);
}
-FileName const findtexfile(string const & fil, string const & /*format*/)
+FileName const findtexfile(string const & fil, string const & /*format*/,
+ bool const onlykpse)
{
/* There is no problem to extend this function too use other
methods to look for files. It could be setup to look
// If the file can be found directly, we just return a
// absolute path version of it.
- FileName const absfile(makeAbsPath(fil));
- if (absfile.exists())
- return absfile;
+ if (!onlykpse) {
+ FileName const absfile(makeAbsPath(fil));
+ if (absfile.exists())
+ return absfile;
+ }
// Now we try to find it using kpsewhich.
// It seems from the kpsewhich manual page that it is safe to use
// is used."
// However, we want to take advantage of the format sine almost all
// the different formats has environment variables that can be used
- // to controll which paths to search. f.ex. bib looks in
+ // to control which paths to search. f.ex. bib looks in
// BIBINPUTS and TEXBIB. Small list follows:
// bib - BIBINPUTS, TEXBIB
// bst - BSTINPUTS