Am Dienstag, 17. Februar 2004 22:05 schrieb Georg Baum:
> Am Dienstag, 17. Februar 2004 18:09 schrieb Jean-Marc Lasgouttes:
> > Do you want me to apply your patch now?

Please apply the attached second version.

> Not yet, I first want to check wether the html stuff works as expected. 
I'll 
> send an updated version then, including the warning message that Angus 
> suggested.

I have played with the html export, and it works without tmpdir if the 
"originaldir" flag is interpreted as "Do a 'nice' export and run everything 
in the original dir". This simulates the "use no temp dir" case just for 
this conversion.

Changes to the first version of the patch:

- doxygen fix in support/filename.h
- Warn when reading the now obsolete use_tempdir flag
- Exit lyx from the buffer constructor if the temp dir is invalid. I tested 
it (using a static counter that triggered the test in the third buffer), 
and unsaved changes got written to .emergency files.
I guess that doing this "controlled crash" is safe: The new buffer is 
completely constructed, but empty, so the emergency write will not harm.


Georg
Index: src/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/ChangeLog,v
retrieving revision 1.1813
diff -u -p -r1.1813 ChangeLog
--- src/ChangeLog	2004/02/20 17:19:48	1.1813
+++ src/ChangeLog	2004/02/21 17:13:38
@@ -1,3 +1,15 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* lyxrc.C, buffer.C, exporter.C: use always a temp dir, ignore
+	use_tempdir in preferences
+	* buffer.C (readFile), lyxvc.C (getLogFile): check success of
+	tempfile creation
+	* lyx_main.C: ensure that tempdir is valid
+	* lyxlex.h: correct typo
+	* buffer.[Ch] (isMultiLingual), (isUnnamed): make const
+	* paragraph.[Ch] (isMultiLingual): make const
+	* cursor.[Ch] (openable): make const
+
 2004-02-20  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
 	* text3.C: fixed LFUN_QUOTE and add lfun arguments single/double.
Index: src/buffer.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/buffer.C,v
retrieving revision 1.554
diff -u -p -r1.554 buffer.C
--- src/buffer.C	2004/02/11 14:45:38	1.554
+++ src/buffer.C	2004/02/21 17:15:38
@@ -34,6 +34,7 @@
 #include "lyxtext.h"
 #include "lyxrc.h"
 #include "lyxvc.h"
+#include "lyx_main.h"
 #include "messages.h"
 #include "output.h"
 #include "output_docbook.h"
@@ -85,7 +86,7 @@ using lyx::support::atoi;
 using lyx::support::bformat;
 using lyx::support::ChangeExtension;
 using lyx::support::cmd_ret;
-using lyx::support::CreateBufferTmpDir;
+using lyx::support::createBufferTmpDir;
 using lyx::support::destroyDir;
 using lyx::support::FileInfo;
 using lyx::support::FileInfo;
@@ -190,8 +191,7 @@ Buffer::Impl::Impl(Buffer & parent, stri
 		text(0, 0)
 {
 	lyxvc.buffer(&parent);
-	if (readonly_ || lyxrc.use_tempdir)
-		temppath = CreateBufferTmpDir();
+	temppath = createBufferTmpDir();
 }
 
 
@@ -199,6 +199,18 @@ Buffer::Buffer(string const & file, bool
 	: pimpl_(new Impl(*this, file, ronly))
 {
 	lyxerr[Debug::INFO] << "Buffer::Buffer()" << endl;
+	// Exit if we have no temp dir.
+	// Since the buffer temp dir is created in the global lyx temp dir,
+	// and that was valid at lyx startup, chances that this happens are
+	// minimal, and trying to work around is not worth the effort.
+	if (temppath().empty()) {
+		Alert::error(_("Could not create temporary directory"),
+		             _("Could not create a temporary directory."
+		               " LyX will exit now."));
+		// Try to save changed files
+		LyX::cref().emergencyCleanup();
+		exit(EXIT_FAILURE);
+	}
 }
 
 
@@ -317,11 +329,8 @@ pair<Buffer::LogType, string> const Buff
 
 	if (filename.empty())
 		return make_pair(Buffer::latexlog, string());
-
-	string path = OnlyPath(filename);
 
-	if (lyxrc.use_tempdir || !IsDirWriteable(path))
-		path = temppath();
+	string const path = temppath();
 
 	string const fname = AddName(path,
 				     OnlyFilename(ChangeExtension(filename,
@@ -596,6 +625,15 @@ bool Buffer::readFile(LyXLex & lex, stri
 					 filename));
 	} else if (file_format < LYX_FORMAT) {
 		string const tmpfile = tempName();
+		if (tmpfile.empty()) {
+			Alert::error(_("Conversion failed"),
+				     bformat(_("%1$s is from an earlier"
+					      " version of LyX, but a temporary"
+					      " file for converting it could"
+					      " not be created."),
+					      filename));
+			return false;
+		}
 		string command = LibFileSearch("lyx2lyx", "lyx2lyx");
 		if (command.empty()) {
 			Alert::error(_("Conversion script not found"),
@@ -953,7 +996,7 @@ bool Buffer::isSGML() const
 
 void Buffer::makeLinuxDocFile(string const & fname,
 			      OutputParams const & runparams,
-			      bool body_only )
+                              bool body_only)
 {
 	ofstream ofs;
 	if (!openFileWrite(ofs, fname))
@@ -1074,12 +1123,8 @@ int Buffer::runChktex()
 
 	// get LaTeX-Filename
 	string const name = getLatexName();
-	string path = filePath();
-
-	string const org_path = path;
-	if (lyxrc.use_tempdir || !IsDirWriteable(path)) {
-		path = temppath();
-	}
+	string const path = temppath();
+	string const org_path = filePath();
 
 	Path p(path); // path to LaTeX file
 	message(_("Running chktex..."));
@@ -1272,10 +1311,10 @@ void Buffer::updateDocLang(Language cons
 }
 
 
-bool Buffer::isMultiLingual()
+bool Buffer::isMultiLingual() const
 {
-	ParIterator end = par_iterator_end();
-	for (ParIterator it = par_iterator_begin(); it != end; ++it)
+	ParConstIterator end = par_iterator_end();
+	for (ParConstIterator it = par_iterator_begin(); it != end; ++it)
 		if (it->isMultiLingual(params()))
 			return true;
 
@@ -1424,7 +1463,7 @@ void Buffer::setUnnamed(bool flag)
 }
 
 
-bool Buffer::isUnnamed()
+bool Buffer::isUnnamed() const
 {
 	return pimpl_->unnamed;
 }
Index: src/buffer.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/buffer.h,v
retrieving revision 1.177
diff -u -p -r1.177 buffer.h
--- src/buffer.h	2004/01/26 10:13:08	1.177
+++ src/buffer.h	2004/02/21 17:16:08
@@ -181,7 +181,7 @@ public:
 	void setUnnamed(bool flag = true);
 
 	///
-	bool isUnnamed();
+	bool isUnnamed() const;
 
 	/// Mark this buffer as dirty.
 	void markDirty();
@@ -248,7 +253,7 @@ public:
 	void updateDocLang(Language const * nlang);
 
 	///
-	bool isMultiLingual();
+	bool isMultiLingual() const;
 
 	/// Does this mean that this is buffer local?
 	limited_stack<Undo> & undostack();
Index: src/cursor.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/cursor.C,v
retrieving revision 1.64
diff -u -p -r1.64 cursor.C
--- src/cursor.C	2004/02/20 17:19:49	1.64
+++ src/cursor.C	2004/02/21 17:16:20
@@ -894,7 +894,7 @@ bool LCursor::isInside(InsetBase const *
 }
 
 
-bool LCursor::openable(MathAtom const & t)
+bool LCursor::openable(MathAtom const & t) const
 {
 	if (!t->isActive())
 		return false;
Index: src/cursor.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/cursor.h,v
retrieving revision 1.39
diff -u -p -r1.39 cursor.h
--- src/cursor.h	2004/02/20 17:19:49	1.39
+++ src/cursor.h	2004/02/21 17:16:32
@@ -471,7 +471,7 @@ private:
 	/// where in the curent cell does the macro name start?
 	int macroNamePos();
 	/// can we enter the inset?
-	bool openable(MathAtom const &);
+	bool openable(MathAtom const &) const;
 };
 
 #endif // LYXCURSOR_H
Index: src/exporter.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/exporter.C,v
retrieving revision 1.50
diff -u -p -r1.50 exporter.C
--- src/exporter.C	2003/11/27 16:38:47	1.50
+++ src/exporter.C	2004/02/21 17:16:32
@@ -85,8 +127,7 @@ bool Exporter::Export(Buffer * buffer, s
 		backend_format = format;
 
 	string filename = buffer->getLatexName(false);
-	if (!buffer->temppath().empty())
-		filename = AddName(buffer->temppath(), filename);
+	filename = AddName(buffer->temppath(), filename);
 	filename = ChangeExtension(filename,
 				   formats.extension(backend_format));
 
Index: src/lyx_main.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyx_main.C,v
retrieving revision 1.182
diff -u -p -r1.182 lyx_main.C
--- src/lyx_main.C	2003/12/12 13:57:19	1.182
+++ src/lyx_main.C	2004/02/21 17:16:50
@@ -58,7 +58,7 @@ using lyx::support::AddName;
 using lyx::support::AddPath;
 using lyx::support::bformat;
 using lyx::support::createDirectory;
-using lyx::support::CreateLyXTmpDir;
+using lyx::support::createLyXTmpDir;
 using lyx::support::FileInfo;
 using lyx::support::FileSearch;
 using lyx::support::GetEnv;
@@ -390,7 +390,21 @@ void LyX::init(bool gui)
 	if (lyxerr.debugging(Debug::LYXRC))
 		lyxrc.print();
 
-	os::setTmpDir(CreateLyXTmpDir(lyxrc.tempdir_path));
+	os::setTmpDir(createLyXTmpDir(lyxrc.tempdir_path));
+	if (os::getTmpDir().empty()) {
+		Alert::error(_("Could not create temporary directory"),
+		             bformat(_("Could not create a temporary directory in\n"
+		                       "%1$s. Make sure that this\n"
+		                       "path exists and is writable and try again."),
+		                     lyxrc.tempdir_path));
+		// createLyXTmpDir() tries sufficiently hard to create a
+		// usable temp dir, so the probability to come here is
+		// close to zero. We therefore don't try to overcome this
+		// problem with e.g. asking the user for a new path and
+		// trying again but simply exit.
+		exit(EXIT_FAILURE);
+	}
+
 	if (lyxerr.debugging(Debug::INIT)) {
 		lyxerr << "LyX tmp dir: `" << os::getTmpDir() << '\'' << endl;
 	}
Index: src/lyxlex.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxlex.h,v
retrieving revision 1.38
diff -u -p -r1.38 lyxlex.h
--- src/lyxlex.h	2003/12/02 12:27:07	1.38
+++ src/lyxlex.h	2004/02/21 17:17:29
@@ -155,7 +155,7 @@ private:
     This is needed to ensure that the pop is done upon exit from methods
     with more than one exit point or that can return as a response to
     exceptions.
-    @autor Lgb
+    @author Lgb
 */
 struct pushpophelper {
 	///
Index: src/lyxrc.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxrc.C,v
retrieving revision 1.162
diff -u -p -r1.162 lyxrc.C
--- src/lyxrc.C	2003/12/14 16:33:53	1.162
+++ src/lyxrc.C	2004/02/21 17:17:41
@@ -156,6 +157,7 @@ keyword_item lyxrcTags[] = {
 	// compatibility with versions older than 1.4.0 only
 	{ "\\use_pspell", LyXRC::RC_USE_SPELL_LIB },
 	{ "\\use_spell_lib", LyXRC::RC_USE_SPELL_LIB },
+	// compatibility with versions older than 1.4.0 only
 	{ "\\use_tempdir", LyXRC::RC_USETEMPDIR },
 	{ "\\user_email", LyXRC::RC_USER_EMAIL },
 	{ "\\user_name", LyXRC::RC_USER_NAME },
@@ -197,7 +199,6 @@ void LyXRC::setDefaults() {
 	print_paper_dimension_flag = "-T";
 	document_path.erase();
 	tempdir_path = "/tmp";
-	use_tempdir = true;
 	ps_command = "gs";
 	view_dvi_paper_option.erase();
 	default_papersize = PAPER_USLETTER;
@@ -657,7 +658,8 @@ int LyXRC::read(string const & filename)
 
 		case RC_USETEMPDIR:
 			if (lexrc.next()) {
-				use_tempdir = lexrc.getBool();
+				lyxerr << "Ignoring obsolete use_tempdir flag." << endl;
+				lexrc.getBool();
 			}
 			break;
 
@@ -1524,9 +1540,7 @@ void LyXRC::output(ostream & os) const
 			os << "\\tempdir_path \"" << tempdir_path << "\"\n";
 		}
 	case RC_USETEMPDIR:
-		if (use_tempdir != system_lyxrc.use_tempdir) {
-			os << "\\use_tempdir " << tostr(use_tempdir) << '\n';
-		}
+		// Ignore it
 	case RC_ASCII_LINELEN:
 		if (ascii_linelen != system_lyxrc.ascii_linelen) {
 			os << "\\ascii_linelen " << ascii_linelen << '\n';
@@ -1904,10 +1929,6 @@ string const LyXRC::getDescription(LyXRC
 		str = _("LyX will place its temporary directories in this path. They will be deleted when you quit LyX.");
 		break;
 
-	case RC_USETEMPDIR:
-		str = _("Select if you wish to use a temporary directory structure to store temporary TeX output.");
-		break;
-
 	case RC_LASTFILES:
 		str = _("The file where the last-files information should be stored.");
 		break;
Index: src/lyxrc.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxrc.h,v
retrieving revision 1.80
diff -u -p -r1.80 lyxrc.h
--- src/lyxrc.h	2003/10/06 15:42:27	1.80
+++ src/lyxrc.h	2004/02/21 17:17:44
@@ -205,8 +206,6 @@ enum LyXRCTags {
 	std::string template_path;
 	///
 	std::string tempdir_path;
-	///
-	bool use_tempdir;
 	///
 	bool auto_region_delete;
 	/// flag telling whether lastfiles should be checked for existance
Index: src/lyxvc.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxvc.C,v
retrieving revision 1.54
diff -u -p -r1.54 lyxvc.C
--- src/lyxvc.C	2003/11/03 17:47:22	1.54
+++ src/lyxvc.C	2004/02/21 17:17:52
@@ -223,6 +223,11 @@ string const LyXVC::getLogFile() const
 		return string();
 
 	string tmpf = tempName(string(), "lyxvclog");
+	if (tmpf.empty()) {
+		lyxerr[Debug::LYXVC] << "Could not generate logfile "
+		                     << tmpf << endl;
+		return string();
+	}
 	lyxerr[Debug::LYXVC] << "Generating logfile " << tmpf << endl;
 	vcs->getLog(tmpf);
 	return tmpf;
Index: src/paragraph.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/paragraph.C,v
retrieving revision 1.354
diff -u -p -r1.354 paragraph.C
--- src/paragraph.C	2004/02/20 11:00:40	1.354
+++ src/paragraph.C	2004/02/21 17:18:10
@@ -1556,7 +1556,7 @@ void Paragraph::changeLanguage(BufferPar
 }
 
 
-bool Paragraph::isMultiLingual(BufferParams const & bparams)
+bool Paragraph::isMultiLingual(BufferParams const & bparams) const
 {
 	Language const * doc_language =	bparams.language;
 	Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin();
Index: src/paragraph.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/paragraph.h,v
retrieving revision 1.125
diff -u -p -r1.125 paragraph.h
--- src/paragraph.h	2004/02/12 16:35:59	1.125
+++ src/paragraph.h	2004/02/21 17:18:20
@@ -80,7 +80,7 @@ public:
 	void changeLanguage(BufferParams const & bparams,
 			    Language const * from, Language const * to);
 	///
-	bool isMultiLingual(BufferParams const &);
+	bool isMultiLingual(BufferParams const &) const;
 
 	///
 	std::string const asString(Buffer const &,
Index: src/frontends/controllers/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/controllers/ChangeLog,v
retrieving revision 1.414
diff -u -p -r1.414 ChangeLog
--- src/frontends/controllers/ChangeLog	2004/02/01 12:46:11	1.414
+++ src/frontends/controllers/ChangeLog	2004/02/21 17:19:18
@@ -1,3 +1,8 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* ControlPrint.C, ControlSendto.C: use always a temp dir
+	* ControlSendto.C: check return value of buffer()->writeFile()
+
 2004-02-01  Lars Gullik Bjonnes  <[EMAIL PROTECTED]>
 
 	* biblio.C (parseBibTeX): "=" -> '='
Index: src/frontends/controllers/ControlPrint.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/controllers/ControlPrint.C,v
retrieving revision 1.45
diff -u -p -r1.45 ControlPrint.C
--- src/frontends/controllers/ControlPrint.C	2004/01/08 10:59:49	1.45
+++ src/frontends/controllers/ControlPrint.C	2004/02/21 17:19:31
@@ -170,10 +170,7 @@ void ControlPrint::apply()
 	}
 
 	// Push directory path.
-	string path = buffer()->filePath();
-	if (lyxrc.use_tempdir || !IsDirWriteable(path)) {
-		path = buffer()->temppath();
-	}
+	string const path = buffer()->temppath();
 	Path p(path);
 
 	// there are three cases here:
Index: src/frontends/controllers/ControlSendto.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/controllers/ControlSendto.C,v
retrieving revision 1.23
diff -u -p -r1.23 ControlSendto.C
--- src/frontends/controllers/ControlSendto.C	2004/01/07 17:57:46	1.23
+++ src/frontends/controllers/ControlSendto.C	2004/02/21 17:19:31
@@ -120,10 +120,10 @@ void ControlSendto::apply()
 	if (format_->name() == "lyx") {
 		filename = ChangeExtension(buffer()->getLatexName(false),
 					   format_->extension());
-		if (!buffer()->temppath().empty())
-			filename = AddName(buffer()->temppath(), filename);
+		filename = AddName(buffer()->temppath(), filename);
 
-		buffer()->writeFile(filename);
+		if (!buffer()->writeFile(filename))
+			return;
 
 	} else {
 		Exporter::Export(buffer(), format_->name(), true, filename);
Index: src/frontends/qt2/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/ChangeLog,v
retrieving revision 1.644
diff -u -p -r1.644 ChangeLog
--- src/frontends/qt2/ChangeLog	2004/02/20 10:32:43	1.644
+++ src/frontends/qt2/ChangeLog	2004/02/21 17:20:09
@@ -1,3 +1,8 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* QPrefs.C, QPrefsDialog.C, ui/QPrefPathsModule.ui: remove
+	use_tempdir
+
 2004-02-20  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
 	* QDocument.C:
Index: src/frontends/qt2/QPrefs.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QPrefs.C,v
retrieving revision 1.50
diff -u -p -r1.50 QPrefs.C
--- src/frontends/qt2/QPrefs.C	2004/01/28 16:21:27	1.50
+++ src/frontends/qt2/QPrefs.C	2004/02/21 17:21:28
@@ -195,7 +195,6 @@ void QPrefs::apply()
 	rc.document_path = fromqstr(pathsmod->workingDirED->text());
 	rc.template_path = fromqstr(pathsmod->templateDirED->text());
 	rc.backupdir_path = fromqstr(pathsmod->backupDirED->text());
-	rc.use_tempdir = pathsmod->tempDirCB->isChecked();
 	rc.tempdir_path = fromqstr(pathsmod->tempDirED->text());
 	// FIXME: should be a checkbox only
 	rc.lyxpipes = fromqstr(pathsmod->lyxserverDirED->text());
@@ -499,7 +498,6 @@ void QPrefs::update_contents()
 	pathsmod->workingDirED->setText(toqstr(rc.document_path));
 	pathsmod->templateDirED->setText(toqstr(rc.template_path));
 	pathsmod->backupDirED->setText(toqstr(rc.backupdir_path));
-	pathsmod->tempDirCB->setChecked(rc.use_tempdir);
 	pathsmod->tempDirED->setText(toqstr(rc.tempdir_path));
 	// FIXME: should be a checkbox only
 	pathsmod->lyxserverDirED->setText(toqstr(rc.lyxpipes));
Index: src/frontends/qt2/QPrefsDialog.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QPrefsDialog.C,v
retrieving revision 1.29
diff -u -p -r1.29 QPrefsDialog.C
--- src/frontends/qt2/QPrefsDialog.C	2003/10/06 15:42:51	1.29
+++ src/frontends/qt2/QPrefsDialog.C	2004/02/21 17:21:28
@@ -210,7 +210,6 @@ QPrefsDialog::QPrefsDialog(QPrefs * form
 	connect(pathsModule->workingDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
 	connect(pathsModule->templateDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
 	connect(pathsModule->backupDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
-	connect(pathsModule->tempDirCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
 	connect(pathsModule->tempDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
 	connect(pathsModule->lyxserverDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
 	connect(spellcheckerModule->spellCommandCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
Index: src/frontends/qt2/ui/QPrefPathsModule.ui
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/ui/QPrefPathsModule.ui,v
retrieving revision 1.6
diff -u -p -r1.6 QPrefPathsModule.ui
--- src/frontends/qt2/ui/QPrefPathsModule.ui	2003/01/23 16:23:40	1.6
+++ src/frontends/qt2/ui/QPrefPathsModule.ui	2004/02/21 17:21:35
@@ -142,14 +142,18 @@
                     </property>
                 </widget>
                 <widget row="4"  column="0" >
-                    <class>QCheckBox</class>
+                    <class>QLabel</class>
                     <property stdset="1">
                         <name>name</name>
-                        <cstring>tempDirCB</cstring>
+                        <cstring>tempDirLA</cstring>
                     </property>
                     <property stdset="1">
                         <name>text</name>
-                        <string>&amp;Use temporary directory</string>
+                        <string>&amp;Temporary directory:</string>
+                    </property>
+                    <property>
+                        <name>buddy</name>
+                        <cstring>tempDirED</cstring>
                     </property>
                 </widget>
                 <widget row="3"  column="2" >
@@ -251,20 +255,6 @@
         </spacer>
     </vbox>
 </widget>
-<connections>
-    <connection>
-        <sender>tempDirCB</sender>
-        <signal>toggled(bool)</signal>
-        <receiver>tempDirED</receiver>
-        <slot>setEnabled(bool)</slot>
-    </connection>
-    <connection>
-        <sender>tempDirCB</sender>
-        <signal>toggled(bool)</signal>
-        <receiver>tempDirPB</receiver>
-        <slot>setEnabled(bool)</slot>
-    </connection>
-</connections>
 <tabstops>
     <tabstop>workingDirED</tabstop>
     <tabstop>workingDirPB</tabstop>
@@ -274,7 +264,6 @@
     <tabstop>backupDirPB</tabstop>
     <tabstop>lyxserverDirED</tabstop>
     <tabstop>lyxserverDirPB</tabstop>
-    <tabstop>tempDirCB</tabstop>
     <tabstop>tempDirED</tabstop>
     <tabstop>tempDirPB</tabstop>
 </tabstops>
Index: src/frontends/xforms/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/ChangeLog,v
retrieving revision 1.878
diff -u -p -r1.878 ChangeLog
--- src/frontends/xforms/ChangeLog	2004/02/20 10:32:44	1.878
+++ src/frontends/xforms/ChangeLog	2004/02/21 17:27:53
@@ -1,3 +1,7 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* FormPreferences.C, forms/form_preferences.fd: remove use_tempdir
+
 2004-02-20  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
 	* FormDocument.C:
Index: src/frontends/xforms/FormPreferences.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/FormPreferences.C,v
retrieving revision 1.181
diff -u -p -r1.181 FormPreferences.C
--- src/frontends/xforms/FormPreferences.C	2003/12/15 09:17:04	1.181
+++ src/frontends/xforms/FormPreferences.C	2004/02/21 17:28:16
@@ -1825,17 +1834,10 @@ void FormPreferences::Paths::apply(LyXRC
 {
 	rc.document_path = fl_get_input(dialog_->input_default_path);
 	rc.template_path = fl_get_input(dialog_->input_template_path);
-
-	int button = fl_get_button(dialog_->check_use_temp_dir);
-	string str  = fl_get_input(dialog_->input_temp_dir);
-	if (!button)
-		str.erase();
+	rc.tempdir_path  = fl_get_input(dialog_->input_temp_dir);
 
-	rc.use_tempdir = button;
-	rc.tempdir_path = str;
-
-	button = fl_get_button(dialog_->check_last_files);
-	str = fl_get_input(dialog_->input_lastfiles);
+	int button = fl_get_button(dialog_->check_last_files);
+	string str = fl_get_input(dialog_->input_lastfiles);
 	if (!button) str.erase();
 
 	rc.check_lastfiles = button;
@@ -1880,7 +1882,6 @@ void FormPreferences::Paths::build()
 	setPrehandler(dialog_->input_backup_path);
 	setPrehandler(dialog_->input_serverpipe);
 	setPrehandler(dialog_->input_temp_dir);
-	setPrehandler(dialog_->check_use_temp_dir);
 }
 
 
@@ -1891,8 +1892,6 @@ FormPreferences::Paths::feedback(FL_OBJE
 		return LyXRC::getDescription(LyXRC::RC_DOCUMENTPATH);
 	if (ob == dialog_->input_template_path)
 		return LyXRC::getDescription(LyXRC::RC_TEMPLATEPATH);
-	if (ob == dialog_->check_use_temp_dir)
-		return LyXRC::getDescription(LyXRC::RC_USETEMPDIR);
 	if (ob == dialog_->input_temp_dir)
 		return LyXRC::getDescription(LyXRC::RC_TEMPDIRPATH);
 	if (ob == dialog_->check_last_files)
@@ -1918,11 +1917,6 @@ bool FormPreferences::Paths::input(FL_OB
 	// !ob if function is called from Paths::update() to de/activate
 	// objects,
 	// otherwise the function is called by an xforms CB via input().
-	if (!ob || ob == dialog_->check_use_temp_dir) {
-		bool const enable = fl_get_button(dialog_->check_use_temp_dir);
-		setEnabled(dialog_->input_temp_dir, enable);
-	}
-
 	if (!ob || ob == dialog_->check_last_files) {
 		bool const enable = fl_get_button(dialog_->check_last_files);
 		setEnabled(dialog_->input_lastfiles, enable);
@@ -2046,13 +2040,7 @@ void FormPreferences::Paths::update(LyXR
 		      rc.make_backup);
 	fl_set_input(dialog_->input_backup_path, str.c_str());
 
-	str.erase();
-	if (rc.use_tempdir)
-		str = rc.tempdir_path;
-
-	fl_set_button(dialog_->check_use_temp_dir,
-		      rc.use_tempdir);
-	fl_set_input(dialog_->input_temp_dir, str.c_str());
+	fl_set_input(dialog_->input_temp_dir, rc.tempdir_path.c_str());
 
 	str.erase();
 	if (rc.check_lastfiles)
Index: src/frontends/xforms/forms/form_preferences.fd
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/forms/form_preferences.fd,v
retrieving revision 1.62
diff -u -p -r1.62 form_preferences.fd
--- src/frontends/xforms/forms/form_preferences.fd	2003/07/23 15:36:40	1.62
+++ src/frontends/xforms/forms/form_preferences.fd	2004/02/21 17:28:35
@@ -2024,7 +2042,7 @@ argument: 0
 Name: form_preferences_paths
 Width: 450
 Height: 350
-Number of Objects: 17
+Number of Objects: 16
 
 --------------------
 class: FL_BOX
@@ -2117,25 +2135,6 @@ callback: C_FormBaseInputCB
 argument: 0
 
 --------------------
-class: FL_CHECKBUTTON
-type: PUSH_BUTTON
-box: 140 80 30 30
-boxtype: FL_NO_BOX
-colors: FL_COL1 FL_YELLOW
-alignment: FL_ALIGN_LEFT
-style: FL_NORMAL_STYLE
-size: FL_NORMAL_SIZE
-lcol: FL_BLACK
-label: Temp dir:|#d
-shortcut: 
-resize: FL_RESIZE_ALL
-gravity: FL_NoGravity FL_NoGravity
-name: check_use_temp_dir
-callback: C_FormBaseInputCB
-argument: 0
-	value: 1
-
---------------------
 class: FL_INPUT
 type: NORMAL_INPUT
 box: 170 80 170 30
@@ -2145,7 +2144,7 @@ alignment: FL_ALIGN_LEFT
 style: FL_NORMAL_STYLE
 size: FL_NORMAL_SIZE
 lcol: FL_BLACK
-label: 
+label: Temp dir:|#d
 shortcut: 
 resize: FL_RESIZE_ALL
 gravity: FL_NoGravity FL_NoGravity
Index: src/graphics/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/graphics/ChangeLog,v
retrieving revision 1.199
diff -u -p -r1.199 ChangeLog
--- src/graphics/ChangeLog	2004/01/31 15:30:23	1.199
+++ src/graphics/ChangeLog	2004/02/21 17:28:55
@@ -1,3 +1,10 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* GraphicsCacheItem.C (convertToDisplayFormat): unzip zipped files
+	to a temporary file
+	* PreviewLoader.C: use always a temp dir
+	* PreviewLoader.C: check successfull creation of LaTeX file
+
 2004-01-31  Lars Gullik Bjonnes  <[EMAIL PROTECTED]>
 
 	* PreviewLoader.C (FindFirst): inherit from std::unary_function
Index: src/graphics/GraphicsCacheItem.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/graphics/GraphicsCacheItem.C,v
retrieving revision 1.60
diff -u -p -r1.60 GraphicsCacheItem.C
--- src/graphics/GraphicsCacheItem.C	2003/10/06 15:42:58	1.60
+++ src/graphics/GraphicsCacheItem.C	2004/02/21 17:28:58
@@ -36,6 +36,7 @@ using support::OnlyFilename;
 using support::tempName;
 using support::unlink;
 using support::unzipFile;
+using support::unzippedFileName;
 using support::zippedFile;
 
 using std::endl;
@@ -381,8 +382,19 @@ void CacheItem::Impl::convertToDisplayFo
 	}
 
 	// Make a local copy in case we unzip it
-	string const filename = zippedFile(filename_) ?
-		unzipFile(filename_) : filename_;
+	string filename;
+	if ((zipped_ = zippedFile(filename_))) {
+		unzipped_filename_ = tempName(string(), filename_);
+		if (unzipped_filename_.empty()) {
+			setStatus(ErrorConverting);
+			lyxerr[Debug::GRAPHICS]
+				<< "\tCould not create temporary file." << endl;
+			return;
+		}
+		filename = unzipFile(filename_, unzipped_filename_);
+	} else
+		filename = filename_;
+
 	string const displayed_filename = MakeDisplayPath(filename_);
 	lyxerr[Debug::GRAPHICS] << "[GrahicsCacheItem::convertToDisplayFormat]\n"
 		<< "\tAttempting to convert image file: " << filename
@@ -412,6 +424,7 @@ void CacheItem::Impl::convertToDisplayFo
 	remove_loaded_file_ = true;
 
 	// Remove the temp file, we only want the name...
+	// FIXME: This is unsafe!
 	unlink(to_file_base);
 
 	// Connect a signal to this->imageConverted and pass this signal to
Index: src/graphics/PreviewLoader.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/graphics/PreviewLoader.C,v
retrieving revision 1.73
diff -u -p -r1.73 PreviewLoader.C
--- src/graphics/PreviewLoader.C	2004/01/31 15:30:23	1.73
+++ src/graphics/PreviewLoader.C	2004/02/21 17:29:08
@@ -461,8 +461,7 @@ void PreviewLoader::Impl::startLoading()
 	lyxerr[Debug::GRAPHICS] << "PreviewLoader::startLoading()" << endl;
 
 	// As used by the LaTeX file and by the resulting image files
-	string const directory = buffer_.temppath().empty() ?
-		buffer_.filePath() : buffer_.temppath();
+	string const directory = buffer_.temppath();
 
 	string const filename_base(unique_filename(directory));
 
@@ -477,6 +476,12 @@ void PreviewLoader::Impl::startLoading()
 	string const latexfile = filename_base + ".tex";
 
 	ofstream of(latexfile.c_str());
+	if (!of) {
+		lyxerr[Debug::GRAPHICS] << "PreviewLoader::startLoading()\n"
+					<< "Unable to create LaTeX file\n"
+					<< latexfile << endl;
+		return;
+	}
 	of << "\\batchmode\n";
 	dumpPreamble(of);
 	of << "\n\\begin{document}\n";
Index: src/insets/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/ChangeLog,v
retrieving revision 1.969
diff -u -p -r1.969 ChangeLog
--- src/insets/ChangeLog	2004/02/20 10:32:44	1.969
+++ src/insets/ChangeLog	2004/02/21 17:30:12
@@ -1,3 +1,13 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* insetexternal.C, insetgraphics.C, insetinclude.C: use always a
+	temp dir
+	* insetinclude.C (latex): show a GUI warning if textclasses don't
+	match
+	* insetinclude.C: use mangledFilename() for temp files
+	* insetgraphics.C (readInsetGraphics): remove version check, since
+	the graphics inset has no own fileformat number anymore
+
 2004-02-20  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
 	* insetquotes.[Ch]: added new member that allows direct access
Index: src/insets/insetexternal.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/insetexternal.C,v
retrieving revision 1.142
diff -u -p -r1.142 insetexternal.C
--- src/insets/insetexternal.C	2004/02/16 11:58:47	1.142
+++ src/insets/insetexternal.C	2004/02/21 17:30:21
@@ -77,6 +77,7 @@ namespace external {
 TempName::TempName()
 {
 	tempname_ = support::tempName(string(), "lyxext");
+	// FIXME: This is unsafe
 	support::unlink(tempname_);
 	// must have an extension for the converter code to work correctly.
 	tempname_ += ".tmp";
@@ -685,8 +686,7 @@ int InsetExternal::latex(Buffer const & 
 	// run through the LaTeX compiler.
 	// If we're running through the LaTeX compiler, we should write the
 	// generated files in the bufer's temporary directory.
-	bool const external_in_tmpdir =
-		lyxrc.use_tempdir && !buf.temppath().empty() && !runparams.nice;
+	bool const external_in_tmpdir = !runparams.nice;
 
 	// If the template has specified a PDFLaTeX output, then we try and
 	// use that.
Index: src/insets/insetgraphics.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/insetgraphics.C,v
retrieving revision 1.236
diff -u -p -r1.236 insetgraphics.C
--- src/insets/insetgraphics.C	2004/02/16 11:58:47	1.236
+++ src/insets/insetgraphics.C	2004/02/21 17:30:23
@@ -29,9 +29,6 @@ TODO
 
 /* NOTES:
  * Fileformat:
- * Current version is 1 (inset file format version), when changing it
- * it should be changed in the Write() function when writing in one place
- * and when reading one should change the version check and the error message.
  * The filename is kept in  the lyx file in a relative way, so as to allow
  * moving the document file and its images with no problem.
  *
@@ -281,18 +278,7 @@ void InsetGraphics::readInsetGraphics(Ly
 			continue;
 		} else if (token == "\\end_inset") {
 			finished = true;
-		} else if (token == "FormatVersion") {
-			lex.next();
-			int version = lex.getInteger();
-			if (version > VersionNumber)
-				lyxerr
-				<< "This document was created with a newer Graphics widget"
-				", You should use a newer version of LyX to read this"
-				" file."
-				<< endl;
-			// TODO: Possibly open up a dialog?
-		}
-		else {
+		} else {
 			if (!params_.Read(lex, token, bufpath))
 				lyxerr << "Unknown token, " << token << ", skipping."
 					<< std::endl;
@@ -469,9 +455,6 @@ string const InsetGraphics::prepareFile(
 	lyxerr[Debug::GRAPHICS]
 		<< "\t we have: from " << from << " to " << to << '\n';
 
-	if (from == to && !lyxrc.use_tempdir)
-		return stripExtensionIfPossible(orig_file, to);
-
 	// We're going to be running the exported buffer through the LaTeX
 	// compiler, so must ensure that LaTeX can cope with the graphics
 	// file format.
@@ -480,16 +463,14 @@ string const InsetGraphics::prepareFile(
 		<< "\tthe orig file is: " << orig_file << endl;
 
 	bool conversion_needed = true;
-	if (lyxrc.use_tempdir) {
-		CopyStatus status;
-		boost::tie(status, temp_file) =
+	CopyStatus status;
+	boost::tie(status, temp_file) =
 			copyToDirIfNeeded(orig_file, buf.temppath());
 
-		if (status == FAILURE)
-			return orig_file;
-		else if (status == IDENTICAL_CONTENTS)
-			conversion_needed = false;
-	}
+	if (status == FAILURE)
+		return orig_file;
+	else if (status == IDENTICAL_CONTENTS)
+		conversion_needed = false;
 
 	if (from == to)
 		return stripExtensionIfPossible(temp_file, to);
@@ -515,7 +496,7 @@ string const InsetGraphics::prepareFile(
 		<< "\tto_file_base = " << to_file_base << '\n'
 		<< "\t from " << from << " to " << to << '\n';
 
-	// if no special converter defined, than we take the default one
+	// if no special converter defined, then we take the default one
 	// from ImageMagic: convert from:inname.from to:outname.to
 	if (!converters.convert(&buf, temp_file, to_file_base, from, to)) {
 		string const command =
Index: src/insets/insetinclude.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/insets/insetinclude.C,v
retrieving revision 1.183
diff -u -p -r1.183 insetinclude.C
--- src/insets/insetinclude.C	2004/02/16 11:58:47	1.183
+++ src/insets/insetinclude.C	2004/02/21 17:30:38
@@ -28,6 +28,7 @@
 #include "metricsinfo.h"
 #include "outputparams.h"
 
+#include "frontends/Alert.h"
 #include "frontends/LyXView.h"
 #include "frontends/Painter.h"
 
@@ -36,6 +37,7 @@
 #include "insets/render_preview.h"
 
 #include "support/FileInfo.h"
+#include "support/filename.h"
 #include "support/filetools.h"
 #include "support/lstrings.h" // contains
 #include "support/tostr.h"
@@ -46,9 +48,11 @@
 #include "support/std_sstream.h"
 
 using lyx::support::AddName;
+using lyx::support::bformat;
 using lyx::support::ChangeExtension;
 using lyx::support::contains;
 using lyx::support::FileInfo;
+using lyx::support::FileName;
 using lyx::support::GetFileContents;
 using lyx::support::IsFileReadable;
 using lyx::support::IsLyXFilename;
@@ -307,30 +311,25 @@ int InsetInclude::latex(Buffer const & b
 	if (loadIfNeeded(buffer, params_)) {
 		Buffer * tmp = bufferlist.getBuffer(included_file);
 
-		// FIXME: this should be a GUI warning
 		if (tmp->params().textclass != buffer.params().textclass) {
-			lyxerr << "WARNING: Included file `"
-			       << MakeDisplayPath(included_file)
-			       << "' has textclass `"
-			       << tmp->params().getLyXTextClass().name()
-			       << "' while parent file has textclass `"
-			       << buffer.params().getLyXTextClass().name()
-			       << "'." << endl;
+			string text = bformat(_("Included file `%1$s'\n"
+			                        "has textclass `%2$s'\n"
+			                        "while parent file has textclass `%3$s'."),
+			                      MakeDisplayPath(included_file),
+			                      tmp->params().getLyXTextClass().name(),
+			                      buffer.params().getLyXTextClass().name());
+			Alert::warning(_("Different textclasses"), text);
 			//return 0;
 		}
 
 		// write it to a file (so far the complete file)
 		string writefile = ChangeExtension(included_file, ".tex");
 
-		if (!buffer.temppath().empty() && !runparams.nice) {
-			incfile = subst(incfile, '/','@');
-#ifdef __EMX__
-			incfile = subst(incfile, ':', '$');
-#endif
-			writefile = AddName(buffer.temppath(), incfile);
-		} else
-			writefile = included_file;
-		writefile = ChangeExtension(writefile, ".tex");
+		if (!runparams.nice) {
+			incfile = FileName(writefile).mangledFilename();
+			writefile = MakeAbsPath(incfile, buffer.temppath());
+		}
+
 		lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
 		lyxerr[Debug::LATEX] << "writefile:" << writefile << endl;
 
@@ -388,15 +387,16 @@ int InsetInclude::linuxdoc(Buffer const 
 		Buffer * tmp = bufferlist.getBuffer(included_file);
 
 		// write it to a file (so far the complete file)
-		string writefile = ChangeExtension(included_file, ".sgml");
-		if (!buffer.temppath().empty() && !runparams.nice) {
-			incfile = subst(incfile, '/','@');
-			writefile = AddName(buffer.temppath(), incfile);
-		} else
+		string writefile;
+		if (IsLyXFilename(included_file))
+			writefile = ChangeExtension(included_file, ".sgml");
+		else
 			writefile = included_file;
 
-		if (IsLyXFilename(included_file))
-			writefile = ChangeExtension(writefile, ".sgml");
+		if (!runparams.nice) {
+			incfile = FileName(writefile).mangledFilename();
+			writefile = MakeAbsPath(incfile, buffer.temppath());
+		}
 
 		lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
 		lyxerr[Debug::LATEX] << "writefile:" << writefile << endl;
@@ -431,14 +431,16 @@ int InsetInclude::docbook(Buffer const &
 		Buffer * tmp = bufferlist.getBuffer(included_file);
 
 		// write it to a file (so far the complete file)
-		string writefile = ChangeExtension(included_file, ".sgml");
-		if (!buffer.temppath().empty() && !runparams.nice) {
-			incfile = subst(incfile, '/','@');
-			writefile = AddName(buffer.temppath(), incfile);
-		} else
-			writefile = included_file;
+		string writefile;
 		if (IsLyXFilename(included_file))
-			writefile = ChangeExtension(writefile, ".sgml");
+			writefile = ChangeExtension(included_file, ".sgml");
+		else
+			writefile = included_file;
+
+		if (!runparams.nice) {
+			incfile = FileName(writefile).mangledFilename();
+			writefile = MakeAbsPath(incfile, buffer.temppath());
+		}
 
 		lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
 		lyxerr[Debug::LATEX] << "writefile:" << writefile << endl;
@@ -468,18 +470,14 @@ void InsetInclude::validate(LaTeXFeature
 	string const included_file = includedFilename(buffer, params_);
 
 	if (IsLyXFilename(included_file))
-		writefile = ChangeExtension(writefile, ".sgml");
-	else if (!buffer.temppath().empty() &&
-	         !features.nice() &&
-	         !isVerbatim(params_)) {
-		incfile = subst(incfile, '/','@');
-#ifdef __EMX__
-// FIXME: It seems that the following is necessary (see latex() above)
-//		incfile = subst(incfile, ':', '$');
-#endif
-		writefile = AddName(buffer.temppath(), incfile);
-	} else
+		writefile = ChangeExtension(included_file, ".sgml");
+	else
 		writefile = included_file;
+
+	if (!features.nice() && !isVerbatim(params_)) {
+		incfile = FileName(writefile).mangledFilename();
+		writefile = MakeAbsPath(incfile, buffer.temppath());
+	}
 
 	features.includeFile(include_label, writefile);
 
Index: src/support/ChangeLog
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/ChangeLog,v
retrieving revision 1.237
diff -u -p -r1.237 ChangeLog
--- src/support/ChangeLog	2004/02/01 12:46:13	1.237
+++ src/support/ChangeLog	2004/02/21 17:32:21
@@ -1,3 +1,13 @@
+2004-02-21  Georg Baum  <[EMAIL PROTECTED]>
+
+	* filetools.[Ch] (CreateBufferTmpDir): rename to createBufferTmpDir,
+	remove pathfor argument
+	* filetools.[Ch] (CreateLyXTmpDir): rename to createLyXTmpDir, try
+	harder to create a usable temp dir
+	* filetools.C (CreateTmpDir): rename to createTmpDir
+	filetools.[Ch] (unzipFile): add argument for output filename
+	* filename.h: fix doxygen warning
+
 2004-02-01  Lars Gullik Bjonnes  <[EMAIL PROTECTED]>
 
 	* lstrings.h (contains_functor): delete
Index: src/support/filename.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/filename.h,v
retrieving revision 1.6
diff -u -p -r1.6 filename.h
--- src/support/filename.h	2003/10/06 15:43:17	1.6
+++ src/support/filename.h	2004/02/21 17:32:35
@@ -22,7 +22,7 @@ namespace support {
 class FileName {
 public:
 	FileName();
-	/** \param filename the file in question. Must have an absolute path.
+	/** \param abs_filename the file in question. Must have an absolute path.
 	 *  \param save_abs_path how is the file to be output to file?
 	 */
 	FileName(std::string const & abs_filename, bool save_abs_path = true);
Index: src/support/filetools.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/filetools.C,v
retrieving revision 1.176
diff -u -p -r1.176 filetools.C
--- src/support/filetools.C	2003/10/16 16:41:32	1.176
+++ src/support/filetools.C	2004/02/21 17:32:58
@@ -440,11 +440,11 @@ int DeleteAllFilesInDir(string const & p
 }
 
 
-string const CreateTmpDir(string const & tempdir, string const & mask)
+string const createTmpDir(string const & tempdir, string const & mask)
 {
 	lyxerr[Debug::FILES]
-		<< "CreateTmpDir: tempdir=`" << tempdir << "'\n"
-		<< "CreateTmpDir:    mask=`" << mask << '\'' << endl;
+		<< "createTmpDir: tempdir=`" << tempdir << "'\n"
+		<< "createTmpDir:    mask=`" << mask << '\'' << endl;
 
 	string const tmpfl(tempName(tempdir, mask));
 	// lyx::tempName actually creates a file to make sure that it
@@ -453,8 +453,11 @@ string const CreateTmpDir(string const &
 	// safe because of the gap between unlink and mkdir. (Lgb)
 	unlink(tmpfl);
 
-	if (tmpfl.empty() || mkdir(tmpfl, 0700))
+	if (tmpfl.empty() || mkdir(tmpfl, 0700)) {
+		lyxerr << "LyX could not create the temporary directory '"
+		       << tmpfl << "'" << endl;
 		return string();
+	}
 
 	return MakeAbsPath(tmpfl);
 }
@@ -477,36 +480,47 @@ int destroyDir(string const & tmpdir)
 }
 
 
-string const CreateBufferTmpDir(string const & pathfor)
+string const createBufferTmpDir()
 {
 	static int count;
-	static string const tmpdir(pathfor.empty() ? os::getTmpDir() : pathfor);
 	// 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 = tmpdir + "/lyx_tmpbuf" + tostr(count++);
+	string const tmpfl = os::getTmpDir() + "/lyx_tmpbuf" + tostr(count++);
 	if (mkdir(tmpfl, 0777)) {
+		lyxerr << "LyX could not create the temporary directory '"
+		       << tmpfl << "'" << endl;
 		return string();
 	}
 	return tmpfl;
 }
 
 
-string const CreateLyXTmpDir(string const & deflt)
+string const createLyXTmpDir(string const & deflt)
 {
-	if ((!deflt.empty()) && (deflt  != "/tmp")) {
+	if (!deflt.empty() && deflt != "/tmp") {
 		if (mkdir(deflt, 0777)) {
+			if (IsDirWriteable(deflt))
+				// deflt could not be created because it
+				// did exist already, so let's create our own
+				// dir inside deflt.
 #ifdef __EMX__
-		Path p(user_lyxdir());
+				Path p(user_lyxdir());
+#endif
+				return createTmpDir(deflt, "lyx_tmpdir");
+			else
+				// some other error occured.
+#ifdef __EMX__
+				Path p(user_lyxdir());
 #endif
-			return CreateTmpDir(deflt, "lyx_tmpdir");
+				return createTmpDir("/tmp", "lyx_tmpdir");
 		} else
 			return deflt;
 	} else {
 #ifdef __EMX__
 		Path p(user_lyxdir());
 #endif
-		return CreateTmpDir("/tmp", "lyx_tmpdir");
+		return createTmpDir("/tmp", "lyx_tmpdir");
 	}
 }
 
@@ -1080,9 +1094,10 @@ string const unzippedFileName(string con
 }
 
 
-string const unzipFile(string const & zipped_file)
+string const unzipFile(string const & zipped_file, string const & unzipped_file)
 {
-	string  const tempfile = unzippedFileName(zipped_file);
+	string const tempfile = unzipped_file.empty() ?
+		unzippedFileName(zipped_file) : unzipped_file;
 	// Run gunzip
 	string const command = "gunzip -c " + zipped_file + " > " + tempfile;
 	Systemcall one;
Index: src/support/filetools.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/filetools.h,v
retrieving revision 1.53
diff -u -p -r1.53 filetools.h
--- src/support/filetools.h	2003/10/06 15:43:18	1.53
+++ src/support/filetools.h	2004/02/21 17:32:59
@@ -22,14 +22,19 @@ namespace support {
 /// remove directory and all contents, returns 0 on success
 int destroyDir(std::string const & tmpdir);
 
-///
-std::string const CreateBufferTmpDir(std::string const & pathfor = std::string());
+/// Creates the per buffer temporary directory
+std::string const createBufferTmpDir();
 
 /// Creates directory. Returns true on success
 bool createDirectory(std::string const & name, int permissions);
 
-///
-std::string const CreateLyXTmpDir(std::string const & deflt);
+/** 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
+  created and used as the temporary directory.
+  \return the tmp dir name or string() if something went wrong.
+ */
+std::string const createLyXTmpDir(std::string const & deflt);
 
 /** Find file by searching several directories.
   Uses a string of paths separated by ";"s to find a file to open.
@@ -141,11 +146,18 @@ std::string const getExtFromContents(std
 /// check for zipped file
 bool zippedFile(std::string const & name);
 
-/// \return the name that LyX will give to the unzipped file.
+/** \return the name that LyX will give to the unzipped file \p zipped_file
+  if the second argument of unzipFile() is empty.
+ */
 std::string const unzippedFileName(std::string const & zipped_file);
 
-/// unzip a file
-std::string const unzipFile(std::string const & zipped_file);
+/** Unzip \p zipped_file.
+  The unzipped file is named \p unzipped_file if \p unzipped_file is not
+  empty, and unzippedFileName(\p zipped_file) otherwise.
+  Will overwrite an already existing unzipped file without warning.
+ */
+std::string const unzipFile(std::string const & zipped_file,
+                            std::string const & unzipped_file = std::string());
 
 /// Returns true is path is absolute
 bool AbsolutePath(std::string const & path);

Reply via email to