]> git.lyx.org Git - features.git/commitdiff
Remove createTempFile method
authorJuergen Spitzmueller <spitz@lyx.org>
Thu, 8 Feb 2018 11:16:30 +0000 (12:16 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Thu, 8 Feb 2018 11:16:30 +0000 (12:16 +0100)
and use the new and safer tempFileName() method instead for the creation
of temporary directories

src/support/filetools.cpp
src/support/filetools.h

index bcfd1b6c9ea741c41910c475a5213849eb505496..7bff99dcd149787d920d058377488a46a7dd4bee 100644 (file)
@@ -40,7 +40,6 @@
 #include "support/TempFile.h"
 
 #include <QDir>
-#include <QTemporaryFile>
 
 #include "support/lassert.h"
 #include "support/regex.h"
@@ -460,7 +459,7 @@ string const commandPrep(string const & command_in)
 }
 
 
-FileName const tempFileName(string const & mask)
+FileName const tempFileName(string const & mask, bool const dir)
 {
        FileName tempfile = TempFile(mask).name();
        // Since the QTemporaryFile object is destroyed at function return
@@ -475,11 +474,16 @@ FileName const tempFileName(string const & mask)
 
        // 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);
@@ -505,35 +509,14 @@ void removeTempFile(FileName const & 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(fromqstr(tmp_fi.absoluteFilePath()) + ".XXXXXXXXXXXX", true);
 
        if (tmpfl.empty() || !tmpfl.createDirectory(0700)) {
                LYXERR0("LyX could not create temporary directory in " << tempdir
index 3a4c2c566d3031bd87a62517761b4b9c5d419636..6a9abc1eebe974227e197dd30d10724648402056 100644 (file)
@@ -40,7 +40,7 @@ static std::set<std::string> tmp_names_;
 * all used temp file names.
 * If you don't have to remove the temp file manually, use TempFile instead!
 */
-FileName const tempFileName(std::string const &);
+FileName const tempFileName(std::string const &, bool const dir = false);
 
 /// Remove and unregister a temporary file.
 void removeTempFile(FileName const &);