9#define RESIPROCATE_SUBSYSTEM Subsystem::DUM
79 ETagToDocumentMap::iterator eTagIt = keyIt->second.begin();
80 for (; eTagIt != keyIt->second.end();)
84 keyIt->second.erase(eTagIt++);
88 invokeOnInitialSyncDocument(connectionId, eTagIt->second.mEventType, eTagIt->second.mDocumentKey, eTagIt->second.mETag, eTagIt->second.mExpirationTime, eTagIt->second.mLastUpdated, eTagIt->second.mContents.get(), eTagIt->second.mSecurityAttributes.get());
94 if (keyIt->second.empty())
116 ETagToDocumentMap::iterator eTagIt = keyIt->second.find(document.
mETag);
117 if (eTagIt != keyIt->second.end())
125 auto contentsForOnDocumentModified = document.
mContents;
136 if (eTagIt->second.mExpirationTime == 0 ||
137 eTagIt->second.mExpirationTime < now)
139 contentsForOnDocumentModified = eTagIt->second.mContents;
140 securityAttributesForOnDocumentModified = eTagIt->second.mSecurityAttributes;
142 const auto contents = eTagIt->second.mContents;
143 const auto securityAttributes = eTagIt->second.mSecurityAttributes;
144 eTagIt->second = document;
146 eTagIt->second.mSecurityAttributes = securityAttributes;
150 eTagIt->second = document;
179 KeyToETagMap::iterator keyIt =
mPublicationDb.find(eventType + documentKey);
183 ETagToDocumentMap::iterator eTagIt = keyIt->second.find(eTag);
184 if (eTagIt != keyIt->second.end())
188 if (!syncPublication || (lastUpdated > eTagIt->second.mLastUpdated))
194 eTagIt->second.mExpirationTime = 0;
200 keyIt->second.erase(eTagIt);
207 if (keyIt->second.empty())
223 KeyToETagMap::iterator keyIt =
mPublicationDb.find(eventType + documentKey);
229 ETagToDocumentMap::iterator eTagIt = keyIt->second.begin();
230 for (; eTagIt != keyIt->second.end(); )
235 if (eTagIt->second.mExpirationTime > now && eTagIt->second.mContents)
237 merger.
mergeETag(destination, eTagIt->second.mContents.get(), isFirst);
245 keyIt->second.erase(eTagIt++);
247 if (keyIt->second.empty())
269 KeyToETagMap::iterator keyIt =
mPublicationDb.find(eventType + documentKey);
273 ETagToDocumentMap::iterator eTagIt = keyIt->second.find(eTag);
274 if (eTagIt != keyIt->second.end())
299 KeyToETagMap::iterator keyIt =
mPublicationDb.find(eventType + documentKey);
303 ETagToDocumentMap::iterator eTagIt = keyIt->second.find(eTag);
304 if (eTagIt != keyIt->second.end())
306 if (eTagIt->second.mExpirationTime >= now &&
307 (lastUpdated == 0 || lastUpdated == eTagIt->second.mLastUpdated))
309 DebugLog(<<
"InMemorySyncPubDb::checkExpired: found expired publication, docKey=" << documentKey <<
", tag=" << eTag);
310 bool syncPublication = eTagIt->second.mSyncPublication;
315 eTagIt->second.mExpirationTime = 0;
316 eTagIt->second.mLastUpdated = now;
321 keyIt->second.erase(eTagIt);
323 if (keyIt->second.empty())
364 (*it)->onDocumentModified(sync, eventType, documentKey, eTag, expirationTime, lastUpdated, contents, securityAttributes);
379 (*it)->onDocumentRemoved(sync, eventType, documentKey, eTag, lastUpdated);
394 (*it)->onInitialSyncDocument(connectionId, eventType, documentKey, eTag, expirationTime, lastUpdated, contents, securityAttributes);
Base class for all SIP body types.
An alternative to std::string, encapsulates an arbitrary buffer of bytes.
virtual KeyToETagMap & getDocuments()
bool shouldEraseDocument(PubDocument &document, uint64_t now)
virtual void unlockDocuments()
void invokeOnDocumentRemoved(bool sync, const Data &eventType, const Data &documentKey, const Data &eTag, uint64_t lastUpdated)
void invokeOnInitialSyncDocument(unsigned int connectionId, const Data &eventType, const Data &documentKey, const Data &eTag, uint64_t expirationTime, uint64_t lastUpdated, const Contents *contents, const SecurityAttributes *securityAttributes)
virtual bool checkExpired(const Data &eventType, const Data &documentKey, const Data &eTag, uint64_t lastUpdated)
virtual void lockDocuments()
virtual bool documentExists(const Data &eventType, const Data &documentKey, const Data &eTag)
KeyToETagMap mPublicationDb
virtual void addUpdateDocument(const PubDocument &document)
virtual void initialSync(unsigned int connectionId)
void invokeOnDocumentModified(bool sync, const Data &eventType, const Data &documentKey, const Data &eTag, uint64_t expirationTime, uint64_t lastUpdated, const Contents *contents, const SecurityAttributes *securityAttributes)
virtual void addHandler(InMemorySyncPubDbHandler *handler)
virtual bool removeDocument(const Data &eventType, const Data &documentKey, const Data &eTag, uint64_t lastUpdated, bool syncPublication=false)
InMemorySyncPubDb(bool syncEnabled=false)
virtual void removeHandler(InMemorySyncPubDbHandler *handler)
virtual bool getMergedETags(const Data &eventType, const Data &documentKey, ETagMerger &merger, Contents *destination)
virtual bool mergeETag(Contents *eTagDest, Contents *eTagSrc, bool isFirst)=0
std::map< resip::Data, ETagToDocumentMap > KeyToETagMap
static uint64_t getTimeSecs()
Returns the current clock time in seconds.
This file is used to handle compatibility fixes/tweaks so reSIProcate can function on multiple platfo...
dcm! – add UnusedChecking(_enum) below;
std::unique_lock< Mutex > Lock
A convenience class to lock a Lockable (such as a Mutex) on object creation, and unlock on destructio...
unsigned long long uint64_t
const _Tp & resipMax(const _Tp &__a, const _Tp &__b)
std::shared_ptr< SecurityAttributes > mSecurityAttributes
std::shared_ptr< Contents > mContents