summaryrefslogtreecommitdiffstats
path: root/common/facade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/facade.cpp')
-rw-r--r--common/facade.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/common/facade.cpp b/common/facade.cpp
index ab41f96..22ef84a 100644
--- a/common/facade.cpp
+++ b/common/facade.cpp
@@ -42,12 +42,42 @@ public:
42 Akonadi2::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier) 42 Akonadi2::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier)
43 { 43 {
44 if (!mCache.contains(instanceIdentifier)) { 44 if (!mCache.contains(instanceIdentifier)) {
45 mCache.insert(instanceIdentifier, Akonadi2::ResourceAccess::Ptr::create(instanceIdentifier)); 45 //Reuse the pointer if something else kept the resourceaccess alive
46 if (mWeakCache.contains(instanceIdentifier)) {
47 auto sharedPointer = mWeakCache.value(instanceIdentifier).toStrongRef();
48 if (sharedPointer) {
49 mCache.insert(instanceIdentifier, sharedPointer);
50 }
51 }
52 if (!mCache.contains(instanceIdentifier)) {
53 //Create a new instance if necessary
54 auto sharedPointer = Akonadi2::ResourceAccess::Ptr::create(instanceIdentifier);
55 QObject::connect(sharedPointer.data(), &Akonadi2::ResourceAccess::ready, sharedPointer.data(), [this, instanceIdentifier](bool ready) {
56 if (!ready) {
57 mCache.remove(instanceIdentifier);
58 }
59 });
60 mCache.insert(instanceIdentifier, sharedPointer);
61 mWeakCache.insert(instanceIdentifier, sharedPointer);
62 }
46 } 63 }
64 if (!mTimer.contains(instanceIdentifier)) {
65 auto timer = new QTimer;
66 //Drop connection after 3 seconds (which is a random value)
67 QObject::connect(timer, &QTimer::timeout, timer, [this, instanceIdentifier]() {
68 mCache.remove(instanceIdentifier);
69 });
70 timer->setInterval(3000);
71 mTimer.insert(instanceIdentifier, timer);
72 }
73 auto timer = mTimer.value(instanceIdentifier);
74 timer->start();
47 return mCache.value(instanceIdentifier); 75 return mCache.value(instanceIdentifier);
48 } 76 }
49 77
78 QHash<QByteArray, QWeakPointer<Akonadi2::ResourceAccess> > mWeakCache;
50 QHash<QByteArray, Akonadi2::ResourceAccess::Ptr> mCache; 79 QHash<QByteArray, Akonadi2::ResourceAccess::Ptr> mCache;
80 QHash<QByteArray, QTimer*> mTimer;
51}; 81};
52 82
53template<class DomainType> 83template<class DomainType>