Now that exceptions are allowed, handle gracefully the case where a Buffer temp directory could not be created. As a bonus, the user will get an informative message.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22196 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2007-12-17 18:37:13 +00:00
parent 8672364e1e
commit 1447a7bf98
8 changed files with 51 additions and 35 deletions

View File

@ -78,7 +78,9 @@
#include "support/convert.h"
#include "support/debug.h"
#include "support/ExceptionMessage.h"
#include "support/FileFilterList.h"
#include "support/FileName.h"
#include "support/FileNameList.h"
#include "support/filetools.h"
#include "support/ForkedCalls.h"
@ -87,6 +89,7 @@
#include "support/lstrings.h"
#include "support/lyxalgo.h"
#include "support/os.h"
#include "support/Package.h"
#include "support/Path.h"
#include "support/textutils.h"
#include "support/types.h"
@ -137,7 +140,7 @@ public:
BufferParams params;
LyXVC lyxvc;
string temppath;
FileName temppath;
mutable TexRow texrow;
Buffer const * parent_buffer;
@ -198,6 +201,24 @@ public:
mutable FileNameList bibfilesCache_;
};
/// Creates the per buffer temporary directory
static FileName createBufferTmpDir()
{
static int 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++));
if (!tmpfl.createDirectory(0777)) {
throw ExceptionMessage(WarningException, _("Disk Error: "), bformat(
_("LyX could not create the temporary directory '%1$s' (Disk is full maybe?)"),
from_utf8(tmpfl.absFilename())));
}
return tmpfl;
}
Buffer::Impl::Impl(Buffer & parent, FileName const & file, bool readonly_)
: parent_buffer(0), lyx_clean(true), bak_clean(true), unnamed(false),
@ -205,14 +226,9 @@ Buffer::Impl::Impl(Buffer & parent, FileName const & file, bool readonly_)
inset(params), toc_backend(&parent), embedded_files(&parent),
timestamp_(0), checksum_(0), wa_(0), undo_(parent)
{
temppath = createBufferTmpDir();
inset.setAutoBreakRows(true);
lyxvc.setBuffer(&parent);
temppath = createBufferTmpDir();
// FIXME: And now do something if temppath == string(), because we
// assume from now on that temppath points to a valid temp dir.
// See http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg67406.html
if (use_gui)
wa_ = new frontend::WorkAreaManager;
}
@ -243,10 +259,10 @@ Buffer::~Buffer()
resetChildDocuments(false);
if (!temppath().empty() && !FileName(temppath()).destroyDirectory()) {
if (!d->temppath.destroyDirectory()) {
Alert::warning(_("Could not remove temporary directory"),
bformat(_("Could not remove the temporary directory %1$s"),
from_utf8(temppath())));
from_utf8(d->temppath.absFilename())));
}
// Remove any previewed LaTeX snippets associated with this buffer.
@ -318,9 +334,9 @@ LyXVC const & Buffer::lyxvc() const
}
string const & Buffer::temppath() const
string const Buffer::temppath() const
{
return d->temppath;
return d->temppath.absFilename();
}

View File

@ -328,7 +328,7 @@ public:
LyXVC const & lyxvc() const;
/// Where to put temporary files.
std::string const & temppath() const;
std::string const temppath() const;
/// Used when typesetting to place errorboxes.
TexRow const & texrow() const;

View File

@ -22,6 +22,7 @@
#include "frontends/alert.h"
#include "support/ExceptionMessage.h"
#include "support/debug.h"
#include "support/filetools.h"
#include "support/gettext.h"
@ -93,7 +94,17 @@ void BufferList::release(Buffer * buf)
Buffer * BufferList::newBuffer(string const & s, bool const ronly)
{
auto_ptr<Buffer> tmpbuf(new Buffer(s, ronly));
auto_ptr<Buffer> tmpbuf;
try { tmpbuf.reset(new Buffer(s, ronly));
} catch (ExceptionMessage const & message) {
if (message.type_ == ErrorException) {
Alert::error(message.title_, message.details_);
exit(1);
} else if (message.type_ == WarningException) {
Alert::warning(message.title_, message.details_);
return 0;
}
}
tmpbuf->params().useClassDefaults();
LYXERR(Debug::INFO, "Assigning to buffer " << bstore.size());
bstore.push_back(tmpbuf.get());

View File

@ -41,6 +41,7 @@ public:
const_iterator end() const;
/// create a new buffer
/// \return 0 if the Buffer creation is not possible for whatever reason.
Buffer * newBuffer(std::string const & s, bool ronly = false);
/// delete a buffer

View File

@ -81,6 +81,9 @@ Buffer * checkAndLoadLyXFile(FileName const & filename)
if (filename.isReadableFile()) {
Buffer * b = theBufferList().newBuffer(filename.absFilename());
if (!b)
// Buffer creation is not possible.
return 0;
if (!b->loadLyXFile(filename)) {
theBufferList().release(b);
return 0;
@ -105,7 +108,9 @@ Buffer * newFile(string const & filename, string const & templatename,
{
// get a free buffer
Buffer * b = theBufferList().newBuffer(filename);
BOOST_ASSERT(b);
if (!b)
// Buffer creation is not possible.
return 0;
FileName tname;
// use defaults.lyx as a default template if it exists.

View File

@ -312,6 +312,10 @@ Buffer * loadIfNeeded(Buffer const & parent, InsetCommandParams const & params)
return 0;
child = theBufferList().newBuffer(included_file.absFilename());
if (!child)
// Buffer creation is not possible.
return 0;
if (!child->loadLyXFile(included_file)) {
//close the buffer we just opened
theBufferList().release(child);

View File

@ -338,24 +338,6 @@ static FileName createTmpDir(FileName const & tempdir, string const & mask)
return tmpfl;
}
string const createBufferTmpDir()
{
static int 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().
string const tmpfl =
package().temp_dir().absFilename() + "/lyx_tmpbuf" +
convert<string>(count++);
if (!FileName(tmpfl).createDirectory(0777)) {
lyxerr << "LyX could not create the temporary directory '"
<< tmpfl << "'" << endl;
return string();
}
return tmpfl;
}
FileName const createLyXTmpDir(FileName const & deflt)
{

View File

@ -22,9 +22,6 @@ namespace support {
class FileName;
/// Creates the per buffer temporary directory
std::string const createBufferTmpDir();
/** Creates the global LyX temp dir.
\p deflt can be an existing directory name. In this case a new directory
inside \p deflt is created. If \p deflt does not exist yet, \p deflt is