diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-02-12 18:11:48 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-02-12 18:11:48 +0100 |
commit | a9a0f53af2138cf259daa2dfee62cb3d785d00aa (patch) | |
tree | da7123bab1c73222e25b40586783ecd0a5714cf8 /common/resourceaccess.cpp | |
parent | 1240a482ab13d285d2624c33015f0f61f16d91a9 (diff) | |
download | sink-a9a0f53af2138cf259daa2dfee62cb3d785d00aa.tar.gz sink-a9a0f53af2138cf259daa2dfee62cb3d785d00aa.zip |
moved ResourceAccessFactory
Diffstat (limited to 'common/resourceaccess.cpp')
-rw-r--r-- | common/resourceaccess.cpp | 45 |
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 | ||
597 | ResourceAccessFactory &ResourceAccessFactory::instance() | ||
598 | { | ||
599 | static ResourceAccessFactory *instance = 0; | ||
600 | if (!instance) { | ||
601 | instance = new ResourceAccessFactory; | ||
602 | } | ||
603 | return *instance; | ||
604 | } | ||
605 | |||
606 | Sink::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 |