From: Pawel Andruszkiewicz
Date: Thu, 28 May 2015 12:38:09 +0000 (+0200)
Subject: [MessagingEmail] Remove all send requests when PostQueue is destroyed.
X-Git-Tag: submit/tizen_tv/20150603.064601^2~10
X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc8fa6f02fcf03172f8e5e4b5fd8dc45d4861195;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git
[MessagingEmail] Remove all send requests when PostQueue is destroyed.
[Verification] TCT: 309/307/1/1/0 (99.35%) - email-service fixed.
Change-Id: I539898ec97503b4208a4784cfb44c3bb26152823
Signed-off-by: Pawel Andruszkiewicz
---
diff --git a/src/messaging/email_manager.cc b/src/messaging/email_manager.cc
index b1513115..7a831cab 100755
--- a/src/messaging/email_manager.cc
+++ b/src/messaging/email_manager.cc
@@ -295,6 +295,7 @@ PlatformResult EmailManager::addMessagePlatform(int account_id,
static gboolean addDraftMessageCompleteCB(void *data)
{
+ LoggerD("Entered");
MessageCallbackUserData* callback =
static_cast(data);
if (!callback) {
@@ -376,12 +377,14 @@ static gboolean sendEmailCompleteCB(void* data)
picojson::object& obj = json->get();
if (json->contains(JSON_CALLBACK_ID) && obj.at(JSON_CALLBACK_ID).is()) {
if (callback->isError()) {
+ LoggerD("Calling error callback");
callback->getQueue().resolve(obj.at(JSON_CALLBACK_ID).get(),
json->serialize()
);
callback->getMessage()->setMessageStatus(MessageStatus::STATUS_FAILED);
}
else {
+ LoggerD("Calling success callback");
obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS);
std::vector recipients;
@@ -438,30 +441,30 @@ PlatformResult EmailManager::sendMessage(MessageRecipientsCallbackData* callback
if (message) {
if (!(message->is_id_set())) {
platform_result = addOutboxMessagePlatform(callback->getAccountId(), message);
- if (platform_result.IsError()) return platform_result;
}
- err = email_get_mail_data(message->getId(),&mail_data);
-
- if (EMAIL_ERROR_NONE != err) {
- LoggerE("email_get_mail_data failed. [%d]\n", err);
- platform_result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get platform email structure");
- } else {
- LoggerD("email_get_mail_data success.\n");
+ if (platform_result) {
+ err = email_get_mail_data(message->getId(),&mail_data);
+ if (EMAIL_ERROR_NONE != err) {
+ LoggerE("email_get_mail_data failed. [%d]\n", err);
+ platform_result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get platform email structure");
+ } else {
+ LoggerD("email_get_mail_data success.\n");
- // Sending EMAIL
- mail_data->save_status = EMAIL_MAIL_STATUS_SENDING;
+ // Sending EMAIL
+ mail_data->save_status = EMAIL_MAIL_STATUS_SENDING;
- int req_id = 0;
- err = email_send_mail(mail_data->mail_id, &req_id);
+ int req_id = 0;
+ err = email_send_mail(mail_data->mail_id, &req_id);
- if (EMAIL_ERROR_NONE != err) {
- LoggerE("Failed to send message %d", err);
- platform_result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to send message");
- } else {
- LoggerD("req_id: %d", req_id);
- callback->getMessage()->setMessageStatus(MessageStatus::STATUS_SENDING);
- m_sendRequests[req_id] = callback;
+ if (EMAIL_ERROR_NONE != err) {
+ LoggerE("Failed to send message %d", err);
+ platform_result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to send message");
+ } else {
+ LoggerD("req_id: %d", req_id);
+ callback->getMessage()->setMessageStatus(MessageStatus::STATUS_SENDING);
+ m_sendRequests[req_id] = callback;
+ }
}
}
} else {
@@ -496,7 +499,7 @@ void EmailManager::sendStatusCallback(int mail_id,
email_noti_on_network_event status,
int error_code)
{
- LoggerD("Enter");
+ LoggerD("Entered");
std::lock_guard lock(m_mutex);
//find first request for this mail_id
@@ -545,6 +548,7 @@ void EmailManager::sendStatusCallback(int mail_id,
email_mail_data_t* EmailManager::loadMessage(int msg_id)
{
+ LoggerD("Entered");
email_mail_data_t* mail_data = NULL;
int err = EMAIL_ERROR_NONE;
err = email_get_mail_data(msg_id, &mail_data);
@@ -558,6 +562,7 @@ email_mail_data_t* EmailManager::loadMessage(int msg_id)
EmailManager::SendReqMapIterator EmailManager::getSendRequest(int mail_id)
{
+ LoggerD("Entered");
for (auto it = m_sendRequests.begin(); it != m_sendRequests.end(); it++) {
if (it->second->getMessage()->getId() == mail_id) {
return it;
@@ -568,6 +573,7 @@ EmailManager::SendReqMapIterator EmailManager::getSendRequest(int mail_id)
void EmailManager::freeMessage(email_mail_data_t* mail_data)
{
+ LoggerD("Entered");
if(!mail_data) {
return;
}
@@ -792,7 +798,7 @@ void EmailManager::syncFolder(SyncFolderCallbackData* callback)
if (NULL != mailbox) {
err = email_free_mailbox(&mailbox, 1);
if (EMAIL_ERROR_NONE != err) {
- LoggerD("Failed to email_free_mailbox - err:%d ", err);
+ LoggerE("Failed to email_free_mailbox - err:%d ", err);
}
mailbox = NULL;
}
@@ -838,6 +844,24 @@ void EmailManager::stopSync(long op_id)
//################################## ^stopSync #################################
+void EmailManager::RemoveSyncCallback(long op_id) {
+ LoggerD("Entered");
+ m_proxy_sync->removeCallback(op_id);
+}
+
+void EmailManager::RemoveCallbacksByQueue(const PostQueue& q) {
+ LoggerD("Entered");
+
+ for (auto it = m_sendRequests.begin(); it != m_sendRequests.end();) {
+ if (&it->second->getQueue() == &q) {
+ delete it->second;
+ m_sendRequests.erase(it++);
+ } else {
+ ++it;
+ }
+ }
+}
+
void removeEmailCompleteCB(MessagesCallbackUserData* callback)
{
LoggerD("Entered");
@@ -873,6 +897,7 @@ void removeEmailCompleteCB(MessagesCallbackUserData* callback)
EmailManager::DeleteReqVector::iterator EmailManager::getDeleteRequest(
const std::vector &ids)
{
+ LoggerD("Entered");
for (auto idIt = ids.begin(); idIt != ids.end(); ++idIt) {
for (auto reqIt = m_deleteRequests.begin(); reqIt != m_deleteRequests.end(); ++reqIt) {
MessagePtrVector msgs = reqIt->callback->getMessages();
@@ -889,7 +914,7 @@ EmailManager::DeleteReqVector::iterator EmailManager::getDeleteRequest(
void EmailManager::removeStatusCallback(const std::vector &ids,
email_noti_on_storage_event status)
{
- LoggerD("Enter");
+ LoggerD("Entered");
std::lock_guard lock(m_mutex);
DeleteReqVector::iterator it = getDeleteRequest(ids);
if (it != m_deleteRequests.end()) {
@@ -923,6 +948,7 @@ void EmailManager::removeStatusCallback(const std::vector &ids,
PlatformResult EmailManager::RemoveMessagesPlatform(MessagesCallbackUserData* callback)
{
+ LoggerD("Entered");
int error;
email_mail_data_t *mail = NULL;
@@ -978,6 +1004,7 @@ void EmailManager::removeMessages(MessagesCallbackUserData* callback)
}
PlatformResult EmailManager::UpdateMessagesPlatform(MessagesCallbackUserData* callback) {
+ LoggerD("Entered");
int error;
email_mail_data_t *mail = NULL;
SCOPE_EXIT {
@@ -1085,6 +1112,7 @@ void EmailManager::updateMessages(MessagesCallbackUserData* callback)
PlatformResult EmailManager::FindMessagesPlatform(FindMsgCallbackUserData* callback)
{
+ LoggerD("Entered");
email_mail_data_t* mailList = NULL;
int mailListCount = 0;
@@ -1165,6 +1193,7 @@ void EmailManager::findMessages(FindMsgCallbackUserData* callback)
PlatformResult EmailManager::FindConversationsPlatform(ConversationCallbackData* callback)
{
+ LoggerD("Entered");
int convListCount = 0;
std::lock_guard lock(m_mutex);
@@ -1189,7 +1218,7 @@ PlatformResult EmailManager::FindConversationsPlatform(ConversationCallbackData*
void EmailManager::findConversations(ConversationCallbackData* callback)
{
- LoggerE("Entered");
+ LoggerD("Entered");
if(!callback){
LoggerE("Callback is null");
@@ -1241,6 +1270,7 @@ void EmailManager::findConversations(ConversationCallbackData* callback)
long EmailManager::getUniqueOpId()
{
+ LoggerD("Entered");
// mutex is created only on first call (first call added to constructor
// to initialize mutex correctly)
static std::mutex op_id_mutex;
@@ -1251,6 +1281,7 @@ long EmailManager::getUniqueOpId()
PlatformResult EmailManager::FindFoldersPlatform(FoldersCallbackData* callback)
{
+ LoggerD("Entered");
int ret = EMAIL_ERROR_UNKNOWN;
int account_id = ACCOUNT_ID_NOT_INITIALIZED;
email_mailbox_t* mailboxes = NULL;
@@ -1379,6 +1410,7 @@ void EmailManager::findFolders(FoldersCallbackData* callback)
PlatformResult EmailManager::RemoveConversationsPlatform(ConversationCallbackData* callback)
{
+ LoggerD("Entered");
int error;
std::lock_guard lock(m_mutex);
std::vector> conversations =
diff --git a/src/messaging/email_manager.h b/src/messaging/email_manager.h
index 0868deeb..73b4c4a2 100755
--- a/src/messaging/email_manager.h
+++ b/src/messaging/email_manager.h
@@ -81,6 +81,9 @@ public:
void syncFolder(SyncFolderCallbackData* callback);
void stopSync(long op_id);
+ void RemoveSyncCallback(long op_id);
+ void RemoveCallbacksByQueue(const PostQueue& q);
+
// void registerStatusCallback(msg_handle_t msg_handle);
/**
diff --git a/src/messaging/messaging_util.cc b/src/messaging/messaging_util.cc
index 910e7ec4..68ea1041 100755
--- a/src/messaging/messaging_util.cc
+++ b/src/messaging/messaging_util.cc
@@ -28,6 +28,7 @@
#include "message_mms.h"
#include "message_conversation.h"
#include "messaging_instance.h"
+#include "messaging/email_manager.h"
#include "tizen/tizen.h"
#include "common/logger.h"
@@ -976,11 +977,13 @@ PlatformResult MessagingUtil::jsonToMessageConversation(const picojson::value& j
PostQueue::PostQueue(MessagingInstance& instance): instance_(instance)
{
- LoggerD("Entered");
+ LoggerD("Entered: [%p]", this);
}
PostQueue::~PostQueue()
{
- LoggerD("Entered");
+ LoggerD("Entered: [%p]", this);
+
+ EmailManager::getInstance().RemoveCallbacksByQueue(*this);
}
void PostQueue::addAndResolve(const long cid, PostPriority priority, const std::string json)
@@ -1011,7 +1014,7 @@ void PostQueue::add(const long cid, PostPriority priority)
void PostQueue::resolve(const long cid, const std::string json)
{
- LoggerD("Entered");
+ LoggerD("Entered: [%p]", this);
tasks_mutex_.lock();
@@ -1035,7 +1038,7 @@ void PostQueue::resolve(const long cid, const std::string json)
void PostQueue::resolve(PostPriority p)
{
- LoggerD("Entered");
+ LoggerD("Entered: [%p]", this);
TasksCollection::iterator i;