#include "support/gzstream.h"
#include "support/lstrings.h"
#include "support/lyxalgo.h"
+#include "support/mutex.h"
#include "support/os.h"
#include "support/Package.h"
#include "support/PathChanger.h"
/// Creates the per buffer temporary directory
static FileName createBufferTmpDir()
{
- // FIXME THREAD
- static int count;
+ // FIXME This would be the ideal application for a TempDir class (like
+ // TempFile but for directories)
+ string counter;
+ {
+ static int count;
+ static Mutex mutex;
+ Mutex::Locker locker(&mutex);
+ counter = convert<string>(count++);
+ }
// We are in our own directory. Why bother to mangle name?
// In fact I wrote this code to circumvent a problematic behaviour
// (bug?) of EMX mkstemp().
FileName tmpfl(package().temp_dir().absFileName() + "/lyx_tmpbuf" +
- convert<string>(count++));
+ counter);
if (!tmpfl.createDirectory(0777)) {
throw ExceptionMessage(WarningException, _("Disk Error: "), bformat(
// Copy child authors to the params. We need those pointers.
AuthorList const & child_authors = params().authors();
AuthorList::Authors::const_iterator it = child_authors.begin();
- for (; it != child_authors.end(); it++)
+ for (; it != child_authors.end(); ++it)
mparams.authors().record(*it);
return mparams;
}
Lexer lex;
istringstream is(s);
lex.setStream(is);
- FileName const fn = FileName::tempName("Buffer_readString");
+ TempFile tempfile("Buffer_readStringXXXXXX.lyx");
+ FileName const fn = tempfile.name();
int file_format;
bool success = parseLyXFormat(lex, fn, file_format) == ReadSuccess;
else if (success)
if (readDocument(lex))
success = false;
- if (fn.exists())
- fn.removeFile();
return success;
}
Buffer::ReadStatus Buffer::convertLyXFormat(FileName const & fn,
FileName & tmpfile, int from_format)
{
- tmpfile = FileName::tempName("Buffer_convertLyXFormatXXXXXX.lyx");
+ TempFile tempfile("Buffer_convertLyXFormatXXXXXX.lyx");
+ tempfile.setAutoRemove(false);
+ tmpfile = tempfile.name();
if(tmpfile.empty()) {
Alert::error(_("Conversion failed"),
bformat(_("%1$s is from a different"
tempfile.setAutoRemove(false);
if (made_backup &&
(symlink ? savefile.copyTo(fileName(), true) : savefile.moveTo(fileName()))) {
+ // saveCheckSum() was already called by writeFile(), but the
+ // time stamp is invalidated by copying/moving
+ saveCheckSum();
markClean();
return true;
}
}
-void Buffer::getSourceCode(odocstream & os, string const format,
+void Buffer::getSourceCode(odocstream & os, string const & format,
pit_type par_begin, pit_type par_end,
OutputWhat output, bool master) const
{
// to fork. But we will do the save
// anyway.
bool failed = false;
- FileName const tmp_ret = FileName::tempName("lyxauto");
+ TempFile tempfile("lyxautoXXXXXX.lyx");
+ tempfile.setAutoRemove(false);
+ FileName const tmp_ret = tempfile.name();
if (!tmp_ret.empty()) {
- buffer_.writeFile(tmp_ret);
- // assume successful write of tmp_ret
- if (!tmp_ret.moveTo(fname_))
+ if (!buffer_.writeFile(tmp_ret))
+ failed = true;
+ else if (!tmp_ret.moveTo(fname_))
failed = true;
} else
failed = true;
// If this buffer is cloned, we assume that
// we are running in a separate thread already.
- FileName const tmp_ret = FileName::tempName("lyxauto");
+ TempFile tempfile("lyxautoXXXXXX.lyx");
+ tempfile.setAutoRemove(false);
+ FileName const tmp_ret = tempfile.name();
if (!tmp_ret.empty()) {
writeFile(tmp_ret);
// assume successful write of tmp_ret