From 3bd2ebb734b017f229c331594fbc31c63b29ee37 Mon Sep 17 00:00:00 2001 From: Michael Reifenberger Date: Tue, 9 Nov 2010 17:02:16 +0000 Subject: Add two patches from Joerg Wunsch: - Implement autosave feature - Detect filesystem full condition Both patches where sent upwards. Submitted by: joerg@ --- cad/qcad/files/patch-zzz-autosave | 345 ++++++++++++++++++++++++++++++++++++++ cad/qcad/files/patch-zzz-ioexcept | 109 ++++++++++++ 2 files changed, 454 insertions(+) create mode 100644 cad/qcad/files/patch-zzz-autosave create mode 100644 cad/qcad/files/patch-zzz-ioexcept diff --git a/cad/qcad/files/patch-zzz-autosave b/cad/qcad/files/patch-zzz-autosave new file mode 100644 index 000000000000..8f499b71b354 --- /dev/null +++ b/cad/qcad/files/patch-zzz-autosave @@ -0,0 +1,345 @@ +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_applicationwindow.cpp ./qcad/src/qc_applicationwindow.cpp +--- ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_applicationwindow.cpp Tue Nov 22 12:49:33 2005 ++++ ./qcad/src/qc_applicationwindow.cpp Sat Aug 11 22:47:35 2007 +@@ -162,6 +162,11 @@ + RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init MDI"); + initMDI(); + ++ // Activate autosave timer ++ autosaveTimer = new QTimer(this, "autosave"); ++ connect(autosaveTimer, SIGNAL(timeout()), this, SLOT(slotFileAutoSave())); ++ autosaveTimer->start(autosaveTime); ++ + // Disable menu and toolbar items + emit windowsChanged(FALSE); + +@@ -2133,6 +2138,9 @@ + name = w->getDocument()->getFilename(); + recentFiles->add(name); + w->setCaption(name); ++ if (!autosaveTimer->isActive()) { ++ autosaveTimer->start(autosaveTime); ++ } + } + } else { + // error +@@ -2148,6 +2156,37 @@ + QString message = tr("Saved drawing: %1").arg(name); + statusBar()->message(message, 2000); + commandWidget->appendHistory(message); ++} ++ ++ ++ ++/** ++ * Autosave. ++ */ ++void QC_ApplicationWindow::slotFileAutoSave() { ++ RS_DEBUG->print("QC_ApplicationWindow::slotFileAutoSave()"); ++ ++ statusBar()->message(tr("Auto-saving drawing...")); ++ ++ QC_MDIWindow* w = getMDIWindow(); ++ QString name; ++ if (w!=NULL) { ++ bool cancelled; ++ if (w->slotFileSave(cancelled, true)) { ++ // auto-save cannot be cancelled by user, so the ++ // "cancelled" parameter is a dummy ++ statusBar()->message(tr("Auto-saved drawing"), 2000); ++ } else { ++ // error ++ autosaveTimer->stop(); ++ QMessageBox::information(this, QMessageBox::tr("Warning"), ++ tr("Cannot auto-save the file\n%1\nPlease " ++ "check the permissions.\n" ++ "Auto-save disabled.") ++ .arg(w->getDocument()->getAutoSaveFilename()), ++ QMessageBox::Ok); ++ } ++ } + } + + +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_applicationwindow.h ./qcad/src/qc_applicationwindow.h +--- ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_applicationwindow.h Tue Nov 22 12:49:34 2005 ++++ ./qcad/src/qc_applicationwindow.h Sat Aug 11 22:47:35 2007 +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -148,6 +149,8 @@ + void slotFileSave(); + /** saves a document under a different filename*/ + void slotFileSaveAs(); ++ /** auto-save document */ ++ void slotFileAutoSave(); + /** exports the document as bitmap */ + void slotFileExport(); + bool slotFileExport(const QString& name, const QString& format, +@@ -456,6 +459,9 @@ + QAction *testResize800; + QAction *testResize1024; + ++ QTimer *autosaveTimer; ++ ++ const static int autosaveTime = 60 * 1000; // 1 minute + }; + + +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_mdiwindow.cpp ./qcad/src/qc_mdiwindow.cpp +--- ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_mdiwindow.cpp Tue Nov 22 12:49:37 2005 ++++ ./qcad/src/qc_mdiwindow.cpp Sat Aug 11 22:47:35 2007 +@@ -324,23 +324,32 @@ + /** + * Saves the current file. + * ++ * @param isAutoSave true if this is an "autosave" operation. ++ * false if this is "Save" operation requested ++ * by the user. + * @return true if the file was saved successfully. + * false if the file could not be saved or the document + * is invalid. + */ +-bool QC_MDIWindow::slotFileSave(bool &cancelled) { ++bool QC_MDIWindow::slotFileSave(bool &cancelled, bool isAutoSave) { + RS_DEBUG->print("QC_MDIWindow::slotFileSave()"); + bool ret = false; + cancelled = false; + + if (document!=NULL) { +- if (document->getFilename().isEmpty()) { +- ret = slotFileSaveAs(cancelled); ++ if (isAutoSave) { ++ // Autosave filename is always supposed to be present. ++ // Autosave does not change the cursor. ++ ret = document->save(true); + } else { +- QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) ); +- ret = document->save(); +- QApplication::restoreOverrideCursor(); +- } ++ if (document->getFilename().isEmpty()) { ++ ret = slotFileSaveAs(cancelled); ++ } else { ++ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) ); ++ ret = document->save(); ++ QApplication::restoreOverrideCursor(); ++ } ++ } + } + + return ret; +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_mdiwindow.h ./qcad/src/qc_mdiwindow.h +--- ../qcad-2.0.5.0-1-community.src.orig/qcad/src/qc_mdiwindow.h Tue Nov 22 12:49:37 2005 ++++ ./qcad/src/qc_mdiwindow.h Sat Aug 11 22:47:35 2007 +@@ -69,7 +69,7 @@ + + void slotFileNew(); + bool slotFileOpen(const QString& fileName, RS2::FormatType type); +- bool slotFileSave(bool &cancelled); ++ bool slotFileSave(bool &cancelled, bool isAutoSave=false); + bool slotFileSaveAs(bool &cancelled); + bool slotFileClose(bool force); + void slotFilePrint(); +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_block.cpp ./qcadlib/src/engine/rs_block.cpp +--- ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_block.cpp Tue Nov 22 12:52:35 2005 ++++ ./qcadlib/src/engine/rs_block.cpp Sat Aug 11 22:47:35 2007 +@@ -78,10 +78,10 @@ + } + + +-bool RS_Block::save() { ++bool RS_Block::save(bool isAutoSave) { + RS_Graphic* g = getGraphic(); + if (g!=NULL) { +- return g->save(); ++ return g->save(isAutoSave); + } else { + return false; + } +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_block.h ./qcadlib/src/engine/rs_block.h +--- ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_block.h Tue Nov 22 12:52:38 2005 ++++ ./qcadlib/src/engine/rs_block.h Sat Aug 11 22:47:35 2007 +@@ -128,7 +128,7 @@ + /** + * Reimplementation from RS_Document. Saves the parent graphic document. + */ +- virtual bool save(); ++ virtual bool save(bool isAutoSave = false); + + /** + * Reimplementation from RS_Document. Does nothing. +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_document.cpp ./qcadlib/src/engine/rs_document.cpp +--- ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_document.cpp Tue Nov 22 12:52:38 2005 ++++ ./qcadlib/src/engine/rs_document.cpp Sat Aug 11 22:47:35 2007 +@@ -40,6 +40,7 @@ + RS_DEBUG->print("RS_Document::RS_Document() "); + + filename = ""; ++ autosaveFilename = "Unnamed"; + formatType = RS2::FormatUnknown; + setModified(false); + RS_Color col(RS2::FlagByLayer); +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_document.h ./qcadlib/src/engine/rs_document.h +--- ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_document.h Tue Nov 22 12:52:32 2005 ++++ ./qcadlib/src/engine/rs_document.h Sat Aug 11 22:47:35 2007 +@@ -53,7 +53,7 @@ + virtual RS_BlockList* getBlockList() = 0; + + virtual void newDoc() = 0; +- virtual bool save() = 0; ++ virtual bool save(bool isAutoSave = false) = 0; + virtual bool saveAs(const RS_String &filename, RS2::FormatType type) = 0; + virtual bool open(const RS_String &filename, RS2::FormatType type) = 0; + +@@ -98,6 +98,13 @@ + } + + /** ++ * @return Auto-save file name of the document currently loaded. ++ */ ++ RS_String getAutoSaveFilename() const { ++ return autosaveFilename; ++ } ++ ++ /** + * Sets file name for the document currently loaded. + */ + void setFilename(const RS_String& fn) { +@@ -136,6 +143,8 @@ + RS_Pen activePen; + /** File name of the document or empty for a new document. */ + RS_String filename; ++ /** Auto-save file name of document. */ ++ RS_String autosaveFilename; + /** Format type */ + RS2::FormatType formatType; + }; +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_graphic.cpp ./qcadlib/src/engine/rs_graphic.cpp +--- ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_graphic.cpp Tue Nov 22 12:52:32 2005 ++++ ./qcadlib/src/engine/rs_graphic.cpp Sat Aug 11 22:47:57 2007 +@@ -24,6 +24,8 @@ + ** + **********************************************************************/ + ++#include ++#include + + #include "rs_graphic.h" + +@@ -178,21 +180,46 @@ + /** + * Saves this graphic with the current filename and settings. + */ +-bool RS_Graphic::save() { ++bool RS_Graphic::save(bool isAutoSave) { + + bool ret = false; ++ + + RS_DEBUG->print("RS_Graphic::save"); +- RS_DEBUG->print(" file: %s", filename.latin1()); +- RS_DEBUG->print(" format: %d", (int)formatType); +- +- RS_DEBUG->print(" export..."); +- ret = RS_FILEIO->fileExport(*this, filename, formatType); +- +- if (ret) { +- setModified(false); +- layerList.setModified(false); +- blockList.setModified(false); ++ if (isAutoSave && !isModified()) { ++ RS_DEBUG->print(" autsave and not modified => not saved"); ++ ret = true; ++ } else { ++ const RS_String *actualName; ++ RS2::FormatType actualType; ++ ++ actualType = formatType; ++ if (isAutoSave) { ++ actualName = new QString(autosaveFilename); ++ if (formatType == RS2::FormatUnknown) { ++ actualType = RS2::FormatDXF; ++ } ++ } else { ++ actualName = new QString(filename); ++ } ++ RS_DEBUG->print(" file: %s", actualName->latin1()); ++ RS_DEBUG->print(" format: %d", (int)actualType); ++ RS_DEBUG->print(" export..."); ++ ret = RS_FILEIO->fileExport(*this, *actualName, actualType); ++ delete actualName; ++ ++ if (ret && !isAutoSave) { ++ setModified(false); ++ layerList.setModified(false); ++ blockList.setModified(false); ++ // Remove old autosave file ++ QFile f(autosaveFilename); ++ if (f.exists()) { ++ RS_DEBUG->print(" removing old autosave file %s", ++ autosaveFilename.latin1()); ++ f.remove(); ++ } ++ } + } + + RS_DEBUG->print("RS_Graphic::save ok"); +@@ -210,9 +237,28 @@ + RS_DEBUG->print("RS_Graphic::saveAs"); + + this->filename = filename; ++ RS_String *oldAutosaveName = new RS_String(autosaveFilename); ++ QFileInfo finfo(filename); ++ // Construct new autosave filename by prepending # to the filename ++ // part, using the same directory as the destination file. ++ this->autosaveFilename = finfo.dirPath() + "/#" + finfo.fileName(); + this->formatType = type; + +- return save(); ++ bool ret = save(); ++ ++ if (ret) { ++ // save was successful, remove old autosave file ++ QFile f(*oldAutosaveName); ++ if (f.exists()) { ++ RS_DEBUG->print("removing old autosave file %s", ++ oldAutosaveName->latin1()); ++ f.remove(); ++ } ++ } ++ ++ delete oldAutosaveName; ++ ++ return ret; + } + + +@@ -226,6 +272,10 @@ + bool ret = false; + + this->filename = filename; ++ QFileInfo finfo(filename); ++ // Construct new autosave filename by prepending # to the filename ++ // part, using the same directory as the destination file. ++ this->autosaveFilename = finfo.dirPath() + "/#" + finfo.fileName(); + + // clean all: + newDoc(); +diff -ru ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_graphic.h ./qcadlib/src/engine/rs_graphic.h +--- ../qcad-2.0.5.0-1-community.src.orig/qcadlib/src/engine/rs_graphic.h Tue Nov 22 12:52:38 2005 ++++ ./qcadlib/src/engine/rs_graphic.h Sat Aug 11 22:47:35 2007 +@@ -69,7 +69,7 @@ + } + + virtual void newDoc(); +- virtual bool save(); ++ virtual bool save(bool isAutoSave = false); + virtual bool saveAs(const RS_String& filename, RS2::FormatType type); + virtual bool open(const RS_String& filename, RS2::FormatType type); + diff --git a/cad/qcad/files/patch-zzz-ioexcept b/cad/qcad/files/patch-zzz-ioexcept new file mode 100644 index 000000000000..9308d63071dd --- /dev/null +++ b/cad/qcad/files/patch-zzz-ioexcept @@ -0,0 +1,109 @@ +--- dxflib/src/dl_writer_ascii.h.orig 2005-11-22 12:46:58.000000000 +0100 ++++ dxflib/src/dl_writer_ascii.h 2010-08-05 23:56:19.000000000 +0200 +@@ -50,7 +50,9 @@ + class DL_WriterA : public DL_Writer { + public: + DL_WriterA(char* fname, DL_Codes::version version=VER_2000) +- : DL_Writer(version), m_ofile(fname) {} ++ : DL_Writer(version), m_ofile(fname) { ++ m_ofile.exceptions(std::ofstream::failbit); ++ } + virtual ~DL_WriterA() {} + + bool openFailed() const; +--- qcadlib/src/filters/rs_filterdxf.cpp.orig 2005-11-22 12:52:41.000000000 +0100 ++++ qcadlib/src/filters/rs_filterdxf.cpp 2010-08-05 23:55:40.000000000 +0200 +@@ -1187,6 +1187,7 @@ + exportVersion = DL_Codes::AC1015; + } + ++ try { + //DL_WriterA* dw = dxf.out(file, VER_R12); + DL_WriterA* dw = dxf.out((const char*)QFile::encodeName(file), exportVersion); + +@@ -1376,6 +1377,10 @@ + dw->close(); + + delete dw; ++ } catch (std::ios::failure &e) { ++ RS_DEBUG->print("RS_FilterDXF::fileExport: ios::failure exception caught"); ++ return false; ++ } + + // check if file was actually written (strange world of windoze xp): + if (RS_FileInfo(file).exists()==false) { +--- qcad/src/ts/qcad_en.ts.orig 2005-11-22 12:49:30.000000000 +0100 ++++ qcad/src/ts/qcad_en.ts 2010-08-06 00:00:02.000000000 +0200 +@@ -238,7 +238,8 @@ + + Cannot save the file + %1 +-Please check the permissions. ++Please check the permissions ++and filesystem status (full?). + + + +--- qcad/src/ts/qcad_de.ts.orig 2005-11-22 12:49:31.000000000 +0100 ++++ qcad/src/ts/qcad_de.ts 2010-08-06 00:00:53.000000000 +0200 +@@ -319,10 +319,12 @@ + + Cannot save the file + %1 +-Please check the permissions. ++Please check the permissions ++and filesystem status (full?). + Kann Datei + %1 +-nicht speichern. Bitte prüfen Sie die Berechtigung. ++nicht speichern. Bitte prüfen Sie die Berechtigung ++sowie den Zustand des Dateisystems (voll?). + + + Help +--- qcad/src/ts/qcad_cs.ts.orig 2005-11-22 12:49:30.000000000 +0100 ++++ qcad/src/ts/qcad_cs.ts 2010-08-06 00:05:58.000000000 +0200 +@@ -300,10 +300,12 @@ + + Cannot save the file + %1 +-Please check the permissions. ++Please check the permissions ++and filesystem status (full?). + Nelze uložit soubor + %1 +-Zkontrolujte prosím přístupová práva. ++Zkontrolujte prosím přístupová práva ++a místo na zařizení. + + + &CAM +--- qcad/src/ts/qcad_ru.ts.orig 2005-11-22 12:49:31.000000000 +0100 ++++ qcad/src/ts/qcad_ru.ts 2010-08-06 00:08:18.000000000 +0200 +@@ -288,10 +288,12 @@ + + Cannot save the file + %1 +-Please check the permissions. ++Please check the permissions ++and filesystem status (full?). + Невозможно сохранить файл + %1 +-Проверьте, пожалуйста, права доступа. ++Проверьте, пожалуйста, права доступа ++и свободное место на файлсистеме. + + + Launch the online manual +--- qcad/src/qc_applicationwindow.cpp~ 2010-08-05 23:41:32.000000000 +0200 ++++ qcad/src/qc_applicationwindow.cpp 2010-08-05 23:59:26.000000000 +0200 +@@ -2111,7 +2111,8 @@ + // error + QMessageBox::information(this, QMessageBox::tr("Warning"), + tr("Cannot save the file\n%1\nPlease " +- "check the permissions.") ++ "check the permissions\n" ++ "and filesystem status (full?).") + .arg(w->getDocument()->getFilename()), + QMessageBox::Ok); + } -- cgit v1.2.3