From e096dece1a22da0a9fa89cba7098f2d140993bf1 Mon Sep 17 00:00:00 2001 From: Maciek Blim Date: Mon, 19 Jan 2015 09:30:25 +0100 Subject: [PATCH] [Messaging] tct fixes for sms part 4 Added Queue to delay listeners callbacks to satisfate tests. tct: pass: 181 fail: 0 timeout 1 pass rate: ~99.5% The only timeouted test is MessageStorage_sms_findMessages_plainBody_and_id_with_errorCallback Above test is using Composite Filter which is not implemented Change-Id: I60685a0fd5c2b1ea238c34d04678d5ce17a02798 Signed-off-by: Maciek Blim --- src/messaging/DBus/LoadAttachmentProxy.cpp | 20 ++- src/messaging/DBus/LoadBodyProxy.cpp | 21 ++- src/messaging/DBus/SyncProxy.cpp | 10 +- .../conversations_change_callback.cc | 12 +- src/messaging/email_manager.cc | 91 ++++++++-- src/messaging/folders_change_callback.cc | 12 +- src/messaging/message_service_email.cc | 6 +- src/messaging/message_service_short_msg.cc | 10 +- src/messaging/message_storage_email.cc | 5 +- src/messaging/message_storage_short_msg.cc | 6 +- src/messaging/messages_change_callback.cc | 11 +- src/messaging/messaging_instance.cc | 20 ++- src/messaging/messaging_util.cc | 163 +++++++++++++++++- src/messaging/messaging_util.h | 52 ++++++ src/messaging/short_message_manager.cc | 76 ++++++-- 15 files changed, 454 insertions(+), 61 deletions(-) diff --git a/src/messaging/DBus/LoadAttachmentProxy.cpp b/src/messaging/DBus/LoadAttachmentProxy.cpp index e353e584..f875898b 100644 --- a/src/messaging/DBus/LoadAttachmentProxy.cpp +++ b/src/messaging/DBus/LoadAttachmentProxy.cpp @@ -199,7 +199,10 @@ void LoadAttachmentProxy::handleEmailSignal(const int status, callback->getMessageAttachment()); obj[JSON_DATA] = picojson::value(args); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } catch (...) { LoggerW("Couldn't create JSMessageAttachment object!"); throw common::UnknownException( @@ -210,17 +213,26 @@ void LoadAttachmentProxy::handleEmailSignal(const int status, LoggerD("Load message attachment failed!"); common::UnknownException e("Load message attachment failed!"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } } catch (const common::PlatformException& e) { LoggerE("Exception in signal callback"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } catch (...) { LoggerE("Exception in signal callback"); common::UnknownException e("Exception in signal callback"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } if(callback) { diff --git a/src/messaging/DBus/LoadBodyProxy.cpp b/src/messaging/DBus/LoadBodyProxy.cpp index 26b24aa0..68cb03b6 100644 --- a/src/messaging/DBus/LoadBodyProxy.cpp +++ b/src/messaging/DBus/LoadBodyProxy.cpp @@ -181,7 +181,10 @@ void LoadBodyProxy::handleEmailSignal(const int status, callback->getMessage()->getBody()); obj[JSON_DATA] = picojson::value(args); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } catch (...) { LoggerW("Couldn't create JSMessage object!"); throw common::UnknownException( @@ -193,8 +196,10 @@ void LoadBodyProxy::handleEmailSignal(const int status, common::UnknownException e("Load message body failed!"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage( - callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } } } @@ -202,14 +207,20 @@ void LoadBodyProxy::handleEmailSignal(const int status, LoggerE("Exception in signal callback"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } catch (...) { LoggerE("Exception in signal callback"); common::UnknownException e("Load message body failed!"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } if(callback) { diff --git a/src/messaging/DBus/SyncProxy.cpp b/src/messaging/DBus/SyncProxy.cpp index adc0cc85..f7c5703e 100644 --- a/src/messaging/DBus/SyncProxy.cpp +++ b/src/messaging/DBus/SyncProxy.cpp @@ -114,7 +114,10 @@ void SyncProxy::handleEmailSignal(const int status, case NOTI_DOWNLOAD_FINISH: LoggerD("Sync finished!"); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(response->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + response->serialize() + ); break; case NOTI_DOWNLOAD_FAIL: @@ -122,7 +125,10 @@ void SyncProxy::handleEmailSignal(const int status, LoggerD("Sync failed!"); common::UnknownException err("Sync failed!"); callback->setError(err.name(), err.message()); - MessagingInstance::getInstance().PostMessage(response->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + response->serialize() + ); } break; diff --git a/src/messaging/conversations_change_callback.cc b/src/messaging/conversations_change_callback.cc index a16fd292..1d3048c5 100644 --- a/src/messaging/conversations_change_callback.cc +++ b/src/messaging/conversations_change_callback.cc @@ -98,7 +98,9 @@ void ConversationsChangeCallback::added( picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(CONVERSATIONSADDED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::MEDIUM, json->serialize()); } void ConversationsChangeCallback::updated( @@ -124,7 +126,9 @@ void ConversationsChangeCallback::updated( picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(CONVERSATIONSUPDATED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::LOW, json->serialize()); } void ConversationsChangeCallback::removed( @@ -150,7 +154,9 @@ void ConversationsChangeCallback::removed( picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(CONVERSATIONSREMOVED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::LAST, json->serialize()); } void ConversationsChangeCallback::setFilter(tizen::AbstractFilterPtr filter) diff --git a/src/messaging/email_manager.cc b/src/messaging/email_manager.cc index 1f616a3a..e5be79a7 100644 --- a/src/messaging/email_manager.cc +++ b/src/messaging/email_manager.cc @@ -280,7 +280,10 @@ static gboolean addDraftMessageCompleteCB(void *data) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); callback->getMessage()->setMessageStatus(MessageStatus::STATUS_FAILED); } else { LoggerD("Calling success callback"); @@ -292,7 +295,10 @@ static gboolean addDraftMessageCompleteCB(void *data) args[JSON_DATA_MESSAGE] = MessagingUtil::messageToJson(callback->getMessage()); obj[JSON_DATA] = picojson::value(args); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("%s (%s)", (err.name()).c_str(), (err.message()).c_str()); @@ -352,7 +358,10 @@ static gboolean sendEmailCompleteCB(void* data) try { if (callback->isError()) { - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); callback->getMessage()->setMessageStatus(MessageStatus::STATUS_FAILED); } else { @@ -379,7 +388,10 @@ static gboolean sendEmailCompleteCB(void* data) data[JSON_DATA_MESSAGE] = MessagingUtil::messageToJson(callback->getMessage()); obj[JSON_DATA] = picojson::value(data); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); callback->getMessage()->setMessageStatus(MessageStatus::STATUS_SENT); } } @@ -801,7 +813,10 @@ void EmailManager::stopSync(long op_id) picojson::object& obj = response->get(); AbortException error("Sync aborted by user"); callback->setError(error.name(), error.message()); - MessagingInstance::getInstance().PostMessage(response->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + response->serialize() + ); m_proxy_sync->removeCallback(op_id); } @@ -818,15 +833,20 @@ void removeEmailCompleteCB(MessagesCallbackUserData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage( - callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("Error while calling removeEmail callback: %s (%s)", @@ -1017,13 +1037,19 @@ void EmailManager::updateMessages(MessagesCallbackUserData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("Error while calling updateEmail callback: %s (%s)", @@ -1085,7 +1111,10 @@ void EmailManager::findMessages(FindMsgCallbackUserData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); @@ -1098,7 +1127,11 @@ void EmailManager::findMessages(FindMsgCallbackUserData* callback) }); obj[JSON_DATA] = picojson::value(response); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("Error while calling findMessages callback: %s (%s)", @@ -1151,7 +1184,10 @@ void EmailManager::findConversations(ConversationCallbackData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); @@ -1166,7 +1202,11 @@ void EmailManager::findConversations(ConversationCallbackData* callback) ); obj[JSON_DATA] = picojson::value(response); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("Error while calling findConversations callback: %s (%s)", @@ -1285,7 +1325,10 @@ void EmailManager::findFolders(FoldersCallbackData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); @@ -1300,7 +1343,11 @@ void EmailManager::findFolders(FoldersCallbackData* callback) ); obj[JSON_DATA] = picojson::value(response); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("Error while calling findFolders callback: %s (%s)", @@ -1376,15 +1423,21 @@ void EmailManager::removeConversations(ConversationCallbackData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage( - callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const PlatformException& err) { LoggerE("Error while calling removeConversations callback: %s (%s)", diff --git a/src/messaging/folders_change_callback.cc b/src/messaging/folders_change_callback.cc index 5c33cc49..3fc7b9be 100644 --- a/src/messaging/folders_change_callback.cc +++ b/src/messaging/folders_change_callback.cc @@ -93,7 +93,9 @@ void FoldersChangeCallback::added(const FolderPtrVector& folders) picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(FOLDERSADDED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::MEDIUM, json->serialize()); } void FoldersChangeCallback::updated(const FolderPtrVector& folders) @@ -118,7 +120,9 @@ void FoldersChangeCallback::updated(const FolderPtrVector& folders) picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(FOLDERSUPDATED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::LOW, json->serialize()); } void FoldersChangeCallback::removed(const FolderPtrVector& folders) @@ -143,7 +147,9 @@ void FoldersChangeCallback::removed(const FolderPtrVector& folders) picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(FOLDERSREMOVED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::LAST, json->serialize()); } void FoldersChangeCallback::setFilter(tizen::AbstractFilterPtr filter) diff --git a/src/messaging/message_service_email.cc b/src/messaging/message_service_email.cc index 9566ade8..e13a568e 100644 --- a/src/messaging/message_service_email.cc +++ b/src/messaging/message_service_email.cc @@ -123,7 +123,11 @@ static gboolean loadMessageAttachmentTask(void* data) callback->getMessageAttachment()); obj[JSON_DATA] = picojson::value(args); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); + delete callback; callback = NULL; return FALSE; diff --git a/src/messaging/message_service_short_msg.cc b/src/messaging/message_service_short_msg.cc index 961e9c86..32cc2783 100644 --- a/src/messaging/message_service_short_msg.cc +++ b/src/messaging/message_service_short_msg.cc @@ -133,12 +133,18 @@ static gboolean loadMessageBodyTask(void* data) args[JSON_DATA_MESSAGE_BODY] = MessagingUtil::messageBodyToJson(body); obj[JSON_DATA] = picojson::value(args); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } catch (...) { LoggerE("Couldn't create JSMessage object!"); common::UnknownException e("Loade message body failed"); callback->setError(e.name(), e.message()); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } return FALSE; diff --git a/src/messaging/message_storage_email.cc b/src/messaging/message_storage_email.cc index fcff018b..6668e511 100644 --- a/src/messaging/message_storage_email.cc +++ b/src/messaging/message_storage_email.cc @@ -44,7 +44,10 @@ static gboolean callError(void* data) return FALSE; } - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); return FALSE; } diff --git a/src/messaging/message_storage_short_msg.cc b/src/messaging/message_storage_short_msg.cc index a666a76c..87755a20 100644 --- a/src/messaging/message_storage_short_msg.cc +++ b/src/messaging/message_storage_short_msg.cc @@ -206,7 +206,11 @@ static gboolean findFoldersCB(void* data) obj[JSON_DATA] = picojson::value(array); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); delete callback; callback = NULL; diff --git a/src/messaging/messages_change_callback.cc b/src/messaging/messages_change_callback.cc index dc41ff49..b7c2dda1 100644 --- a/src/messaging/messages_change_callback.cc +++ b/src/messaging/messages_change_callback.cc @@ -125,7 +125,9 @@ void MessagesChangeCallback::added(const MessagePtrVector& msgs) picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(MESSAGESADDED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::MEDIUM, json->serialize()); } void MessagesChangeCallback::updated(const MessagePtrVector& msgs) @@ -156,7 +158,9 @@ void MessagesChangeCallback::updated(const MessagePtrVector& msgs) picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(MESSAGESUPDATED); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::LOW, json->serialize()); } void MessagesChangeCallback::removed(const MessagePtrVector& msgs) @@ -189,8 +193,9 @@ void MessagesChangeCallback::removed(const MessagePtrVector& msgs) obj[JSON_ACTION] = picojson::value(MESSAGESREMOVED); LoggerD("MESSAGES: %s", picojson::value(array).serialize().c_str()); obj[JSON_DATA] = picojson::value(array); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().addAndResolve(obj.at( + JSON_CALLBACK_ID).get(), PostPriority::LAST, json->serialize()); } void MessagesChangeCallback::setFilter(tizen::AbstractFilterPtr filter) diff --git a/src/messaging/messaging_instance.cc b/src/messaging/messaging_instance.cc index d1b930c6..7ce5108a 100644 --- a/src/messaging/messaging_instance.cc +++ b/src/messaging/messaging_instance.cc @@ -196,7 +196,10 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, (MessagingUtil::getValueFromJSONObject(data,SEND_MESSAGE_ARGS_SIMINDEX)); if (!callback->setSimIndex(simIndex)) { - PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); delete callback; callback = NULL; return; @@ -204,6 +207,7 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, callback->setJson(json); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); auto service = MessagingManager::getInstance().getMessageService(serviceId); service->sendMessage(callback); } @@ -217,6 +221,7 @@ void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& arg picojson::value message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE); const double callbackId = args.get(JSON_CALLBACK_ID).get(); + MessageBodyCallbackData* callback = new MessageBodyCallbackData(); callback->setMessage(MessagingUtil::jsonToMessage(message)); @@ -225,6 +230,7 @@ void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& arg obj[JSON_CALLBACK_ID] = picojson::value(callbackId); callback->setJson(json); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); auto service = MessagingManager::getInstance().getMessageService(getServiceIdFromJSON(data)); service->loadMessageBody(callback); } @@ -237,6 +243,7 @@ void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::valu picojson::object data = args.get(JSON_DATA).get(); picojson::value attachment = data.at(LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT); const double callbackId = args.get(JSON_CALLBACK_ID).get(); + MessageAttachmentCallbackData* callback = new MessageAttachmentCallbackData(); callback->setMessageAttachment(MessagingUtil::jsonToMessageAttachment(attachment)); @@ -245,6 +252,7 @@ void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::valu obj[JSON_CALLBACK_ID] = picojson::value(callbackId); callback->setJson(json); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); auto service = MessagingManager::getInstance().getMessageService(getServiceIdFromJSON(data)); service->loadMessageAttachment(callback); } @@ -280,6 +288,7 @@ void MessagingInstance::MessageServiceSync(const picojson::value& args, callback->setAccountId(id); callback->setLimit(limit); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); long op_id = MessagingManager::getInstance().getMessageService(id)->sync(callback); picojson::value v_op_id(static_cast(op_id)); @@ -320,6 +329,7 @@ void MessagingInstance::MessageServiceSyncFolder(const picojson::value& args, callback->setMessageFolder(MessagingUtil::jsonToMessageFolder(v_folder)); callback->setLimit(limit); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); long op_id = MessagingManager::getInstance().getMessageService(id)->syncFolder(callback); picojson::value v_op_id(static_cast(op_id)); @@ -377,6 +387,7 @@ void MessagingInstance::MessageStorageAddDraft(const picojson::value& args, obj[JSON_CALLBACK_ID] = picojson::value(callbackId); callback->setJson(json); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); auto service = MessagingManager::getInstance().getMessageService(serviceId); service->getMsgStorage()->addDraftMessage(callback); } @@ -414,6 +425,7 @@ void MessagingInstance::MessageStorageFindMessages(const picojson::value& args, obj[JSON_CALLBACK_ID] = picojson::value(callbackId); callback->setJson(json); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); storage->findMessages(callback); } @@ -440,6 +452,7 @@ void MessagingInstance::MessageStorageRemoveMessages(const picojson::value& args auto service = MessagingManager::getInstance().getMessageService(getServiceIdFromJSON(data)); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); service->getMsgStorage()->removeMessages(callback); } @@ -467,6 +480,7 @@ void MessagingInstance::MessageStorageUpdateMessages(const picojson::value& args auto service = MessagingManager::getInstance().getMessageService(getServiceIdFromJSON(data)); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); service->getMsgStorage()->updateMessages(callback); } @@ -500,6 +514,7 @@ void MessagingInstance::MessageStorageFindConversations(const picojson::value& a obj[JSON_CALLBACK_ID] = picojson::value(callbackId); callback->setJson(json); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); auto storage = MessagingManager::getInstance().getMessageService(serviceId)->getMsgStorage(); storage->findConversations(callback); } @@ -526,6 +541,7 @@ void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& auto service = MessagingManager::getInstance().getMessageService(getServiceIdFromJSON(data)); + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); service->getMsgStorage()->removeConversations(callback); } @@ -545,6 +561,8 @@ void MessagingInstance::MessageStorageFindFolders(const picojson::value& args, picojson::object& obj = json->get(); obj[JSON_CALLBACK_ID] = picojson::value(callbackId); callback->setJson(json); + + PostQueue::getInstance().add(static_cast(callbackId), PostPriority::HIGH); auto service = MessagingManager::getInstance().getMessageService(getServiceIdFromJSON(data)); service->getMsgStorage()->findFolders(callback); } diff --git a/src/messaging/messaging_util.cc b/src/messaging/messaging_util.cc index fe87e111..b1c45494 100644 --- a/src/messaging/messaging_util.cc +++ b/src/messaging/messaging_util.cc @@ -4,7 +4,6 @@ #include "messaging_util.h" #include -#include #include #include #include @@ -15,6 +14,7 @@ #include "message_sms.h" #include "message_mms.h" #include "message_conversation.h" +#include "messaging_instance.h" #include "tizen/tizen.h" #include "common/logger.h" @@ -870,5 +870,166 @@ std::shared_ptr MessagingUtil::jsonToMessageConversation(co return conversation; } +PostQueue& PostQueue::getInstance() +{ + LoggerD("Entered"); + static PostQueue instance; + return instance; +} + +PostQueue::PostQueue() +{ + LoggerD("Entered"); +} +PostQueue::~PostQueue() +{ + LoggerD("Entered"); +} + +void PostQueue::addAndResolve(const long cid, PostPriority priority, const std::string json) +{ + LoggerD("Entered"); + + std::shared_ptr t(new PostTask(priority)); + t->attach(json); + tasks_mutex_.lock(); + tasks_.push_back(std::make_pair(cid, t)); + tasks_mutex_.unlock(); + + resolve(PostPriority::HIGH); + + return; +} + +void PostQueue::add(const long cid, PostPriority priority) +{ + LoggerD("Entered"); + + tasks_mutex_.lock(); + tasks_.push_back(std::make_pair(cid, std::shared_ptr(new PostTask(priority)))); + tasks_mutex_.unlock(); + + return; +} + +void PostQueue::resolve(const long cid, const std::string json) +{ + LoggerD("Entered"); + + tasks_mutex_.lock(); + + TasksCollection::iterator i; + i = std::find_if(tasks_.begin(), tasks_.end(), [&cid] (TasksCollectionItem item)->bool { + return (cid == item.first); + }); + + if (tasks_.end() == i) { + LoggerD("Not found cid"); + tasks_mutex_.unlock(); + return; + } + + i->second->attach(json); + tasks_mutex_.unlock(); + + resolve(PostPriority::HIGH); + return; +} + +void PostQueue::resolve(PostPriority p) +{ + LoggerD("Entered"); + + TasksCollection::iterator i; + + tasks_mutex_.lock(); + i = std::find_if(tasks_.begin(), tasks_.end(), [&p] (TasksCollectionItem item)->bool { + return (p == item.second->priority()); + }); + + if (tasks_.end() == i) { + // not found + tasks_mutex_.unlock(); + + if (PostPriority::LAST != p) { + return resolve(static_cast(p-1)); + } else { + return; + } + } + + if (TaskState::READY == i->second->state()) { + i->second->resolve(); + std::string json = i->second->json(); + + i = tasks_.erase(i); + tasks_mutex_.unlock(); + + MessagingInstance::getInstance().PostMessage(json.c_str()); + } else if (TaskState::NEW == i->second->state()) { + tasks_mutex_.unlock(); + + return; + } else if (TaskState::DONE == i->second->state()) { + i = tasks_.erase(i); + tasks_mutex_.unlock(); + } + + return resolve(static_cast(p)); +} + +PostQueue::PostTask::PostTask() +{ + LoggerD("Entered"); + priority_ = PostPriority::LOW; + state_ = TaskState::NEW; +} +PostQueue::PostTask::PostTask(PostPriority p) +{ + LoggerD("Entered"); + priority_ = p; + state_ = TaskState::NEW; +} +PostQueue::PostTask::~PostTask() +{ + LoggerD("Entered"); +} + +void PostQueue::PostTask::attach(const std::string j) +{ + LoggerD("Entered"); + if (TaskState::DONE == state_) { + return; + } + json_ = j; + state_ = TaskState::READY; + return; +} + +PostPriority PostQueue::PostTask::priority() +{ + return priority_; +} + +PostQueue::TaskState PostQueue::PostTask::state() +{ + return state_; +} + +std::string PostQueue::PostTask::json() +{ + return json_; +} + +void PostQueue::PostTask::resolve() +{ + LoggerD("Entered"); + if (TaskState::READY == state_) { + state_ = TaskState::DONE; + } + return; +} + + } // messaging } // extension diff --git a/src/messaging/messaging_util.h b/src/messaging/messaging_util.h index 885b18a7..84995986 100644 --- a/src/messaging/messaging_util.h +++ b/src/messaging/messaging_util.h @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include "common/logger.h" #include "common/picojson.h" @@ -159,6 +161,56 @@ private: static tizen::AttributeRangeFilterPtr jsonFilterToAttributeRangeFilter(const picojson::object& json); }; +enum PostPriority { + LAST = 0, + LOW, + MEDIUM, + HIGH +}; + +class PostQueue { +public: + static PostQueue& getInstance(); + void addAndResolve(const long cid, PostPriority priority, const std::string json); + void add(const long cid, PostPriority priority = PostPriority::LAST); + void resolve(const long cid, const std::string json); + + enum TaskState { + NEW = 0, + READY, + DONE + }; + +private: + class PostTask; + typedef std::pair> TasksCollectionItem; + typedef std::vector TasksCollection; + + PostQueue(); + PostQueue(const PostQueue &); + ~PostQueue(); + void operator=(const PostQueue &); + void resolve(PostPriority p); + TasksCollection tasks_; + std::mutex tasks_mutex_; + + class PostTask { + public: + PostTask(); + PostTask(PostPriority p); + ~PostTask(); + void attach(const std::string j); + PostPriority priority(); + TaskState state(); + std::string json(); + void resolve(); + private: + std::string json_; + PostPriority priority_; + TaskState state_; + }; +}; + } // messaging } // extension #endif // MESSAGING_MESSAGING_UTIL_H_ diff --git a/src/messaging/short_message_manager.cc b/src/messaging/short_message_manager.cc index 734ede73..4ffe81dd 100644 --- a/src/messaging/short_message_manager.cc +++ b/src/messaging/short_message_manager.cc @@ -45,7 +45,10 @@ static gboolean sendMessageCompleteCB(void* data) try { if (callback->isError()) { - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); callback->getMessage()->setMessageStatus(MessageStatus::STATUS_FAILED); } else { @@ -70,7 +73,10 @@ static gboolean sendMessageCompleteCB(void* data) data[JSON_DATA_MESSAGE] = MessagingUtil::messageToJson(message); obj[JSON_DATA] = picojson::value(data); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); callback->getMessage()->setMessageStatus(MessageStatus::STATUS_SENT); } } @@ -101,7 +107,10 @@ static gboolean addDraftMessageCompleteCB(void *data) if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); callback->getMessage()->setMessageStatus(MessageStatus::STATUS_FAILED); } else { LoggerD("Calling success callback"); @@ -114,7 +123,10 @@ static gboolean addDraftMessageCompleteCB(void *data) args[JSON_DATA_MESSAGE] = MessagingUtil::messageToJson(callback->getMessage()); obj[JSON_DATA] = picojson::value(args); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const common::PlatformException& err) { LoggerE("Error while calling addDraftMessage callback: %s (%s)", @@ -768,14 +780,21 @@ void ShortMsgManager::removeMessages(MessagesCallbackUserData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const common::PlatformException& err) { LoggerE("Error while calling removeShortMsg callback: %s (%s)", @@ -840,7 +859,10 @@ void ShortMsgManager::updateMessages(MessagesCallbackUserData* callback) if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); @@ -858,7 +880,11 @@ void ShortMsgManager::updateMessages(MessagesCallbackUserData* callback) obj[JSON_DATA] = picojson::value(array); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const common::PlatformException& err) { LoggerE("Error while calling updateShortMsg callback: %s (%s)", @@ -970,7 +996,10 @@ void ShortMsgManager::findMessages(FindMsgCallbackUserData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback with %d messages:", callback->getMessages().size()); @@ -986,7 +1015,11 @@ void ShortMsgManager::findMessages(FindMsgCallbackUserData* callback) obj[JSON_DATA] = picojson::value(response); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const common::PlatformException& err) { LoggerE("Error while calling findMessages callback: %s (%s)", @@ -1034,7 +1067,10 @@ void ShortMsgManager::findConversations(ConversationCallbackData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage(callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); @@ -1049,7 +1085,11 @@ void ShortMsgManager::findConversations(ConversationCallbackData* callback) ); obj[JSON_DATA] = picojson::value(response); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const common::PlatformException& err) { LoggerE("Error while calling findConversations callback: %s (%s)", @@ -1169,15 +1209,21 @@ void ShortMsgManager::removeConversations(ConversationCallbackData* callback) try { if (callback->isError()) { LoggerD("Calling error callback"); - MessagingInstance::getInstance().PostMessage( - callback->getJson()->serialize().c_str()); + PostQueue::getInstance().resolve( + callback->getJson()->get().at(JSON_CALLBACK_ID).get(), + callback->getJson()->serialize() + ); } else { LoggerD("Calling success callback"); auto json = callback->getJson(); picojson::object& obj = json->get(); obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); - MessagingInstance::getInstance().PostMessage(json->serialize().c_str()); + + PostQueue::getInstance().resolve( + obj.at(JSON_CALLBACK_ID).get(), + json->serialize() + ); } } catch (const common::PlatformException& err) { LoggerE("Error while calling removeConversations callback: %s (%s)", -- 2.34.1