summaryrefslogtreecommitdiffstats
path: root/common/resourceaccess.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-02-12 18:11:48 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-02-12 18:11:48 +0100
commita9a0f53af2138cf259daa2dfee62cb3d785d00aa (patch)
treeda7123bab1c73222e25b40586783ecd0a5714cf8 /common/resourceaccess.cpp
parent1240a482ab13d285d2624c33015f0f61f16d91a9 (diff)
downloadsink-a9a0f53af2138cf259daa2dfee62cb3d785d00aa.tar.gz
sink-a9a0f53af2138cf259daa2dfee62cb3d785d00aa.zip
moved ResourceAccessFactory
Diffstat (limited to 'common/resourceaccess.cpp')
-rw-r--r--common/resourceaccess.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp
index 80d60e8..555d807 100644
--- a/common/resourceaccess.cpp
+++ b/common/resourceaccess.cpp
@@ -594,6 +594,51 @@ bool ResourceAccess::processMessageBuffer()
594 return d->partialMessageBuffer.size() >= headerSize; 594 return d->partialMessageBuffer.size() >= headerSize;
595} 595}
596 596
597ResourceAccessFactory &ResourceAccessFactory::instance()
598{
599 static ResourceAccessFactory *instance = 0;
600 if (!instance) {
601 instance = new ResourceAccessFactory;
602 }
603 return *instance;
604}
605
606Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &instanceIdentifier)
607{
608 if (!mCache.contains(instanceIdentifier)) {
609 //Reuse the pointer if something else kept the resourceaccess alive
610 if (mWeakCache.contains(instanceIdentifier)) {
611 auto sharedPointer = mWeakCache.value(instanceIdentifier).toStrongRef();
612 if (sharedPointer) {
613 mCache.insert(instanceIdentifier, sharedPointer);
614 }
615 }
616 if (!mCache.contains(instanceIdentifier)) {
617 //Create a new instance if necessary
618 auto sharedPointer = Sink::ResourceAccess::Ptr::create(instanceIdentifier);
619 QObject::connect(sharedPointer.data(), &Sink::ResourceAccess::ready, sharedPointer.data(), [this, instanceIdentifier](bool ready) {
620 if (!ready) {
621 mCache.remove(instanceIdentifier);
622 }
623 });
624 mCache.insert(instanceIdentifier, sharedPointer);
625 mWeakCache.insert(instanceIdentifier, sharedPointer);
626 }
627 }
628 if (!mTimer.contains(instanceIdentifier)) {
629 auto timer = new QTimer;
630 //Drop connection after 3 seconds (which is a random value)
631 QObject::connect(timer, &QTimer::timeout, timer, [this, instanceIdentifier]() {
632 mCache.remove(instanceIdentifier);
633 });
634 timer->setInterval(3000);
635 mTimer.insert(instanceIdentifier, timer);
636 }
637 auto timer = mTimer.value(instanceIdentifier);
638 timer->start();
639 return mCache.value(instanceIdentifier);
640}
641
597} 642}
598 643
599#pragma clang diagnostic push 644#pragma clang diagnostic push