diff options
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" |