- for (BufferStorage::iterator it = bstore.begin();
- it != bstore.end(); ++it) {
- if (!(*it)->isLyxClean()) {
- bool madeit = false;
-
- lyxerr <<_("lyx: Attempting to save"
- " document ")
- << (*it)->fileName()
- << _(" as...") << endl;
-
- for (int i = 0; i < 3 && !madeit; ++i) {
- string s;
-
- // We try to save three places:
- // 1) Same place as document.
- // 2) In HOME directory.
- // 3) In "/tmp" directory.
- if (i == 0) {
- s = (*it)->fileName();
- } else if (i == 1) {
- s = AddName(GetEnvPath("HOME"),
- (*it)->fileName());
- } else {
- // MakeAbsPath to prepend the current
- // drive letter on OS/2
- s = AddName(MakeAbsPath("/tmp/"),
- (*it)->fileName());
- }
- s += ".emergency";
-
- lyxerr << " " << i + 1 << ") " << s << endl;
-
- if ((*it)->writeFile(s, true)) {
- (*it)->markLyxClean();
- lyxerr << _(" Save seems successful. "
- "Phew.") << endl;
- madeit = true;
- } else if (i != 2) {
- lyxerr << _(" Save failed! Trying...")
- << endl;
- } else {
- lyxerr << _(" Save failed! Bummer. "
- "Document is lost.")
- << endl;
- }
- }
+ for_each(bstore.begin(), bstore.end(),
+ lyx::void_class_fun(*this, &BufferList::emergencyWrite));
+}
+
+
+void BufferList::emergencyWrite(Buffer * buf)
+{
+ // assert(buf) // this is not good since C assert takes an int
+ // and a pointer is a long (JMarc)
+ assert(buf != 0); // use c assert to avoid a loop
+
+
+ // No need to save if the buffer has not changed.
+ if (buf->isClean())
+ return;
+
+ lyxerr << fmt(_("lyx: Attempting to save document %s as..."),
+ buf->isUnnamed() ? OnlyFilename(buf->fileName()).c_str()
+ : buf->fileName().c_str()) << endl;
+
+ // We try to save three places:
+
+ // 1) Same place as document. Unless it is an unnamed doc.
+ if (!buf->isUnnamed()) {
+ string s = buf->fileName();
+ s += ".emergency";
+ lyxerr << " " << s << endl;
+ if (buf->writeFile(s)) {
+ buf->markClean();
+ lyxerr << _(" Save seems successful. Phew.") << endl;
+ return;
+ } else {
+ lyxerr << _(" Save failed! Trying...") << endl;