[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kbibtex/kbibtex/0.7] src: Zotero::API instance managed through QSharedPointer
From:       Thomas Fischer <fischer () unix-ag ! uni-kl ! de>
Date:       2016-11-26 21:53:23
Message-ID: E1cAkuR-0006Wb-VV () code ! kde ! org
[Download RAW message or body]

Git commit 117fd986420f2dc1f3751bc5dbdbd5aabeb080da by Thomas Fischer.
Committed on 26/11/2016 at 21:34.
Pushed by thomasfischer into branch 'kbibtex/0.7'.

Zotero::API instance managed through QSharedPointer

In order to address issues where stale instances of Zotero::API are
used, the single instance of this class, which is used in a number
of other classes, is encapsulated in a QSharedPointer to keep track
of which other objects are still using this instance.

Manual forward-port of commit 0ac3b8a4cab0875114ce83379 from branch
'kbibtex/0.6'.

M  +3    -3    src/networking/zotero/collection.cpp
M  +2    -1    src/networking/zotero/collection.h
M  +4    -4    src/networking/zotero/groups.cpp
M  +2    -1    src/networking/zotero/groups.h
M  +3    -3    src/networking/zotero/items.cpp
M  +1    -1    src/networking/zotero/items.h
M  +3    -3    src/networking/zotero/tags.cpp
M  +2    -1    src/networking/zotero/tags.h
M  +20   -6    src/program/docklets/zoterobrowser.cpp

https://commits.kde.org/kbibtex/117fd986420f2dc1f3751bc5dbdbd5aabeb080da

diff --git a/src/networking/zotero/collection.cpp \
b/src/networking/zotero/collection.cpp index 69dec22..f4440bd 100644
--- a/src/networking/zotero/collection.cpp
+++ b/src/networking/zotero/collection.cpp
@@ -39,12 +39,12 @@ private:
     Zotero::Collection *p;
 
 public:
-    Zotero::API *api;
+    QSharedPointer<Zotero::API> api;
 
     static const QString top;
     KUrl queuedRequestZoteroUrl;
 
-    Private(API *a, Zotero::Collection *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Collection *parent)
             : p(parent), api(a) {
         initialized = false;
         busy = false;
@@ -83,7 +83,7 @@ public:
 
 const QString Zotero::Collection::Private::top = QLatin1String("top");
 
-Collection::Collection(API *api, QObject *parent)
+Collection::Collection(QSharedPointer<Zotero::API> api, QObject *parent)
         : QObject(parent), d(new Zotero::Collection::Private(api, this))
 {
     d->collectionToLabel[Private::top] = i18n("Library");
diff --git a/src/networking/zotero/collection.h b/src/networking/zotero/collection.h
index 1bb8247..822d084 100644
--- a/src/networking/zotero/collection.h
+++ b/src/networking/zotero/collection.h
@@ -20,6 +20,7 @@
 
 #include <QObject>
 #include <QScopedPointer>
+#include <QSharedPointer>
 
 #include <KUrl>
 
@@ -37,7 +38,7 @@ class KBIBTEXNETWORKING_EXPORT Collection : public QObject
 {
     Q_OBJECT
 public:
-    Collection(API *api, QObject *parent);
+    Collection(QSharedPointer<Zotero::API> api, QObject *parent);
     ~Collection();
 
     bool initialized() const;
diff --git a/src/networking/zotero/groups.cpp b/src/networking/zotero/groups.cpp
index 5bbe145..5abcd39 100644
--- a/src/networking/zotero/groups.cpp
+++ b/src/networking/zotero/groups.cpp
@@ -35,10 +35,10 @@ private:
     Zotero::Groups *p;
 
 public:
-    API *api;
+    QSharedPointer<Zotero::API> api;
     KUrl queuedRequestZoteroUrl;
 
-    Private(API *a, Zotero::Groups *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Groups *parent)
             : p(parent), api(a) {
         initialized = false;
         busy = false;
@@ -59,11 +59,11 @@ public:
     }
 };
 
-Groups::Groups(API *api, QObject *parent)
+Groups::Groups(QSharedPointer<Zotero::API> api, QObject *parent)
         : QObject(parent), d(new Zotero::Groups::Private(api, this))
 {
     KUrl url = api->baseUrl();
-    Q_ASSERT_X(url.path().contains(QLatin1String("users/")), "Groups::Groups(API \
*api, QObject *parent)", "Provided base URL does not contain 'users/' as expected"); \
+    Q_ASSERT_X(url.path().contains(QLatin1String("users/")), \
"Groups::Groups(QSharedPointer<Zotero::API> api, QObject *parent)", "Provided base \
URL does not contain 'users/' as expected");  url.addPath(QLatin1String("/groups"));
     if (d->api->inBackoffMode() && d->queuedRequestZoteroUrl.isEmpty()) {
         d->queuedRequestZoteroUrl = url;
diff --git a/src/networking/zotero/groups.h b/src/networking/zotero/groups.h
index ff081fb..0ff843b 100644
--- a/src/networking/zotero/groups.h
+++ b/src/networking/zotero/groups.h
@@ -20,6 +20,7 @@
 
 #include <QObject>
 #include <QMap>
+#include <QSharedPointer>
 
 #include "kbibtexnetworking_export.h"
 
@@ -35,7 +36,7 @@ class KBIBTEXNETWORKING_EXPORT Groups : public QObject
 {
     Q_OBJECT
 public:
-    explicit Groups(API *api, QObject *parent = NULL);
+    explicit Groups(QSharedPointer<Zotero::API> api, QObject *parent = NULL);
     ~Groups();
 
     bool initialized() const;
diff --git a/src/networking/zotero/items.cpp b/src/networking/zotero/items.cpp
index 675719e..4bc41c2 100644
--- a/src/networking/zotero/items.cpp
+++ b/src/networking/zotero/items.cpp
@@ -38,10 +38,10 @@ private:
     Zotero::Items *p;
 
 public:
-    API *api;
+    QSharedPointer<Zotero::API> api;
     KUrl queuedRequestZoteroUrl;
 
-    Private(API *a, Zotero::Items *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Items *parent)
             : p(parent), api(a) {
         /// nothing
     }
@@ -66,7 +66,7 @@ public:
     }
 };
 
-Items::Items(API *api, QObject *parent)
+Items::Items(QSharedPointer<Zotero::API> api, QObject *parent)
         : QObject(parent), d(new Zotero::Items::Private(api, this))
 {
     /// nothing
diff --git a/src/networking/zotero/items.h b/src/networking/zotero/items.h
index f2c6aec..01ef040 100644
--- a/src/networking/zotero/items.h
+++ b/src/networking/zotero/items.h
@@ -39,7 +39,7 @@ class KBIBTEXNETWORKING_EXPORT Items : public QObject
 {
     Q_OBJECT
 public:
-    explicit Items(API *api, QObject *parent = NULL);
+    explicit Items(QSharedPointer<Zotero::API> api, QObject *parent = NULL);
     ~Items();
 
     void retrieveItemsByCollection(const QString &collectionId);
diff --git a/src/networking/zotero/tags.cpp b/src/networking/zotero/tags.cpp
index 210aecf..671d1fb 100644
--- a/src/networking/zotero/tags.cpp
+++ b/src/networking/zotero/tags.cpp
@@ -35,10 +35,10 @@ private:
     Zotero::Tags *p;
 
 public:
-    API *api;
+    QSharedPointer<Zotero::API> api;
     KUrl queuedRequestZoteroUrl;
 
-    Private(API *a, Zotero::Tags *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Tags *parent)
             : p(parent), api(a) {
         initialized = false;
         busy = false;
@@ -59,7 +59,7 @@ public:
     }
 };
 
-Tags::Tags(API *api, QObject *parent)
+Tags::Tags(QSharedPointer<Zotero::API> api, QObject *parent)
         : QObject(parent), d(new Zotero::Tags::Private(api, this))
 {
 
diff --git a/src/networking/zotero/tags.h b/src/networking/zotero/tags.h
index 7ee2fa3..118a11a 100644
--- a/src/networking/zotero/tags.h
+++ b/src/networking/zotero/tags.h
@@ -20,6 +20,7 @@
 
 #include <QObject>
 #include <QMap>
+#include <QSharedPointer>
 
 #include "kbibtexnetworking_export.h"
 
@@ -35,7 +36,7 @@ class KBIBTEXNETWORKING_EXPORT Tags : public QObject
 {
     Q_OBJECT
 public:
-    explicit Tags(API *api, QObject *parent = NULL);
+    explicit Tags(QSharedPointer<Zotero::API> api, QObject *parent = NULL);
     ~Tags();
 
     bool initialized() const;
diff --git a/src/program/docklets/zoterobrowser.cpp \
b/src/program/docklets/zoterobrowser.cpp index ca0dc9c..0487be6 100644
--- a/src/program/docklets/zoterobrowser.cpp
+++ b/src/program/docklets/zoterobrowser.cpp
@@ -63,7 +63,7 @@ public:
     Zotero::TagModel *tagModel;
     Zotero::Collection *collection;
     Zotero::CollectionModel *collectionModel;
-    Zotero::API *api;
+    QSharedPointer<Zotero::API> api;
     bool needToApplyCredentials;
 
     SearchResults *searchResults;
@@ -84,13 +84,20 @@ public:
     static const QString walletFolderOAuth, walletEntryKBibTeXZotero, \
walletKeyZoteroId, walletKeyZoteroApiKey;  
     Private(SearchResults *sr, ZoteroBrowser *parent)
-            : p(parent), \
config(KSharedConfig::openConfig(QLatin1String("kbibtexrc"))), items(NULL), \
groups(NULL), tags(NULL), tagModel(NULL), collection(NULL), collectionModel(NULL), \
api(NULL), needToApplyCredentials(true), searchResults(sr), \
comboBoxGroupListInitialized(false), nonBusyCursor(p->cursor()), wallet(NULL) { +     \
: p(parent), config(KSharedConfig::openConfig(QLatin1String("kbibtexrc"))), \
items(NULL), groups(NULL), tags(NULL), tagModel(NULL), collection(NULL), \
collectionModel(NULL), needToApplyCredentials(true), searchResults(sr), \
comboBoxGroupListInitialized(false), nonBusyCursor(p->cursor()), wallet(NULL) {  \
setupGUI();  }
 
     ~Private() {
         if (wallet != NULL)
             delete wallet;
+        if (items != NULL) delete items;
+        if (groups != NULL) delete groups;
+        if (tags != NULL) delete tags;
+        if (tagModel != NULL) delete tagModel;
+        if (collection != NULL) delete collection;
+        if (collectionModel != NULL) delete collectionModel;
+        api.clear();
     }
 
     void setupGUI()
@@ -297,15 +304,21 @@ void ZoteroBrowser::applyCredentials()
         int groupId = \
d->comboBoxGroupList->itemData(d->comboBoxGroupList->currentIndex()).toInt(&ok);  if \
(!ok) groupId = -1;  
-        d->api->deleteLater();
+        disconnect(d->tags, SIGNAL(finishedLoading()), this, \
SLOT(reenableWidget())); +        disconnect(d->items, SIGNAL(stoppedSearch(int)), \
this, SLOT(reenableWidget())); +        disconnect(d->items, \
SIGNAL(foundElement(QSharedPointer<Element>)), this, \
SLOT(showItem(QSharedPointer<Element>))); +        disconnect(d->tagModel, \
SIGNAL(modelReset()), this, SLOT(modelReset())); +        \
disconnect(d->collectionModel, SIGNAL(modelReset()), this, SLOT(modelReset())); +
         d->collection->deleteLater();
         d->items->deleteLater();
         d->tags->deleteLater();
         d->collectionModel->deleteLater();
         d->tagModel->deleteLater();
+        d->api.clear();
 
         const bool makeGroupRequest = d->radioGroupLibrary->isChecked() && groupId > \
                0;
-        d->api = new Zotero::API(makeGroupRequest ? Zotero::API::GroupRequest : \
Zotero::API::UserRequest, makeGroupRequest ? groupId : userId, \
d->lineEditApiKey->text(), this); +        d->api = QSharedPointer<Zotero::API>(new \
Zotero::API(makeGroupRequest ? Zotero::API::GroupRequest : Zotero::API::UserRequest, \
makeGroupRequest ? groupId : userId, apiKey, this));  d->items = new \
Zotero::Items(d->api, this);  d->tags = new Zotero::Tags(d->api, this);
         d->tagModel = new Zotero::TagModel(d->tags, this);
@@ -345,10 +358,11 @@ void ZoteroBrowser::retrieveGroupList() {
         d->comboBoxGroupList->clear();
         d->comboBoxGroupListInitialized = false;
 
-        d->api->deleteLater();
+        disconnect(d->groups, SIGNAL(finishedLoading()), this, \
SLOT(gotGroupList()));  d->groups->deleteLater();
+        d->api.clear();
 
-        d->api = new Zotero::API(Zotero::API::UserRequest, userId, \
d->lineEditApiKey->text(), this); +        d->api = QSharedPointer<Zotero::API>(new \
Zotero::API(Zotero::API::UserRequest, userId, d->lineEditApiKey->text(), this));  \
d->groups = new Zotero::Groups(d->api, this);  
         connect(d->groups, SIGNAL(finishedLoading()), this, SLOT(gotGroupList()));


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic