Filesystem Utilities: Add Checksum calculation methods.
authorKlaas Freitag <freitag@owncloud.com>
Tue, 12 May 2015 13:48:13 +0000 (15:48 +0200)
committerKlaas Freitag <freitag@owncloud.com>
Tue, 19 May 2015 15:09:39 +0000 (17:09 +0200)
CMakeLists.txt
config.h.in
src/libsync/CMakeLists.txt
src/libsync/filesystem.cpp
src/libsync/filesystem.h

index 2ff58de7352c50e7269642a976c2c903c5b8f61e..da6d004e89449dc1eb6260717b0798e61597b6b1 100644 (file)
@@ -165,13 +165,13 @@ endif()
 find_package(Sphinx)
 find_package(PdfLatex)
 
-
 find_package(SQLite3 3.8.0 REQUIRED)
 # On some OS, we want to use our own, not the system sqlite
 if (USE_OUR_OWN_SQLITE3)
     include_directories(BEFORE ${SQLITE3_INCLUDE_DIR})
 endif()
 
+find_package(ZLIB)
 
 configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
 
index 48e9d88520bbd142bf21b81469baef25fc6431c3..601dc6be3cb8bc16fbd63b9363b613e51d65d7d6 100644 (file)
@@ -19,6 +19,8 @@
 #cmakedefine APPLICATION_EXECUTABLE "@APPLICATION_EXECUTABLE@"
 #cmakedefine APPLICATION_UPDATE_URL "@APPLICATION_UPDATE_URL@"
 
+#cmakedefine ZLIB_FOUND @ZLIB_FOUND@
+
 #cmakedefine SYSCONFDIR "@SYSCONFDIR@"
 #cmakedefine DATADIR "@DATADIR@"
 
index cb9490b719a0cbfc6af439cfa755632b5e34d63f..aaa1d93ca726f37f536c40319438292b4993a6a1 100644 (file)
@@ -141,6 +141,11 @@ if(NEON_FOUND)
     endif()
 endif()
 
+if(ZLIB_FOUND)
+    list(APPEND libsync_LINK_TARGETS ${ZLIB_LIBRARIES})
+    include_directories(${ZLIB_INCLUDE_DIRS})
+endif(ZLIB_FOUND)
+
 add_library(${synclib_NAME} SHARED ${libsync_SRCS} ${syncMoc})
 GENERATE_EXPORT_HEADER( ${synclib_NAME}
        BASE_NAME ${synclib_NAME}
index 4191686d0a0e1db13cad4c1fd379ecd72c8ba75f..b80d4858cdeb67080af0c90eec8dd0996a70e7f6 100644 (file)
@@ -11,6 +11,7 @@
  * for more details.
  */
 
+#include "config.h"
 #include "filesystem.h"
 
 #include "utility.h"
 #include <QFileInfo>
 #include <QCoreApplication>
 #include <QDebug>
+#include <QCryptographicHash>
+#include <QFuture>
+#include <qtconcurrentrun.h>
+
+#ifdef ZLIB_FOUND
+#include <zlib.h>
+#endif
 
 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
 #include <qabstractfileengine.h>
@@ -394,4 +402,90 @@ QString FileSystem::fileSystemForPath(const QString & path)
 }
 #endif
 
+QByteArray FileSystem::calcMd5Worker( const QString& filename )
+{
+    QByteArray arr;
+
+    QCryptographicHash crypto( QCryptographicHash::Md5 );
+
+    QFile file(filename);
+    if (file.open(QIODevice::ReadOnly)) {
+        QByteArray data;
+        while (!file.atEnd()) {
+            data = file.read(1024*1024*10);
+            crypto.addData(data);
+        }
+        arr = crypto.result().toHex();
+    }
+    return arr;
+}
+
+QByteArray FileSystem::calcSha1Worker( const QString& filename )
+{
+    QByteArray arr;
+
+    QCryptographicHash crypto( QCryptographicHash::Sha1 );
+
+    QFile file(filename);
+    if (file.open(QIODevice::ReadOnly)) {
+        QByteArray data;
+        while (!file.atEnd()) {
+            data = file.read(1024*1024*10);
+            crypto.addData(data);
+        }
+        arr = crypto.result().toHex();
+    }
+    return arr;
+}
+
+#ifdef ZLIB_FOUND
+QByteArray FileSystem::calcAdler32Worker( const QString& filename )
+{
+  unsigned int adler = adler32(0L, Z_NULL, 0);
+
+  QFile file(filename);
+  if (file.open(QIODevice::ReadOnly)) {
+    QByteArray data;
+    while (!file.atEnd()) {
+      data = file.read(1024*1024*10);
+      adler = adler32(adler, (const Bytef*) data.data(), data.size());
+    }
+  }
+
+  return QString::number( adler, 16 ).toUtf8();
+}
+#endif
+
+QByteArray FileSystem::calcMd5( const QString& fileName )
+{
+    QFuture<QByteArray> f1 = QtConcurrent::run(calcMd5Worker, fileName );
+    f1.waitForFinished();
+
+    const QByteArray md5 = f1.result();
+
+    return md5;
+}
+
+QByteArray FileSystem::calcSha1( const QString& fileName )
+{
+    QFuture<QByteArray> f1 = QtConcurrent::run(calcSha1Worker, fileName );
+    f1.waitForFinished();
+
+    const QByteArray sha1 = f1.result();
+
+    return sha1;
+}
+
+#ifdef ZLIB_FOUND
+QByteArray FileSystem::calcAdler32( const QString& fileName )
+{
+    QFuture<QByteArray> f1 = QtConcurrent::run(calcAdler32Worker, fileName );
+    f1.waitForFinished();
+
+    const QByteArray checksum = f1.result();
+
+    return checksum;
+}
+#endif
+
 } // namespace OCC
index ac51e639592f2d9ffad5db89932e9edcc330850a..a2a1450d9604b8c76ae533cc8836622f3fb0c50e 100644 (file)
@@ -121,4 +121,18 @@ bool openAndSeekFileSharedRead(QFile* file, QString* error, qint64 seek);
 QString fileSystemForPath(const QString & path);
 #endif
 
+/**
+ * Calculate the checksum of a file in a worker thread. Each function waits
+ * until the calculation is finished.
+ */
+QByteArray calcMd5( const QString& fileName );
+QByteArray calcSha1( const QString& fileName );
+QByteArray calcAdler32( const QString& fileName );
+
+#ifdef ZLIB_FOUND
+QByteArray calcAdler32Worker( const QString& filename );
+#endif
+QByteArray calcSha1Worker( const QString& filename );
+QByteArray calcMd5Worker( const QString& filename );
+
 }}