]> git.lyx.org Git - lyx.git/blobdiff - src/support/filetools.cpp
Fix bug 9798.
[lyx.git] / src / support / filetools.cpp
index 3d2346c7cd01b1bf3ae40efb43218fe340eb3775..37fd14f54d425b2d28c61826132adc5d7385ac86 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "support/filetools.h"
 
+#include "support/convert.h"
 #include "support/debug.h"
 #include "support/environment.h"
 #include "support/gettext.h"
@@ -36,6 +37,7 @@
 #include "support/PathChanger.h"
 #include "support/Systemcall.h"
 #include "support/qstring_helpers.h"
+#include "support/TempFile.h"
 
 #include <QDir>
 #include <QTemporaryFile>
@@ -458,6 +460,51 @@ string const commandPrep(string const & command_in)
 }
 
 
+FileName const tempFileName(string const & mask)
+{
+       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.
+       // Thus, in order to prevent race conditions, we track returned names
+       // and create our own unique names if QTemporaryFile returns a name again.
+       if (tmp_names_.find(tempfile.absFileName()) == tmp_names_.end()) {
+               tmp_names_.insert(tempfile.absFileName());
+               return tempfile;
+       }
+
+       // OK, we need another name. Simply append digits.
+       FileName tmp = tempfile;
+       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();
+               if (tmp_names_.find(new_fn) == tmp_names_.end()) {
+                       tmp_names_.insert(new_fn);
+                       tempfile.set(new_fn);
+                       return tempfile;
+               }
+       }
+
+       // This should not happen!
+       LYXERR0("tempFileName(): Could not create unique temp file name!");
+       return tempfile;
+}
+
+
+void removeTempFile(FileName const & fn)
+{
+       if (!fn.exists())
+               return;
+
+       string const abs = fn.absFileName();
+       if (tmp_names_.find(abs) != tmp_names_.end())
+               tmp_names_.erase(abs);
+       fn.removeFile();
+}
+
+
 static string createTempFile(QString const & mask)
 {
        // FIXME: This is not safe. QTemporaryFile creates a file in open(),
@@ -466,7 +513,7 @@ static string createTempFile(QString const & mask)
        //        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 currentlky non-existing
+       //        TempFile, but using a currently non-existing
        //        QTemporaryDirectory object).
        QTemporaryFile qt_tmp(mask + ".XXXXXXXXXXXX");
        if (qt_tmp.open()) {