From 5650ef40b3628956550d16f83e63cd9ce882b032 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Sat, 6 Aug 2016 20:38:59 +0200 Subject: Add passwordChanged() signal to QPdfDocument The passwordChanged() signal is emitted whenever the password on the document is changed. Change-Id: I8c35274dba7160b81555eac5bbda37d47cb8c9b7 Reviewed-by: Simon Hausmann --- src/pdf/qpdfdocument.cpp | 13 ++++++++++++- src/pdf/qpdfdocument.h | 5 ++++- tests/auto/qpdfdocument/tst_qpdfdocument.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp index 6802089..119b74b 100644 --- a/src/pdf/qpdfdocument.cpp +++ b/src/pdf/qpdfdocument.cpp @@ -283,9 +283,15 @@ void QPdfDocument::load(QIODevice *device) void QPdfDocument::setPassword(const QString &password) { + const QByteArray newPassword = password.toUtf8(); + + if (d->password == newPassword) + return; + const QMutexLocker lock(pdfMutex()); - d->password = password.toUtf8(); + d->password = newPassword; + emit passwordChanged(); if (!d->doc && d->avail) d->tryLoadDocument(); @@ -322,6 +328,11 @@ void QPdfDocument::close() const QMutexLocker lock(pdfMutex()); d->clear(); + + if (!d->password.isEmpty()) { + d->password.clear(); + emit passwordChanged(); + } } int QPdfDocument::pageCount() const diff --git a/src/pdf/qpdfdocument.h b/src/pdf/qpdfdocument.h index bb3602d..1f024b3 100644 --- a/src/pdf/qpdfdocument.h +++ b/src/pdf/qpdfdocument.h @@ -34,9 +34,11 @@ class QNetworkReply; class Q_PDF_EXPORT QPdfDocument : public QObject { Q_OBJECT + Q_PROPERTY(int pageCount READ pageCount NOTIFY pageCountChanged FINAL) - Q_PROPERTY(QString password READ password WRITE setPassword FINAL) + Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged FINAL) Q_PROPERTY(bool loading READ isLoading FINAL) + public: enum Error { @@ -70,6 +72,7 @@ public: QImage render(int page, const QSizeF &pageSize); Q_SIGNALS: + void passwordChanged(); void passwordRequired(); void documentLoadStarted(); void documentLoadFinished(); diff --git a/tests/auto/qpdfdocument/tst_qpdfdocument.cpp b/tests/auto/qpdfdocument/tst_qpdfdocument.cpp index ef00bdb..41b34ff 100644 --- a/tests/auto/qpdfdocument/tst_qpdfdocument.cpp +++ b/tests/auto/qpdfdocument/tst_qpdfdocument.cpp @@ -22,6 +22,7 @@ private slots: void close(); void loadAfterClose(); void closeOnDestroy(); + void passwordClearedOnClose(); }; struct TemporaryPdf: public QTemporaryFile @@ -101,11 +102,16 @@ void tst_QPdfDocument::loadAsync() void tst_QPdfDocument::password() { QPdfDocument doc; + QSignalSpy passwordChangedSpy(&doc, SIGNAL(passwordChanged())); + QCOMPARE(doc.pageCount(), 0); QCOMPARE(doc.load(QFINDTESTDATA("pdf-sample.protected.pdf")), QPdfDocument::IncorrectPasswordError); + QCOMPARE(passwordChangedSpy.count(), 0); doc.setPassword(QStringLiteral("WrongPassword")); + QCOMPARE(passwordChangedSpy.count(), 1); QCOMPARE(doc.load(QFINDTESTDATA("pdf-sample.protected.pdf")), QPdfDocument::IncorrectPasswordError); doc.setPassword(QStringLiteral("Qt")); + QCOMPARE(passwordChangedSpy.count(), 2); QCOMPARE(doc.load(QFINDTESTDATA("pdf-sample.protected.pdf")), QPdfDocument::NoError); QCOMPARE(doc.pageCount(), 1); } @@ -175,6 +181,27 @@ void tst_QPdfDocument::closeOnDestroy() } } +void tst_QPdfDocument::passwordClearedOnClose() +{ + TemporaryPdf tempPdf; + QPdfDocument doc; + + QSignalSpy passwordChangedSpy(&doc, SIGNAL(passwordChanged())); + + doc.setPassword(QStringLiteral("Qt")); + QCOMPARE(passwordChangedSpy.count(), 1); + QCOMPARE(doc.load(QFINDTESTDATA("pdf-sample.protected.pdf")), QPdfDocument::NoError); + passwordChangedSpy.clear(); + + doc.close(); // password is cleared on close + QCOMPARE(passwordChangedSpy.count(), 1); + passwordChangedSpy.clear(); + + doc.load(&tempPdf); + doc.close(); // signal is not emitted if password didn't change + QCOMPARE(passwordChangedSpy.count(), 0); +} + QTEST_MAIN(tst_QPdfDocument) #include "tst_qpdfdocument.moc" -- cgit v1.2.3