Просмотр исходного кода

Filesystem Utilities: Add Checksum calculation methods.

Klaas Freitag 10 лет назад
Родитель
Сommit
67d38bc87b
5 измененных файлов с 116 добавлено и 1 удалено
  1. 1 1
      CMakeLists.txt
  2. 2 0
      config.h.in
  3. 5 0
      src/libsync/CMakeLists.txt
  4. 94 0
      src/libsync/filesystem.cpp
  5. 14 0
      src/libsync/filesystem.h

+ 1 - 1
CMakeLists.txt

@@ -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)
 

+ 2 - 0
config.h.in

@@ -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@"
 

+ 5 - 0
src/libsync/CMakeLists.txt

@@ -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}

+ 94 - 0
src/libsync/filesystem.cpp

@@ -11,6 +11,7 @@
  * for more details.
  */
 
+#include "config.h"
 #include "filesystem.h"
 
 #include "utility.h"
@@ -18,6 +19,13 @@
 #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

+ 14 - 0
src/libsync/filesystem.h

@@ -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 );
+
 }}