@@ -780,14 +780,14 @@ EWSPlugin::ExmdbInstance::~ExmdbInstance()
780780 * @param uname Name of creating user
781781 * @param plugin Parent plugin
782782 */
783- EWSPlugin::Subscription::Subscription (const char * uname, const EWSPlugin& plugin) :
783+ EWSPlugin::SubManager::SubManager (const char * uname, const EWSPlugin & plugin) :
784784 ews(plugin), username(uname)
785785{}
786786
787787/* *
788788 * @brief Cancel subscription
789789 */
790- EWSPlugin::Subscription ::~Subscription ()
790+ EWSPlugin::SubManager ::~SubManager ()
791791{
792792 std::lock_guard ss_lock (ews.subscriptionLock );
793793 for (const auto & subKey : subscriptions)
@@ -815,87 +815,94 @@ void EWSPlugin::event(const char* dir, BOOL, uint32_t ID, const DB_NOTIFY* notif
815815 return ;
816816 detail::SubscriptionKey subKey = it->second ;
817817 lock.unlock ();
818- sptr<Subscription> sub ;
818+ sptr<SubManager> mgr ;
819819 try {
820- sub = std::get<sptr<Subscription >>(cache.get (subKey));
820+ mgr = std::get<sptr<SubManager >>(cache.get (subKey));
821821 } catch (...) { // Key not found or type error
822822 }
823- if (!sub )
823+ if (mgr == nullptr )
824824 return ;
825- lock = std::unique_lock (sub ->lock );
825+ lock = std::unique_lock (mgr ->lock );
826826 sTimePoint now (clock::now ());
827- auto mkFid = [&](uint64_t fid){return tFolderId (mkFolderEntryId (sub->mailboxInfo , rop_util_make_eid_ex (1 , fid)).serialize ());};
828- auto mkMid = [&](uint64_t fid, uint64_t mid){return tItemId (mkMessageEntryId (sub->mailboxInfo , rop_util_make_eid_ex (1 , fid), rop_util_make_eid_ex (1 , mid)).serialize ());};
827+ auto mkFid = [&](uint64_t fid) {
828+ return tFolderId (mkFolderEntryId (mgr->mailboxInfo ,
829+ rop_util_make_eid_ex (1 , fid)).serialize ());
830+ };
831+ auto mkMid = [&](uint64_t fid, uint64_t mid) {
832+ return tItemId (mkMessageEntryId (mgr->mailboxInfo ,
833+ rop_util_make_eid_ex (1 , fid),
834+ rop_util_make_eid_ex (1 , mid)).serialize ());
835+ };
829836 switch (notification->type )
830837 {
831838 case db_notify_type::new_mail: {
832839 const DB_NOTIFY_NEW_MAIL* evt = static_cast <DB_NOTIFY_NEW_MAIL*>(notification->pdata );
833- sub ->events .emplace_back (aNewMailEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
840+ mgr ->events .emplace_back (aNewMailEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
834841 break ;
835842 }
836843 case db_notify_type::folder_created: {
837844 const DB_NOTIFY_FOLDER_CREATED* evt = static_cast <DB_NOTIFY_FOLDER_CREATED*>(notification->pdata );
838- sub ->events .emplace_back (aCreatedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id )));
845+ mgr ->events .emplace_back (aCreatedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id )));
839846 break ;
840847 }
841848 case db_notify_type::message_created: {
842849 const DB_NOTIFY_MESSAGE_CREATED* evt = static_cast <DB_NOTIFY_MESSAGE_CREATED*>(notification->pdata );
843- sub ->events .emplace_back (aCreatedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
850+ mgr ->events .emplace_back (aCreatedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
844851 break ;
845852 }
846853 case db_notify_type::folder_deleted: {
847854 const DB_NOTIFY_FOLDER_DELETED* evt = static_cast <DB_NOTIFY_FOLDER_DELETED*>(notification->pdata );
848- sub ->events .emplace_back (aDeletedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id )));
855+ mgr ->events .emplace_back (aDeletedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id )));
849856 break ;
850857 }
851858 case db_notify_type::message_deleted: {
852859 const DB_NOTIFY_MESSAGE_DELETED* evt = static_cast <DB_NOTIFY_MESSAGE_DELETED*>(notification->pdata );
853- sub ->events .emplace_back (aDeletedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
860+ mgr ->events .emplace_back (aDeletedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
854861 break ;
855862 }
856863 case db_notify_type::folder_modified: {
857864 const DB_NOTIFY_FOLDER_MODIFIED* evt = static_cast <DB_NOTIFY_FOLDER_MODIFIED*>(notification->pdata );
858- sub ->events .emplace_back (tModifiedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id )));
865+ mgr ->events .emplace_back (tModifiedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id )));
859866 break ;
860867 }
861868 case db_notify_type::message_modified: {
862869 const DB_NOTIFY_MESSAGE_MODIFIED* evt = static_cast <DB_NOTIFY_MESSAGE_MODIFIED*>(notification->pdata );
863- sub ->events .emplace_back (tModifiedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
870+ mgr ->events .emplace_back (tModifiedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id )));
864871 break ;
865872 }
866873 case db_notify_type::folder_moved: {
867874 const DB_NOTIFY_FOLDER_MVCP* evt = static_cast <DB_NOTIFY_FOLDER_MVCP*>(notification->pdata );
868- sub ->events .emplace_back (aMovedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id ), static_cast <aOldFolderId&&>(mkFid (evt->old_folder_id )),
875+ mgr ->events .emplace_back (aMovedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id ), static_cast <aOldFolderId&&>(mkFid (evt->old_folder_id )),
869876 static_cast <aOldFolderId&&>(mkFid (evt->old_parent_id ))));
870877 break ;
871878 }
872879 case db_notify_type::message_moved: {
873880 const DB_NOTIFY_MESSAGE_MVCP* evt = static_cast <DB_NOTIFY_MESSAGE_MVCP*>(notification->pdata );
874- sub ->events .emplace_back (aMovedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id ),
881+ mgr ->events .emplace_back (aMovedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id ),
875882 static_cast <aOldItemId&&>(mkMid (evt->old_folder_id , evt->old_message_id )),
876883 static_cast <aOldFolderId&&>(mkFid (evt->old_folder_id ))));
877884 break ;
878885 }
879886 case db_notify_type::folder_copied: {
880887 const DB_NOTIFY_FOLDER_MVCP* evt = static_cast <DB_NOTIFY_FOLDER_MVCP*>(notification->pdata );
881- sub ->events .emplace_back (aCopiedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id ), static_cast <aOldFolderId&&>(mkFid (evt->old_folder_id )),
888+ mgr ->events .emplace_back (aCopiedEvent (now, mkFid (evt->folder_id ), mkFid (evt->parent_id ), static_cast <aOldFolderId&&>(mkFid (evt->old_folder_id )),
882889 static_cast <aOldFolderId&&>(mkFid (evt->old_parent_id ))));
883890 break ;
884891 }
885892 case db_notify_type::message_copied: {
886893 const DB_NOTIFY_MESSAGE_MVCP* evt = static_cast <DB_NOTIFY_MESSAGE_MVCP*>(notification->pdata );
887- sub ->events .emplace_back (aCopiedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id ),
894+ mgr ->events .emplace_back (aCopiedEvent (now, mkMid (evt->folder_id , evt->message_id ), mkFid (evt->folder_id ),
888895 static_cast <aOldItemId&&>(mkMid (evt->old_folder_id , evt->old_message_id )),
889896 static_cast <aOldFolderId&&>(mkFid (evt->old_folder_id ))));
890897 break ;
891898 }
892899 default :
893900 break ;
894901 }
895- if (sub ->waitingContext )
902+ if (mgr ->waitingContext )
896903 // Reschedule next wakeup 0.1 seconds. Should be enough to gather related events.
897904 // Is still bound to the ObjectCache cleanup cycle and might take significantly longer than that.
898- cache.get (*sub ->waitingContext , std::chrono::milliseconds (100 ));
905+ cache.get (*mgr ->waitingContext , std::chrono::milliseconds (100 ));
899906} catch (const std::exception& err)
900907{mlog (LV_ERR, " [ews#evt] %s:Failed to process notification: %s" , err.what (), timestamp ().c_str ());}
901908
@@ -940,13 +947,13 @@ std::shared_ptr<EWSPlugin::ExmdbInstance> EWSPlugin::loadMessageInstance(const s
940947 */
941948bool EWSPlugin::linkSubscription (const Structures::tSubscriptionId& subscriptionId, const EWSContext& ctx) const
942949{
943- auto sub = subscription (subscriptionId.ID , subscriptionId.timeout );
944- if (!sub || sub ->username != ctx.auth_info ().username )
950+ auto mgr = get_submgr (subscriptionId.ID , subscriptionId.timeout );
951+ if (mgr == nullptr || mgr ->username != ctx.auth_info ().username )
945952 return false ;
946- std::lock_guard subLock (sub ->lock );
947- if (sub ->waitingContext )
948- unlinkSubscription (*sub ->waitingContext );
949- sub ->waitingContext = ctx.ID ();
953+ std::lock_guard subLock (mgr ->lock );
954+ if (mgr ->waitingContext )
955+ unlinkSubscription (*mgr ->waitingContext );
956+ mgr ->waitingContext = ctx.ID ();
950957 return true ;
951958}
952959
@@ -985,12 +992,13 @@ std::shared_ptr<EWSPlugin::ExmdbInstance> EWSPlugin::loadAttachmentInstance(cons
985992 *
986993 * @return Pointer to created subscription
987994 */
988- std::shared_ptr<EWSPlugin::Subscription> EWSPlugin::mksub (const Structures::tSubscriptionId& ID, const char * username) const
995+ std::shared_ptr<EWSPlugin::SubManager>
996+ EWSPlugin::make_submgr (const Structures::tSubscriptionId &ID,
997+ const char *username) const
989998{
990- using ms = std::chrono::milliseconds;
991- auto sub = std::make_shared<Subscription>(username, *this );
992- cache.emplace (ms (ID.timeout *60'000 ), ID.ID , sub);
993- return sub;
999+ auto mgr = std::make_shared<SubManager>(username, *this );
1000+ cache.emplace (std::chrono::milliseconds (ID.timeout * 60'000 ), ID.ID , mgr);
1001+ return mgr;
9941002}
9951003
9961004/* *
@@ -1026,11 +1034,11 @@ detail::ExmdbSubscriptionKey EWSPlugin::subscribe(const std::string& maildir, ui
10261034 *
10271035 * @return Pointer to subscription or nullptr if not found
10281036 */
1029- std::shared_ptr<EWSPlugin::Subscription >
1030- EWSPlugin::subscription (detail::SubscriptionKey subscriptionKey,
1037+ std::shared_ptr<EWSPlugin::SubManager >
1038+ EWSPlugin::get_submgr (detail::SubscriptionKey subscriptionKey,
10311039 uint32_t timeout) const try
10321040{
1033- return std::get<sptr<Subscription >>(cache.get (subscriptionKey,
1041+ return std::get<sptr<SubManager >>(cache.get (subscriptionKey,
10341042 std::chrono::milliseconds (timeout * 60'000 )));
10351043} catch (...) { // Key not found or type error
10361044 return nullptr ;
@@ -1082,8 +1090,8 @@ bool EWSPlugin::unsubscribe(detail::SubscriptionKey subscriptionKey,
10821090 const char *username) const try
10831091{
10841092 CacheKey key = subscriptionKey;
1085- auto subscription = std::get<sptr<Subscription >>(cache.get (key));
1086- if (subscription ->username != username)
1093+ auto mgr = std::get<sptr<SubManager >>(cache.get (key));
1094+ if (mgr ->username != username)
10871095 return false ;
10881096 cache.evict (key);
10891097 return true ;
0 commit comments