]> gitweb.hamatoma.de Git - reqt/commitdiff
rebackgui: works basicly under windows
authorHamatoma <git.tortouse@hm.f-r-e-i.de>
Wed, 27 Jan 2016 22:48:36 +0000 (23:48 +0100)
committerHamatoma <git.tortouse@hm.f-r-e-i.de>
Wed, 27 Jan 2016 22:48:36 +0000 (23:48 +0100)
28 files changed:
appl/rebackgui/BackupEngine.cpp
appl/rebackgui/BackupUtils.cpp [new file with mode: 0644]
appl/rebackgui/BackupUtils.hpp [new file with mode: 0644]
appl/rebackgui/Configuration.cpp
appl/rebackgui/Configuration.hpp
appl/rebackgui/backupgui.hpp
appl/rebackgui/mainwindow.cpp
appl/rebackgui/mainwindow.hpp
appl/rebackgui/rebackgui.pro
base/ReConfig.cpp
base/ReConfig.hpp
base/ReFile.cpp
base/ReFileUtils.cpp
base/ReFileUtils.hpp
base/ReQStringUtils.cpp
base/ReRandomizer.cpp
base/ReRandomizer.hpp
base/ReStringUtils.cpp
base/ReStringUtils.hpp
base/ReTest.cpp
base/rebase.hpp
cunit/cuReFileSystem.cpp
cunit/cuReFileUtils.cpp
cunit/cuReProcess.cpp
gui/ReGuiApplication.cpp
os/ReFileSystem.cpp
os/ReFileSystem.hpp
os/reos.hpp

index 4fee13e4de33e84897cd885820acda36e3cb6f6e..3950da99eebf63e84fe021780fded1a01213e6be 100644 (file)
@@ -227,8 +227,26 @@ BackupTask::BackupTask(const QString& name,
  */
 void BackupTask::copyFile(int index, const QString& relPath, const QString& node){
        QString source = m_sourceDirs.at(index) + relPath + node;
-       QString target = m_targetDirs.at(index) + relPath + node;
-       m_mainWindow->addToFileList(source + " -> " + target);
+    QString targetDir = m_targetDirs.at(index) + relPath;
+    QString target =  targetDir +  node;
+    ReQStringUtils::chomp(targetDir, OS_SEPARATOR);
+    bool isFile;
+    if (! ReFileUtils::isDirectory(targetDir, &isFile)){
+        if (isFile){
+            if (unlink(I18N::s2b(targetDir).constData()) != 0)
+                error(tr("cannot remove file (for making a directory (%1): %2")
+                      .arg(errno).arg(targetDir));
+        }
+        if (! ReFileUtils::makeDirWithParents(targetDir))
+            error(tr("cannot make directory (%1): %2").arg(errno).arg(targetDir));
+    }
+    QFile src(source);
+    unlink(I18N::s2b(target).constData());
+    if (! src.copy(target)){
+        error(tr("copy failed (%1): %2").arg(errno).arg(source));
+    } else {
+        m_mainWindow->addToFileList(source);
+    }
 }
 
 /**
diff --git a/appl/rebackgui/BackupUtils.cpp b/appl/rebackgui/BackupUtils.cpp
new file mode 100644 (file)
index 0000000..ee777f6
--- /dev/null
@@ -0,0 +1,117 @@
+/*\r
+ * Licence:\r
+ * You can use and modify this file without any restriction.\r
+ * There is no warranty.\r
+ * You also can use the licence from http://www.wtfpl.net/.\r
+ * The original sources can be found on https://github.com/republib.\r
+*/\r
+#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
+#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
diff --git a/appl/rebackgui/BackupUtils.hpp b/appl/rebackgui/BackupUtils.hpp
new file mode 100644 (file)
index 0000000..af97bfc
--- /dev/null
@@ -0,0 +1,24 @@
+/*\r
+ * Licence:\r
+ * You can use and modify this file without any restriction.\r
+ * There is no warranty.\r
+ * You also can use the licence from http://www.wtfpl.net/.\r
+ * The original sources can be found on https://github.com/republib.\r
+*/\r
+#ifndef BACKUPUTILS_H\r
+#define BACKUPUTILS_H\r
+\r
+\r
+class BackupUtils\r
+{\r
+public:\r
+    BackupUtils();\r
+public:\r
+    static QString dateToString(const QDateTime& dateTime);\r
+    static QString findTarget(const BackupItem& item, ReLogger* logger);\r
+    static QString nameOfTargetDescription(const QString &path);\r
+    static bool prepareTarget(const QString &path, BackupItem &item, ReLogger *logger);\r
+    static QDateTime stringToDate(const QString& dateTime);\r
+};\r
+\r
+#endif // BACKUPUTILS_H\r
index dc5d2410b0b291d9727aab2096efcf8a7d2c47ba..0a0b884406582b82d6d98f162df372f4db6ea779 100644 (file)
@@ -13,6 +13,7 @@
  */
 BackupItem::BackupItem() :
        m_no(0),
+    m_uid(),
        m_name(),
        m_sources(),
        m_target(),
@@ -26,6 +27,7 @@ BackupItem::BackupItem() :
  */
 BackupItem::BackupItem(int no) :
        m_no(no),
+     m_uid(),
        m_name(),
        m_sources(),
        m_target(),
@@ -59,6 +61,7 @@ void Configuration::appendNew()
 {
        BackupItem item(m_items.size());
        item.m_name = QObject::tr("item") + QString::number(item.m_no + 1);
+    item.m_uid = QString(ReRandomizer::buildUUID());
        m_items.append(item);
 }
 
@@ -70,6 +73,11 @@ void Configuration::check()
        if (m_items.size() == 0){
                appendNew();
        }
+    for (int ix =0; ix < m_items.size(); ix++){
+        BackupItem& item = m_items[ix];
+        if (item.m_uid.isEmpty())
+            item.m_uid = QString(ReRandomizer::buildUUID());
+    }
 }
 
 /**
@@ -122,9 +130,11 @@ void Configuration::load(QString filename)
                                getItem(no, map).m_name = value;
                        } else if (ReQStringUtils::hasPrefixAndNumber("sources", line2, no, value)){
                                getItem(no, map).m_sources = value.split(';');
-                       } else if (ReQStringUtils::hasPrefixAndNumber("target", line2, no, value)){
-                               getItem(no, map).m_target = value;
-                       } else if (ReQStringUtils::hasPrefixAndNumber("filepatterns", line2, no, value)){
+            } else if (ReQStringUtils::hasPrefixAndNumber("uid", line2, no, value)){
+                getItem(no, map).m_uid = value;
+            } else if (ReQStringUtils::hasPrefixAndNumber("target", line2, no, value)){
+                getItem(no, map).m_target = value;
+            } else if (ReQStringUtils::hasPrefixAndNumber("filepatterns", line2, no, value)){
                                getItem(no, map).m_filePatterns = value;
                        } else if (ReQStringUtils::hasPrefixAndNumber("dirpatterns", line2, no, value)){
                                getItem(no, map).m_dirPatterns = value;
@@ -167,9 +177,11 @@ void Configuration::save(QString filename)
                QByteArray buffer;
                for (int ix = 0; ix < m_items.size(); ix++){
                        BackupItem& item = m_items[ix];
-                       buffer = "name." + QByteArray::number(ix) + "="
-                                       + item.m_name.toUtf8() + "\n";
-                       buffer += "sources." + QByteArray::number(ix) + "="
+            buffer = "name." + QByteArray::number(ix) + "="
+                    + item.m_name.toUtf8() + "\n";
+            buffer += "uid." + QByteArray::number(ix) + "="
+                    + item.m_uid.toUtf8() + "\n";
+            buffer += "sources." + QByteArray::number(ix) + "="
                                        + item.m_sources.join(';').toUtf8() + "\n";
                        buffer += "target." + QByteArray::number(ix) + "="
                                        + item.m_target.toUtf8() + "\n";
@@ -178,7 +190,7 @@ void Configuration::save(QString filename)
                        buffer += "dirpatterns." + QByteArray::number(ix) + "="
                                        + item.m_dirPatterns.toUtf8() + "\n";
                        buffer += "lastbackup." + QByteArray::number(ix) + "="
-                                       + item.m_lastBackup.toString("yyyy.MM.dd/hh:mm") + "\n";
+                    + BackupUtils::dateToString(item.m_lastBackup) + "\n";
                        if (fputs(buffer.constData(), fp) != buffer.length())
                                m_mainWindow->error(QObject::tr("cannot write (%1): %2").arg(errno)
                                                                                        .arg(filename));
index 7ea29860d80e9dc0412caa170336ea60f5c8cb2f..38df7ca6ef8f90664522f6732ff5b009e6eee65e 100644 (file)
@@ -17,6 +17,7 @@ public:
        BackupItem(int no);
 public:
        int m_no;
+    QString m_uid;
        QString m_name;
        QStringList m_sources;
        QString m_target;
index ea5db17951a94ffaf12ee4f5e602ae241a1e8afd..c2922fa70b467416b4b2b144441157160ec1b4eb 100644 (file)
@@ -12,6 +12,7 @@
 #include "gui/regui.hpp"
 #include "Configuration.hpp"
 #include "BackupEngine.hpp"
+#include "BackupUtils.hpp"
 #include "mainwindow.hpp"
 #include "ui_mainwindow.h"
 
index 95419d3de562ce2d7fc4f95a9c8ce4c9b7d53188..26b06a9e7a166fb4cd1200f8673df2e1cdda9e30 100644 (file)
@@ -49,7 +49,6 @@ MainWindow::MainWindow(const QString& homeDir, QWidget *parent) :
          SLOT(onLoadConfig()));
    connect(ui->actionSaveConfig, SIGNAL(triggered()), this,
          SLOT(onSaveConfig()));
-   connect(ui->pushButtonDeleteItem, SIGNAL(clicked()), this, SLOT(onNewDeleteItem()));
    connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(onAbout()));
    connect(ui->tableWidgetConfiguration->selectionModel(),
                   SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&)),
@@ -62,6 +61,7 @@ MainWindow::MainWindow(const QString& homeDir, QWidget *parent) :
    connect(ui->pushButtonClearErrorList, SIGNAL(clicked()), this, SLOT(onClearErrorList()));
    connect(ui->pushButtonClear, SIGNAL(clicked()), this, SLOT(onClearLog()));
    m_configuration.load("");
+   ui->tableWidgetConfiguration->selectRow(0);
    updateTable();
    updateItem(0);
 }
@@ -106,6 +106,28 @@ bool MainWindow::error(const QString& message){
 }
 
 
+/**
+ * Find the target identification.
+ *
+ * @param dir  the directory on the external medium (already mounted)
+ * @return      the relative path
+ */
+QString MainWindow::extractTarget(const QString& dir){
+    QString rc;
+    QString target;
+#if defined __linux__
+#elif defined _WIN32
+    rc = dir;
+    if (dir.length() >= 2 && dir.at(1) == ':')
+        rc.remove(0, 2);
+    if (rc.startsWith(OS_SEPARATOR_STR))
+        rc.remove(0, 1);
+    target = ";" + rc;
+#endif
+    ui->lineEditTarget->setText(target);
+    return rc;
+}
+
 /**
  * Set GUI elements from the queue when the GUI timer is triggered.
  */
@@ -263,23 +285,13 @@ void MainWindow::onSelectTarget(){
                        QFileDialog::ShowDirsOnly);
        if (!dir.isEmpty()){
                dir = ReFileUtils::nativePath(dir);
-               findTarget(dir);
+        extractTarget(dir);
+        BackupItem& item = m_configuration.items()[m_currentRowConfiguration];
+        if (! BackupUtils::prepareTarget(dir, item, &m_logger))
+            say(LOG_INFO, tr("target initialized with %1")
+                .arg(BackupUtils::nameOfTargetDescription(dir)));
        }
 }
-
-/**
- * Find the target identification.
- *
- * @param dir  the directory on the external medium (already mounted)
- */
-void MainWindow::findTarget(const QString& dir){
-       QString target =  ";" + dir;
-#if defined __linux__
-#else
-#endif
-       ui->lineEditTarget->setText(target);
-}
-
 /**
  * The current row has been changed.
  *
@@ -307,19 +319,6 @@ void MainWindow::onSaveConfig(){
        m_configuration.save("");
 }
 
-/**
- * Builds the target directory.
- *
- * @return     the target directory
- */
-QString MainWindow::buildTargetDir(const QString& target){
-       QString rc = target;
-       int ix = rc.indexOf(';');
-       if (ix == 0)
-               rc.remove(0, 1);
-       return rc;
-}
-
 /**
  * Starts the backup.
  */
@@ -328,21 +327,25 @@ void MainWindow::onStart(){
        if (row < 0){
                say(LOG_ERROR, tr("no backup item selected"));
        } else {
-               startStop(true);
-               const BackupItem& item = m_configuration.items().at(row);
-               delete m_searchTask;
+        const BackupItem& item = m_configuration.items().at(row);
                BackupEngine::m_searchReady = false;
-               QString target = buildTargetDir(item.m_target);
-               ReQStringUtils::ensureLastChar(target, OS_SEPARATOR);
-               m_searchTask = new SearchTask(item.m_name,
-                                                       item.m_filePatterns, item.m_dirPatterns,
-                                                       item.m_sources, target, this);
-               m_searchTask->start();
-               delete m_backupTask;
-               m_backupTask = new BackupTask(item.m_name, item.m_sources, target,
-                                                         this);
-               m_backupTask->start();
-       }
+        QString target = BackupUtils::findTarget(item, &m_logger);
+        if (target.isEmpty()){
+            say(LOG_ERROR, tr("Target not available"));
+        } else {
+            ReQStringUtils::ensureLastChar(target, OS_SEPARATOR);
+            startStop(true);
+            delete m_searchTask;
+            m_searchTask = new SearchTask(item.m_name,
+                                          item.m_filePatterns, item.m_dirPatterns,
+                                          item.m_sources, target, this);
+            m_searchTask->start();
+            delete m_backupTask;
+            m_backupTask = new BackupTask(item.m_name, item.m_sources, target,
+                                          this);
+            m_backupTask->start();
+        }
+    }
 }
 /**
  * Stops the backup.
@@ -485,7 +488,7 @@ void MainWindow::updateTableRow(int row, BackupItem& item, QTableWidget* target)
                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() ? "" :
-                                                               item.m_lastBackup.toString("yyyy.MM.dd hh:mm")));
+            BackupUtils::dateToString(item.m_lastBackup)));
                target->setItem(row, base + 3, new QTableWidgetItem(item.m_sources.join(" ")));
        }
 }
index ef63a8ee075b952f09b60a9d09e7da5837f9b32e..0305348e8f18cedef09e797ce9c070ac2ce91db3 100644 (file)
@@ -32,9 +32,10 @@ public:
    void startStop(bool isStart);
    void restoreState();
    void saveState();
+private:
+   QString extractTarget(const QString& dir);
 private slots:
    virtual void aboutToQuit();
-   void findTarget(const QString& dir);
    virtual void guiTimerUpdate();
    void onAbout();
    void onAddItem();
@@ -62,7 +63,7 @@ private:
        int m_currentRowBackup;
        QString m_lastSource;
        SearchTask* m_searchTask;
-       BackupTask* m_backupTask;
+    BackupTask* m_backupTask;
 };
 
 #endif // MAINWINDOW_HPP
index 49b131a604090db20db190ccca60a22d1e35141a..9d8b6084ffcf5592062e0fb2c6ed18668fa2ea12 100644 (file)
@@ -1,46 +1,51 @@
-#-------------------------------------------------
-#
-# Project created by QtCreator 2016-01-18T00:51:17
-#
-#-------------------------------------------------
-
-QT       += core gui
-
-greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-
-TARGET = rebackgui
-TEMPLATE = app
-INCLUDEPATH = ../.. /usr/include/c++/4.9
-
-SOURCES += main.cpp\
-        ../../base/ReException.cpp \
-        ../../base/ReQStringUtils.cpp \
-        ../../base/ReFileUtils.cpp \
-        ../../base/ReMatcher.cpp \
-        ../../base/ReLogger.cpp \
-        ../../gui/ReStateStorage.cpp \
-        ../../gui/ReGuiApplication.cpp \
-        ../../gui/ReGuiValidator.cpp \
-        ../../gui/ReGuiQueue.cpp \
-        mainwindow.cpp \
-        aboutdialog.cpp \
-       Configuration.cpp \
-       BackupEngine.cpp
-
-HEADERS  += mainwindow.hpp \
-        ../../base/rebase.hpp \
-        ../../base/ReQStringUtils.hpp \
-        ../../gui/ReStateStorage.hpp \
-        ../../gui/ReGuiValidator.hpp \
-        ../../gui/regui.hpp \
-        aboutdialog.hpp \
-       Configuration.hpp \
-       backupgui.hpp \
-       BackupEngine.hpp
-
-FORMS    += mainwindow.ui \
-        aboutdialog.ui
-
-DISTFILES += \
-       ReBackGui.html
-
+#-------------------------------------------------\r
+#\r
+# Project created by QtCreator 2016-01-18T00:51:17\r
+#\r
+#-------------------------------------------------\r
+\r
+QT       += core gui\r
+\r
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets\r
+\r
+TARGET = rebackgui\r
+TEMPLATE = app\r
+INCLUDEPATH = ../.. /usr/include/c++/4.9\r
+\r
+SOURCES += main.cpp\\r
+        ../../base/ReException.cpp \\r
+        ../../base/ReConfig.cpp \\r
+        ../../base/ReQStringUtils.cpp \\r
+        ../../base/ReFileUtils.cpp \\r
+        ../../base/ReMatcher.cpp \\r
+        ../../base/ReLogger.cpp \\r
+        ../../base/ReRandomizer.cpp \\r
+        ../../base/ReStringUtils.cpp \\r
+        ../../gui/ReStateStorage.cpp \\r
+        ../../gui/ReGuiApplication.cpp \\r
+        ../../gui/ReGuiValidator.cpp \\r
+        ../../gui/ReGuiQueue.cpp \\r
+        mainwindow.cpp \\r
+        aboutdialog.cpp \\r
+       Configuration.cpp \\r
+       BackupEngine.cpp \\r
+    BackupUtils.cpp\r
+\r
+HEADERS  += mainwindow.hpp \\r
+        ../../base/rebase.hpp \\r
+        ../../base/ReQStringUtils.hpp \\r
+        ../../gui/ReStateStorage.hpp \\r
+        ../../gui/ReGuiValidator.hpp \\r
+        ../../gui/regui.hpp \\r
+        aboutdialog.hpp \\r
+       Configuration.hpp \\r
+       backupgui.hpp \\r
+       BackupEngine.hpp \\r
+    BackupUtils.hpp\r
+\r
+FORMS    += mainwindow.ui \\r
+        aboutdialog.ui\r
+\r
+DISTFILES += \\r
+       ReBackGui.html\r
+\r
index dffdb11d57e282a30750cb313a8de1c5a07d5da1..8ecac9700709faab08ce1b0c597dcb01349500b3 100644 (file)
@@ -54,7 +54,8 @@ ReConfig::ReConfig(const char* file, bool readOnly, ReLogger* logger) :
            m_lineList(),
            m_readOnly(readOnly),
            m_logger(logger),
-           m_ownLogger(logger == NULL) {
+        m_ownLogger(logger == NULL),
+        m_modified(false){
        if (logger == NULL) {
                initLogger();
        }
@@ -68,6 +69,8 @@ ReConfig::ReConfig(const char* file, bool readOnly, ReLogger* logger) :
  * Frees the resources.
  */
 ReConfig::~ReConfig() {
+    if (! m_readOnly && m_modified)
+        write(m_file);
        if (m_ownLogger)
                delete m_logger;
        m_logger = NULL;
@@ -134,7 +137,44 @@ QByteArray ReConfig::asString(const char* key, const char* defaultValue) {
        if (contains(key)) {
                rc = (*this)[key];
        }
-       return rc;
+    return rc;
+}
+
+/**
+ * Puts a boolean variable into the configuration.
+ *
+ * @param key   the key of the variable
+ * @param value the value of the variable
+ */
+void ReConfig::put(const char *key, bool value)
+{
+    put(key, value ? "true" : "false");
+}
+
+/**
+ * Puts an integer variable into the configuration.
+ *
+ * @param key   the key of the variable
+ * @param value the value of the variable
+ */
+void ReConfig::put(const char *key, int value)
+{
+    put(key, QByteArray::number(value).constData());
+}
+
+/**
+ * Puts a string variable into the configuration.
+ *
+ * @param key   the key of the variable
+ * @param value the value of the variable
+ */
+void ReConfig::put(const char *key, const char *value)
+{
+    m_modified = true;
+    if (! contains(key)){
+        m_lineList.append(key + QByteArray("="));
+    }
+    insert(key, value);
 }
 
 /**
@@ -147,6 +187,8 @@ QByteArray ReConfig::asString(const char* key, const char* defaultValue) {
 bool ReConfig::read(const char* file) {
        bool rc = true;
        m_lineList.reserve(1024);
+    if (file == NULL)
+        file = m_file.constData();
        FILE* fp = fopen(file, "r");
        if (fp == NULL) {
                m_logger->logv(LOG_ERROR, LOC_READ_1, "cannot read: %s", file);
@@ -187,9 +229,27 @@ bool ReConfig::write(const char* file) {
        if (m_readOnly)
                m_logger->log(LOG_ERROR, LOC_WRITE_1, "cannot write: (readonly");
        else {
-               m_logger->logv(LOG_ERROR, LOC_WRITE_2, "not implemented: write(%s)",
-                   file);
-       }
+        if (file == NULL){
+            file =  m_file.constData();
+        }
+        int pos = 0;
+        QByteArray key;
+        FILE* fp = fopen(file, "w");
+        if (fp == NULL)
+            m_logger->logv(LOG_ERROR, LOC_WRITE_2, "cannot open (%d): %s", errno, file);
+        else {
+            for (int ix = 0; ix < m_lineList.size(); ix++){
+                QByteArray& line = m_lineList[ix];
+                if (isalnum(line[0]) && (pos = line.indexOf('=')) >= 0) {
+                    key = line.mid(0, pos);
+                    if (contains(key))
+                        line = key + "=" + value(key) + "\n";
+                }
+                fputs(line.constData(), fp);
+            }
+            fclose(fp);
+        }
+    }
        return rc;
 }
 
index cb8ee06b2f52403ab4b9b9a719b61139a15a7e67..a862ed069b968264f675ecc469d84afb3a6a824e 100644 (file)
 #ifndef RECONFIG_HPP
 #define RECONFIG_HPP
 
-class ReConfig: public ReConfigurator, public QHash<QByteArray, QByteArray> {
+class ReConfig: public ReConfigurator, protected QHash<QByteArray, QByteArray> {
 public:
        ReConfig(const char* file = NULL, bool readOnly = true, ReLogger* logger =
            NULL);
        virtual ~ReConfig();
 
 public:
-       bool read(const char* file);
-       bool write(const char* file);
-       void clear();
-       const QList<QByteArray>& getLines() const;
-
        virtual bool asBool(const char* key, bool defaultValue) const;
        virtual int asInt(const char* key, int defaultValue) const;
        virtual QByteArray asString(const char* key, const char* defaultValue);
+       void clear();
+       const QList<QByteArray>& getLines() const;
+       void put(const char* key, bool value);
+       void put(const char* key, int value);
+       void put(const char* key, const char* value);
+       bool read(const char* file = NULL);
+       bool write(const char* file = NULL);
+
 private:
        void initLogger();
 private:
-       const char* m_file;
-       QList<QByteArray> m_lineList;
+       QByteArray m_file;
+       QByteArrayList m_lineList;
        bool m_readOnly;
        ReLogger* m_logger;
        // true: the logger must be destroyed in the destructor
        bool m_ownLogger;
+       bool m_modified;
 };
 
 #endif // RECONFIG_HPP
index 324841353e8cf8da5191b0e92982d66bcfb32394..ae1bad8afb9b81fd63a1bfc3a8b196c037ce178d 100644 (file)
@@ -17,7 +17,7 @@ enum {
        LOC_DELETE_TREE_3,              // 11803
 };
 
-#if defined __linux__ || defined WIN32
+#if defined __linux__ || defined _WIN32
 void* memichr(void* heap, int cc, size_t length) {
        const char* heap2 = reinterpret_cast<const char*>(heap);
        int cc2 = tolower(cc);
@@ -30,7 +30,8 @@ void* memichr(void* heap, int cc, size_t length) {
        }
        return rc;
 }
-
+#endif /* __linux__ */
+#if defined __linux__
 int memicmp(const void* str1, const void* str2, size_t length) {
        const char* str12 = reinterpret_cast<const char*>(str1);
        const char* str22 = reinterpret_cast<const char*>(str2);
@@ -44,8 +45,7 @@ int memicmp(const void* str1, const void* str2, size_t length) {
        }
        return rc;
 }
-#endif /* __linux__ */
-
+#endif
 /**
  * Constructor.
  */
index fe2b822c87aeb09da5e822343189f19630a4be38..e2bae9ef35e81f857f148c4703c9f735703d8d5d 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #include "base/rebase.hpp"
-
 enum {
        LOC_DELETE_TREE_1 = LOC_FIRST_OF(LOC_FILE_UTILS), // 12501
        LOC_DELETE_TREE_2,              // 12502
@@ -45,7 +44,7 @@ QByteArray ReFileUtils::cleanPath(const char* path) {
        int length = strlen(path);
        rc.reserve(length);
        int minLength = 0;
-#ifdef __WIN32__
+#ifdef _WIN32
        // UNC path, e.g. "\\server\share"?
        if ((path[0] == OS_SEPARATOR || path[0] == OS_2nd_SEPARATOR)
                        && (path[1] == OS_SEPARATOR || path[1] == OS_2nd_SEPARATOR)) {
@@ -231,7 +230,29 @@ QByteArray ReFileUtils::extensionOf(const char* filename) {
                        ix--;
                }
        }
-       return rc;
+    return rc;
+}
+
+/**
+ * Returns the list of root filesystems.
+ *
+ * Windows: the list of available drives
+ *
+ * @return the list of root directories
+ */
+QStringList ReFileUtils::findRootDirs()
+{
+    QStringList rc;
+#if defined __linux__
+    rc.append("/");
+#elif defined _WIN32
+    QFileInfoList drives = QDir::drives();
+    QFileInfoList::const_iterator it;
+    for (it = drives.cbegin(); it != drives.cend(); ++it){
+        rc.append(it->absolutePath().mid(0, 2));
+    }
+#endif
+    return rc;
 }
 
 /**
@@ -282,11 +303,12 @@ bool ReFileUtils::isDirectory(const QString& path, bool* isFile)
        QFileInfo info(path);
        bool rc = info.exists();
        if (rc){
-               if (isFile != NULL)
-                       *isFile = true;
                if (! info.isDir())
                        rc = false;
-       }
+        if (isFile != NULL)
+            *isFile = ! rc;
+    } else if (isFile != NULL)
+        *isFile = false;
        return rc;
 }
 
@@ -300,8 +322,8 @@ bool ReFileUtils::isRootDir(const char* path)
 {
 #if defined __linux__
        return path[0] == OS_SEPARATOR && path[1] == '\0';
-#elif defined WIN32
-       return isalpha(path[0]) &&  path[1] == ':' && path[2] == '\\' && path[3] = '\0';
+#elif defined _WIN32
+    return isalpha(path[0]) &&  path[1] == ':' && path[2] == '\\' && path[3] == '\0';
 #endif
 }
 
@@ -349,26 +371,39 @@ bool ReFileUtils::makeDir(const QString& path, ReLogger* logger) {
  *                                     <code>false</code>: error occurred
  */
 bool ReFileUtils::makeDirWithParents(const char* path, ReLogger* logger) {
-       const char* end;
-       const char* start = path;
-       bool rc = true;
-       QByteArray dir;
-       while (rc && (end = strchr(start, OS_SEPARATOR)) != NULL) {
-               if (end == path) {
-                       start++;
-                       dir += OS_SEPARATOR;
-               } else {
-                       dir.append(start, end - start);
-                       start = end + 1;
-                       rc = makeDir(dir.constData(), logger);
-                       dir += OS_SEPARATOR;
-               }
-       }
-       if (rc && start[0] != '\0') {
-               dir.append(start);
-               rc = makeDir(dir.constData(), logger);
-       }
-       return rc;
+    struct stat info;
+    bool rc = false;
+    if (stat(path, &info) == 0 && S_ISDIR(info.st_mode)){
+        rc = true;
+    } else {
+        QByteArray dir = ReStringUtils::chomp(parentOf(path), OS_SEPARATOR);
+        if (stat(dir.constData(), &info) == 0 && S_ISDIR(info.st_mode))
+            rc = makeDir(path, logger);
+        else {
+            const char* end;
+            const char* start = path;
+            while (rc && (end = strchr(start, OS_SEPARATOR)) != NULL) {
+                if (end == path) {
+                    start++;
+                    dir += OS_SEPARATOR;
+                } else {
+                    dir.append(start, end - start);
+                    start = end + 1;
+#if defined _WIN32
+                    if (dir.length() == 2 && dir.at(1) == ':')
+                        continue;
+#endif
+                    rc = makeDir(dir.constData(), logger);
+                    dir += OS_SEPARATOR;
+                }
+            }
+            if (rc && start[0] != '\0') {
+                dir.append(start);
+                rc = makeDir(dir.constData(), logger);
+            }
+        }
+    }
+    return rc;
 }
 
 /**
@@ -440,19 +475,40 @@ QByteArray ReFileUtils::nodeOf(const char* filename) {
  *                                     trailing separator
  */
 QString ReFileUtils::parentOf(const QString& filename) {
-       QString rc;
+    QString rc;
+
+    int ix = filename.size() - 1;
+    while (ix >= 0) {
+        if (filename[ix] == '/' || filename[ix] == '\\') {
+            rc = filename.mid(0, ix + 1);
+            break;
+        }
+        ix--;
+    }
+    return rc;
+}
 
-       int ix = filename.size() - 1;
-       while (ix >= 0) {
-               if (filename[ix] == '/' || filename[ix] == '\\') {
-                       rc = filename.mid(ix + 1);
-                       break;
-               }
-               ix--;
-       }
-       if (ix >= 0)
-               rc = filename.mid(0, ix + 1);
-       return rc;
+/**
+ * Extracts the path of a full filename.
+ *
+ * @param filename  the filename (with or without path)
+ * @return          "": no path available<br>
+ *                                     "/": filename = "/"<br>
+ *                                     otherwise: the path of <code>filename</code> including
+ *                                     trailing separator
+ */
+QByteArray ReFileUtils::parentOf(const char* filename) {
+    QByteArray rc;
+
+    int ix = strlen(filename) - 1;
+    while (ix >= 0) {
+        if (filename[ix] == '/' || filename[ix] == '\\') {
+            rc.append(filename, ix + 1);
+            break;
+        }
+        ix--;
+    }
+    return rc;
 }
 
 /**
@@ -652,8 +708,17 @@ bool ReFileUtils::setTimes(const char* filename, const QDateTime& modified,
                        "cannot change times (%d): $s", errno, filename);
                rc = false;
        }
-#elif defined __WIN32__
-#error "not implemented"
+#else
+    // ANSII-C:
+    struct utimbuf times;
+    times.actime = time_t(accessed.currentMSecsSinceEpoch() / 1000);
+    times.modtime = time_t(modified.currentMSecsSinceEpoch() / 1000);
+    int rc2 = utime(filename, &times);
+    if (rc2 != 0 && logger != NULL){
+        logger->logv(LOG_ERROR, LOC_SET_TIMES_1,
+            "cannot change times (%d): $s", errno, filename);
+        rc = false;
+    }
 #endif
        return rc;
 }
@@ -671,8 +736,8 @@ int ReFileUtils::seek(FILE* file, int64_t offset, int whence) {
        int rc;
 #if defined __linux__
        rc = fseeko(file, offset, whence);
-#elif defined __WIN32__
-       rc = _fseek64(file, offset, whence);
+#elif defined _WIN32
+    rc = _fseeki64(file, offset, whence);
 #endif
        return rc;
 }
@@ -688,8 +753,8 @@ int64_t ReFileUtils::tell(FILE* file) {
        int64_t rc;
 #if defined __linux__
        rc = ftello(file);
-#elif defined __WIN32__
-       rc = _ftell64(file);
+#elif defined _WIN32
+    rc = _ftelli64(file);
 #endif
        return rc;
 }
@@ -710,7 +775,7 @@ QByteArray ReFileUtils::tempDir(const char* node, const char* parent,
        QByteArray temp("/tmp");
        static const char* firstVar = "TMP";
        static const char* secondVar = "TEMP";
-#elif defined WIN32
+#elif defined _WIN32
        QByteArray temp("c:\\temp");
        static const char* firstVar = "TEMP";
        static const char* secondVar = "TMP";
@@ -721,7 +786,7 @@ QByteArray ReFileUtils::tempDir(const char* node, const char* parent,
                temp = ptr;
        else if ((ptr = getenv(secondVar)) != NULL)
                temp = ptr;
-#if defined WIN32
+#if defined _WIN32
        temp.replace('\\', '/');
 #endif
        if (temp.at(temp.length() - 1) != '/')
index 5ba8f07b35c528cc6de1651a14ad5c6dee67b8ae..db12853c30d7994c03e00209093732a1b922a975 100644 (file)
@@ -34,6 +34,7 @@ public:
        static QString cleanPath(const QString& path);
        static QString extensionOf(const QString& filename);
        static QByteArray extensionOf(const char* filename);
+       static QStringList findRootDirs();
        static bool isAbsolutPath(const QString& path);
        static bool isAbsolutPath(const char* path);
        static bool isDirectory(const QString& path, bool* isFile = NULL);
@@ -71,6 +72,7 @@ public:
        static QString nodeOf(const QString& filename);
        static QByteArray nodeOf(const char* filename);
        static QString parentOf(const QString& filename);
+       static QByteArray parentOf(const char* filename);
        static QString pathAppend(const QString& base, const QString& path);
        static QByteArray pathAppend(const char* base, const char* path);
        static QByteArray& readFromFile(const char* filename, QByteArray& buffer);
index 350f7c24c2a0ce1cd88294de2f2384904cf3c587..b5fcf726ffb5236359dafd0d18e4a3785ce8ab43 100644 (file)
@@ -517,18 +517,18 @@ QString ReQStringUtils::readableDuration(qint64 duration){
                rc = QString::number(duration2, 'f', 3) + " sec";
        } else if (duration2 < 3600.0){
                int duration3 = int(duration2);
-               snprintf(buffer, sizeof buffer, "%d:%02d",
+        _snprintf(buffer, sizeof buffer, "%d:%02d",
                                 duration3 / 60, duration3 % 60);
                rc = buffer;
        } else if (duration2 < 3600.0 * 24){
                int duration3 = int(duration2);
-               snprintf(buffer, sizeof buffer, "%d:%02d:%02d",
+        _snprintf(buffer, sizeof buffer, "%d:%02d:%02d",
                                 duration3 / 3600, duration3 % 3600 / 60,
                                 duration3 % 60);
                rc = buffer;
        } else {
                int duration3 = int(duration2);
-               snprintf(buffer, sizeof buffer, "%d:%02d:%02d:%02d",
+        _snprintf(buffer, sizeof buffer, "%d:%02d:%02d:%02d",
                                 int(duration3 / (3600*24)),
                                 int(duration3 % (3600*24) / 3600), int(duration3 % 3600 / 60),
                                 int(duration3 % 60));
index e2dd05e77cd367ba1edd5496790ffcf63ad7d36c..92ce55f36ec75a462cc3454be1e4abff5ca412af 100644 (file)
@@ -393,7 +393,27 @@ ReRandomizer::seed_t ReRandomizer::nearTrueRandom() {
                rc ^= buffer;
        close(fh);
 #endif
-       return rc;
+    return rc;
+}
+
+/**
+ * Returns a unique identifier.
+ *
+ * @param readable  <code>true</code>: the string is divided with '-' (every 4 chars)
+ * @return a BASE64 encoded near true random value (96 bit)
+ */
+QByteArray ReRandomizer::buildUUID(bool readable)
+{
+    QByteArray uuid;
+    uint8_t buffer[2 * sizeof(seed_t)];
+    reinterpret_cast<seed_t*>(buffer)[0] = nearTrueRandom();
+    reinterpret_cast<seed_t*>(buffer)[1] = nearTrueRandom();
+    ReStringUtils::base64Encode(buffer, 12, uuid);
+    if (readable){
+        for (int ix = 12; ix > 0; ix -= 4)
+            uuid.insert(ix, '-');
+    }
+    return uuid;
 }
 
 /**
@@ -1059,7 +1079,7 @@ void ReKISSRandomizer::saveSeed(QByteArray& seed) const {
  */
 QByteArray ReKISSRandomizer::state() const{
        char buffer[512];
-       snprintf(buffer, sizeof buffer,
+    _snprintf(buffer, sizeof buffer,
                         "%2d: f: %016llx i: %016llx: c: %016llx x: %016llx y: %016llx z: %016llx",
                m_counter,
                (long long) m_factor, (long long) m_increment,
index 7fd1f54a4197816fb00f2e198036e10bdab39102..21cbdc6e250e2ddc77296f36867dec8c08f17d58 100644 (file)
@@ -156,6 +156,7 @@ public:
        static void hash(const QByteArray& text, QByteArray& seed);
        static seed_t pseudoTrueRandom();
        static seed_t nearTrueRandom();
+       static QByteArray buildUUID(bool readable = true);
 protected:
        QByteArray m_name;
        int m_counter;
index efb9cf1a7ff3a9490f4fa2527191b8a16d619836..9e2c8ea6df0931fabeed897d55f18826d725f341 100644 (file)
 const char ReStringUtils::AUTO_SEPARATOR = '\0';
 
 const QByteArray ReStringUtils::m_empty;
+static const char* m_base64Chars =
+             "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+
+/**
+ * Transforms a BASE64 string into a byte array.
+ *
+ * @param input         the string to decode
+ * @param inputLength   the length of the string to decode. If -1 strlen() will be taken
+ * @param output        OUT: the decoded bytes
+ * @return              <code>output</code> (for chaining)
+ */
+QByteArray& ReStringUtils::base64Decode(const char* input, int inputLength, QByteArray& output) {
+    static uint8_t decoder[256] = {0};
+    if (decoder['A'] == 0){
+        for (int ix = strlen(m_base64Chars) - 1; ix >= 0; ix--)
+            decoder[m_base64Chars[ix]] = ix;
+    }
+    int fillBytes = 0;
+    while(inputLength > 0 && input[inputLength - 1] == '='){
+        fillBytes++;
+        inputLength--;
+    }
+    output.resize((inputLength + 3) * 3 / 4);
+    uint8_t* outCursor = reinterpret_cast<uint8_t*>(output.data());
+    while(inputLength > 4){
+        *outCursor++ = decoder[(input[0] << 2) + ((input[1] & 0x30) >> 4)];
+        *outCursor++ = decoder[((input[1] & 0xf) << 4) + ((input[2] & 0x3c) >> 2)];
+        *outCursor++ = decoder[((input[2] & 0x3) << 6) + input[3]];
+        inputLength -= 4;
+        input += 4;
+    }
+  return output;
+}
+
+/**
+ * Transforms a byte array into a BASE64 string.
+ *
+ * @param input         the byte array to encode
+ * @param inputLength   the length of the byte array to encode
+ * @param output        OUT: the encoded string
+ * @return              <code>output</code> (for chaining)
+ */
+QByteArray& ReStringUtils::base64Encode(uint8_t const* input, size_t inputLength, QByteArray& output) {
+  output.resize(4 * ((inputLength + 2 - ((inputLength + 2) % 3)) / 3));
+  uint8_t* outCursor = reinterpret_cast<uint8_t*>(output.data());
+  while (inputLength-- > 3) {
+      *outCursor++ = m_base64Chars[(input[0] & 0xfc) >> 2];
+      *outCursor++ = m_base64Chars[((input[0] & 0x03) << 4) + ((input[1] & 0xf0) >> 4)];
+      *outCursor++ = m_base64Chars[((input[1] & 0x0f) << 2) + ((input[2] & 0xc0) >> 6)];
+      *outCursor++ = m_base64Chars[input[2] & 0x3f];
+      input += 3;
+      inputLength -= 3;
+    }
+  if (inputLength > 0){
+    uint8_t buffer[3];
+    memset(buffer, 0, sizeof buffer);
+    memcpy(buffer, input, 3 - inputLength);
+    *outCursor++ = m_base64Chars[(input[0] & 0xfc) >> 2];
+    *outCursor++ = m_base64Chars[((input[0] & 0x03) << 4) + ((input[1] & 0xf0) >> 4)];
+    *outCursor++ = m_base64Chars[((input[1] & 0x0f) << 2) + ((input[2] & 0xc0) >> 6)];
+    *outCursor++ = m_base64Chars[input[2] & 0x3f];
+    for (int ii = inputLength; ii <= 3; ii++)
+        *outCursor++ = '=';
+  }
+  return output;
+}
 
 /**
  * Removes a given character from the end of the string if it is there.
@@ -114,6 +181,7 @@ const QByteArray& ReStringUtils::cutString(const QByteArray& source,
 }
 static char s_fileSeparator = 0;
 
+
 /**
  * @brief Returns the os specific file path separator.
  * @return the file path separator, e.g. "/" for linux
index b443eab8c5764a5a8e28b05a49d9ae1c3c4df97b..c83eb693257a8e22dcba5cc929ed654679e5a66f 100644 (file)
@@ -8,8 +8,8 @@
  * More info: http://unlicense.org
  * The latest sources: https://github.com/republib
  */
-#ifndef RPLSTRING_HPP
-#define RPLSTRING_HPP
+#ifndef RESTRING_HPP
+#define RESTRING_HPP
 
 #ifdef __linux__
 #define strnicmp(trg, src, len) strncasecmp(trg, src, len)
@@ -44,6 +44,8 @@ protected:
 
 class ReStringUtils {
 public:
+       static QByteArray& base64Decode(const char *input, int inputLength, QByteArray& output);
+       static QByteArray& base64Encode(const uint8_t *input, size_t inputLength, QByteArray& output);
        static QByteArray& chomp(QByteArray &string, char cc = '\n');
        static int countChar(const char* line, char cc);
        static int count(const char* source, const char* item);
@@ -90,4 +92,4 @@ public:
        static const char AUTO_SEPARATOR;
 };
 
-#endif // RPLSTRING_HPP
+#endif // RESTRING_HPP
index 1b5dbb4f5746d125fae4fd0ed35563e08934b1cd..335b634142092037b238d025d21f3510a500fc6a 100644 (file)
@@ -462,9 +462,9 @@ void ReTest::assertLogContainsLocation(int location, const char* file, int lineN
 void ReTest::ensureNotExist(const char* fullname)
 {
        if (exists(fullname))
-               unlink(fullname);
+        _unlink(fullname);
        if (exists(fullname) && exists(fullname, true))
-               rmdir(fullname);
+        _rmdir(fullname);
        if (exists(fullname))
                error("cannot delete (%d): %s", errno, fullname);
 }
@@ -528,14 +528,14 @@ QByteArray ReTest::getTempDir(const char* node, const char* parent,
        if (parent != NULL) {
                temp += parent;
                if (stat(temp.constData(), &info) != 0)
-                       mkdir(temp.constData(), (-1));
+            _mkdir(temp.constData());
                temp += sep;
        }
        if (node != NULL) {
                temp += node;
                temp += sep;
                if (stat(temp.data(), &info) != 0)
-                       mkdir(temp.data(), -1);
+            _mkdir(temp.data());
        }
        if (!withSeparator)
                temp.resize(temp.length() - 1);
@@ -559,7 +559,7 @@ QByteArray ReTest::getTempFile(const char* node, const char* parent,
        rc += node;
        struct stat info;
        if (deleteIfExists && stat(rc.constData(), &info) == 0)
-               unlink(rc.constData());
+        _unlink(rc.constData());
        return rc;
 }
 /**
index a80380e07ee0842e975b33c4eeba040803e6d615..e661449aad654962ce3f2d6dbf744c354b48abd1 100644 (file)
 #include <unistd.h>
 #include <sys/time.h>
 #include <fcntl.h>
-#else
+#elif defined _WIN32
 #include <io.h>
 #include <direct.h>
+#include <sys/utime.h>
 #endif
+
 #include <QThread>
 #include <QIODevice>
 #include <QTextStream>
@@ -61,7 +63,10 @@ typedef quint32 uint32_t;
 typedef qreal real_t;
 typedef QString ReString;
 #define RE_UNUSED(x) (void)(x)
-
+#ifdef _WIN32
+typedef quint64 uint64_t;
+typedef short int int16_t;
+#endif
 #ifdef __linux__
 #define _strcasecmp strcasecmp
 #define OS_SEPARATOR '/'
@@ -74,6 +79,7 @@ typedef QString ReString;
 #define _unlink unlink
 //typedef qint64 uint64_t;
 #else
+#define S_ISDIR(mode) (((mode) & _S_IFDIR) != 0)
 #define _strcasecmp _stricmp
 #define OS_SEPARATOR '\\'
 #define OS_SEPARATOR_STR "\\"
index 870ae661712f346e7a84eeb89ff4c8acec6d30e6..e292f272e6ff4718d60436881d58fa4410df8d87 100644 (file)
@@ -197,15 +197,19 @@ protected:
 #endif
                checkEqu(owner, p1.m_user);
                checkEqu(group, p1.m_group);
+#ifdef __linux__
                checkEqu( S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH, p1.m_fileMode);
                checkEqu(S_IWUSR | S_IRUSR | S_IXUSR | S_IWGRP | S_IRGRP
                                 | S_IXGRP | S_IROTH | S_IXOTH | __S_IFDIR, p1.m_dirMode);
+#endif
                ReOSPermissions p2(p1);
                checkEqu(owner, p2.m_user);
                checkEqu(group, p2.m_group);
-               checkEqu( S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH, p2.m_fileMode);
+#ifdef __linux__
+        checkEqu( S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH, p2.m_fileMode);
                checkEqu(S_IWUSR | S_IRUSR | S_IXUSR | S_IWGRP | S_IRGRP
                                 | S_IXGRP | S_IROTH | S_IXOTH | __S_IFDIR, p2.m_dirMode);
+#endif
                p2.m_user = 0x4711;
                p2.m_group = 0x1147;
                p2.m_dirMode = 123;
index 8db20b295d35ed7a258ccedcb215864132bcd408..af4f614c7fe2f5492c9584d54a5341f96bb407f1 100644 (file)
@@ -45,7 +45,7 @@ public:
                        ReFileUtils::tempDirEmpty("subdir2", "cuReFileUtils", true));
                QByteArray subdir(dir);
                subdir.append("subdirX");
-               mkdir(subdir.constData(), ALLPERMS);
+        _mkdir(subdir.constData());
                struct stat info;
                checkEqu(0, stat(subdir.constData(), &info));
                ReFileUtils::tempDirEmpty("subdir2", "cuReFileUtils", true);
@@ -65,13 +65,13 @@ public:
                QByteArray base = ReFileUtils::tempDir("ReFileUtils");
                for (char cc = 'a'; cc < 'f'; cc++) {
                        QByteArray subdir(base + cc);
-                       mkdir(subdir.constData(), ALLPERMS);
+            _mkdir(subdir.constData());
                        for (char cc2 = '1'; cc2 < '5'; cc2++) {
                                QByteArray name(subdir);
                                name.append(OS_SEPARATOR_STR).append(&cc2, 1);
                                ReFileUtils::writeToFile(name, name);
                                name += "dir";
-                               mkdir(name.constData(), ALLPERMS);
+                _mkdir(name.constData());
                                name.append(OS_SEPARATOR_STR).append("x.txt");
                                ReFileUtils::writeToFile(name, name);
                        }
@@ -87,7 +87,7 @@ public:
                // the dir must exist:
                checkEqu(0, stat(base, &info));
                // rmdir() works only if the dir is empty:
-               checkEqu(0, rmdir(base));
+        checkEqu(0, _rmdir(base));
                buildTree();
                checkT(ReFileUtils::deleteTree(QString(base), false, &m_logger));
                checkEqu(0, stat(base, &info));
index a71774bc8ea52666599bef630b265fc3e1cf0e68..2dfc65d51f502e8061a6a728ac5f2316164155fa 100644 (file)
@@ -28,6 +28,13 @@ private:
                QByteArray id = ReProcess::executeAndRead(QString("/usr/bin/id"), args);
                checkF(id.isEmpty());
 
+#elif defined _WIN32
+        QStringList args;
+        args.append("/c");
+        args.append("dir");
+        args.append("c:\\");
+        QByteArray id = ReProcess::executeAndRead(QString("cmd"), args);
+        checkF(id.isEmpty());
 #else
 #error "missing test"
 #endif
index efa918a2198bf3e8cae044bf7f3c36908b21af91..bbe07345007573d6a6325c0bab2c6efa4b03a0a8 100644 (file)
@@ -79,7 +79,7 @@ QString ReGuiApplication::fileOfHome(const QString& node)
 QString ReGuiApplication::buildHomeDir(QString homeDirBase, const QString& node){
        QString homeDir;
        if (homeDirBase.isEmpty()){
-                         homeDir = QDir::home().absoluteFilePath(node);
+        homeDir = ReFileUtils::nativePath(QDir::home().absoluteFilePath(node));
        } else if (ReFileUtils::isRootDir(homeDirBase.toLatin1().constData())){
                homeDir = homeDirBase + node;
        }
index a99bf01aeb0d78b6ba89532c9fba6a228b6a86ba..a3ac04b921a9813eb2b0347aae2df8be0eba3795 100644 (file)
@@ -45,6 +45,9 @@ ReFileSystem::ReFileSystem(const QString& name, ReLogger* logger) :
 #ifdef __linux__
                m_uid(geteuid()),
                m_gid(getegid()),
+#else
+        m_uid(0),
+        m_gid(0),
 #endif
                m_writeable(false),
                m_logger(logger),
index 58e8795f27fc32edca03d74d2493785660dbc8dc..3ee73793c73aba507b5f50244017a09917119d1b 100644 (file)
@@ -225,10 +225,8 @@ public:
        static ReFileSystem* buildFromUrl(const QString& url);
 protected:
        QString m_name;
-#ifdef __linux__
        int m_uid;
        int m_gid;
-#endif
        // ending with OS_SEPARATOR:
        QString m_directory;
        // All links are replaced by its targets:
index e9b302d21f8491577046cfc53928967fdc9a237b..a0baffcd5f01fc1cd5db429aa760bcf165c78a27 100644 (file)
@@ -19,7 +19,7 @@
 #include <dirent.h>
 #include <grp.h>
 #include <pwd.h>
-#elif defined __WIN32__
+#elif defined _WIN32
 #include <tchar.h>
 #include "windows.h"
 #include <winnt.h>
 #if defined __linux__
 typedef struct timespec ReFileTime_t;
 typedef __off_t ReFileSize_t;
-#elif defined __WIN32__
+#elif defined _WIN32
 typedef FILETIME ReFileTime_t;
 typedef int64_t ReFileSize_t;
+typedef unsigned short mode_t;
 #endif
 /** Returns whether a time is greater (younger) than another.
  * @param time1                first operand