+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(),
+ // 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();
+}
+
+