From ef03396072e3959e7d03f55d91c2ffa1faa51d8d Mon Sep 17 00:00:00 2001 From: Sune Vuorela Date: Tue, 20 Dec 2011 19:46:28 +0100 Subject: [PATCH] QCryptographicHash: allow to hash the content of a QIODevice This adds a new function (and tests) to give the possibility of doing a QCryptographicHash of a QIODevice, like a QFile or whatever people needs. It is a quite handy overload in many cases. Change-Id: I22fd272f05571844641b3daefcc6746be4e5c7c3 Reviewed-by: Thiago Macieira --- src/corelib/tools/qcryptographichash.cpp | 23 +++++++++++++ src/corelib/tools/qcryptographichash.h | 2 ++ .../data/2c1517dad3678f03917f15849b052fd5.md5 | Bin 0 -> 8375 bytes .../data/d41d8cd98f00b204e9800998ecf8427e.md5 | 0 .../qcryptographichash/qcryptographichash.pro | 12 +++++++ .../tst_qcryptographichash.cpp | 32 ++++++++++++++++++ 6 files changed, 69 insertions(+) create mode 100644 tests/auto/corelib/tools/qcryptographichash/data/2c1517dad3678f03917f15849b052fd5.md5 create mode 100644 tests/auto/corelib/tools/qcryptographichash/data/d41d8cd98f00b204e9800998ecf8427e.md5 diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp index 89b3bab7c6e..e5ac73c3f57 100644 --- a/src/corelib/tools/qcryptographichash.cpp +++ b/src/corelib/tools/qcryptographichash.cpp @@ -50,6 +50,7 @@ #include "../../3rdparty/md4/md4.h" #include "../../3rdparty/md4/md4.cpp" #include "../../3rdparty/sha1/sha1.cpp" +#include QT_BEGIN_NAMESPACE @@ -154,6 +155,28 @@ void QCryptographicHash::addData(const QByteArray &data) addData(data.constData(), data.length()); } +/*! + Reads the data from the open QIODevice \a device until it ends + and hashes it. Returns true if reading was successful. + */ +bool QCryptographicHash::addData(QIODevice* device) +{ + if (!device->isReadable()) + return false; + + if (!device->isOpen()) + return false; + + char buffer[1024]; + int length; + + while ((length = device->read(buffer,sizeof(buffer))) > 0) + addData(buffer,length); + + return device->atEnd(); +} + + /*! Returns the final hash value. diff --git a/src/corelib/tools/qcryptographichash.h b/src/corelib/tools/qcryptographichash.h index b40e8cc25ba..15ebd224185 100644 --- a/src/corelib/tools/qcryptographichash.h +++ b/src/corelib/tools/qcryptographichash.h @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Core) class QCryptographicHashPrivate; +class QIODevice; class Q_CORE_EXPORT QCryptographicHash { @@ -68,6 +69,7 @@ public: void addData(const char *data, int length); void addData(const QByteArray &data); + bool addData(QIODevice* device); QByteArray result() const; diff --git a/tests/auto/corelib/tools/qcryptographichash/data/2c1517dad3678f03917f15849b052fd5.md5 b/tests/auto/corelib/tools/qcryptographichash/data/2c1517dad3678f03917f15849b052fd5.md5 new file mode 100644 index 0000000000000000000000000000000000000000..dd5c63cce173668c3187374bfb4c3257036a2654 GIT binary patch literal 8375 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 literal 0 HcmV?d00001 diff --git a/tests/auto/corelib/tools/qcryptographichash/data/d41d8cd98f00b204e9800998ecf8427e.md5 b/tests/auto/corelib/tools/qcryptographichash/data/d41d8cd98f00b204e9800998ecf8427e.md5 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro index 39987bac35a..fddd67fbd68 100644 --- a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro +++ b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro @@ -2,3 +2,15 @@ CONFIG += testcase parallel_test TARGET = tst_qcryptographichash QT = core testlib SOURCES = tst_qcryptographichash.cpp + + +wince* { + addFiles.files = data/* + addFiles.path = data/ + DEPLOYMENT += addFiles + + DEFINES += SRCDIR=\\\".\\\" +} +else { + DEFINES += SRCDIR=\\\"$$PWD/\\\" +} \ No newline at end of file diff --git a/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp b/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp index b8592e18502..8ca13ff244d 100644 --- a/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp +++ b/tests/auto/corelib/tools/qcryptographichash/tst_qcryptographichash.cpp @@ -51,6 +51,8 @@ private slots: void intermediary_result_data(); void intermediary_result(); void sha1(); + void files_data(); + void files(); }; #include @@ -150,5 +152,35 @@ void tst_QCryptographicHash::sha1() } +Q_DECLARE_METATYPE(QCryptographicHash::Algorithm); + +void tst_QCryptographicHash::files_data() { + QTest::addColumn("filename"); + QTest::addColumn("algorithm"); + QTest::addColumn("md5sum"); + QTest::newRow("Line") << QString::fromAscii("data/2c1517dad3678f03917f15849b052fd5.md5") << QCryptographicHash::Md5 << QByteArray("2c1517dad3678f03917f15849b052fd5"); + QTest::newRow("Line") << QString::fromAscii("data/d41d8cd98f00b204e9800998ecf8427e.md5") << QCryptographicHash::Md5 << QByteArray("d41d8cd98f00b204e9800998ecf8427e"); +} + + +void tst_QCryptographicHash::files() +{ + QFETCH(QString, filename); + QFETCH(QCryptographicHash::Algorithm, algorithm); + QFETCH(QByteArray, md5sum); + { + QFile f(QString::fromLocal8Bit(SRCDIR) + filename); + QCryptographicHash hash(algorithm); + QVERIFY(! hash.addData(&f)); // file is not open for reading; + if (f.open(QIODevice::ReadOnly)) { + QVERIFY(hash.addData(&f)); + QCOMPARE(hash.result().toHex(),md5sum); + } else { + QFAIL("Failed to open file for testing. should not happen"); + } + } +} + + QTEST_MAIN(tst_QCryptographicHash) #include "tst_qcryptographichash.moc"