]> gitweb.hamatoma.de Git - reqt/commitdiff
rebackgui: reload of last backup date, menu
authorhama <hama@siduction.net>
Sun, 14 Feb 2016 22:59:38 +0000 (23:59 +0100)
committerhama <hama@siduction.net>
Sun, 14 Feb 2016 22:59:38 +0000 (23:59 +0100)
appl/rebackgui/BackupUtils.cpp
appl/rebackgui/Configuration.cpp
appl/rebackgui/Configuration.hpp
appl/rebackgui/mainwindow.cpp
appl/rebackgui/mainwindow.ui
base/ReConfig.cpp
base/ReConfig.hpp

index 551f489bcb1f20f384b2954fa6ff7cadb0e51715..620ec1436016d7b6490c58fcfc3e4eee3cd8e9bb 100644 (file)
  * More info: http://unlicense.org
  * The latest sources: https://github.com/republib
  */
-#include "backupgui.hpp"\r
-\r
-BackupUtils::BackupUtils()\r
-{\r
-\r
-}\r
-/**\r
- * Converts a date time to a string.\r
- *\r
- * @param dateTime  the timepoint to convert\r
- * @return          the string representation\r
- */\r
-QString BackupUtils::dateToString(const QDateTime &dateTime)\r
-{\r
-       QString rc = dateTime.toString("yyyy.MM.dd/hh:mm:ss");\r
-       return rc;\r
-}\r
-\r
-/**\r
- * Finds the real path of a target directory.\r
- *\r
- * Note: if the medium of the target is an external medium\r
- * the path can change.\r
- *\r
- * @param item  the info about the backup item\r
- * @return      "": not found<br>\r
- *              otherwise: the full path of the target directory\r
- */\r
-QString BackupUtils::findTarget(const BackupItem& item, ReLogger* logger)\r
-{\r
-       QString rc;\r
-#if defined __linux__\r
-       if (item.m_target.startsWith(";/")){\r
-               // the path is an absolute path on a fixed disk:\r
-               rc = item.m_target.mid(1);\r
-       } else {\r
-\r
-       }\r
-#elif defined _WIN32\r
-       QStringList drives = ReFileUtils::findRootDirs();\r
-       QStringList::const_iterator it;\r
-       for (it = drives.cbegin(); it != drives.cend(); ++it){\r
-               QString path = *it;\r
-               ReQStringUtils::ensureLastChar(path, OS_SEPARATOR);\r
-               int pos = item.m_target.indexOf(';');\r
-               if (pos >= 0)\r
-                       path += item.m_target.mid(pos + 1);\r
-               else\r
-                       path += item.m_target;\r
-               QString markerFile = nameOfTargetDescription(path);\r
-               if (QFileInfo(markerFile).exists()){\r
-                       if (rc.isEmpty())\r
-                               rc = ReFileUtils::parentOf(markerFile);\r
-                       ReConfig config(I18N::s2b(markerFile), true, logger);\r
-                       if (! config.asString((item.m_uid + ".created").toLatin1(),\r
-                                                                 "").isEmpty()){\r
-                               rc =  ReFileUtils::parentOf(markerFile);\r
-                               break;\r
-                       }\r
-               }\r
-       }\r
-#endif\r
-       return rc;\r
-}\r
-\r
-/**\r
- * Returns the name of the file marking a backup target.\r
- *\r
- * @param path  the path of the file\r
- * @return      the full name of the file\r
- */\r
-QString BackupUtils::nameOfTargetDescription(const QString& path){\r
-       QString fname = path;\r
-       ReQStringUtils::ensureLastChar(fname, OS_SEPARATOR);\r
-       fname += ".rebackgui.target";\r
-       return fname;\r
-}\r
-\r
-/**\r
- * Prepares the target base directory.\r
- *\r
- * Creates a file. The program uses this file to recognize a target directory.\r
- *\r
- * @param path      the target base directory\r
- * @param item      the info about the backup item\r
- * @param logger    the logger\r
- * @return          <code>true</code>: target is already initialized\r
- */\r
-bool BackupUtils::prepareTarget(const QString& path, BackupItem &item,\r
-                                                               ReLogger* logger)\r
-{\r
-       bool rc = false;\r
-       QString fname = nameOfTargetDescription(path);\r
-       ReConfig config(I18N::s2b(fname), false, logger);\r
-       QByteArray key = item.m_uid.toLatin1() + ".created";\r
-       if (config.asString(key.constData(), "").isEmpty()){\r
-               config.put(key, dateToString(QDateTime::currentDateTime()).toLatin1().constData());\r
-               rc = true;\r
-       }\r
-       return rc;\r
-}\r
-\r
-/**\r
- * Converts a string into a date time.\r
- *\r
- * @param dateTime  the string convert\r
- * @return          the date time\r
- */\r
-QDateTime BackupUtils::stringToDate(const QString &dateTime)\r
-{\r
-       QDateTime rc;\r
-       rc.fromString(dateTime, "yyyy.MM.dd/hh:mm:ss");\r
-       return rc;\r
-}\r
-\r
-\r
+#include "backupgui.hpp"
+
+BackupUtils::BackupUtils()
+{
+
+}
+/**
+ * Converts a date time to a string.
+ *
+ * @param dateTime  the timepoint to convert
+ * @return          the string representation
+ */
+QString BackupUtils::dateToString(const QDateTime &dateTime)
+{
+       QString rc = dateTime.toString("yyyy.MM.dd/hh:mm:ss");
+       return rc;
+}
+
+/**
+ * Finds the real path of a target directory.
+ *
+ * Note: if the medium of the target is an external medium
+ * the path can change.
+ *
+ * @param item  the info about the backup item
+ * @return      "": not found<br>
+ *              otherwise: the full path of the target directory
+ */
+QString BackupUtils::findTarget(const BackupItem& item, ReLogger* logger)
+{
+       QString rc;
+#if defined __linux__
+       if (item.m_target.startsWith(";/")){
+               // the path is an absolute path on a fixed disk:
+               rc = item.m_target.mid(1);
+       } else {
+
+       }
+#elif defined _WIN32
+       QStringList drives = ReFileUtils::findRootDirs();
+       QStringList::const_iterator it;
+       for (it = drives.cbegin(); it != drives.cend(); ++it){
+               QString path = *it;
+               ReQStringUtils::ensureLastChar(path, OS_SEPARATOR);
+               int pos = item.m_target.indexOf(';');
+               if (pos >= 0)
+                       path += item.m_target.mid(pos + 1);
+               else
+                       path += item.m_target;
+               QString markerFile = nameOfTargetDescription(path);
+               if (QFileInfo(markerFile).exists()){
+                       if (rc.isEmpty())
+                               rc = ReFileUtils::parentOf(markerFile);
+                       ReConfig config(I18N::s2b(markerFile), true, logger);
+                       if (! config.asString((item.m_uid + ".created").toLatin1(),
+                                                                 "").isEmpty()){
+                               rc =  ReFileUtils::parentOf(markerFile);
+                               break;
+                       }
+               }
+       }
+#endif
+       return rc;
+}
+
+/**
+ * Returns the name of the file marking a backup target.
+ *
+ * @param path  the path of the file
+ * @return      the full name of the file
+ */
+QString BackupUtils::nameOfTargetDescription(const QString& path){
+       QString fname = path;
+       ReQStringUtils::ensureLastChar(fname, OS_SEPARATOR);
+       fname += ".rebackgui.target";
+       return fname;
+}
+
+/**
+ * Prepares the target base directory.
+ *
+ * Creates a file. The program uses this file to recognize a target directory.
+ *
+ * @param path      the target base directory
+ * @param item      the info about the backup item
+ * @param logger    the logger
+ * @return          <code>true</code>: target is already initialized
+ */
+bool BackupUtils::prepareTarget(const QString& path, BackupItem &item,
+                                                               ReLogger* logger)
+{
+       bool rc = false;
+       QString fname = nameOfTargetDescription(path);
+       ReConfig config(I18N::s2b(fname), false, logger);
+       QByteArray key = item.m_uid.toLatin1() + ".created";
+       if (config.asString(key.constData(), "").isEmpty()){
+               config.put(key, dateToString(QDateTime::currentDateTime()).toLatin1().constData());
+               rc = true;
+       }
+       return rc;
+}
+
+/**
+ * Converts a string into a date time.
+ *
+ * @param dateTime  the string convert
+ * @return          the date time
+ */
+QDateTime BackupUtils::stringToDate(const QString &dateTime)
+{
+       QDateTime rc = QDateTime::fromString(dateTime, "yyyy.MM.dd/hh:mm:ss");
+       return rc;
+}
+
+
index b6edc2cc325bee93cc19f6a52b06c48ca0ffcabb..e0f0c4c5225f2d0b0e4c3c199fa3eb17f6159edf 100644 (file)
@@ -20,7 +20,8 @@ BackupItem::BackupItem() :
        m_name(),
        m_sources(),
        m_target(),
-       m_lastBackup(){
+       m_lastBackup(),
+       m_active(false){
 }
 
 /**
@@ -34,7 +35,8 @@ BackupItem::BackupItem(int no) :
        m_name(),
        m_sources(),
        m_target(),
-       m_lastBackup(){
+       m_lastBackup(),
+       m_active(false){
 }
 
 /**
@@ -155,6 +157,7 @@ void Configuration::load(QString filename)
                        m_items.clear();
                        QList<int>::iterator it;
                        for (it = keys.begin(); it != keys.end(); ++it){
+                               readBackupDate(map[*it]);
                                m_items.append(map[*it]);
                        }
                }
@@ -163,6 +166,32 @@ void Configuration::load(QString filename)
        check();
 }
 
+/**
+ * Reads the last backup date from the target description file.
+ *
+ * @param item the item to inspect
+ * @return             <code>true</code>: the last backup date has been found (and
+ *                             set in <code>item</code>)
+ */
+bool Configuration::readBackupDate(BackupItem& item){
+       bool rc = false;
+       QString target = BackupUtils::findTarget(item, m_mainWindow->logger());
+       if (! target.isEmpty()){
+               item.m_active = true;
+               QString name = BackupUtils::nameOfTargetDescription(target);
+               ReConfig config(I18N::s2b(name).constData());
+               rc = item.m_active = config.exists();
+               if (rc){
+                       QByteArray key = item.m_uid.toLatin1() + ".lastbackup";
+                       QByteArray date = config.asString(key, "");
+                       if (date.length() > 1){
+                               item.m_lastBackup = BackupUtils::stringToDate(date);
+                       }
+               }
+       }
+       return rc;
+}
+
 /**
  * Saves the configuration file.
  *
index 4c4ca6edb203b40f7cc17c7973a7a555ea0bf79a..17933c99899fe2e7b45e9d35ab8bdb66466b72de 100644 (file)
@@ -20,13 +20,14 @@ public:
        BackupItem(int no);
 public:
        int m_no;
-    QString m_uid;
+       QString m_uid;
        QString m_name;
        QStringList m_sources;
        QString m_target;
        QDateTime m_lastBackup;
        QString m_filePatterns;
        QString m_dirPatterns;
+       bool m_active;
 };
 typedef QMap<int, BackupItem> BackupItemMap;
 typedef QList<BackupItem> BackupItemList;
@@ -40,6 +41,7 @@ public:
        void check();
        BackupItemList& items();
        void load(QString filename);
+       bool readBackupDate(BackupItem& item);
        void save(QString filename);
 
 private:
index 6319648298f41662b51aa904ebf24066b5c1e9ba..ce0cec631829cfd3e603472f3eb1b97b011c3ef1 100644 (file)
@@ -45,6 +45,8 @@ MainWindow::MainWindow(const QString& homeDir, QWidget *parent) :
          SLOT(onStart()));
    connect(ui->actionChecksums, SIGNAL(triggered()), this,
          SLOT(onChecksums()));
+   connect(ui->actionClean, SIGNAL(triggered()), this,
+         SLOT(onClean()));
    connect(ui->actionStop, SIGNAL(triggered()), this,
          SLOT(onStop()));
    connect(ui->pushButtonBackup, SIGNAL(clicked()), this, SLOT(onStart()));
@@ -191,11 +193,11 @@ void MainWindow::onGuiTimerUpdate()
  *          otherwise: error occurred
  */
 bool MainWindow::initializeStart(){
-    setStatusMessage(LOG_INFO, QObject::tr("Search started..."));
+       setStatusMessage(LOG_INFO, QObject::tr("Search started..."));
        bool rc = true;
-    BackupEngine::m_shouldStop = false;
-    BackupEngine::m_searchReady = false;
-    BackupEngine::m_hotBytes = 0;
+       BackupEngine::m_shouldStop = false;
+       BackupEngine::m_searchReady = false;
+       BackupEngine::m_hotBytes = 0;
        BackupEngine::m_hotFiles = 0;
        BackupEngine::m_matchedFiles = 0;
        BackupEngine::m_totalDirs = 0;
@@ -495,7 +497,7 @@ void MainWindow::onUpdate(){
                item.m_sources.append(ui->listWidgetSource->item(ix)->text());
        }
        updateTable();
-    saveState();
+       saveState();
 }
 
 /**
@@ -504,7 +506,7 @@ void MainWindow::onUpdate(){
  */
 void MainWindow::onVerboseIndexChanged(int index)
 {
-    BackupEngine::m_verboseLevel = (ReVerbose_t) index;
+       BackupEngine::m_verboseLevel = (ReVerbose_t) index;
 }
 
 /**
@@ -565,9 +567,10 @@ void MainWindow::startStop(bool isStart){
        ui->actionStop->setEnabled(isStart);
        ui->pushButtonBackup->setEnabled(! isStart);
        ui->pushButtonStop->setEnabled(isStart);
-    ui->pushButtonChecksum->setEnabled(! isStart);
-    ui->pushButtonClean->setEnabled(! isStart);
-    ui->actionChecksums->setEnabled(! isStart);
+       ui->pushButtonChecksum->setEnabled(! isStart);
+       ui->pushButtonClean->setEnabled(! isStart);
+       ui->actionChecksums->setEnabled(! isStart);
+       ui->actionClean->setEnabled(! isStart);
        if (isStart)
                BackupEngine::m_verboseLevel = (ReVerbose_t) ui->comboBoxVerbose->currentIndex();
 }
@@ -625,6 +628,9 @@ void MainWindow::updateTableRow(int row, BackupItem& item, QTableWidget* target)
                updateTableRow(row, item, ui->tableWidgetConfiguration);
        } else {
                int base = target == ui->tableWidget ? 1 : 0;
+               QString active = QObject::tr(item.m_active ? "yes" : "no");
+               if (base == 1)
+                       target->setItem(row, 0, new QTableWidgetItem(active));
                target->setItem(row, base + 0, new QTableWidgetItem(item.m_name));
                target->setItem(row, base + 1, new QTableWidgetItem(item.m_target));
                target->setItem(row, base + 2, new QTableWidgetItem(! item.m_lastBackup.isValid() ? "" :
index 884d43fb1dc4c2558e6dc7a6e25d9616abb51ed4..1d967cf9b8c671a62c0fb496edf7676460254a1a 100644 (file)
     <addaction name="actionStart"/>
     <addaction name="actionStop"/>
     <addaction name="actionChecksums"/>
+    <addaction name="actionClean"/>
    </widget>
    <addaction name="menuFile"/>
    <addaction name="menuEdit"/>
     <string>Calculates checksums for source and target files and reports differences</string>
    </property>
   </action>
+  <action name="actionClean">
+   <property name="text">
+    <string>Clean</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
  <resources/>
index 593d9a17f6ff385fb2405bd1d7814ce49c936d4c..ca86e2d5ab521fdac244a43d2c92fdb384170821 100644 (file)
@@ -55,7 +55,8 @@ ReConfig::ReConfig(const char* file, bool readOnly, ReLogger* logger) :
                m_readOnly(readOnly),
                m_logger(logger),
                m_ownLogger(logger == NULL),
-               m_modified(false){
+               m_modified(false),
+               m_exists(false){
        if (logger == NULL) {
                initLogger();
        }
@@ -90,6 +91,15 @@ void ReConfig::initLogger() {
        m_logger->addAppender(appender2);
 }
 
+/**
+ * Returns whether the configuration file exists.
+ * @return     <code>true</code>: the file exists.
+ */
+bool ReConfig::exists() const
+{
+       return m_exists;
+}
+
 /**
  * Returns  configuration value as an integer.
  *
@@ -190,6 +200,7 @@ bool ReConfig::read(const char* file) {
        if (file == NULL)
                file = m_file.constData();
        FILE* fp = fopen(file, "r");
+       m_exists = fp != NULL;
        if (fp == NULL) {
                m_logger->logv(LOG_ERROR, LOC_READ_1, "cannot read: %s", file);
                rc = false;
index a862ed069b968264f675ecc469d84afb3a6a824e..617e5668f39b702431b9c47fae06e4249e0460d8 100644 (file)
@@ -14,7 +14,7 @@
 class ReConfig: public ReConfigurator, protected QHash<QByteArray, QByteArray> {
 public:
        ReConfig(const char* file = NULL, bool readOnly = true, ReLogger* logger =
-           NULL);
+               NULL);
        virtual ~ReConfig();
 
 public:
@@ -22,6 +22,7 @@ public:
        virtual int asInt(const char* key, int defaultValue) const;
        virtual QByteArray asString(const char* key, const char* defaultValue);
        void clear();
+       bool exists() const;
        const QList<QByteArray>& getLines() const;
        void put(const char* key, bool value);
        void put(const char* key, int value);
@@ -39,6 +40,7 @@ private:
        // true: the logger must be destroyed in the destructor
        bool m_ownLogger;
        bool m_modified;
+       bool m_exists;
 };
 
 #endif // RECONFIG_HPP