From a350b28d627297e024f3af2a35c48e0eb7e74bc1 Mon Sep 17 00:00:00 2001 From: Michal Michalski Date: Wed, 4 Dec 2019 08:59:42 +0100 Subject: [PATCH] [messaging] MessageStorageFindFolders simplified implementation. + reimplement MessageStorageFindFolders without using PostQueue + replace FoldersCallbackData with simpler FindFoldersTaskParams + improve code readability in other minor ways [Verification] tct-messaging-*-tizen-tests 100% pass rate. Signed-off-by: Michal Michalski Change-Id: I4842fc6e43971960f591b86b30d9d4d6720620a4 --- src/messaging/email_manager.cc | 100 ----------------------------- src/messaging/email_manager.h | 2 - src/messaging/message_conversation.cc | 3 +- src/messaging/message_storage.h | 3 +- src/messaging/message_storage_email.cc | 58 ++++++++++++----- src/messaging/message_storage_email.h | 2 +- src/messaging/message_storage_short_msg.cc | 62 +++++++++--------- src/messaging/message_storage_short_msg.h | 2 +- src/messaging/messaging.gyp | 2 + src/messaging/messaging_instance.cc | 38 +++++------ src/messaging/messaging_native.cc | 63 ++++++++++++++++++ src/messaging/messaging_native.h | 41 ++++++++++++ src/messaging/messaging_util.cc | 26 ++++---- src/messaging/messaging_util.h | 10 +++ 14 files changed, 222 insertions(+), 190 deletions(-) create mode 100644 src/messaging/messaging_native.cc create mode 100644 src/messaging/messaging_native.h diff --git a/src/messaging/email_manager.cc b/src/messaging/email_manager.cc index 362757c..7742545 100644 --- a/src/messaging/email_manager.cc +++ b/src/messaging/email_manager.cc @@ -1280,106 +1280,6 @@ long EmailManager::getUniqueOpId() { return op_id++; } -/** - * Attribute | Attribute filter| Attribute range filter - * | supported | supported - * ----------------+-----------------+------------------------ - * id | Yes | No - * parentId | Yes | No - * serviceId | Yes | No - * contentType | Yes | No - * name | Yes | No - * path | Yes | No - * type | Yes | No - * synchronizable | Yes | No - **/ - -PlatformResult EmailManager::FindFoldersPlatform(FoldersCallbackData* callback) { - ScopeLogger(); - int ret = EMAIL_ERROR_UNKNOWN; - email_mailbox_t* mailboxes = NULL; - int mailboxes_count = 0; - - SCOPE_EXIT { - if (mailboxes != NULL) { - if (EMAIL_ERROR_NONE != email_free_mailbox(&mailboxes, mailboxes_count)) { - LoggerW("Free mailboxes failed: %d", ret); - } - } - }; - - - tizen::AbstractFilterPtr filter = callback->getFilter(); - if (!filter) { - return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Filter not provided"); - } - - std::lock_guard lock(m_mutex); - auto account_id = callback->getMessageStorageId(); - - if (account_id < 0) { - LoggerD("account_id < 0"); - return PlatformResult(ErrorCode::UNKNOWN_ERR, "An unknown error occurred"); - } - - LoggerD("Listing folders for account ID: %d", account_id); - ret = email_get_mailbox_list(account_id, -1, &mailboxes, &mailboxes_count); - if (EMAIL_ERROR_NONE != ret || !mailboxes) { - return LogAndCreateResult( - ErrorCode::UNKNOWN_ERR, "Platform error, cannot get folders", - ("email_get_mailbox_list error: %d (%s)", ret, get_error_message(ret))); - } - - LoggerD("Found mailboxes: %d", mailboxes_count); - for (int i = 0; i < mailboxes_count; ++i) { - auto fd = std::make_shared(mailboxes[i]); - if (filter->isMatching(fd.get())) { - callback->addFolder(fd); - } - } - - return PlatformResult(ErrorCode::NO_ERROR); -} - -void EmailManager::findFolders(FoldersCallbackData* callback) { - ScopeLogger(); - - if (!callback) { - LoggerE("Callback is null"); - return; - } - - PlatformResult ret = FindFoldersPlatform(callback); - if (ret.IsError()) { - LoggerE("%d (%s)", static_cast(ret.error_code()), (ret.message()).c_str()); - callback->SetError(ret); - } - - // Complete task - LoggerD("callback: %p error:%d folders.size()=%zu", callback, callback->IsError(), - callback->getFolders().size()); - - if (callback->IsError()) { - LoggerD("Calling error callback"); - } else { - LoggerD("Calling success callback"); - - std::vector response; - auto folders = callback->getFolders(); - std::for_each(folders.begin(), folders.end(), - [&response](std::shared_ptr& folder) { - response.push_back(MessagingUtil::folderToJson(folder)); - }); - - callback->SetSuccess(picojson::value(response)); - } - - callback->Post(); - - delete callback; - callback = NULL; -} - PlatformResult EmailManager::RemoveConversationsPlatform(ConversationCallbackData* callback) { ScopeLogger(); int error; diff --git a/src/messaging/email_manager.h b/src/messaging/email_manager.h index a591e1d..021515e 100644 --- a/src/messaging/email_manager.h +++ b/src/messaging/email_manager.h @@ -67,7 +67,6 @@ class EmailManager { void updateMessages(MessagesCallbackUserData* callback); void findMessages(FindMsgCallbackUserData* callback); void findConversations(ConversationCallbackData* callback); - void findFolders(FoldersCallbackData* callback); void removeConversations(ConversationCallbackData* callback); std::string getMessageStatus(int id); @@ -104,7 +103,6 @@ class EmailManager { common::PlatformResult RemoveMessagesPlatform(MessagesCallbackUserData* callback); common::PlatformResult FindMessagesPlatform(FindMsgCallbackUserData* callback); common::PlatformResult FindConversationsPlatform(ConversationCallbackData* callback); - common::PlatformResult FindFoldersPlatform(FoldersCallbackData* callback); common::PlatformResult RemoveConversationsPlatform(ConversationCallbackData* callback); typedef std::map SendReqMap; diff --git a/src/messaging/message_conversation.cc b/src/messaging/message_conversation.cc index 71ce740..a2ef073 100644 --- a/src/messaging/message_conversation.cc +++ b/src/messaging/message_conversation.cc @@ -57,8 +57,7 @@ bool ContainsAllRequiredRecipients(AnyPtr match_value, std::vector return true; } -} // namespace - +} // namespace namespace extension { namespace messaging { diff --git a/src/messaging/message_storage.h b/src/messaging/message_storage.h index 8fdb208..0b2f74c 100644 --- a/src/messaging/message_storage.h +++ b/src/messaging/message_storage.h @@ -25,7 +25,6 @@ #include "conversation_callback_data.h" #include "find_msg_callback_user_data.h" -#include "folders_callback_data.h" #include "message_callback_user_data.h" #include "messages_callback_user_data.h" #include "messaging_util.h" @@ -55,7 +54,7 @@ class MessageStorage { virtual void findMessages(FindMsgCallbackUserData* callback) = 0; virtual void findConversations(ConversationCallbackData* callback) = 0; virtual void removeConversations(ConversationCallbackData* callback) = 0; - virtual void findFolders(FoldersCallbackData* callback) = 0; + virtual void findFolders(FindFoldersTaskParams* params) = 0; // Listeners registration/removal is common for all types of storage // and does not have to be overwritten in derived classes. diff --git a/src/messaging/message_storage_email.cc b/src/messaging/message_storage_email.cc index fc5bfa0..c0b7160 100644 --- a/src/messaging/message_storage_email.cc +++ b/src/messaging/message_storage_email.cc @@ -19,10 +19,22 @@ #include #include "common/platform_exception.h" +#include "common/platform_result.h" +#include "common/scope_exit.h" +#include "common/tools.h" #include "email_manager.h" #include "message.h" #include "messaging_instance.h" +#include "messaging_util.h" + +#include "messaging_native.h" + +using common::ErrorCode; +using common::tools::ReportError; +using common::tools::ReportSuccess; +using common::Instance; +using common::PlatformResult; namespace extension { namespace messaging { @@ -197,28 +209,44 @@ void MessageStorageEmail::removeConversations(ConversationCallbackData* callback } } -static gboolean findFoldersTask(void* data) { +static gboolean FindFoldersGlibTask(void* data) { ScopeLogger(); + picojson::object response; + std::unique_ptr params(static_cast(data)); - FoldersCallbackData* callback = static_cast(data); - callback->getEmailManager().findFolders(callback); + if (!params) { + LoggerE("FindFoldersGlibTask received null arguments."); + return FALSE; + } + + std::vector folders; + PlatformResult ret = native::EmailGetMailboxList(params->account_id, folders); + if (ret.IsError()) { + ReportError(ret, &response); + Instance::PostMessage(params->instance, picojson::value(response)); + return FALSE; + } + auto json = picojson::value(picojson::array()); + auto& folders_list = json.get(); + for (const auto& folder : folders) { + if (params->filter->isMatching(&folder)) { + folders_list.push_back(MessagingUtil::folderToJson(folder)); + } + } + + response[JSON_CALLBACK_ID] = picojson::value(static_cast(params->callback_id)); + ReportSuccess(json, response); + Instance::PostMessage(params->instance, picojson::value(response)); return FALSE; } -void MessageStorageEmail::findFolders(FoldersCallbackData* callback) { +void MessageStorageEmail::findFolders(FindFoldersTaskParams* params) { ScopeLogger(); - - if (!callback) { - LoggerE("Callback is null"); - return; - } - - guint id = g_idle_add(findFoldersTask, static_cast(callback)); - if (!id) { - LoggerE("g_idle_add failed"); - delete callback; - callback = NULL; + guint ret = g_idle_add(FindFoldersGlibTask, params); + if (!ret) { + LoggerE("Failed to set FindFoldersGlibTask."); + delete params; } } diff --git a/src/messaging/message_storage_email.h b/src/messaging/message_storage_email.h index 53a557b..e9ded38 100644 --- a/src/messaging/message_storage_email.h +++ b/src/messaging/message_storage_email.h @@ -33,7 +33,7 @@ class MessageStorageEmail : public MessageStorage { virtual void findMessages(FindMsgCallbackUserData* callback); virtual void findConversations(ConversationCallbackData* callback); virtual void removeConversations(ConversationCallbackData* callback); - virtual void findFolders(FoldersCallbackData* callback); + virtual void findFolders(FindFoldersTaskParams* callback); }; } // messaging diff --git a/src/messaging/message_storage_short_msg.cc b/src/messaging/message_storage_short_msg.cc index c5bae61..b653c92 100644 --- a/src/messaging/message_storage_short_msg.cc +++ b/src/messaging/message_storage_short_msg.cc @@ -16,6 +16,9 @@ #include "common/logger.h" #include "common/platform_exception.h" +#include "common/platform_result.h" +#include "common/scope_exit.h" +#include "common/tools.h" #include "message_sms.h" #include "message_storage_short_msg.h" @@ -23,6 +26,12 @@ #include "messaging_util.h" #include "short_message_manager.h" +using common::ErrorCode; +using common::tools::ReportError; +using common::tools::ReportSuccess; +using common::Instance; +using common::PlatformResult; + namespace extension { namespace messaging { @@ -197,52 +206,39 @@ void MessageStorageShortMsg::removeConversations(ConversationCallbackData* callb static gboolean findFoldersCB(void* data) { ScopeLogger(); + std::unique_ptr params(static_cast(data)); - FoldersCallbackData* callback = static_cast(data); + std::string content_type = params->message_type; + FolderPtr folder; + picojson::object response; picojson::array array; - auto each = [&array](std::shared_ptr folder) -> void { - array.push_back(MessagingUtil::folderToJson(folder)); - }; - - auto folders = callback->getFolders(); - for_each(folders.begin(), folders.end(), each); - - callback->SetSuccess(picojson::value(array)); - callback->Post(); + for (int i = MESSAGE_FOLDER_TYPE_INBOX; i < MESSAGE_FOLDER_TYPE_NOTSTANDARD; ++i) { + MessageFolder folder( + std::to_string(i), "", std::to_string(params->account_id), content_type, + MessagingUtil::messageFolderTypeToString(static_cast(i)), "", + static_cast(i), false); - delete callback; - callback = NULL; + if (params->filter->isMatching(&folder)) { + array.push_back(MessagingUtil::folderToJson(folder)); + } + } + response[JSON_CALLBACK_ID] = picojson::value(static_cast(params->callback_id)); + ReportSuccess(picojson::value(array), response); + Instance::PostMessage(params->instance, picojson::value(response)); return FALSE; } -void MessageStorageShortMsg::findFolders(FoldersCallbackData* callback) { +void MessageStorageShortMsg::findFolders(FindFoldersTaskParams* params) { ScopeLogger(); - if (!callback) { - LoggerE("Callback is null"); + if (!params) { + LoggerE("FindFoldersTaskParams is null"); return; } - - std::string content_type = getMsgServiceTypeString(); - FolderPtr folder; - - auto filter = callback->getFilter(); - for (int i = MESSAGE_FOLDER_TYPE_INBOX; i < MESSAGE_FOLDER_TYPE_NOTSTANDARD; ++i) { - folder = std::make_shared( - std::to_string(i), "", std::to_string(m_id), content_type, - MessagingUtil::messageFolderTypeToString(static_cast(i)), "", static_cast(i), - false); - if (filter->isMatching(folder.get())) { - callback->addFolder(folder); - } - } - - guint id = g_idle_add(findFoldersCB, static_cast(callback)); + guint id = g_idle_add(findFoldersCB, static_cast(params)); if (!id) { LoggerE("g_idle_add failed"); - delete callback; - callback = NULL; } } diff --git a/src/messaging/message_storage_short_msg.h b/src/messaging/message_storage_short_msg.h index df20d4e..9afa15d 100644 --- a/src/messaging/message_storage_short_msg.h +++ b/src/messaging/message_storage_short_msg.h @@ -33,7 +33,7 @@ class MessageStorageShortMsg : public MessageStorage { virtual void findMessages(FindMsgCallbackUserData* callback); virtual void findConversations(ConversationCallbackData* callback); virtual void removeConversations(ConversationCallbackData* callback); - virtual void findFolders(FoldersCallbackData* callback); + virtual void findFolders(FindFoldersTaskParams* params); }; } // messaging diff --git a/src/messaging/messaging.gyp b/src/messaging/messaging.gyp index 670301b..a0ded5e 100644 --- a/src/messaging/messaging.gyp +++ b/src/messaging/messaging.gyp @@ -25,6 +25,8 @@ ], }, 'sources': [ + 'messaging_native.cc', + 'messaging_native.h', 'messaging_api.js', 'callback_user_data.cc', 'callback_user_data.h', diff --git a/src/messaging/messaging_instance.cc b/src/messaging/messaging_instance.cc index cdd091d..c325b01 100644 --- a/src/messaging/messaging_instance.cc +++ b/src/messaging/messaging_instance.cc @@ -28,7 +28,6 @@ #include "conversations_change_callback.h" #include "email_manager.h" #include "find_msg_callback_user_data.h" -#include "folders_callback_data.h" #include "folders_change_callback.h" #include "message.h" #include "message_storage.h" @@ -41,6 +40,7 @@ using common::ErrorCode; using common::TypeMismatchException; using common::PlatformResult; +using common::tools::ReportError; namespace extension { namespace messaging { @@ -69,12 +69,10 @@ const char* REMOVE_CHANGE_LISTENER_ARGS_WATCHID = "watchId"; const char* FUNCTIONS_HIDDEN_ARGS_SERVICE_ID = "serviceId"; const char* FUN_MESSAGE_MESSAGING_EMAIL = "messaging.email"; -auto getServiceIdFromJSON = [](picojson::object& data) -> int { - std::string serviceStrId; +int getServiceIdFromJSON(const picojson::object& data) { try { - serviceStrId = - MessagingUtil::getValueFromJSONObject(data, FUNCTIONS_HIDDEN_ARGS_SERVICE_ID); - return std::stoi(serviceStrId); + return std::stoi( + MessagingUtil::getValueFromJSONObject(data, FUNCTIONS_HIDDEN_ARGS_SERVICE_ID)); } catch (...) { return -1; } @@ -609,26 +607,24 @@ void MessagingInstance::MessageStorageFindFolders(const picojson::value& args, CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(); - const double callbackId = args.get(JSON_CALLBACK_ID).get(); + const auto& data = args.get(); + auto service = manager_.getMessageService(getServiceIdFromJSON(data)); - auto json = std::shared_ptr(new picojson::value(picojson::object())); - picojson::object& obj = json->get(); - obj[JSON_CALLBACK_ID] = picojson::value(callbackId); + auto task_params = new FindFoldersTaskParams(); + task_params->instance = this; + task_params->callback_id = args.get(JSON_CALLBACK_ID).get(); + task_params->account_id = service->getMsgServiceId(); + task_params->message_type = service->getMsgServiceTypeString(); - AbstractFilterPtr filter; - PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); + PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &(task_params->filter)); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj) + LoggerE("Cannot convert json to AbstractFilter: %s", args.serialize().c_str()); + ReportError(ret, &out); + delete task_params; + return; } - FoldersCallbackData* callback = new FoldersCallbackData(queue_, callbackId, *this); - callback->setFilter(filter); - - callback->AddToQueue(); - auto service = manager_.getMessageService(getServiceIdFromJSON(data)); - callback->setMessageStorageId(service->getMsgServiceId()); - service->getMsgStorage()->findFolders(callback); + service->getMsgStorage()->findFolders(task_params); } void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson::value& args, diff --git a/src/messaging/messaging_native.cc b/src/messaging/messaging_native.cc new file mode 100644 index 0000000..032d786 --- /dev/null +++ b/src/messaging/messaging_native.cc @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "messaging_native.h" +#include "common/logger.h" +#include "common/platform_result.h" +#include "common/scope_exit.h" +#include "message_folder.h" + +#include + +#include + +using extension::messaging::MessageFolder; +using common::PlatformResult; +using common::ErrorCode; + +namespace native { + +PlatformResult EmailGetMailboxList(int account_id, email_mailbox_t** mailboxes, int* count) { + ScopeLogger("account id: %d", account_id); + int ret = email_get_mailbox_list(account_id, -1, mailboxes, count); + if (EMAIL_ERROR_NONE != ret) { + LoggerE("Calling email_get_mailbox_list() failed."); + return PlatformResult(ErrorCode::UNKNOWN_ERR, "Calling email_get_mailbox_list() failed."); + } + return PlatformResult(); +} + +PlatformResult EmailGetMailboxList(int account_id, std::vector& folders) { + email_mailbox_t* mailboxes = nullptr; + int count = 0; + + SCOPE_EXIT { + email_free_mailbox(&mailboxes, count); + }; + + auto ret = EmailGetMailboxList(account_id, &mailboxes, &count); + if (ret.IsError()) { + return ret; + } + + for (int i = 0; i < count; ++i) { + folders.push_back(MessageFolder(mailboxes[i])); + } + + return PlatformResult(); +} + +} // namespace native diff --git a/src/messaging/messaging_native.h b/src/messaging/messaging_native.h new file mode 100644 index 0000000..6910177 --- /dev/null +++ b/src/messaging/messaging_native.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * --------------------------------------------------------------------- + * The purpose of this module is to wrap native messaging API to make WebAPI + * implementation less verbose. Actions such as logging and conversion of integer + * native error code value to PlatformResult have been scattered across the entire + * API implementation, so placing them in a wrapper function will remove a lot of + * repeating, verbose code form WebAPI. + * + * Also in the future if we decide to unit test our API this wrappers will make it easier + * to create native api mock. + */ +#ifndef MESSAGING_NATIVE_H_ +#define MESSAGING_NATIVE_H_ + +#include +#include "common/platform_result.h" +#include "message_folder.h" + +using extension::messaging::MessageFolder; + +namespace native { + +common::PlatformResult EmailGetMailboxList(int account_id, std::vector& folders); + +} // namespace native + +#endif // MESSAGING_NATIVE_H_ diff --git a/src/messaging/messaging_util.cc b/src/messaging/messaging_util.cc index 9636f5f..85a9ab0 100644 --- a/src/messaging/messaging_util.cc +++ b/src/messaging/messaging_util.cc @@ -668,24 +668,24 @@ picojson::value MessagingUtil::conversationToJson( return v; } -picojson::value MessagingUtil::folderToJson(std::shared_ptr folder) { +picojson::value MessagingUtil::folderToJson(const MessageFolder& folder) { ScopeLogger(); - picojson::object o; - - o[MESSAGE_FOLDER_ATTRIBUTE_ID] = picojson::value(folder->getId()); + o[MESSAGE_FOLDER_ATTRIBUTE_ID] = picojson::value(folder.getId()); o[MESSAGE_FOLDER_ATTRIBUTE_PARENT_ID] = - folder->isParentIdSet() ? picojson::value(folder->getParentId()) : picojson::value(); - o[MESSAGE_FOLDER_ATTRIBUTE_SERVICE_ID] = picojson::value(folder->getServiceId()); - o[MESSAGE_FOLDER_ATTRIBUTE_CONTENT_TYPE] = picojson::value(folder->getContentType()); - o[MESSAGE_FOLDER_ATTRIBUTE_NAME] = picojson::value(folder->getName()); - o[MESSAGE_FOLDER_ATTRIBUTE_PATH] = picojson::value(folder->getPath()); + folder.isParentIdSet() ? picojson::value(folder.getParentId()) : picojson::value(); + o[MESSAGE_FOLDER_ATTRIBUTE_SERVICE_ID] = picojson::value(folder.getServiceId()); + o[MESSAGE_FOLDER_ATTRIBUTE_CONTENT_TYPE] = picojson::value(folder.getContentType()); + o[MESSAGE_FOLDER_ATTRIBUTE_NAME] = picojson::value(folder.getName()); + o[MESSAGE_FOLDER_ATTRIBUTE_PATH] = picojson::value(folder.getPath()); o[MESSAGE_FOLDER_ATTRIBUTE_TYPE] = - picojson::value(MessagingUtil::messageFolderTypeToString(folder->getType())); - o[MESSAGE_FOLDER_ATTRIBUTE_SYNCHRONIZABLE] = picojson::value(folder->getSynchronizable()); + picojson::value(MessagingUtil::messageFolderTypeToString(folder.getType())); + o[MESSAGE_FOLDER_ATTRIBUTE_SYNCHRONIZABLE] = picojson::value(folder.getSynchronizable()); + return picojson::value(o); +} - picojson::value v(o); - return v; +picojson::value MessagingUtil::folderToJson(std::shared_ptr folder) { + return folderToJson(*folder); } PlatformResult MessagingUtil::jsonToMessage(const picojson::value& json, diff --git a/src/messaging/messaging_util.h b/src/messaging/messaging_util.h index 7a5201a..cbcf8bc 100644 --- a/src/messaging/messaging_util.h +++ b/src/messaging/messaging_util.h @@ -138,7 +138,10 @@ class MessagingUtil { static picojson::value messageToJson(std::shared_ptr message); static picojson::value messageAttachmentToJson(std::shared_ptr attachment); static picojson::value conversationToJson(std::shared_ptr conversation); + + static picojson::value folderToJson(const MessageFolder& folder); static picojson::value folderToJson(std::shared_ptr folder); + static common::PlatformResult jsonToMessage(const picojson::value& json, std::shared_ptr* result, MessagingInstance& instance); @@ -236,6 +239,13 @@ class PostQueue { }; }; +struct FindFoldersTaskParams { + int account_id, callback_id; + std::string message_type; + MessagingInstance* instance; + std::shared_ptr filter; +}; + } // messaging } // extension #endif // MESSAGING_MESSAGING_UTIL_H_ -- 2.7.4