From 4c779851d4dd3a8b3c3ccf9daa95ca592b24621d Mon Sep 17 00:00:00 2001 From: Pawel Kaczmarczyk Date: Mon, 20 Nov 2017 11:39:32 +0100 Subject: [PATCH] [Messaging] Refactor singleton managers into instance's fields to prevent crash Callback could be called even after MessagingInstance object was destroyed. [Verification] Passrate didn't change Change-Id: I3ac0db270f9f7a07613a9bd53e18f3b954952944 Signed-off-by: Pawel Kaczmarczyk --- src/messaging/DBus/MessageProxy.cpp | 15 ++-- src/messaging/DBus/MessageProxy.h | 6 +- src/messaging/DBus/SendProxy.cpp | 11 +-- src/messaging/DBus/SendProxy.h | 6 +- src/messaging/callback_user_data.cc | 16 ++++- src/messaging/callback_user_data.h | 9 ++- src/messaging/change_listener_container.cc | 2 - src/messaging/conversation_callback_data.cc | 3 +- src/messaging/conversation_callback_data.h | 3 +- .../conversations_change_callback.cc | 5 +- src/messaging/conversations_change_callback.h | 3 +- src/messaging/email_manager.cc | 45 ++++++------ src/messaging/email_manager.h | 10 ++- src/messaging/find_msg_callback_user_data.cc | 5 +- src/messaging/find_msg_callback_user_data.h | 2 +- src/messaging/folders_change_callback.cc | 4 +- src/messaging/folders_change_callback.h | 3 +- src/messaging/message.cc | 6 +- src/messaging/message.h | 3 +- src/messaging/message_callback_user_data.cc | 5 +- src/messaging/message_callback_user_data.h | 2 +- src/messaging/message_service.cc | 24 ++++--- src/messaging/message_service.h | 11 +-- src/messaging/message_service_email.cc | 42 +++++------ src/messaging/message_service_email.h | 7 +- src/messaging/message_service_short_msg.cc | 17 ++--- src/messaging/message_service_short_msg.h | 6 +- src/messaging/message_storage_email.cc | 15 ++-- src/messaging/message_storage_short_msg.cc | 12 ++-- src/messaging/messages_callback_user_data.cc | 3 +- src/messaging/messages_callback_user_data.h | 3 +- src/messaging/messages_change_callback.cc | 4 +- src/messaging/messages_change_callback.h | 3 +- src/messaging/messaging_extension.cc | 5 +- src/messaging/messaging_instance.cc | 71 +++++++++++-------- src/messaging/messaging_instance.h | 6 ++ src/messaging/messaging_manager.cc | 12 ++-- src/messaging/messaging_util.cc | 7 +- src/messaging/messaging_util.h | 3 +- src/messaging/short_message_manager.cc | 53 +++++++------- src/messaging/short_message_manager.h | 15 ++-- 41 files changed, 273 insertions(+), 210 deletions(-) mode change 100755 => 100644 src/messaging/callback_user_data.cc mode change 100755 => 100644 src/messaging/callback_user_data.h diff --git a/src/messaging/DBus/MessageProxy.cpp b/src/messaging/DBus/MessageProxy.cpp index 7cc1653d..30e17b5f 100644 --- a/src/messaging/DBus/MessageProxy.cpp +++ b/src/messaging/DBus/MessageProxy.cpp @@ -31,10 +31,11 @@ namespace DBus { using namespace common; -MessageProxy::MessageProxy() +MessageProxy::MessageProxy(EmailManager& manager) : common::dbus::Proxy(kDBusPathEmailStorageChange, kDBusIfaceEmailStorageChange, kDBusNameSignalEmail, kDBusPathEmailStorageChange, - kDBusIfaceEmailStorageChange) { + kDBusIfaceEmailStorageChange), + email_manager_(manager) { ScopeLogger(); } @@ -42,9 +43,9 @@ MessageProxy::~MessageProxy() { ScopeLogger(); } -PlatformResult MessageProxy::create(MessageProxyPtr* message_proxy) { +PlatformResult MessageProxy::create(EmailManager& manager, MessageProxyPtr* message_proxy) { ScopeLogger(); - message_proxy->reset(new MessageProxy()); + message_proxy->reset(new MessageProxy(manager)); if ((*message_proxy)->isNotProxyGot()) { message_proxy->reset(); return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Could not get proxy"); @@ -129,7 +130,7 @@ PlatformResult MessageProxy::handleEmailEvent(int account_id, int mail_id, int t } } - email_mail_data_t* mail_data = EmailManager::getInstance().loadMessage(mail_id); + email_mail_data_t* mail_data = email_manager_.loadMessage(mail_id); if (mail_data == NULL) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Failed to load email"); } @@ -170,7 +171,7 @@ PlatformResult MessageProxy::handleEmailEvent(int account_id, int mail_id, int t delete eventMsg; delete eventConv; - EmailManager::getInstance().freeMessage(mail_data); + email_manager_.freeMessage(mail_data); } else { LoggerD("Listener not registered just ignore"); } @@ -226,7 +227,7 @@ void MessageProxy::notifyEmailManager(const std::string& idsString, LoggerD("Mail id list is empty."); return; } - EmailManager::getInstance().removeStatusCallback(ids, status); + email_manager_.removeStatusCallback(ids, status); } void MessageProxy::handleThreadRemoveEvent(int account_id, int thread_id) { diff --git a/src/messaging/DBus/MessageProxy.h b/src/messaging/DBus/MessageProxy.h index 6006117e..4089fcdd 100644 --- a/src/messaging/DBus/MessageProxy.h +++ b/src/messaging/DBus/MessageProxy.h @@ -30,6 +30,7 @@ namespace extension { namespace messaging { +class EmailManager; namespace DBus { class MessageProxy; @@ -38,10 +39,10 @@ typedef std::shared_ptr MessageProxyPtr; class MessageProxy : public common::dbus::Proxy { public: virtual ~MessageProxy(); - static common::PlatformResult create(MessageProxyPtr *message_proxy); + static common::PlatformResult create(EmailManager &manager, MessageProxyPtr *message_proxy); protected: - MessageProxy(); + MessageProxy(EmailManager &manager); virtual void signalCallback(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters); @@ -57,6 +58,7 @@ class MessageProxy : public common::dbus::Proxy { void notifyEmailManager(const std::string &idsString, email_noti_on_storage_event status); void handleThreadRemoveEvent(int account_id, int thread_id); common::PlatformResult handleMailboxEvent(int account_id, int mailbox_id, int event); + EmailManager &email_manager_; }; } // namespace DBus diff --git a/src/messaging/DBus/SendProxy.cpp b/src/messaging/DBus/SendProxy.cpp index 0e8dc8e7..f2a57ef6 100644 --- a/src/messaging/DBus/SendProxy.cpp +++ b/src/messaging/DBus/SendProxy.cpp @@ -29,7 +29,8 @@ namespace DBus { using namespace common; -SendProxy::SendProxy() : EmailSignalProxy(kDBusPathNetworkStatus, kDBusIfaceNetworkStatus) { +SendProxy::SendProxy(EmailManager& manager) + : EmailSignalProxy(kDBusPathNetworkStatus, kDBusIfaceNetworkStatus), email_manager_(manager) { ScopeLogger(); } @@ -37,9 +38,9 @@ SendProxy::~SendProxy() { ScopeLogger(); } -PlatformResult SendProxy::create(SendProxyPtr* send_proxy) { +PlatformResult SendProxy::create(EmailManager& manager, SendProxyPtr* send_proxy) { ScopeLogger(); - send_proxy->reset(new SendProxy()); + send_proxy->reset(new SendProxy(manager)); if ((*send_proxy)->isNotProxyGot()) { send_proxy->reset(); return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Could not get send proxy"); @@ -59,8 +60,8 @@ void SendProxy::handleEmailSignal(const int status, const int account_id, const "received email signal with:\n status: %d\n account_id: %d\n " "source: %s\n mail_id: %d\n error_code: %d", status, account_id, source.c_str(), mail_id, error_code); - EmailManager::getInstance().sendStatusCallback( - mail_id, static_cast(status), error_code); + email_manager_.sendStatusCallback(mail_id, static_cast(status), + error_code); break; default: LoggerD("Unrecognized status %d, ignoring", status); diff --git a/src/messaging/DBus/SendProxy.h b/src/messaging/DBus/SendProxy.h index e9f211b7..8e327162 100644 --- a/src/messaging/DBus/SendProxy.h +++ b/src/messaging/DBus/SendProxy.h @@ -23,6 +23,7 @@ namespace extension { namespace messaging { +class EmailManager; namespace DBus { class SendProxy; @@ -31,12 +32,13 @@ typedef std::shared_ptr SendProxyPtr; class SendProxy : public EmailSignalProxy { public: virtual ~SendProxy(); - static common::PlatformResult create(SendProxyPtr* send_proxy); + static common::PlatformResult create(EmailManager& manager, SendProxyPtr* send_proxy); protected: - SendProxy(); + SendProxy(EmailManager& manager); virtual void handleEmailSignal(const int status, const int account_id, const std::string& source, const int op_handle, const int error_code); + EmailManager& email_manager_; }; } // DBus diff --git a/src/messaging/callback_user_data.cc b/src/messaging/callback_user_data.cc old mode 100755 new mode 100644 index dfe796ae..e29ba89a --- a/src/messaging/callback_user_data.cc +++ b/src/messaging/callback_user_data.cc @@ -19,18 +19,22 @@ #include "common/logger.h" #include "common/tools.h" +#include "messaging_instance.h" + using common::tools::ReportSuccess; using common::tools::ReportError; namespace extension { namespace messaging { -CallbackUserData::CallbackUserData(PostQueue& queue, long cid, bool keep /* = false */) +CallbackUserData::CallbackUserData(PostQueue& queue, long cid, MessagingInstance& instance, + bool keep /* = false */) : json_(picojson::object()), obj_(json_.get()), cid_(cid), queue_(queue), - result_(common::ErrorCode::NO_ERROR) { + result_(common::ErrorCode::NO_ERROR), + instance_(instance) { ScopeLogger(); if (!keep) { // this is not listener, add callbackId @@ -101,5 +105,13 @@ void CallbackUserData::AddJsonData(const char* key, const picojson::value& value obj_[key] = value; } +EmailManager& CallbackUserData::getEmailManager() { + return instance_.getEmailManager(); +} + +ShortMsgManager& CallbackUserData::getShortMsgManager() { + return instance_.getShortMsgManager(); +} + } // messaging } // extension diff --git a/src/messaging/callback_user_data.h b/src/messaging/callback_user_data.h old mode 100755 new mode 100644 index 6f72c83e..a51aea9b --- a/src/messaging/callback_user_data.h +++ b/src/messaging/callback_user_data.h @@ -26,9 +26,12 @@ namespace extension { namespace messaging { +class EmailManager; +class ShortMsgManager; + class CallbackUserData { public: - CallbackUserData(PostQueue& queue, long cid, bool keep = false); + CallbackUserData(PostQueue& queue, long cid, MessagingInstance& instance, bool keep = false); virtual ~CallbackUserData(); bool IsError() const; @@ -42,6 +45,9 @@ class CallbackUserData { void AddAndPost(PostPriority p); bool HasQueue(const PostQueue& q) const; + EmailManager& getEmailManager(); + ShortMsgManager& getShortMsgManager(); + private: void AddJsonData(const char* key, const picojson::value& value); @@ -50,6 +56,7 @@ class CallbackUserData { long cid_; PostQueue& queue_; common::PlatformResult result_; + MessagingInstance& instance_; }; } // messaging diff --git a/src/messaging/change_listener_container.cc b/src/messaging/change_listener_container.cc index e201c8fc..b0824460 100644 --- a/src/messaging/change_listener_container.cc +++ b/src/messaging/change_listener_container.cc @@ -211,8 +211,6 @@ ChangeListenerContainer::ChangeListeners::ListenerGroup::Get 0) { - instance.m_slot_size = slot_size; + m_slot_size = slot_size; } - PlatformResult ret = DBus::SyncProxy::create( - DBus::kDBusPathNetworkStatus, DBus::kDBusIfaceNetworkStatus, &instance.m_proxy_sync); + PlatformResult ret = DBus::SyncProxy::create(DBus::kDBusPathNetworkStatus, + DBus::kDBusIfaceNetworkStatus, &m_proxy_sync); CHECK_ERROR(ret, "create sync proxy failed"); - if (!instance.m_proxy_sync) { + if (!m_proxy_sync) { LoggerE("Sync proxy is null"); return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Sync proxy is null"); } - instance.m_proxy_sync->signalSubscribe(); + m_proxy_sync->signalSubscribe(); ret = DBus::LoadBodyProxy::create(DBus::kDBusPathNetworkStatus, DBus::kDBusIfaceNetworkStatus, - &instance.m_proxy_load_body); + &m_proxy_load_body); CHECK_ERROR(ret, "create load body proxy failed"); - if (!instance.m_proxy_load_body) { + if (!m_proxy_load_body) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Load body proxy is null"); } - instance.m_proxy_load_body->signalSubscribe(); + m_proxy_load_body->signalSubscribe(); // ret = DBus::LoadAttachmentProxy::create(DBus::Proxy::DBUS_PATH_NETWORK_STATUS, // DBus::Proxy::DBUS_IFACE_NETWORK_STATUS, @@ -141,21 +134,21 @@ PlatformResult EmailManager::InitializeEmailService() { // } // m_proxy_load_attachment->signalSubscribe(); - ret = DBus::MessageProxy::create(&instance.m_proxy_messageStorage); + ret = DBus::MessageProxy::create(*this, &m_proxy_messageStorage); CHECK_ERROR(ret, "create message proxy failed"); - if (!instance.m_proxy_messageStorage) { + if (!m_proxy_messageStorage) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Message proxy is null"); } - instance.m_proxy_messageStorage->signalSubscribe(); + m_proxy_messageStorage->signalSubscribe(); - ret = DBus::SendProxy::create(&instance.m_proxy_send); + ret = DBus::SendProxy::create(*this, &m_proxy_send); CHECK_ERROR(ret, "create send proxy failed"); - if (!instance.m_proxy_send) { + if (!m_proxy_send) { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Send proxy is null"); } - instance.m_proxy_send->signalSubscribe(); + m_proxy_send->signalSubscribe(); - instance.m_is_initialized = true; + m_is_initialized = true; } return PlatformResult(ErrorCode::NO_ERROR); @@ -1123,6 +1116,10 @@ PlatformResult EmailManager::FindConversationsPlatform(ConversationCallbackData* std::shared_ptr conversation; PlatformResult ret = MessageConversation::convertEmailConversationToObject( conversationsInfo.at(i).id, &conversation); + if (ret.IsError()) { + LoggerE("%d (%s)", ret.error_code(), (ret.message()).c_str()); + return ret; + } conversation->setUnreadMessages(conversationsInfo.at(i).unreadMessages); callback->addConversation(conversation); } diff --git a/src/messaging/email_manager.h b/src/messaging/email_manager.h index e6e8c1d0..a591e1d4 100644 --- a/src/messaging/email_manager.h +++ b/src/messaging/email_manager.h @@ -57,8 +57,10 @@ class MessageBodyCallbackData; class EmailManager { public: - static EmailManager& getInstance(); - static common::PlatformResult InitializeEmailService(); + EmailManager(); + virtual ~EmailManager(); + + common::PlatformResult InitializeEmailService(); void addDraftMessage(MessageCallbackUserData* callback); void removeMessages(MessagesCallbackUserData* callback); @@ -94,10 +96,6 @@ class EmailManager { long getUniqueOpId(); private: - EmailManager(); - EmailManager(const EmailManager&); - void operator=(const EmailManager&); - virtual ~EmailManager(); common::PlatformResult addDraftMessagePlatform(int account_id, std::shared_ptr message); common::PlatformResult addOutboxMessagePlatform(int account_id, std::shared_ptr message); common::PlatformResult addMessagePlatform(int account_id, std::shared_ptr message, diff --git a/src/messaging/find_msg_callback_user_data.cc b/src/messaging/find_msg_callback_user_data.cc index 2b309a2a..f09e223b 100644 --- a/src/messaging/find_msg_callback_user_data.cc +++ b/src/messaging/find_msg_callback_user_data.cc @@ -23,8 +23,9 @@ namespace extension { namespace messaging { -FindMsgCallbackUserData::FindMsgCallbackUserData(PostQueue& queue, long cid) - : CallbackUserData(queue, cid), +FindMsgCallbackUserData::FindMsgCallbackUserData(PostQueue& queue, long cid, + MessagingInstance& instance) + : CallbackUserData(queue, cid, instance), m_limit(0), m_offset(0), m_account_id(0), diff --git a/src/messaging/find_msg_callback_user_data.h b/src/messaging/find_msg_callback_user_data.h index da7f194c..8445653c 100644 --- a/src/messaging/find_msg_callback_user_data.h +++ b/src/messaging/find_msg_callback_user_data.h @@ -40,7 +40,7 @@ class Message; class FindMsgCallbackUserData : public CallbackUserData { public: - FindMsgCallbackUserData(PostQueue& queue, long cid); + FindMsgCallbackUserData(PostQueue& queue, long cid, MessagingInstance& instance); virtual ~FindMsgCallbackUserData(); void setFilter(AbstractFilterPtr filter); diff --git a/src/messaging/folders_change_callback.cc b/src/messaging/folders_change_callback.cc index 59c159ba..6ceda0b2 100644 --- a/src/messaging/folders_change_callback.cc +++ b/src/messaging/folders_change_callback.cc @@ -28,8 +28,8 @@ const char* FOLDERSUPDATED = "foldersupdated"; const char* FOLDERSREMOVED = "foldersremoved"; FoldersChangeCallback::FoldersChangeCallback(long cid, int service_id, MessageType service_type, - PostQueue& queue) - : m_callback_data(queue, cid, true), + PostQueue& queue, MessagingInstance& instance) + : m_callback_data(queue, cid, instance, true), m_id(service_id), m_msg_type(service_type), m_is_act(true) { diff --git a/src/messaging/folders_change_callback.h b/src/messaging/folders_change_callback.h index f6649a08..1b870ec6 100644 --- a/src/messaging/folders_change_callback.h +++ b/src/messaging/folders_change_callback.h @@ -37,7 +37,8 @@ class FoldersChangeCallback { public: typedef void (FoldersChangeCallback::*Signature)(const FolderPtrVector& conversations); - FoldersChangeCallback(long cid, int service_id, MessageType service_type, PostQueue& queue); + FoldersChangeCallback(long cid, int service_id, MessageType service_type, PostQueue& queue, + MessagingInstance& instance); virtual ~FoldersChangeCallback(); void added(const FolderPtrVector& folders); diff --git a/src/messaging/message.cc b/src/messaging/message.cc index a171c9a2..d439357f 100644 --- a/src/messaging/message.cc +++ b/src/messaging/message.cc @@ -29,6 +29,7 @@ #include "message_email.h" #include "message_mms.h" #include "message_sms.h" +#include "messaging_instance.h" #include "messaging_util.h" #include "short_message_manager.h" @@ -1476,10 +1477,11 @@ PlatformResult Message::convertPlatformShortMessageToObject(msg_struct_t msg, return PlatformResult(ErrorCode::NO_ERROR); } -PlatformResult Message::findShortMessageById(const int id, MessagePtr* message) { +PlatformResult Message::findShortMessageById(const int id, MessagingInstance& instance, + MessagePtr* message) { ScopeLogger(); msg_struct_t msg; - PlatformResult ret = ShortMsgManager::getInstance().getMessage(id, &msg); + PlatformResult ret = instance.getShortMsgManager().getMessage(id, &msg); if (ret.IsError()) { return ret; } diff --git a/src/messaging/message.h b/src/messaging/message.h index 87578ead..c4c5c15f 100644 --- a/src/messaging/message.h +++ b/src/messaging/message.h @@ -145,7 +145,8 @@ class Message : public FilterableObject { // function for filling Message attributes static common::PlatformResult convertPlatformShortMessageToObject(msg_struct_t msg, Message** message); - static common::PlatformResult findShortMessageById(const int id, MessagePtr* message); + static common::PlatformResult findShortMessageById(const int id, MessagingInstance& instance, + MessagePtr* message); static common::PlatformResult addMMSBodyAndAttachmentsToStruct(const AttachmentPtrVector& attach, msg_struct_t& mms_struct, Message* message); diff --git a/src/messaging/message_callback_user_data.cc b/src/messaging/message_callback_user_data.cc index bb6f1b97..d00c46b0 100644 --- a/src/messaging/message_callback_user_data.cc +++ b/src/messaging/message_callback_user_data.cc @@ -20,8 +20,9 @@ namespace extension { namespace messaging { -MessageCallbackUserData::MessageCallbackUserData(PostQueue& queue, long cid) - : CallbackUserData(queue, cid), m_account_id(0) { +MessageCallbackUserData::MessageCallbackUserData(PostQueue& queue, long cid, + MessagingInstance& instance) + : CallbackUserData(queue, cid, instance), m_account_id(0) { ScopeLogger(); } diff --git a/src/messaging/message_callback_user_data.h b/src/messaging/message_callback_user_data.h index c1f7c1a5..5360f930 100644 --- a/src/messaging/message_callback_user_data.h +++ b/src/messaging/message_callback_user_data.h @@ -31,7 +31,7 @@ class PostQueue; class MessageCallbackUserData : public CallbackUserData { public: - MessageCallbackUserData(PostQueue& queue, long cid); + MessageCallbackUserData(PostQueue& queue, long cid, MessagingInstance& instance); virtual ~MessageCallbackUserData(); void setMessage(std::shared_ptr message); diff --git a/src/messaging/message_service.cc b/src/messaging/message_service.cc index aa922a52..6f683e67 100644 --- a/src/messaging/message_service.cc +++ b/src/messaging/message_service.cc @@ -41,8 +41,9 @@ const char* JSON_SERVICE_NAME = "name"; //#################### MessageRecipientsCallbackData #################### -MessageRecipientsCallbackData::MessageRecipientsCallbackData(PostQueue& queue, long cid) - : CallbackUserData(queue, cid), +MessageRecipientsCallbackData::MessageRecipientsCallbackData(PostQueue& queue, long cid, + MessagingInstance& instance) + : CallbackUserData(queue, cid, instance), m_account_id(-1), m_sim_index(TAPI_NETWORK_DEFAULT_DATA_SUBS_UNKNOWN), m_default_sim_index(TAPI_NETWORK_DEFAULT_DATA_SUBS_UNKNOWN) { @@ -122,8 +123,9 @@ TelNetworkDefaultDataSubs_t MessageRecipientsCallbackData::getDefaultSimIndex() //#################### BaseMessageServiceCallbackData #################### -BaseMessageServiceCallbackData::BaseMessageServiceCallbackData(PostQueue& queue, long cid) - : CallbackUserData(queue, cid), m_op_handle(-1) { +BaseMessageServiceCallbackData::BaseMessageServiceCallbackData(PostQueue& queue, long cid, + MessagingInstance& instance) + : CallbackUserData(queue, cid, instance), m_op_handle(-1) { ScopeLogger(); } @@ -155,8 +157,9 @@ std::shared_ptr MessageBodyCallbackData::getMessage() const { //#################### MessageAttachmentCallbackData #################### -MessageAttachmentCallbackData::MessageAttachmentCallbackData(PostQueue& queue, long cid) - : BaseMessageServiceCallbackData(queue, cid), m_nth(0) { +MessageAttachmentCallbackData::MessageAttachmentCallbackData(PostQueue& queue, long cid, + MessagingInstance& instance) + : BaseMessageServiceCallbackData(queue, cid, instance), m_nth(0) { ScopeLogger(); } @@ -183,8 +186,8 @@ int MessageAttachmentCallbackData::getNth() const { //#################### SyncCallbackData #################### -SyncCallbackData::SyncCallbackData(PostQueue& queue, long cid) - : BaseMessageServiceCallbackData(queue, cid), +SyncCallbackData::SyncCallbackData(PostQueue& queue, long cid, MessagingInstance& instance) + : BaseMessageServiceCallbackData(queue, cid, instance), m_is_limit(false), m_limit(0), m_op_id(-1), @@ -241,8 +244,9 @@ std::shared_ptr SyncFolderCallbackData::getMessageFolder() const //#################### MessageService #################### -MessageService::MessageService(int id, MessageType msgType, const std::string& name) - : m_id(id), m_msg_type(msgType), m_name(name) { +MessageService::MessageService(int id, MessageType msgType, const std::string& name, + MessagingInstance& instance) + : m_id(id), m_msg_type(msgType), m_name(name), instance_(instance) { ScopeLogger(); switch (msgType) { case MessageType::SMS: diff --git a/src/messaging/message_service.h b/src/messaging/message_service.h index e0e888e8..ca16baf8 100644 --- a/src/messaging/message_service.h +++ b/src/messaging/message_service.h @@ -36,7 +36,7 @@ enum MessageServiceAccountId { UNKNOWN_ACCOUNT_ID = 0, SMS_ACCOUNT_ID = 101, MMS class MessageRecipientsCallbackData : public CallbackUserData { public: - MessageRecipientsCallbackData(PostQueue& queue, long cid); + MessageRecipientsCallbackData(PostQueue& queue, long cid, MessagingInstance& instance); virtual ~MessageRecipientsCallbackData(); void setMessage(std::shared_ptr message); @@ -64,7 +64,7 @@ class MessageRecipientsCallbackData : public CallbackUserData { class BaseMessageServiceCallbackData : public CallbackUserData { public: - BaseMessageServiceCallbackData(PostQueue& queue, long cid); + BaseMessageServiceCallbackData(PostQueue& queue, long cid, MessagingInstance& instance); virtual ~BaseMessageServiceCallbackData(); /** @@ -96,7 +96,7 @@ class MessageBodyCallbackData : public BaseMessageServiceCallbackData { class MessageAttachmentCallbackData : public BaseMessageServiceCallbackData { public: - MessageAttachmentCallbackData(PostQueue& queue, long cid); + MessageAttachmentCallbackData(PostQueue& queue, long cid, MessagingInstance& instance); virtual ~MessageAttachmentCallbackData(); void setMessageAttachment(std::shared_ptr messageAttachment); @@ -119,7 +119,7 @@ class MessageAttachmentCallbackData : public BaseMessageServiceCallbackData { class SyncCallbackData : public BaseMessageServiceCallbackData { public: - SyncCallbackData(PostQueue& queue, long cid); + SyncCallbackData(PostQueue& queue, long cid, MessagingInstance& instance); virtual ~SyncCallbackData(); void setLimit(const unsigned long limit); @@ -177,12 +177,13 @@ class MessageService { * We have child classes MessageServiceEmail and MessageServiceShortMsg which * should provide specialized implementation. */ - MessageService(int id, MessageType msgType, const std::string& name); + MessageService(int id, MessageType msgType, const std::string& name, MessagingInstance& instance); int m_id; MessageType m_msg_type; std::string m_name; MessageStoragePtr m_storage; + MessagingInstance& instance_; }; } // messaging diff --git a/src/messaging/message_service_email.cc b/src/messaging/message_service_email.cc index 09b941e7..9a8a8748 100644 --- a/src/messaging/message_service_email.cc +++ b/src/messaging/message_service_email.cc @@ -16,6 +16,7 @@ #include "message_service_email.h" #include "email_manager.h" +#include "messaging_instance.h" #include "common/logger.h" @@ -25,8 +26,8 @@ using common::PlatformResult; namespace extension { namespace messaging { -MessageServiceEmail::MessageServiceEmail(int id, std::string name) - : MessageService(id, MessageType::EMAIL, name) { +MessageServiceEmail::MessageServiceEmail(int id, std::string name, MessagingInstance& instance) + : MessageService(id, MessageType::EMAIL, name, instance) { ScopeLogger(); } @@ -36,15 +37,14 @@ MessageServiceEmail::~MessageServiceEmail() { for (auto id : registered_callbacks_) { // this may internally fail, because we don't have information about // callbacks which already have fired - EmailManager::getInstance().RemoveSyncCallback(id); + instance_.getEmailManager().RemoveSyncCallback(id); } } static gboolean sendMessageTask(void* data) { ScopeLogger(); - - auto ret = - EmailManager::getInstance().sendMessage(static_cast(data)); + MessageRecipientsCallbackData* callback = static_cast(data); + auto ret = callback->getEmailManager().sendMessage(callback); if (!ret) { LoggerE("Error: %d - %s", ret.error_code(), ret.message().c_str()); @@ -73,8 +73,8 @@ PlatformResult MessageServiceEmail::sendMessage(MessageRecipientsCallbackData* c static gboolean loadMessageBodyTask(void* data) { ScopeLogger(); - - EmailManager::getInstance().loadMessageBody(static_cast(data)); + MessageBodyCallbackData* callback = static_cast(data); + callback->getEmailManager().loadMessageBody(callback); return FALSE; } @@ -113,7 +113,7 @@ static gboolean loadMessageAttachmentTask(void* data) { delete callback; callback = nullptr; } else { - const auto ret = EmailManager::getInstance().loadMessageAttachment(callback); + const auto ret = callback->getEmailManager().loadMessageAttachment(callback); if (!ret) { LoggerE("Error: %d - %s", ret.error_code(), ret.message().c_str()); @@ -138,8 +138,8 @@ PlatformResult MessageServiceEmail::loadMessageAttachment(MessageAttachmentCallb static gboolean syncTask(void* data) { ScopeLogger(); - - EmailManager::getInstance().sync(data); + SyncCallbackData* callback = static_cast(data); + callback->getEmailManager().sync(data); return FALSE; } @@ -151,7 +151,7 @@ PlatformResult MessageServiceEmail::sync(SyncCallbackData* callback, long* opera return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Callback is null"); } - long op_id = EmailManager::getInstance().getUniqueOpId(); + long op_id = callback->getEmailManager().getUniqueOpId(); callback->setOpId(op_id); guint id = g_idle_add(syncTask, static_cast(callback)); @@ -166,8 +166,8 @@ PlatformResult MessageServiceEmail::sync(SyncCallbackData* callback, long* opera static gboolean syncFolderTask(void* data) { ScopeLogger(); - - EmailManager::getInstance().syncFolder(static_cast(data)); + SyncFolderCallbackData* callback = static_cast(data); + callback->getEmailManager().syncFolder(callback); return FALSE; } @@ -184,7 +184,7 @@ PlatformResult MessageServiceEmail::syncFolder(SyncFolderCallbackData* callback, return LogAndCreateResult(ErrorCode::TYPE_MISMATCH_ERR, "Message folder is null"); } - long op_id = EmailManager::getInstance().getUniqueOpId(); + long op_id = callback->getEmailManager().getUniqueOpId(); callback->setOpId(op_id); guint id = g_idle_add(syncFolderTask, callback); @@ -205,11 +205,11 @@ static gboolean stopSyncTask(void* data) { return FALSE; } - const long op_id = *(static_cast(data)); - delete static_cast(data); - data = NULL; - EmailManager::getInstance().stopSync(op_id); - + StopSyncData* callback = static_cast(data); + long op_id = callback->op_id; + callback->instance.getEmailManager().stopSync(op_id); + delete callback; + callback = nullptr; return FALSE; } @@ -217,7 +217,7 @@ PlatformResult MessageServiceEmail::stopSync(long op_id) { ScopeLogger(); registered_callbacks_.erase(op_id); - long* data = new long(op_id); + StopSyncData* data = new StopSyncData{op_id, instance_}; guint id = g_idle_add(stopSyncTask, static_cast(data)); if (!id) { diff --git a/src/messaging/message_service_email.h b/src/messaging/message_service_email.h index 8d14bb7b..e1691109 100644 --- a/src/messaging/message_service_email.h +++ b/src/messaging/message_service_email.h @@ -24,9 +24,14 @@ namespace extension { namespace messaging { +struct StopSyncData { + long op_id; + MessagingInstance& instance; +}; + class MessageServiceEmail : public MessageService { public: - MessageServiceEmail(int id, std::string name); + MessageServiceEmail(int id, std::string name, MessagingInstance& instance); virtual ~MessageServiceEmail(); virtual common::PlatformResult sendMessage(MessageRecipientsCallbackData* callback); diff --git a/src/messaging/message_service_short_msg.cc b/src/messaging/message_service_short_msg.cc index 78db7058..a5ca744a 100644 --- a/src/messaging/message_service_short_msg.cc +++ b/src/messaging/message_service_short_msg.cc @@ -37,8 +37,9 @@ using common::PlatformResult; namespace extension { namespace messaging { -MessageServiceShortMsg::MessageServiceShortMsg(int id, MessageType msgType) - : MessageService(id, msgType, MessagingUtil::messageTypeToString(msgType)) { +MessageServiceShortMsg::MessageServiceShortMsg(int id, MessageType msgType, + MessagingInstance& instance) + : MessageService(id, msgType, MessagingUtil::messageTypeToString(msgType), instance) { ScopeLogger(); } @@ -49,8 +50,8 @@ MessageServiceShortMsg::~MessageServiceShortMsg() { static gboolean sendMessageThread(void* data) { ScopeLogger(); - auto ret = - ShortMsgManager::getInstance().sendMessage(static_cast(data)); + MessageRecipientsCallbackData* callback = static_cast(data); + auto ret = callback->getShortMsgManager().sendMessage(callback); if (!ret) { LoggerE("Error: %d - %s", ret.error_code(), ret.message().c_str()); @@ -150,16 +151,16 @@ PlatformResult MessageServiceShortMsg::loadMessageBody(MessageBodyCallbackData* return PlatformResult(ErrorCode::NO_ERROR); } -MessageServiceShortMsg* MessageServiceShortMsg::GetMmsMessageService() { +MessageServiceShortMsg* MessageServiceShortMsg::GetMmsMessageService(MessagingInstance& instance) { ScopeLogger(); return new (std::nothrow) - MessageServiceShortMsg(MessageServiceAccountId::MMS_ACCOUNT_ID, MessageType::MMS); + MessageServiceShortMsg(MessageServiceAccountId::MMS_ACCOUNT_ID, MessageType::MMS, instance); } -MessageServiceShortMsg* MessageServiceShortMsg::GetSmsMessageService() { +MessageServiceShortMsg* MessageServiceShortMsg::GetSmsMessageService(MessagingInstance& instance) { ScopeLogger(); return new (std::nothrow) - MessageServiceShortMsg(MessageServiceAccountId::SMS_ACCOUNT_ID, MessageType::SMS); + MessageServiceShortMsg(MessageServiceAccountId::SMS_ACCOUNT_ID, MessageType::SMS, instance); } } // namespace messaging diff --git a/src/messaging/message_service_short_msg.h b/src/messaging/message_service_short_msg.h index d1ad5f2d..a18c40a8 100644 --- a/src/messaging/message_service_short_msg.h +++ b/src/messaging/message_service_short_msg.h @@ -31,11 +31,11 @@ class MessageServiceShortMsg : public MessageService { virtual common::PlatformResult loadMessageBody(MessageBodyCallbackData* callback); - static MessageServiceShortMsg* GetMmsMessageService(); - static MessageServiceShortMsg* GetSmsMessageService(); + static MessageServiceShortMsg* GetMmsMessageService(MessagingInstance& instance); + static MessageServiceShortMsg* GetSmsMessageService(MessagingInstance& instance); protected: - MessageServiceShortMsg(int id, MessageType msgType); + MessageServiceShortMsg(int id, MessageType msgType, MessagingInstance& instance); }; } // namespace messaging diff --git a/src/messaging/message_storage_email.cc b/src/messaging/message_storage_email.cc index 87e670c7..fc5bfa00 100644 --- a/src/messaging/message_storage_email.cc +++ b/src/messaging/message_storage_email.cc @@ -22,6 +22,7 @@ #include "email_manager.h" #include "message.h" +#include "messaging_instance.h" namespace extension { namespace messaging { @@ -38,7 +39,7 @@ static gboolean addDraftMessageTask(void* data) { ScopeLogger(); MessageCallbackUserData* callback = static_cast(data); - EmailManager::getInstance().addDraftMessage(callback); + callback->getEmailManager().addDraftMessage(callback); return FALSE; } @@ -65,7 +66,7 @@ static gboolean removeMessagesTask(void* data) { ScopeLogger(); MessagesCallbackUserData* callback = static_cast(data); - EmailManager::getInstance().removeMessages(callback); + callback->getEmailManager().removeMessages(callback); return FALSE; } @@ -92,7 +93,7 @@ static gboolean updateMessagesTask(void* data) { ScopeLogger(); MessagesCallbackUserData* callback = static_cast(data); - EmailManager::getInstance().updateMessages(callback); + callback->getEmailManager().updateMessages(callback); return FALSE; } @@ -118,7 +119,7 @@ static gboolean findMessagesTask(void* data) { ScopeLogger(); FindMsgCallbackUserData* callback = static_cast(data); - EmailManager::getInstance().findMessages(callback); + callback->getEmailManager().findMessages(callback); return FALSE; } @@ -146,7 +147,7 @@ static gboolean findConversationsTask(void* data) { ScopeLogger(); ConversationCallbackData* callback = static_cast(data); - EmailManager::getInstance().findConversations(callback); + callback->getEmailManager().findConversations(callback); return FALSE; } @@ -173,7 +174,7 @@ static gboolean removeConversationsTask(void* data) { ScopeLogger(); ConversationCallbackData* callback = static_cast(data); - EmailManager::getInstance().removeConversations(callback); + callback->getEmailManager().removeConversations(callback); return FALSE; } @@ -200,7 +201,7 @@ static gboolean findFoldersTask(void* data) { ScopeLogger(); FoldersCallbackData* callback = static_cast(data); - EmailManager::getInstance().findFolders(callback); + callback->getEmailManager().findFolders(callback); return FALSE; } diff --git a/src/messaging/message_storage_short_msg.cc b/src/messaging/message_storage_short_msg.cc index 335b1899..2c1e4727 100644 --- a/src/messaging/message_storage_short_msg.cc +++ b/src/messaging/message_storage_short_msg.cc @@ -39,7 +39,7 @@ static gboolean addDraftMessageTask(void* data) { ScopeLogger(); MessageCallbackUserData* callback = static_cast(data); - ShortMsgManager::getInstance().addDraftMessage(callback); + callback->getShortMsgManager().addDraftMessage(callback); return false; } @@ -64,7 +64,7 @@ static gboolean removeMessagesTask(void* data) { ScopeLogger(); MessagesCallbackUserData* callback = static_cast(data); - ShortMsgManager::getInstance().removeMessages(callback); + callback->getShortMsgManager().removeMessages(callback); return false; } @@ -91,7 +91,7 @@ static gboolean updateMessagesTask(void* data) { ScopeLogger(); MessagesCallbackUserData* callback = static_cast(data); - ShortMsgManager::getInstance().updateMessages(callback); + callback->getShortMsgManager().updateMessages(callback); return false; } @@ -118,7 +118,7 @@ static gboolean findMessagesTask(void* data) { ScopeLogger(); FindMsgCallbackUserData* callback = static_cast(data); - ShortMsgManager::getInstance().findMessages(callback); + callback->getShortMsgManager().findMessages(callback); return false; } @@ -145,7 +145,7 @@ static gboolean findConversationsTask(void* data) { ScopeLogger(); ConversationCallbackData* callback = static_cast(data); - ShortMsgManager::getInstance().findConversations(callback); + callback->getShortMsgManager().findConversations(callback); return false; } @@ -172,7 +172,7 @@ static gboolean removeConversationsTask(void* data) { ScopeLogger(); ConversationCallbackData* callback = static_cast(data); - ShortMsgManager::getInstance().removeConversations(callback); + callback->getShortMsgManager().removeConversations(callback); return false; } diff --git a/src/messaging/messages_callback_user_data.cc b/src/messaging/messages_callback_user_data.cc index ef74d62e..b8474680 100644 --- a/src/messaging/messages_callback_user_data.cc +++ b/src/messaging/messages_callback_user_data.cc @@ -20,8 +20,9 @@ namespace extension { namespace messaging { MessagesCallbackUserData::MessagesCallbackUserData(PostQueue& queue, long cid, + MessagingInstance& instance, bool keep /* = false*/) - : CallbackUserData(queue, cid, keep), m_service_type(UNDEFINED) { + : CallbackUserData(queue, cid, instance, keep), m_service_type(UNDEFINED) { ScopeLogger(); } diff --git a/src/messaging/messages_callback_user_data.h b/src/messaging/messages_callback_user_data.h index e59b1007..4869ccee 100644 --- a/src/messaging/messages_callback_user_data.h +++ b/src/messaging/messages_callback_user_data.h @@ -32,7 +32,8 @@ class Message; class MessagesCallbackUserData : public CallbackUserData { public: - MessagesCallbackUserData(PostQueue& queue, long cid, bool keep = false); + MessagesCallbackUserData(PostQueue& queue, long cid, MessagingInstance& instance, + bool keep = false); virtual ~MessagesCallbackUserData(); void addMessage(std::shared_ptr msg); diff --git a/src/messaging/messages_change_callback.cc b/src/messaging/messages_change_callback.cc index d262a425..d476d9c5 100644 --- a/src/messaging/messages_change_callback.cc +++ b/src/messaging/messages_change_callback.cc @@ -47,8 +47,8 @@ const char* MESSAGESUPDATED = "messagesupdated"; const char* MESSAGESREMOVED = "messagesremoved"; MessagesChangeCallback::MessagesChangeCallback(long cid, int service_id, MessageType service_type, - PostQueue& queue) - : m_callback_data(queue, cid, true), + PostQueue& queue, MessagingInstance& instance) + : m_callback_data(queue, cid, instance, true), m_service_id(service_id), m_msg_type(service_type), m_is_act(true) { diff --git a/src/messaging/messages_change_callback.h b/src/messaging/messages_change_callback.h index 64343cbf..fe721be7 100644 --- a/src/messaging/messages_change_callback.h +++ b/src/messaging/messages_change_callback.h @@ -38,7 +38,8 @@ class MessagesChangeCallback { public: typedef void (MessagesChangeCallback::*Signature)(const MessagePtrVector& conversations); - MessagesChangeCallback(long cid, int service_id, MessageType service_type, PostQueue& queue); + MessagesChangeCallback(long cid, int service_id, MessageType service_type, PostQueue& queue, + MessagingInstance& instance); virtual ~MessagesChangeCallback(); void added(const MessagePtrVector& messages); diff --git a/src/messaging/messaging_extension.cc b/src/messaging/messaging_extension.cc index caefca7e..97e5e9a7 100644 --- a/src/messaging/messaging_extension.cc +++ b/src/messaging/messaging_extension.cc @@ -47,10 +47,11 @@ MessagingExtension::~MessagingExtension() { common::Instance* MessagingExtension::CreateInstance() { ScopeLogger(); - PlatformResult ret = extension::messaging::EmailManager::InitializeEmailService(); + extension::messaging::MessagingInstance* instance = new extension::messaging::MessagingInstance(); + PlatformResult ret = instance->getEmailManager().InitializeEmailService(); if (ret.IsError()) { LoggerE("Initializing the email service failed (%s)", ret.message().c_str()); return nullptr; } - return new extension::messaging::MessagingInstance(); + return static_cast(instance); } diff --git a/src/messaging/messaging_instance.cc b/src/messaging/messaging_instance.cc index 1446c731..2cf41a50 100644 --- a/src/messaging/messaging_instance.cc +++ b/src/messaging/messaging_instance.cc @@ -174,6 +174,14 @@ MessagingInstance::~MessagingInstance() { return; \ } +EmailManager& MessagingInstance::getEmailManager() { + return email_manager_; +} + +ShortMsgManager& MessagingInstance::getShortMsgManager() { + return short_msg_manager_; +} + void MessagingInstance::GetMessageServices(const picojson::value& args, picojson::object& out) { ScopeLogger(); @@ -202,12 +210,13 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, obj[JSON_CALLBACK_ID] = picojson::value(callbackId); std::shared_ptr message; - PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message); + PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message, *this); if (ret.IsError()) { POST_AND_RETURN(ret, json, obj) } - MessageRecipientsCallbackData* callback = new MessageRecipientsCallbackData(queue_, callbackId); + MessageRecipientsCallbackData* callback = + new MessageRecipientsCallbackData(queue_, callbackId, *this); long simIndex = 0; int serviceId = 0; @@ -256,12 +265,12 @@ void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& arg obj[JSON_CALLBACK_ID] = picojson::value(callbackId); std::shared_ptr message; - PlatformResult ret = MessagingUtil::jsonToMessage(json_message, &message); + PlatformResult ret = MessagingUtil::jsonToMessage(json_message, &message, *this); if (ret.IsError()) { POST_AND_RETURN(ret, json, obj) } - MessageBodyCallbackData* callback = new MessageBodyCallbackData(queue_, callbackId); + MessageBodyCallbackData* callback = new MessageBodyCallbackData(queue_, callbackId, *this); callback->setMessage(message); @@ -284,7 +293,8 @@ void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::valu picojson::value attachment = data.at(LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT); const double callbackId = args.get(JSON_CALLBACK_ID).get(); - MessageAttachmentCallbackData* callback = new MessageAttachmentCallbackData(queue_, callbackId); + MessageAttachmentCallbackData* callback = + new MessageAttachmentCallbackData(queue_, callbackId, *this); callback->setMessageAttachment(MessagingUtil::jsonToMessageAttachment(attachment)); callback->AddToQueue(); @@ -322,7 +332,7 @@ void MessagingInstance::MessageServiceSync(const picojson::value& args, picojson limit = static_cast(v_limit.get()); } - SyncCallbackData* callback = new SyncCallbackData(queue_, callbackId); + SyncCallbackData* callback = new SyncCallbackData(queue_, callbackId, *this); callback->setAccountId(id); callback->setLimit(limit); @@ -365,7 +375,7 @@ void MessagingInstance::MessageServiceSyncFolder(const picojson::value& args, limit = static_cast(v_limit.get()); } - SyncFolderCallbackData* callback = new SyncFolderCallbackData(queue_, callbackId); + SyncFolderCallbackData* callback = new SyncFolderCallbackData(queue_, callbackId, *this); callback->setAccountId(id); callback->setMessageFolder(MessagingUtil::jsonToMessageFolder(v_folder)); callback->setLimit(limit); @@ -432,12 +442,12 @@ void MessagingInstance::MessageStorageAddDraft(const picojson::value& args, pico obj[JSON_CALLBACK_ID] = picojson::value(callbackId); std::shared_ptr message; - PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message); + PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message, *this); if (ret.IsError()) { POST_AND_RETURN(ret, json, obj) } - MessageCallbackUserData* callback = new MessageCallbackUserData(queue_, callbackId); + MessageCallbackUserData* callback = new MessageCallbackUserData(queue_, callbackId, *this); callback->setMessage(message); int serviceId = getServiceIdFromJSON(data); @@ -478,7 +488,7 @@ void MessagingInstance::MessageStorageFindMessages(const picojson::value& args, int serviceId = getServiceIdFromJSON(data); auto storage = manager_.getMessageService(serviceId)->getMsgStorage(); - FindMsgCallbackUserData* callback = new FindMsgCallbackUserData(queue_, callbackId); + FindMsgCallbackUserData* callback = new FindMsgCallbackUserData(queue_, callbackId, *this); callback->setFilter(filter); callback->setLimit(limit); callback->setOffset(offset); @@ -500,11 +510,11 @@ void MessagingInstance::MessageStorageRemoveMessages(const picojson::value& args picojson::array messages = data.at(REMOVE_MESSAGES_ARGS_MESSAGES).get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); - MessagesCallbackUserData* callback = new MessagesCallbackUserData(queue_, callbackId); + MessagesCallbackUserData* callback = new MessagesCallbackUserData(queue_, callbackId, *this); - auto each = [callback](picojson::value& v) -> void { + auto each = [callback, this](picojson::value& v) -> void { std::shared_ptr message; - PlatformResult ret = MessagingUtil::jsonToMessage(v, &message); + PlatformResult ret = MessagingUtil::jsonToMessage(v, &message, *this); if (ret.IsSuccess()) { callback->addMessage(message); } @@ -530,15 +540,16 @@ void MessagingInstance::MessageStorageUpdateMessages(const picojson::value& args auto pico_array = pico_messages.get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); - auto callback = new MessagesCallbackUserData(queue_, callbackId); + auto callback = new MessagesCallbackUserData(queue_, callbackId, *this); - std::for_each(pico_array.begin(), pico_array.end(), [&callback](picojson::value& v) -> void { - std::shared_ptr message; - PlatformResult ret = MessagingUtil::jsonToMessage(v, &message); - if (ret.IsSuccess()) { - callback->addMessage(message); - } - }); + std::for_each(pico_array.begin(), pico_array.end(), + [&callback, this](picojson::value& v) -> void { + std::shared_ptr message; + PlatformResult ret = MessagingUtil::jsonToMessage(v, &message, *this); + if (ret.IsSuccess()) { + callback->addMessage(message); + } + }); auto service = manager_.getMessageService(getServiceIdFromJSON(data)); @@ -573,7 +584,7 @@ void MessagingInstance::MessageStorageFindConversations(const picojson::value& a int serviceId = getServiceIdFromJSON(data); - ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId); + ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId, *this); callback->setFilter(filter); callback->setLimit(limit); callback->setOffset(offset); @@ -601,7 +612,7 @@ void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& picojson::object& obj = json->get(); obj[JSON_CALLBACK_ID] = picojson::value(callbackId); - ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId); + ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId, *this); PlatformResult ret(ErrorCode::NO_ERROR); for (auto it = conversations.begin(); it != conversations.end(); ++it) { @@ -640,7 +651,7 @@ void MessagingInstance::MessageStorageFindFolders(const picojson::value& args, POST_AND_RETURN(ret, json, obj) } - FoldersCallbackData* callback = new FoldersCallbackData(queue_, callbackId); + FoldersCallbackData* callback = new FoldersCallbackData(queue_, callbackId, *this); callback->setFilter(filter); callback->AddToQueue(); @@ -667,8 +678,8 @@ void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson:: auto service = manager_.getMessageService(serviceId); - std::shared_ptr callback( - new MessagesChangeCallback(kDumbCallbackId, serviceId, service->getMsgServiceType(), queue_)); + std::shared_ptr callback(new MessagesChangeCallback( + kDumbCallbackId, serviceId, service->getMsgServiceType(), queue_, *this)); callback->setFilter(filter); @@ -698,7 +709,7 @@ void MessagingInstance::MessageStorageAddConversationsChangeListener(const picoj auto service = manager_.getMessageService(serviceId); std::shared_ptr callback(new ConversationsChangeCallback( - static_cast(-1), serviceId, service->getMsgServiceType(), queue_)); + static_cast(-1), serviceId, service->getMsgServiceType(), queue_, *this)); callback->setFilter(filter); @@ -728,7 +739,7 @@ void MessagingInstance::MessageStorageAddFolderChangeListener(const picojson::va auto service = manager_.getMessageService(serviceId); std::shared_ptr callback(new FoldersChangeCallback( - static_cast(-1), serviceId, service->getMsgServiceType(), queue_)); + static_cast(-1), serviceId, service->getMsgServiceType(), queue_, *this)); callback->setFilter(filter); @@ -764,9 +775,9 @@ void MessagingInstance::MessageGetMessageStatus(const picojson::value& args, std::string status; if (FUN_MESSAGE_MESSAGING_EMAIL == type) { - status = EmailManager::getInstance().getMessageStatus(id); + status = email_manager_.getMessageStatus(id); } else { - status = ShortMsgManager::getInstance().getMessageStatus(id); + status = short_msg_manager_.getMessageStatus(id); } ReportSuccess(picojson::value(status), out); diff --git a/src/messaging/messaging_instance.h b/src/messaging/messaging_instance.h index 531af888..d5ff5d75 100644 --- a/src/messaging/messaging_instance.h +++ b/src/messaging/messaging_instance.h @@ -19,8 +19,10 @@ #include "common/extension.h" +#include "email_manager.h" #include "messaging_manager.h" #include "messaging_util.h" +#include "short_message_manager.h" namespace extension { namespace messaging { @@ -29,6 +31,8 @@ class MessagingInstance : public common::ParsedInstance { public: MessagingInstance(); virtual ~MessagingInstance(); + EmailManager& getEmailManager(); + ShortMsgManager& getShortMsgManager(); private: void GetMessageServices(const picojson::value& args, picojson::object& out); @@ -55,6 +59,8 @@ class MessagingInstance : public common::ParsedInstance { void MessageGetMessageStatus(const picojson::value& args, picojson::object& out); MessagingManager manager_; + ShortMsgManager short_msg_manager_; + EmailManager email_manager_; PostQueue queue_; }; diff --git a/src/messaging/messaging_manager.cc b/src/messaging/messaging_manager.cc index 3016ff94..dbb4f4c5 100644 --- a/src/messaging/messaging_manager.cc +++ b/src/messaging/messaging_manager.cc @@ -61,7 +61,7 @@ MessagingManager::MessagingManager(MessagingInstance& instance) : instance_(inst if (ret != MSG_SUCCESS) { LoggerE("Cannot get message handle: %d", ret); } else { - ShortMsgManager::getInstance().registerStatusCallback(m_msg_handle); + instance.getShortMsgManager().registerStatusCallback(m_msg_handle); } m_sms_service = std::make_pair(UNDEFINED_MESSAGE_SERVICE, nullptr); @@ -113,7 +113,8 @@ static void* getMsgServicesThread(const std::shared_ptr& delete user_data->sms_service->second; } - MessageService* service = MessageServiceShortMsg::GetSmsMessageService(); + MessageService* service = + MessageServiceShortMsg::GetSmsMessageService(user_data->instance_); if (!service) { platform_result = LogAndCreateResult(ErrorCode::UNKNOWN_ERR, @@ -138,7 +139,8 @@ static void* getMsgServicesThread(const std::shared_ptr& delete user_data->mms_service->second; } - MessageService* service = MessageServiceShortMsg::GetMmsMessageService(); + MessageService* service = + MessageServiceShortMsg::GetMmsMessageService(user_data->instance_); if (!service) { platform_result = LogAndCreateResult(ErrorCode::UNKNOWN_ERR, @@ -180,8 +182,8 @@ static void* getMsgServicesThread(const std::shared_ptr& LoggerD("Account[%d/%d] id: %d, name: %s", i, count, email_accounts[i].account_id, name.c_str()); - MessageService* service = new (std::nothrow) - MessageServiceEmail(email_accounts[i].account_id, name.c_str()); + MessageService* service = new (std::nothrow) MessageServiceEmail( + email_accounts[i].account_id, name.c_str(), user_data->instance_); if (!service) { LoggerD("message service[%d] is NULL", i); std::for_each(msgServices.begin(), msgServices.end(), diff --git a/src/messaging/messaging_util.cc b/src/messaging/messaging_util.cc index 6385c433..d919911c 100644 --- a/src/messaging/messaging_util.cc +++ b/src/messaging/messaging_util.cc @@ -674,7 +674,8 @@ picojson::value MessagingUtil::folderToJson(std::shared_ptr folde } PlatformResult MessagingUtil::jsonToMessage(const picojson::value& json, - std::shared_ptr* result_message) { + std::shared_ptr* result_message, + MessagingInstance& instance) { ScopeLogger(); std::shared_ptr message; picojson::object data = json.get(); @@ -700,7 +701,7 @@ PlatformResult MessagingUtil::jsonToMessage(const picojson::value& json, } else { std::string mid = data.at(MESSAGE_ATTRIBUTE_ID).get(); int message_id = std::atoi(mid.c_str()); - platform_result = Message::findShortMessageById(message_id, &message); + platform_result = Message::findShortMessageById(message_id, instance, &message); if (!platform_result) return platform_result; } break; @@ -1143,7 +1144,7 @@ PostQueue::PostQueue(MessagingInstance& instance) : instance_(instance) { PostQueue::~PostQueue() { ScopeLogger("this: [%p]", this); - EmailManager::getInstance().RemoveCallbacksByQueue(*this); + instance_.getEmailManager().RemoveCallbacksByQueue(*this); } void PostQueue::addAndResolve(const long cid, PostPriority priority, const std::string& json) { diff --git a/src/messaging/messaging_util.h b/src/messaging/messaging_util.h index bbd89268..7ccd031a 100644 --- a/src/messaging/messaging_util.h +++ b/src/messaging/messaging_util.h @@ -128,7 +128,8 @@ class MessagingUtil { static picojson::value conversationToJson(std::shared_ptr conversation); static picojson::value folderToJson(std::shared_ptr folder); static common::PlatformResult jsonToMessage(const picojson::value& json, - std::shared_ptr* result); + std::shared_ptr* result, + MessagingInstance& instance); static std::shared_ptr jsonToMessageBody(const picojson::value& json); static std::shared_ptr jsonToMessageFolder(const picojson::value& json); static tizen::SortModePtr jsonToSortMode(const picojson::object& json); diff --git a/src/messaging/short_message_manager.cc b/src/messaging/short_message_manager.cc index 8bc5468d..6007a592 100644 --- a/src/messaging/short_message_manager.cc +++ b/src/messaging/short_message_manager.cc @@ -39,13 +39,6 @@ using common::PlatformResult; namespace extension { namespace messaging { -ShortMsgManager& ShortMsgManager::getInstance() { - ScopeLogger(); - - static ShortMsgManager instance; - return instance; -} - static gboolean sendMessageCompleteCB(void* data) { ScopeLogger("callback:%p", data); @@ -390,13 +383,15 @@ void ShortMsgManager::sendStatusCallback(msg_struct_t sent_status) { static void sent_status_cb(msg_handle_t handle, msg_struct_t sent_status, void* data) { ScopeLogger(); - ShortMsgManager::getInstance().sendStatusCallback(sent_status); + ShortMsgManager* short_msg_manager = static_cast(data); + short_msg_manager->sendStatusCallback(sent_status); return; } -PlatformResult ShortMsgManager::callProperEventMessages( - EventMessages* event, msg_storage_change_type_t storageChangeType) { +PlatformResult ShortMsgManager::callProperEventMessages(EventMessages* event, + msg_storage_change_type_t storageChangeType, + ShortMsgManager* shortMsgManager) { ScopeLogger( "event.items.size()=%d event.removed_conversations.size()=%d" " sChangeType:%d", @@ -410,7 +405,7 @@ PlatformResult ShortMsgManager::callProperEventMessages( eventConv->items = event->removed_conversations; } else { PlatformResult ret = ShortMsgManager::getConversationsForMessages( - event->items, storageChangeType, &(eventConv->items)); + event->items, storageChangeType, &(eventConv->items), shortMsgManager); if (ret.IsError()) { LoggerD("Error while getting conversations for message"); delete event; @@ -513,21 +508,23 @@ void ShortMsgManager::storage_change_cb(msg_handle_t handle, eventMMS->service_type = MessageType::MMS; eventMMS->service_id = MMS_ACCOUNT_ID; + ShortMsgManager* short_msg_manager = static_cast(data); + if (MSG_STORAGE_CHANGE_DELETE == storageChangeType) { - ShortMsgManager& msg_manager = ShortMsgManager::getInstance(); - std::lock_guard lock(msg_manager.m_mutex); + std::lock_guard lock(short_msg_manager->m_mutex); std::map* rem_msgs[2] = { // Recently removed messages - &msg_manager.m_sms_removed_messages, &msg_manager.m_mms_removed_messages}; + &short_msg_manager->m_sms_removed_messages, &short_msg_manager->m_mms_removed_messages}; std::map* rem_convs[2] = {// Recently removed conversations - &msg_manager.m_sms_removed_msg_id_conv_id_map, - &msg_manager.m_mms_removed_msg_id_conv_id_map}; + &short_msg_manager->m_sms_removed_msg_id_conv_id_map, + &short_msg_manager->m_mms_removed_msg_id_conv_id_map}; EventMessages* dest_event[2] = {// SMS/MMS EventMessage to be propagated eventSMS, eventMMS}; - std::map* conv_map[2] = {// Map conversationId - object - &msg_manager.m_sms_removed_conv_id_object_map, - &msg_manager.m_mms_removed_conv_id_object_map}; + std::map* conv_map[2] = { + // Map conversationId - object + &short_msg_manager->m_sms_removed_conv_id_object_map, + &short_msg_manager->m_mms_removed_conv_id_object_map}; for (int event_i = 0; event_i < 2; ++event_i) { std::map& cur_rem_msgs = *(rem_msgs[event_i]); @@ -590,7 +587,7 @@ void ShortMsgManager::storage_change_cb(msg_handle_t handle, PlatformResult ret(ErrorCode::NO_ERROR); for (int i = 0; i < pMsgIdList->nCount; ++i) { msg_struct_t msg; - ret = ShortMsgManager::getInstance().getMessage(pMsgIdList->msgIdList[i], &msg); + ret = short_msg_manager->getMessage(pMsgIdList->msgIdList[i], &msg); if (ret.IsError() || NULL == msg) { LoggerE("Failed to load short message"); delete eventSMS; @@ -632,7 +629,8 @@ void ShortMsgManager::storage_change_cb(msg_handle_t handle, } if (!eventSMS->items.empty() || !eventSMS->removed_conversations.empty()) { - PlatformResult ret = ShortMsgManager::callProperEventMessages(eventSMS, storageChangeType); + PlatformResult ret = + ShortMsgManager::callProperEventMessages(eventSMS, storageChangeType, short_msg_manager); // PlatformResult could be ignored here. eventSMS is deleted in callProperEventMessages() } else { LoggerD("No SMS messages, not triggering eventSMS"); @@ -640,7 +638,8 @@ void ShortMsgManager::storage_change_cb(msg_handle_t handle, eventSMS = NULL; } if (!eventMMS->items.empty() || !eventMMS->removed_conversations.empty()) { - PlatformResult ret = ShortMsgManager::callProperEventMessages(eventMMS, storageChangeType); + PlatformResult ret = + ShortMsgManager::callProperEventMessages(eventMMS, storageChangeType, short_msg_manager); // PlatformResult could be ignored here. eventMMS is deleted in callProperEventMessages() } else { LoggerD("No MMS messages, not triggering eventMMS"); @@ -653,10 +652,12 @@ void ShortMsgManager::registerStatusCallback(msg_handle_t msg_handle) { ScopeLogger(); m_msg_handle = msg_handle; // set message sent status callback - if (MSG_SUCCESS != msg_reg_sent_status_callback(m_msg_handle, &sent_status_cb, NULL)) { + if (MSG_SUCCESS != + msg_reg_sent_status_callback(m_msg_handle, &sent_status_cb, static_cast(this))) { LoggerE("sent status callback register error!!!"); } - if (MSG_SUCCESS != msg_reg_storage_change_callback(m_msg_handle, &storage_change_cb, NULL)) { + if (MSG_SUCCESS != + msg_reg_storage_change_callback(m_msg_handle, &storage_change_cb, static_cast(this))) { LoggerE("storage change callback register error!"); } } @@ -847,7 +848,7 @@ PlatformResult ShortMsgManager::getMessage(int msg_id, msg_struct_t* out_msg) { PlatformResult ShortMsgManager::getConversationsForMessages( MessagePtrVector messages, msg_storage_change_type_t storageChangeType, - ConversationPtrVector* result) { + ConversationPtrVector* result, ShortMsgManager* shortMsgManager) { ScopeLogger("messages.size()=%d storageChangeType=%d", messages.size(), storageChangeType); std::unordered_set unique_conv_ids; @@ -864,7 +865,7 @@ PlatformResult ShortMsgManager::getConversationsForMessages( unique_conv_ids.insert(conv_id); ConversationPtr conv; PlatformResult ret = MessageConversation::convertMsgConversationToObject( - conv_id, ShortMsgManager::getInstance().m_msg_handle, &conv); + conv_id, shortMsgManager->m_msg_handle, &conv); if (ret.IsError()) { LoggerD("Convert msg conversation to object failed (%s)", ret.message().c_str()); return ret; diff --git a/src/messaging/short_message_manager.h b/src/messaging/short_message_manager.h index 3af61424..6bfe440a 100644 --- a/src/messaging/short_message_manager.h +++ b/src/messaging/short_message_manager.h @@ -40,7 +40,8 @@ class FindMsgCallbackUserData; class ShortMsgManager { public: - static ShortMsgManager& getInstance(); + ShortMsgManager(); + virtual ~ShortMsgManager(); common::PlatformResult sendMessage(MessageRecipientsCallbackData* callback); void sendStatusCallback(msg_struct_t sent_status); @@ -58,11 +59,6 @@ class ShortMsgManager { std::string getMessageStatus(int id); private: - ShortMsgManager(); - ShortMsgManager(const ShortMsgManager&); - void operator=(const ShortMsgManager&); - virtual ~ShortMsgManager(); - /** * Listener for msg storage changes. Calls callbacks from ChangeListenerContainer. * @param handle @@ -87,9 +83,10 @@ class ShortMsgManager { */ static common::PlatformResult getConversationsForMessages( MessagePtrVector messages, msg_storage_change_type_t storageChangeType, - ConversationPtrVector* result); - static common::PlatformResult callProperEventMessages( - EventMessages* event, msg_storage_change_type_t storageChangeType); + ConversationPtrVector* result, ShortMsgManager* shortMsgManager); + static common::PlatformResult callProperEventMessages(EventMessages* event, + msg_storage_change_type_t storageChangeType, + ShortMsgManager* shortMsgManager); typedef std::map SendReqMap; SendReqMap m_sendRequests; msg_handle_t m_msg_handle; -- 2.34.1