Skip to content

Commit ac724ea

Browse files
committed
ews: give EWSPlugin::Subscription class a better name
1 parent 310d6f5 commit ac724ea

File tree

3 files changed

+63
-61
lines changed

3 files changed

+63
-61
lines changed

exch/ews/context.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -700,13 +700,13 @@ std::string EWSContext::getDir(const sFolderSpec& folder) const
700700
*/
701701
std::pair<std::list<sNotificationEvent>, bool> EWSContext::getEvents(const tSubscriptionId& subscriptionId) const
702702
{
703-
auto subscription = m_plugin.subscription(subscriptionId.ID, subscriptionId.timeout);
704-
if(!subscription)
703+
auto mgr = m_plugin.get_submgr(subscriptionId.ID, subscriptionId.timeout);
704+
if (mgr == nullptr)
705705
throw EWSError::InvalidSubscription(E3202);
706-
if(subscription->username != m_auth_info.username)
706+
if (mgr->username != m_auth_info.username)
707707
throw EWSError::AccessDenied(E3203);
708-
std::pair<std::list<sNotificationEvent>, bool> result{{}, subscription->events.size() > 50};
709-
auto& evt = subscription->events;
708+
std::pair<std::list<sNotificationEvent>, bool> result{{}, mgr->events.size() > 50};
709+
auto &evt = mgr->events;
710710
if(result.second) {
711711
auto it = evt.begin();
712712
std::advance(it, 50);
@@ -2135,16 +2135,16 @@ void EWSContext::updated(const std::string& dir, const sFolderSpec& folder) cons
21352135
tSubscriptionId EWSContext::subscribe(const std::vector<sFolderId>& folderIds, uint16_t eventMask, bool all, uint32_t timeout) const
21362136
{
21372137
tSubscriptionId subscriptionId(timeout);
2138-
auto subscription = m_plugin.mksub(subscriptionId, m_auth_info.username);
2138+
auto mgr = m_plugin.make_submgr(subscriptionId, m_auth_info.username);
21392139
if(folderIds.empty()) {
2140-
subscription->mailboxInfo = getMailboxInfo(m_auth_info.maildir, false);
2140+
mgr->mailboxInfo = getMailboxInfo(m_auth_info.maildir, false);
21412141
detail::ExmdbSubscriptionKey key =
21422142
m_plugin.subscribe(m_auth_info.maildir, eventMask, true, rop_util_make_eid_ex(1, PRIVATE_FID_IPMSUBTREE),
21432143
subscriptionId.ID);
2144-
subscription->subscriptions.emplace_back(key);
2144+
mgr->subscriptions.emplace_back(key);
21452145
return subscriptionId;
21462146
}
2147-
subscription->subscriptions.reserve(folderIds.size());
2147+
mgr->subscriptions.reserve(folderIds.size());
21482148
std::string target;
21492149
std::string maildir;
21502150
for(const sFolderId& f : folderIds) {
@@ -2154,12 +2154,12 @@ tSubscriptionId EWSContext::subscribe(const std::vector<sFolderId>& folderIds, u
21542154
if(target.empty()) {
21552155
target = *folderspec.target;
21562156
maildir = get_maildir(*folderspec.target);
2157-
subscription->mailboxInfo = getMailboxInfo(maildir, folderspec.location == folderspec.PUBLIC);
2157+
mgr->mailboxInfo = getMailboxInfo(maildir, folderspec.location == folderspec.PUBLIC);
21582158
} else if(target != *folderspec.target)
21592159
throw EWSError::InvalidSubscriptionRequest(E3200);
21602160
if(!(permissions(maildir, folderspec.folderId) & frightsReadAny))
21612161
continue; // TODO: proper error handling
2162-
subscription->subscriptions.emplace_back(m_plugin.subscribe(maildir, eventMask, all, folderspec.folderId,
2162+
mgr->subscriptions.emplace_back(m_plugin.subscribe(maildir, eventMask, all, folderspec.folderId,
21632163
subscriptionId.ID));
21642164
}
21652165
return subscriptionId;

exch/ews/ews.cpp

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
941948
bool 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;

exch/ews/ews.hpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,10 @@ class EWSPlugin {
139139
/**
140140
* @brief Subscription management struct
141141
*/
142-
struct Subscription
143-
{
144-
Subscription(const char*, const EWSPlugin&);
145-
Subscription(const Subscription&) = delete;
146-
Subscription(Subscription&&) = delete;
147-
148-
Subscription& operator=(const Subscription&) = delete;
149-
Subscription& operator=(Subscription&&) = delete;
142+
struct SubManager {
143+
SubManager(const char *, const EWSPlugin &);
144+
~SubManager();
145+
NOMOVE(SubManager);
150146

151147
const EWSPlugin& ews; ///< Parent plugin
152148
std::string username; ///< Name of the user who created the subscription
@@ -155,8 +151,6 @@ class EWSPlugin {
155151
std::vector<detail::ExmdbSubscriptionKey> subscriptions; ///< Exmdb subscription keys
156152
std::list<Structures::sNotificationEvent> events; ///< Events that occured since last check
157153
std::optional<int> waitingContext; ///< ID of context waiting for events
158-
159-
~Subscription();
160154
};
161155

162156
void event(const char*, BOOL, uint32_t, const DB_NOTIFY*) const;
@@ -166,9 +160,9 @@ class EWSPlugin {
166160
std::shared_ptr<ExmdbInstance> loadMessageInstance(const std::string&, uint64_t, uint64_t) const;
167161
Structures::sFolderEntryId mkFolderEntryId(const Structures::sMailboxInfo&, uint64_t) const;
168162
Structures::sMessageEntryId mkMessageEntryId(const Structures::sMailboxInfo&, uint64_t, uint64_t) const;
169-
std::shared_ptr<Subscription> mksub(const Structures::tSubscriptionId&, const char*) const;
163+
std::shared_ptr<SubManager> make_submgr(const Structures::tSubscriptionId &, const char *) const;
170164
detail::ExmdbSubscriptionKey subscribe(const std::string&, uint16_t, bool, uint64_t, detail::SubscriptionKey) const;
171-
std::shared_ptr<Subscription> subscription(detail::SubscriptionKey, uint32_t) const;
165+
std::shared_ptr<SubManager> get_submgr(detail::SubscriptionKey, uint32_t) const;
172166
std::string timestamp() const;
173167
void unlinkSubscription(int) const;
174168
bool unsubscribe(detail::SubscriptionKey, const char*) const;
@@ -207,7 +201,7 @@ class EWSPlugin {
207201
};
208202

209203
using CacheKey = std::variant<detail::AttachmentInstanceKey, detail::MessageInstanceKey, detail::SubscriptionKey, detail::ContextWakeupKey, detail::EmbeddedInstanceKey>;
210-
using CacheObj = std::variant<sptr<ExmdbInstance>, sptr<Subscription>, sptr<WakeupNotify>>;
204+
using CacheObj = std::variant<sptr<ExmdbInstance>, sptr<SubManager>, sptr<WakeupNotify>>;
211205

212206
static const std::unordered_map<std::string, Handler> requestMap;
213207

0 commit comments

Comments
 (0)