[Pkg-owncloud-commits] [qtkeychain] 04/35: Refactored code to simplify classes.

Sandro Knauß hefee-guest at moszumanska.debian.org
Tue May 24 17:39:58 UTC 2016


This is an automated email from the git hooks/post-receive script.

hefee-guest pushed a commit to branch master
in repository qtkeychain.

commit e6e828c33b09f84a954f9885d0b4efd706bcd439
Author: Armin Novak <armin.novak at thincast.com>
Date:   Fri Nov 27 14:37:41 2015 +0100

    Refactored code to simplify classes.
    
    Job classes:
    * Moved common members to parent.
    * Made Job constructor protected, only for use by implementing class.
    
    JobPrivate classes:
    * Moved common members to parent.
    * Made Job constructor protected, only for use by implementing class.
    * Unified members where code was duplicated.
---
 keychain.cpp      | 153 ++++++++++++++++++++++++----------------------
 keychain.h        |  45 ++++++--------
 keychain_mac.cpp  |  23 ++++---
 keychain_p.h      | 129 +++++++++++++++++++-------------------
 keychain_unix.cpp | 180 ++++++++++++++++++++++++------------------------------
 keychain_win.cpp  |  34 +++++------
 6 files changed, 270 insertions(+), 294 deletions(-)

diff --git a/keychain.cpp b/keychain.cpp
index 7687f9d..8e738d0 100644
--- a/keychain.cpp
+++ b/keychain.cpp
@@ -11,9 +11,9 @@
 
 using namespace QKeychain;
 
-Job::Job( const QString& service, QObject *parent )
+Job::Job( JobPrivate *q, QObject *parent )
     : QObject( parent )
-    , d ( new JobPrivate( service ) ) {
+    , d ( q ) {
 }
 
 Job::~Job() {
@@ -52,6 +52,10 @@ void Job::setInsecureFallback( bool insecureFallback ) {
     d->insecureFallback = insecureFallback;
 }
 
+void Job::doStart() {
+    JobExecutor::instance()->enqueue( this );
+}
+
 void Job::emitFinished() {
     emit finished( this );
     if ( d->autoDelete )
@@ -64,6 +68,10 @@ void Job::emitFinishedWithError( Error error, const QString& errorString ) {
     emitFinished();
 }
 
+void Job::scheduledStart() {
+    d->scheduledStart();
+}
+
 Error Job::error() const {
     return d->error;
 }
@@ -81,12 +89,11 @@ void Job::setErrorString( const QString& errorString ) {
 }
 
 ReadPasswordJob::ReadPasswordJob( const QString& service, QObject* parent )
-    : Job( service, parent )
-    , d( new ReadPasswordJobPrivate( this ) )
-{}
+    : Job( new ReadPasswordJobPrivate( service, this ), parent ) {
+
+}
 
 ReadPasswordJob::~ReadPasswordJob() {
-    delete d;
 }
 
 QString ReadPasswordJob::textData() const {
@@ -97,126 +104,80 @@ QByteArray ReadPasswordJob::binaryData() const {
     return d->data;
 }
 
-QString ReadPasswordJob::key() const {
+QString Job::key() const {
     return d->key;
 }
 
-void ReadPasswordJob::setKey( const QString& key ) {
-    d->key = key;
-}
-
-void ReadPasswordJob::doStart() {
-    JobExecutor::instance()->enqueue( this );
+void Job::setKey( const QString& key_ ) {
+    d->key = key_;
 }
 
 WritePasswordJob::WritePasswordJob( const QString& service, QObject* parent )
-    : Job( service, parent )
-    , d( new WritePasswordJobPrivate( this ) ) {
+    : Job( new WritePasswordJobPrivate( service, this ), parent ) {
 }
 
 WritePasswordJob::~WritePasswordJob() {
-    delete d;
-}
-
-QString WritePasswordJob::key() const {
-    return d->key;
-}
-
-void WritePasswordJob::setKey( const QString& key ) {
-    d->key = key;
 }
 
 void WritePasswordJob::setBinaryData( const QByteArray& data ) {
-    d->binaryData = data;
-    d->mode = WritePasswordJobPrivate::Binary;
+    d->data = data;
+    d->mode = JobPrivate::Binary;
 }
 
 void WritePasswordJob::setTextData( const QString& data ) {
-    d->textData = data;
-    d->mode = WritePasswordJobPrivate::Text;
-}
-
-void WritePasswordJob::doStart() {
-    JobExecutor::instance()->enqueue( this );
+    d->data = data.toUtf8();
+    d->mode = JobPrivate::Text;
 }
 
 DeletePasswordJob::DeletePasswordJob( const QString& service, QObject* parent )
-    : Job( service, parent )
-    , d( new DeletePasswordJobPrivate( this ) ) {
+    : Job( new DeletePasswordJobPrivate( service, this ), parent ) {
 }
 
 DeletePasswordJob::~DeletePasswordJob() {
-    delete d;
 }
 
-void DeletePasswordJob::doStart() {
-    //Internally, to delete a password we just execute a write job with no data set (null byte array).
-    //In all current implementations, this deletes the entry so this is sufficient
-    WritePasswordJob* job = new WritePasswordJob( service(), this );
-    connect( job, SIGNAL(finished(QKeychain::Job*)), d, SLOT(jobFinished(QKeychain::Job*)) );
-    job->setInsecureFallback(true);
-    job->setSettings(settings());
-    job->setKey( d->key );
-    job->doStart();
-}
+DeletePasswordJobPrivate::DeletePasswordJobPrivate(const QString &service_, DeletePasswordJob *qq) :
+    JobPrivate(service_, qq) {
 
-QString DeletePasswordJob::key() const {
-    return d->key;
-}
-
-void DeletePasswordJob::setKey( const QString& key ) {
-    d->key = key;
-}
-
-void DeletePasswordJobPrivate::jobFinished( Job* job ) {
-    q->setError( job->error() );
-    q->setErrorString( job->errorString() );
-    q->emitFinished();
 }
 
 JobExecutor::JobExecutor()
     : QObject( 0 )
-    , m_runningJob( 0 )
-{
+    , m_jobRunning( false ) {
 }
 
 void JobExecutor::enqueue( Job* job ) {
-    m_queue.append( job );
+    m_queue.enqueue( job );
     startNextIfNoneRunning();
 }
 
 void JobExecutor::startNextIfNoneRunning() {
-    if ( m_queue.isEmpty() || m_runningJob )
+    if ( m_queue.isEmpty() || m_jobRunning )
         return;
     QPointer<Job> next;
     while ( !next && !m_queue.isEmpty() ) {
-        next = m_queue.first();
-        m_queue.pop_front();
+        next = m_queue.dequeue();
     }
     if ( next ) {
         connect( next, SIGNAL(finished(QKeychain::Job*)), this, SLOT(jobFinished(QKeychain::Job*)) );
         connect( next, SIGNAL(destroyed(QObject*)), this, SLOT(jobDestroyed(QObject*)) );
-        m_runningJob = next;
-        if ( ReadPasswordJob* rpj = qobject_cast<ReadPasswordJob*>( m_runningJob ) )
-            rpj->d->scheduledStart();
-        else if ( WritePasswordJob* wpj = qobject_cast<WritePasswordJob*>( m_runningJob) )
-            wpj->d->scheduledStart();
+        m_jobRunning = true;
+        next->scheduledStart();
     }
 }
 
 void JobExecutor::jobDestroyed( QObject* object ) {
+    Job* job = static_cast<Job*>(object);
     Q_UNUSED( object ) // for release mode
-    Q_ASSERT( object == m_runningJob );
-    m_runningJob->disconnect( this );
-    m_runningJob = 0;
+    job->disconnect( this );
+    m_jobRunning = false;
     startNextIfNoneRunning();
 }
 
 void JobExecutor::jobFinished( Job* job ) {
     Q_UNUSED( job ) // for release mode
-    Q_ASSERT( job == m_runningJob );
-    m_runningJob->disconnect( this );
-    m_runningJob = 0;
+    job->disconnect( this );
+    m_jobRunning = false;
     startNextIfNoneRunning();
 }
 
@@ -227,3 +188,47 @@ JobExecutor* JobExecutor::instance() {
         s_instance = new JobExecutor;
     return s_instance;
 }
+
+ReadPasswordJobPrivate::ReadPasswordJobPrivate(const QString &service_, ReadPasswordJob *qq) :
+    JobPrivate(service_, qq) {
+
+}
+
+JobPrivate::JobPrivate(const QString &service_, Job *qq)
+    : error( NoError )
+    , service( service_ )
+    , autoDelete( true )
+    , insecureFallback( false )
+    , q(qq) {
+
+}
+
+QString JobPrivate::modeToString(Mode m)
+{
+    switch (m) {
+    case Text:
+        return QLatin1String("Text");
+    case Binary:
+        return QLatin1String("Binary");
+    }
+
+    Q_ASSERT_X(false, Q_FUNC_INFO, "Unhandled Mode value");
+    return QString();
+}
+
+JobPrivate::Mode JobPrivate::stringToMode(const QString& s)
+{
+    if (s == QLatin1String("Text") || s == QLatin1String("1"))
+        return Text;
+    if (s == QLatin1String("Binary") || s == QLatin1String("2"))
+        return Binary;
+
+    qCritical("Unexpected mode string '%s'", qPrintable(s));
+
+    return Text;
+}
+
+WritePasswordJobPrivate::WritePasswordJobPrivate(const QString &service_, WritePasswordJob *qq) :
+    JobPrivate(service_, qq) {
+
+}
diff --git a/keychain.h b/keychain.h
index 6ed5e95..31eb9fd 100644
--- a/keychain.h
+++ b/keychain.h
@@ -39,8 +39,7 @@ class JobPrivate;
 
 class QKEYCHAIN_EXPORT Job : public QObject {
     Q_OBJECT
-public:
-    explicit Job( const QString& service, QObject* parent=0 );
+public:    
     ~Job();
 
     QSettings* settings() const;
@@ -59,19 +58,32 @@ public:
     bool insecureFallback() const;
     void setInsecureFallback( bool insecureFallback );
 
+    QString key() const;
+    void setKey( const QString& key );
+
 Q_SIGNALS:
     void finished( QKeychain::Job* );
 
 protected:
-    Q_INVOKABLE virtual void doStart() = 0;
+    explicit Job( JobPrivate *q, QObject* parent=0 );
+    Q_INVOKABLE void doStart();
 
+private:
     void setError( Error error );
     void setErrorString( const QString& errorString );
     void emitFinished();
     void emitFinishedWithError(Error, const QString& errorString);
 
-private:
+    void scheduledStart();
+
+protected:
     JobPrivate* const d;
+
+friend class JobExecutor;
+friend class JobPrivate;
+friend class ReadPasswordJobPrivate;
+friend class WritePasswordJobPrivate;
+friend class DeletePasswordJobPrivate;
 };
 
 class ReadPasswordJobPrivate;
@@ -82,19 +94,11 @@ public:
     explicit ReadPasswordJob( const QString& service, QObject* parent=0 );
     ~ReadPasswordJob();
 
-    QString key() const;
-    void setKey( const QString& key );
-
     QByteArray binaryData() const;
     QString textData() const;
 
-protected:
-    void doStart();
-
 private:
     friend class QKeychain::ReadPasswordJobPrivate;
-    friend class QKeychain::JobExecutor;
-    ReadPasswordJobPrivate* const d;
 };
 
 class WritePasswordJobPrivate;
@@ -105,20 +109,12 @@ public:
     explicit WritePasswordJob( const QString& service, QObject* parent=0 );
     ~WritePasswordJob();
 
-    QString key() const;
-    void setKey( const QString& key );
-
     void setBinaryData( const QByteArray& data );
     void setTextData( const QString& data );
 
-protected:
-    void doStart();
-
 private:
-    friend class QKeychain::JobExecutor;
+
     friend class QKeychain::WritePasswordJobPrivate;
-    friend class DeletePasswordJob;
-    WritePasswordJobPrivate* const d;
 };
 
 class DeletePasswordJobPrivate;
@@ -129,15 +125,8 @@ public:
     explicit DeletePasswordJob( const QString& service, QObject* parent=0 );
     ~DeletePasswordJob();
 
-    QString key() const;
-    void setKey( const QString& key );
-
-protected:
-    void doStart();
-
 private:
     friend class QKeychain::DeletePasswordJobPrivate;
-    DeletePasswordJobPrivate* const d;
 };
 
 } // namespace QtKeychain
diff --git a/keychain_mac.cpp b/keychain_mac.cpp
index 8a058cf..9e04ee8 100644
--- a/keychain_mac.cpp
+++ b/keychain_mac.cpp
@@ -29,9 +29,9 @@ static QString strForStatus( OSStatus os ) {
     const char * const buf = CFStringGetCStringPtr( str.value,  kCFStringEncodingUTF8 );
     if ( !buf )
         return QObject::tr( "%1 (OSStatus %2)" )
-            .arg( "OSX Keychain Error" ).arg( os );
+                .arg( "OSX Keychain Error" ).arg( os );
     return QObject::tr( "%1 (OSStatus %2)" )
-        .arg( QString::fromUtf8( buf, strlen( buf ) ) ).arg( os );
+            .arg( QString::fromUtf8( buf, strlen( buf ) ) ).arg( os );
 }
 
 static OSStatus readPw( QByteArray* pw,
@@ -148,14 +148,17 @@ void WritePasswordJobPrivate::scheduledStart()
     QString errorString;
     Error error = NoError;
 
-    if ( mode == Delete ) {
-        const Error derr = deleteEntryImpl( q->service(), key, &errorString );
-        if ( derr != NoError )
-            error = CouldNotDeleteEntry;
-        q->emitFinishedWithError( error, errorString );
-        return;
-    }
-    const QByteArray data = mode == Text ?  textData.toUtf8() : binaryData;
     error = writeEntryImpl( q->service(), key, data, &errorString );
     q->emitFinishedWithError( error, errorString );
 }
+
+void DeletePasswordJobPrivate::scheduledStart()
+{
+    QString errorString;
+    Error error = NoError;
+
+    const Error derr = deleteEntryImpl( q->service(), key, &errorString );
+    if ( derr != NoError )
+        error = CouldNotDeleteEntry;
+    q->emitFinishedWithError( error, errorString );
+}
diff --git a/keychain_p.h b/keychain_p.h
index 09c9b25..e0b4056 100644
--- a/keychain_p.h
+++ b/keychain_p.h
@@ -13,7 +13,7 @@
 #include <QObject>
 #include <QPointer>
 #include <QSettings>
-#include <QVector>
+#include <QQueue>
 
 #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
 
@@ -35,105 +35,108 @@ class JobExecutor;
 class JobPrivate : public QObject {
     Q_OBJECT
 public:
-    JobPrivate( const QString& service_ )
-        : error( NoError )
-        , service( service_ )
-        , autoDelete( true )
-        , insecureFallback( false ) {}
+    enum Mode {
+	Text,
+	Binary
+    };
+
+    virtual void scheduledStart() = 0;
+
+    static QString modeToString(Mode m);
+    static Mode stringToMode(const QString& s);
+
+    Mode mode;
 
+#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
+    org::kde::KWallet* iface;
+    int walletHandle;
+
+    static void gnomeKeyring_readCb( int result, const char* string, JobPrivate* data );
+    static void gnomeKeyring_writeCb( int result, JobPrivate* self );
+
+    virtual void fallbackOnError(const QDBusError& err) = 0;
+
+protected Q_SLOTS:
+    void kwalletWalletFound( QDBusPendingCallWatcher* watcher );
+    virtual void kwalletFinished( QDBusPendingCallWatcher* watcher );
+    virtual void kwalletOpenFinished( QDBusPendingCallWatcher* watcher );
+#else
+    void kwalletWalletFound(QDBusPendingCallWatcher *watcher) {}
+    virtual void kwalletFinished( QDBusPendingCallWatcher* watcher ) {}
+    virtual void kwalletOpenFinished( QDBusPendingCallWatcher* watcher ) {}
+#endif
+
+protected:
+    JobPrivate( const QString& service_, Job *q );
+
+protected:
     QKeychain::Error error;
     QString errorString;
     QString service;
     bool autoDelete;
     bool insecureFallback;
     QPointer<QSettings> settings;
+    QString key;
+    Job* const q;
+    QByteArray data;
+
+friend class Job;
+friend class JobExecutor;
+friend class ReadPasswordJob;
+friend class WritePasswordJob;
 };
 
-class ReadPasswordJobPrivate : public QObject {
+class ReadPasswordJobPrivate : public JobPrivate {
     Q_OBJECT
 public:
-    explicit ReadPasswordJobPrivate( ReadPasswordJob* qq ) : q( qq ), walletHandle( 0 ), dataType( Text ) {}
+    explicit ReadPasswordJobPrivate( const QString &service_, ReadPasswordJob* qq );
     void scheduledStart();
 
-    ReadPasswordJob* const q;
-    QByteArray data;
-    QString key;
-    int walletHandle;
-    enum DataType {
-        Binary,
-        Text
-    };
-    DataType dataType;
-
 #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
-    org::kde::KWallet* iface;
-    static void gnomeKeyring_cb( int result, const char* string, ReadPasswordJobPrivate* data );
-    friend class QKeychain::JobExecutor;
     void fallbackOnError(const QDBusError& err);
 
 private Q_SLOTS:
-    void kwalletWalletFound( QDBusPendingCallWatcher* watcher );
     void kwalletOpenFinished( QDBusPendingCallWatcher* watcher );
     void kwalletEntryTypeFinished( QDBusPendingCallWatcher* watcher );
-    void kwalletReadFinished( QDBusPendingCallWatcher* watcher );
+    void kwalletFinished( QDBusPendingCallWatcher* watcher );
 #else //moc's too dumb to respect above macros, so just define empty slot implementations
 private Q_SLOTS:
-    void kwalletWalletFound( QDBusPendingCallWatcher* ) {}
     void kwalletOpenFinished( QDBusPendingCallWatcher* ) {}
     void kwalletEntryTypeFinished( QDBusPendingCallWatcher* ) {}
-    void kwalletReadFinished( QDBusPendingCallWatcher* ) {}
+    void kwalletFinished( QDBusPendingCallWatcher* ) {}
 #endif
 
+    friend class ReadPasswordJob;
 };
 
-class WritePasswordJobPrivate : public QObject {
+class WritePasswordJobPrivate : public JobPrivate {
     Q_OBJECT
 public:
-    explicit WritePasswordJobPrivate( WritePasswordJob* qq ) : q( qq ), mode( Delete ) {}
+    explicit WritePasswordJobPrivate( const QString &service_, WritePasswordJob* qq );
     void scheduledStart();
 
-    enum Mode {
-        Delete,
-        Text,
-        Binary
-    };
-
-    static QString modeToString(Mode m);
-    static Mode stringToMode(const QString& s);
-
-    WritePasswordJob* const q;
-    Mode mode;
-    QString key;
-    QByteArray binaryData;
-    QString textData;
-
 #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
-    org::kde::KWallet* iface;
-    static void gnomeKeyring_cb( int result, WritePasswordJobPrivate* self );
-    friend class QKeychain::JobExecutor;
     void fallbackOnError(const QDBusError& err);
-
-private Q_SLOTS:
-    void kwalletWalletFound( QDBusPendingCallWatcher* watcher );
-    void kwalletOpenFinished( QDBusPendingCallWatcher* watcher );
-    void kwalletWriteFinished( QDBusPendingCallWatcher* watcher );
-#else
-private Q_SLOTS:
-    void kwalletWalletFound( QDBusPendingCallWatcher* ) {}
-    void kwalletOpenFinished( QDBusPendingCallWatcher* ) {}
-    void kwalletWriteFinished( QDBusPendingCallWatcher* ) {}
 #endif
+
+    friend class WritePasswordJob;
 };
 
-class DeletePasswordJobPrivate : public QObject {
+class DeletePasswordJobPrivate : public JobPrivate {
     Q_OBJECT
 public:
-    explicit DeletePasswordJobPrivate( DeletePasswordJob* qq ) : q( qq ) {}
+    explicit DeletePasswordJobPrivate( const QString &service_, DeletePasswordJob* qq );
+
+    void scheduledStart();
+
+#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
+    void fallbackOnError(const QDBusError& err);
+#endif
+
+protected:
     void doStart();
-    DeletePasswordJob* const q;
-    QString key;
-private Q_SLOTS:
-    void jobFinished( QKeychain::Job* );
+
+    friend class DeletePasswordJob;
 };
 
 class JobExecutor : public QObject {
@@ -154,8 +157,8 @@ private Q_SLOTS:
 
 private:
     static JobExecutor* s_instance;
-    Job* m_runningJob;
-    QVector<QPointer<Job> > m_queue;
+    QQueue<QPointer<Job> > m_queue;
+    bool m_jobRunning;
 };
 
 }
diff --git a/keychain_unix.cpp b/keychain_unix.cpp
index 48f4240..9fa9f24 100644
--- a/keychain_unix.cpp
+++ b/keychain_unix.cpp
@@ -94,7 +94,7 @@ static KeyringBackend detectKeyringBackend()
     case DesktopEnv_Plasma5:
         return Backend_Kwallet5;
         break;
-    // fall through
+        // fall through
     case DesktopEnv_Gnome:
     case DesktopEnv_Unity:
     case DesktopEnv_Xfce:
@@ -125,7 +125,7 @@ static void kwalletReadPasswordScheduledStartImpl(const char * service, const ch
     }
     else
     {
-    // D-Bus is not reachable so none can tell us something about KWalletd
+        // D-Bus is not reachable so none can tell us something about KWalletd
         QDBusError err( QDBusError::NoServer, ReadPasswordJobPrivate::tr("D-Bus is not running") );
         priv->fallbackOnError( err );
     }
@@ -135,7 +135,7 @@ void ReadPasswordJobPrivate::scheduledStart() {
     switch ( getKeyringBackend() ) {
     case Backend_GnomeKeyring:
         if ( !GnomeKeyring::find_network_password( key.toUtf8().constData(), q->service().toUtf8().constData(),
-                                                   reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &ReadPasswordJobPrivate::gnomeKeyring_cb ),
+                                                   reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &JobPrivate::gnomeKeyring_readCb ),
                                                    this, 0 ) )
             q->emitFinishedWithError( OtherError, tr("Unknown error") );
         break;
@@ -149,13 +149,14 @@ void ReadPasswordJobPrivate::scheduledStart() {
     }
 }
 
-void ReadPasswordJobPrivate::kwalletWalletFound(QDBusPendingCallWatcher *watcher)
+void JobPrivate::kwalletWalletFound(QDBusPendingCallWatcher *watcher)
 {
     watcher->deleteLater();
     const QDBusPendingReply<QString> reply = *watcher;
     const QDBusPendingReply<int> pendingReply = iface->open( reply.value(), 0, q->service() );
     QDBusPendingCallWatcher* pendingWatcher = new QDBusPendingCallWatcher( pendingReply, this );
-    connect( pendingWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletOpenFinished(QDBusPendingCallWatcher*)) );
+    connect( pendingWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
+             this, SLOT(kwalletOpenFinished(QDBusPendingCallWatcher*)) );
 }
 
 static QPair<Error, QString> mapGnomeKeyringError( int result )
@@ -188,10 +189,10 @@ static QPair<Error, QString> mapGnomeKeyringError( int result )
     return qMakePair( OtherError, QObject::tr("Unknown error") );
 }
 
-void ReadPasswordJobPrivate::gnomeKeyring_cb( int result, const char* string, ReadPasswordJobPrivate* self )
+void JobPrivate::gnomeKeyring_readCb( int result, const char* string, JobPrivate* self )
 {
     if ( result == GnomeKeyring::RESULT_OK ) {
-        if ( self->dataType == ReadPasswordJobPrivate::Text )
+        if ( self->mode == JobPrivate::Text )
             self->data = string;
         else
             self->data = QByteArray::fromBase64( string );
@@ -209,11 +210,7 @@ void ReadPasswordJobPrivate::fallbackOnError(const QDBusError& err )
 
     if ( q->insecureFallback() && actual->contains( dataKey( key ) ) ) {
 
-        const WritePasswordJobPrivate::Mode mode = WritePasswordJobPrivate::stringToMode( actual->value( typeKey( key ) ).toString() );
-        if (mode == WritePasswordJobPrivate::Binary)
-           dataType = Binary;
-        else
-            dataType = Text;
+        mode = JobPrivate::stringToMode( actual->value( typeKey( key ) ).toString() );
         data = actual->value( dataKey( key ) ).toByteArray();
 
         q->emitFinished();
@@ -300,10 +297,10 @@ void ReadPasswordJobPrivate::kwalletEntryTypeFinished( QDBusPendingCallWatcher*
         q->emitFinishedWithError( EntryNotFound, tr("Entry not found") );
         return;
     case Password:
-        dataType = Text;
+        mode = Text;
         break;
     case Stream:
-        dataType = Binary;
+        mode = Binary;
         break;
     case Map:
         q->emitFinishedWithError( EntryNotFound, tr("Unsupported entry type 'Map'") );
@@ -313,32 +310,28 @@ void ReadPasswordJobPrivate::kwalletEntryTypeFinished( QDBusPendingCallWatcher*
         return;
     }
 
-    const QDBusPendingCall nextReply = dataType == Text
-        ? QDBusPendingCall( iface->readPassword( walletHandle, q->service(), key, q->service() ) )
-        : QDBusPendingCall( iface->readEntry( walletHandle, q->service(), key, q->service() ) );
+    const QDBusPendingCall nextReply = (mode == Text)
+            ? QDBusPendingCall( iface->readPassword( walletHandle, q->service(), key, q->service() ) )
+            : QDBusPendingCall( iface->readEntry( walletHandle, q->service(), key, q->service() ) );
     QDBusPendingCallWatcher* nextWatcher = new QDBusPendingCallWatcher( nextReply, this );
     connect( nextWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletReadFinished(QDBusPendingCallWatcher*)) );
 }
 
-void ReadPasswordJobPrivate::kwalletReadFinished( QDBusPendingCallWatcher* watcher ) {
-    watcher->deleteLater();
-    if ( watcher->isError() ) {
-        const QDBusError err = watcher->error();
-        q->emitFinishedWithError( OtherError, tr("Could not read password: %1; %2").arg( QDBusError::errorString( err.type() ), err.message() ) );
-        return;
-    }
-
-    if ( dataType == Binary ) {
+void ReadPasswordJobPrivate::kwalletFinished( QDBusPendingCallWatcher* watcher ) {
+    if ( !watcher->isError() ) {
+    if ( mode == Binary ) {
         QDBusPendingReply<QByteArray> reply = *watcher;
         data = reply.value();
     } else {
         QDBusPendingReply<QString> reply = *watcher;
         data = reply.value().toUtf8();
     }
-    q->emitFinished();
+    }
+
+    JobPrivate::kwalletFinished(watcher);
 }
 
-static void kwalletWritePasswordScheduledStart( const char * service, const char * path, WritePasswordJobPrivate * priv ) {
+static void kwalletWritePasswordScheduledStart( const char * service, const char * path, JobPrivate * priv ) {
     if ( QDBusConnection::sessionBus().isConnected() )
     {
         priv->iface = new org::kde::KWallet( QLatin1String(service), QLatin1String(path), QDBusConnection::sessionBus(), priv );
@@ -356,21 +349,15 @@ static void kwalletWritePasswordScheduledStart( const char * service, const char
 
 void WritePasswordJobPrivate::scheduledStart() {
     switch ( getKeyringBackend() ) {
-    case Backend_GnomeKeyring:
-        if ( mode == WritePasswordJobPrivate::Delete ) {
-            if ( !GnomeKeyring::delete_network_password( key.toUtf8().constData(), q->service().toUtf8().constData(),
-                                                         reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &WritePasswordJobPrivate::gnomeKeyring_cb ),
-                                                         this, 0 ) )
-                q->emitFinishedWithError( OtherError, tr("Unknown error") );
-        } else {
-            QByteArray password = mode == WritePasswordJobPrivate::Text ? textData.toUtf8() : binaryData.toBase64();
-            QByteArray service = q->service().toUtf8();
-            if ( !GnomeKeyring::store_network_password( GnomeKeyring::GNOME_KEYRING_DEFAULT, service.constData(),
-                                                        key.toUtf8().constData(), service.constData(), password.constData(),
-                                                        reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &WritePasswordJobPrivate::gnomeKeyring_cb ),
-                                                        this, 0 ) )
-                q->emitFinishedWithError( OtherError, tr("Unknown error") );
-        }
+    case Backend_GnomeKeyring: {
+        QByteArray password = (mode == JobPrivate::Text) ? data : data.toBase64();
+        QByteArray service = q->service().toUtf8();
+        if ( !GnomeKeyring::store_network_password( GnomeKeyring::GNOME_KEYRING_DEFAULT, service.constData(),
+                                                    key.toUtf8().constData(), service.constData(), password.constData(),
+                                                    reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &JobPrivate::gnomeKeyring_writeCb ),
+                                                    this, 0 ) )
+            q->emitFinishedWithError( OtherError, tr("Unknown error") );
+    }
         break;
 
     case Backend_Kwallet4:
@@ -382,35 +369,6 @@ void WritePasswordJobPrivate::scheduledStart() {
     }
 }
 
-QString WritePasswordJobPrivate::modeToString(Mode m)
-{
-    switch (m) {
-    case Delete:
-        return QLatin1String("Delete");
-    case Text:
-        return QLatin1String("Text");
-    case Binary:
-        return QLatin1String("Binary");
-    }
-
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unhandled Mode value");
-    return QString();
-}
-
-WritePasswordJobPrivate::Mode WritePasswordJobPrivate::stringToMode(const QString& s)
-{
-    if (s == QLatin1String("Delete") || s == QLatin1String("0"))
-        return Delete;
-    if (s == QLatin1String("Text") || s == QLatin1String("1"))
-        return Text;
-    if (s == QLatin1String("Binary") || s == QLatin1String("2"))
-        return Binary;
-
-    qCritical("Unexpected mode string '%s'", qPrintable(s));
-
-    return Text;
-}
-
 void WritePasswordJobPrivate::fallbackOnError(const QDBusError &err)
 {
     QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
@@ -421,25 +379,14 @@ void WritePasswordJobPrivate::fallbackOnError(const QDBusError &err)
         return;
     }
 
-    if ( mode == Delete ) {
-        actual->remove( key );
-        actual->sync();
-
-        q->emitFinished();
-        return;
-   }
-
     actual->setValue( QString::fromLatin1( "%1/type" ).arg( key ), mode );
-    if ( mode == Text )
-        actual->setValue( QString::fromLatin1( "%1/data" ).arg( key ), textData.toUtf8() );
-    else if ( mode == Binary )
-        actual->setValue( QString::fromLatin1( "%1/data" ).arg( key ), binaryData );
+    actual->setValue( QString::fromLatin1( "%1/data" ).arg( key ), data );
     actual->sync();
 
     q->emitFinished();
 }
 
-void WritePasswordJobPrivate::gnomeKeyring_cb( int result, WritePasswordJobPrivate* self )
+void JobPrivate::gnomeKeyring_writeCb(int result, JobPrivate* self )
 {
     if ( result == GnomeKeyring::RESULT_OK ) {
         self->q->emitFinished();
@@ -449,16 +396,7 @@ void WritePasswordJobPrivate::gnomeKeyring_cb( int result, WritePasswordJobPriva
     }
 }
 
-void WritePasswordJobPrivate::kwalletWalletFound(QDBusPendingCallWatcher *watcher)
-{
-    watcher->deleteLater();
-    const QDBusPendingReply<QString> reply = *watcher;
-    const QDBusPendingReply<int> pendingReply = iface->open( reply.value(), 0, q->service() );
-    QDBusPendingCallWatcher* pendingWatcher = new QDBusPendingCallWatcher( pendingReply, this );
-    connect( pendingWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletOpenFinished(QDBusPendingCallWatcher*)) );
-}
-
-void WritePasswordJobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watcher ) {
+void JobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watcher ) {
     watcher->deleteLater();
     QDBusPendingReply<int> reply = *watcher;
 
@@ -486,10 +424,10 @@ void WritePasswordJobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watc
 
     QDBusPendingReply<int> nextReply;
 
-    if ( !textData.isEmpty() )
-        nextReply = iface->writePassword( handle, q->service(), key, textData, q->service() );
-    else if ( !binaryData.isEmpty() )
-        nextReply = iface->writeEntry( handle, q->service(), key, binaryData, q->service() );
+    if ( mode == Text )
+        nextReply = iface->writePassword( handle, q->service(), key, QString::fromUtf8(data), q->service() );
+    else if ( mode == Binary )
+        nextReply = iface->writeEntry( handle, q->service(), key, data, q->service() );
     else
         nextReply = iface->removeEntry( handle, q->service(), key, q->service() );
 
@@ -497,14 +435,54 @@ void WritePasswordJobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watc
     connect( nextWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletWriteFinished(QDBusPendingCallWatcher*)) );
 }
 
-void WritePasswordJobPrivate::kwalletWriteFinished( QDBusPendingCallWatcher* watcher ) {
+void JobPrivate::kwalletFinished( QDBusPendingCallWatcher* watcher ) {
     watcher->deleteLater();
     QDBusPendingReply<int> reply = *watcher;
     if ( reply.isError() ) {
         const QDBusError err = reply.error();
-        q->emitFinishedWithError( OtherError, tr("Could not open wallet: %1; %2").arg( QDBusError::errorString( err.type() ), err.message() ) );
+        q->emitFinishedWithError( OtherError, tr("Could not open wallet: %1; %2")
+                                  .arg( QDBusError::errorString( err.type() ), err.message() ) );
         return;
     }
 
     q->emitFinished();
 }
+
+void DeletePasswordJobPrivate::scheduledStart() {
+    switch ( getKeyringBackend() ) {
+    case Backend_GnomeKeyring: {
+        if ( !GnomeKeyring::delete_network_password(
+                 key.toUtf8().constData(), q->service().toUtf8().constData(),
+                 reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &JobPrivate::gnomeKeyring_writeCb ),
+                 this, 0 ) )
+            q->emitFinishedWithError( OtherError, tr("Unknown error") );
+    }
+        break;
+
+    case Backend_Kwallet4:
+        kwalletWritePasswordScheduledStart("org.kde.kwalletd", "/modules/kwalletd", this);
+        break;
+    case Backend_Kwallet5:
+        kwalletWritePasswordScheduledStart("org.kde.kwalletd5", "/modules/kwalletd5", this);
+        break;
+    }
+}
+
+void DeletePasswordJobPrivate::fallbackOnError(const QDBusError &err) {
+    QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
+    QSettings* actual = q->settings() ? q->settings() : local.data();
+
+    if ( !q->insecureFallback() ) {
+        q->emitFinishedWithError( OtherError, tr("Could not open wallet: %1; %2")
+                                  .arg( QDBusError::errorString( err.type() ), err.message() ) );
+        return;
+    }
+
+    actual->remove( key );
+    actual->sync();
+
+    q->emitFinished();
+
+
+    q->emitFinished();
+}
diff --git a/keychain_win.cpp b/keychain_win.cpp
index e2df4b8..d5f0967 100644
--- a/keychain_win.cpp
+++ b/keychain_win.cpp
@@ -53,24 +53,6 @@ void ReadPasswordJobPrivate::scheduledStart() {
 }
 
 void WritePasswordJobPrivate::scheduledStart() {
-    if ( mode == Delete ) {
-        //Use settings member if there, create local settings object if not
-        std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
-        QSettings* actual = q->settings() ? q->settings() : local.get();
-        actual->remove( key );
-        actual->sync();
-        if ( actual->status() != QSettings::NoError ) {
-            const QString err = actual->status() == QSettings::AccessError
-                    ? tr("Could not delete encrypted data from settings: access error")
-                    : tr("Could not delete encrypted data from settings: format error");
-            q->emitFinishedWithError( OtherError, err );
-        } else {
-            q->emitFinished();
-        }
-        return;
-    }
-
-    QByteArray data = mode == Binary ? binaryData : textData.toUtf8();
     DATA_BLOB blob_in, blob_out;
     blob_in.pbData = reinterpret_cast<BYTE*>( data.data() );
     blob_in.cbData = data.size();
@@ -105,3 +87,19 @@ void WritePasswordJobPrivate::scheduledStart() {
 
     q->emitFinished();
 }
+
+void DeletePasswordJobPrivate::scheduledStart() {
+    //Use settings member if there, create local settings object if not
+    std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
+    QSettings* actual = q->settings() ? q->settings() : local.get();
+    actual->remove( key );
+    actual->sync();
+    if ( actual->status() != QSettings::NoError ) {
+        const QString err = actual->status() == QSettings::AccessError
+                ? tr("Could not delete encrypted data from settings: access error")
+                : tr("Could not delete encrypted data from settings: format error");
+        q->emitFinishedWithError( OtherError, err );
+    } else {
+        q->emitFinished();
+    }
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/qtkeychain.git



More information about the Pkg-owncloud-commits mailing list