diff options
author | Sune Vuorela <sune@vuorela.dk> | 2011-12-20 19:46:28 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-22 19:47:47 +0100 |
commit | ef03396072e3959e7d03f55d91c2ffa1faa51d8d (patch) | |
tree | df07f15b52e8e44f151c3b856c3b15c0bc8587bb | |
parent | eff09a2794bcb4b5373fcee85faa498b36fac27c (diff) |
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 <thiago.macieira@intel.com>
6 files changed, 69 insertions, 0 deletions
diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp index 89b3bab7c6..e5ac73c3f5 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 <qiodevice.h> QT_BEGIN_NAMESPACE @@ -155,6 +156,28 @@ void QCryptographicHash::addData(const QByteArray &data) } /*! + 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. \sa QByteArray::toHex() diff --git a/src/corelib/tools/qcryptographichash.h b/src/corelib/tools/qcryptographichash.h index b40e8cc25b..15ebd22418 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 Binary files differnew file mode 100644 index 0000000000..dd5c63cce1 --- /dev/null +++ b/tests/auto/corelib/tools/qcryptographichash/data/2c1517dad3678f03917f15849b052fd5.md5 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 0000000000..e69de29bb2 --- /dev/null +++ b/tests/auto/corelib/tools/qcryptographichash/data/d41d8cd98f00b204e9800998ecf8427e.md5 diff --git a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro index 39987bac35..fddd67fbd6 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 b8592e1850..8ca13ff244 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 <QtCore> @@ -150,5 +152,35 @@ void tst_QCryptographicHash::sha1() } +Q_DECLARE_METATYPE(QCryptographicHash::Algorithm); + +void tst_QCryptographicHash::files_data() { + QTest::addColumn<QString>("filename"); + QTest::addColumn<QCryptographicHash::Algorithm>("algorithm"); + QTest::addColumn<QByteArray>("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" |