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

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

Git commit 1d326b8d5b825141d7c176c54bdeba432210fae6 by Thomas Fischer.
Committed on 26/11/2016 at 21:45.
Pushed by thomasfischer into branch 'master'.

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/1d326b8d5b825141d7c176c54bdeba432210fae6

diff --git a/src/networking/zotero/collection.cpp \
b/src/networking/zotero/collection.cpp index 2c7974b..6bacbfa 100644
--- a/src/networking/zotero/collection.cpp
+++ b/src/networking/zotero/collection.cpp
@@ -38,11 +38,11 @@ private:
     Zotero::Collection *p;
 
 public:
-    Zotero::API *api;
+    QSharedPointer<Zotero::API> api;
 
     static const QString top;
 
-    Private(API *a, Zotero::Collection *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Collection *parent)
             : p(parent), api(a) {
         initialized = false;
         busy = false;
@@ -82,7 +82,7 @@ public:
 
 const QString Zotero::Collection::Private::top = QStringLiteral("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 89a50ed..55a475d 100644
--- a/src/networking/zotero/collection.h
+++ b/src/networking/zotero/collection.h
@@ -20,6 +20,7 @@
 
 #include <QObject>
 #include <QScopedPointer>
+#include <QSharedPointer>
 
 #include <QUrl>
 
@@ -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 20b0430..d81d8ad 100644
--- a/src/networking/zotero/groups.cpp
+++ b/src/networking/zotero/groups.cpp
@@ -34,9 +34,9 @@ private:
     Zotero::Groups *p;
 
 public:
-    API *api;
+    QSharedPointer<Zotero::API> api;
 
-    Private(API *a, Zotero::Groups *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Groups *parent)
             : p(parent), api(a) {
         initialized = false;
         busy = false;
@@ -57,11 +57,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))
 {
     QUrl url = api->baseUrl();
-    Q_ASSERT_X(url.path().contains(QStringLiteral("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 = \
url.adjusted(QUrl::StripTrailingSlash);  url.setPath(url.path() + \
QStringLiteral("/groups"));  
diff --git a/src/networking/zotero/groups.h b/src/networking/zotero/groups.h
index c39f39c..4905b9f 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 2f14b4f..3cdecae 100644
--- a/src/networking/zotero/items.cpp
+++ b/src/networking/zotero/items.cpp
@@ -37,9 +37,9 @@ private:
     Zotero::Items *p;
 
 public:
-    API *api;
+    QSharedPointer<Zotero::API> api;
 
-    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 5351a06..1560db1 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 b8c4ed8..f5ce1d7 100644
--- a/src/networking/zotero/tags.cpp
+++ b/src/networking/zotero/tags.cpp
@@ -34,9 +34,9 @@ private:
     Zotero::Tags *p;
 
 public:
-    API *api;
+    QSharedPointer<Zotero::API> api;
 
-    Private(API *a, Zotero::Tags *parent)
+    Private(QSharedPointer<Zotero::API> a, Zotero::Tags *parent)
             : p(parent), api(a) {
         initialized = false;
         busy = false;
@@ -57,7 +57,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))
 {
     QUrl url = api->baseUrl();
diff --git a/src/networking/zotero/tags.h b/src/networking/zotero/tags.h
index d62ac80..85127f6 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 b9e4af9..6b81548 100644
--- a/src/program/docklets/zoterobrowser.cpp
+++ b/src/program/docklets/zoterobrowser.cpp
@@ -64,7 +64,7 @@ public:
     Zotero::TagModel *tagModel;
     Zotero::Collection *collection;
     Zotero::CollectionModel *collectionModel;
-    Zotero::API *api;
+    QSharedPointer<Zotero::API> api;
     bool needToApplyCredentials;
 
     SearchResults *searchResults;
@@ -85,13 +85,20 @@ public:
     static const QString walletFolderOAuth, walletEntryKBibTeXZotero, \
walletKeyZoteroId, walletKeyZoteroApiKey;  
     Private(SearchResults *sr, ZoteroBrowser *parent)
-            : p(parent), \
config(KSharedConfig::openConfig(QStringLiteral("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(QStringLiteral("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()
@@ -287,15 +294,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, d->lineEditApiKey->text(), 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);
@@ -335,10 +348,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, &Zotero::Groups::finishedLoading, this, \
&ZoteroBrowser::gotGroupList);


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

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