2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "messaging_instance.h"
19 #include <system_info.h>
23 #include "common/logger.h"
24 #include "common/tools.h"
26 #include "MsgCommon/AbstractFilter.h"
27 #include "conversations_change_callback.h"
28 #include "email_manager.h"
29 #include "find_msg_callback_user_data.h"
30 #include "folders_callback_data.h"
31 #include "folders_change_callback.h"
33 #include "message_storage.h"
34 #include "messages_callback_user_data.h"
35 #include "messages_change_callback.h"
36 #include "messaging_manager.h"
37 #include "messaging_util.h"
38 #include "short_message_manager.h"
40 using common::ErrorCode;
41 using common::TypeMismatchException;
42 using common::PlatformResult;
48 const char* FUN_GET_MESSAGE_SERVICES = "Messaging_getMessageServices";
49 const char* GET_MESSAGE_SERVICES_ARGS_MESSAGE_SERVICE_TYPE = "messageServiceType";
51 const char* FUN_MESSAGE_SERVICE_SEND_MESSAGE = "MessageService_sendMessage";
52 const char* SEND_MESSAGE_ARGS_MESSAGE = "message";
53 const char* SEND_MESSAGE_ARGS_SIMINDEX = "simIndex";
55 const char* FUN_MESSAGE_SERVICE_LOAD_MESSAGE_BODY = "MessageService_loadMessageBody";
57 const char* FUN_MESSAGE_SERVICE_LOAD_MESSAGE_ATTACHMENT = "MessageService_loadMessageAttachment";
58 const char* LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT = "attachment";
60 const char* FUN_MESSAGE_SERVICE_SYNC = "MessageService_sync";
61 const char* SYNC_ARGS_ID = "id";
62 const char* SYNC_ARGS_LIMIT = "limit";
64 const char* FUN_MESSAGE_SERVICE_SYNC_FOLDER = "MessageService_syncFolder";
65 const char* SYNC_FOLDER_ARGS_ID = "id";
66 const char* SYNC_FOLDER_ARGS_FOLDER = "folder";
67 const char* SYNC_FOLDER_ARGS_LIMIT = "limit";
69 const char* FUN_MESSAGE_SERVICE_STOP_SYNC = "MessageService_stopSync";
70 const char* STOP_SYNC_ARGS_ID = "id";
71 const char* STOP_SYNC_ARGS_OPID = "opId";
73 const char* FUN_MESSAGE_STORAGE_ADD_DRAFT_MESSAGE = "MessageStorage_addDraftMessage";
74 const char* ADD_DRAFT_MESSAGE_ARGS_MESSAGE = "message";
76 const char* FUN_MESSAGE_STORAGE_FIND_MESSAGES = "MessageStorage_findMessages";
78 const char* FUN_MESSAGE_STORAGE_REMOVE_MESSAGES = "MessageStorage_removeMessages";
79 const char* REMOVE_MESSAGES_ARGS_MESSAGES = "messages";
81 const char* FUN_MESSAGE_STORAGE_UPDATE_MESSAGES = "MessageStorage_updateMessages";
82 const char* UPDATE_MESSAGES_ARGS_MESSAGES = "messages";
84 const char* FUN_MESSAGE_STORAGE_FIND_CONVERSATIONS = "MessageStorage_findConversations";
85 const char* FIND_CONVERSATIONS_ARGS_LIMIT = "limit";
86 const char* FIND_CONVERSATIONS_ARGS_OFFSET = "offset";
88 const char* FUN_MESSAGE_STORAGE_REMOVE_CONVERSATIONS = "MessageStorage_removeConversations";
89 const char* REMOVE_CONVERSATIONS_ARGS_CONVERSATIONS = "conversations";
91 const char* FUN_MESSAGE_STORAGE_FIND_FOLDERS = "MessageStorage_findFolders";
92 const char* FIND_FOLDERS_ARGS_LIMIT = "limit";
93 const char* FIND_FOLDERS_ARGS_OFFSET = "offset";
95 const char* FUN_MESSAGE_STORAGE_ADD_MESSAGES_CHANGE_LISTENER =
96 "MessageStorage_addMessagesChangeListener";
98 const char* FUN_MESSAGE_STORAGE_ADD_CONVERSATIONS_CHANGE_LISTENER =
99 "MessageStorage_addConversationsChangeListener";
101 const char* FUN_MESSAGE_STORAGE_ADD_FOLDER_CHANGE_LISTENER =
102 "MessageStorage_addFoldersChangeListener";
104 const char* FUN_MESSAGE_STORAGE_REMOVE_CHANGE_LISTENER = "MessageStorage_removeChangeListener";
105 const char* REMOVE_CHANGE_LISTENER_ARGS_WATCHID = "watchId";
107 const char* FUNCTIONS_HIDDEN_ARGS_SERVICE_ID = "serviceId";
108 const char* FUN_MESSAGE_GET_MESSAGE_STATUS = "Message_messageStatus";
109 const char* FUN_MESSAGE_MESSAGING_EMAIL = "messaging.email";
111 auto getServiceIdFromJSON = [](picojson::object& data) -> int {
112 std::string serviceStrId;
115 MessagingUtil::getValueFromJSONObject<std::string>(data, FUNCTIONS_HIDDEN_ARGS_SERVICE_ID);
116 return std::stoi(serviceStrId);
122 const std::string kPrivilegeMessagingRead = "http://tizen.org/privilege/messaging.read";
123 const std::string kPrivilegeMessagingWrite = "http://tizen.org/privilege/messaging.write";
125 const long kDumbCallbackId = -1;
128 MessagingInstance::MessagingInstance() : manager_(*this), queue_(*this) {
130 using std::placeholders::_1;
131 using std::placeholders::_2;
132 #define REGISTER_ASYNC(c, x) RegisterSyncHandler(c, std::bind(&MessagingInstance::x, this, _1, _2));
133 REGISTER_ASYNC(FUN_GET_MESSAGE_SERVICES, GetMessageServices);
134 REGISTER_ASYNC(FUN_MESSAGE_SERVICE_SEND_MESSAGE, MessageServiceSendMessage);
135 REGISTER_ASYNC(FUN_MESSAGE_SERVICE_LOAD_MESSAGE_BODY, MessageServiceLoadMessageBody);
136 REGISTER_ASYNC(FUN_MESSAGE_SERVICE_LOAD_MESSAGE_ATTACHMENT, MessageServiceLoadMessageAttachment);
137 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_ADD_DRAFT_MESSAGE, MessageStorageAddDraft);
138 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_FIND_MESSAGES, MessageStorageFindMessages);
139 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_REMOVE_MESSAGES, MessageStorageRemoveMessages);
140 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_UPDATE_MESSAGES, MessageStorageUpdateMessages);
141 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_FIND_CONVERSATIONS, MessageStorageFindConversations);
142 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_REMOVE_CONVERSATIONS, MessageStorageRemoveConversations);
143 REGISTER_ASYNC(FUN_MESSAGE_STORAGE_FIND_FOLDERS, MessageStorageFindFolders);
144 #undef REGISTER_ASYNC
145 #define REGISTER_SYNC(c, x) RegisterSyncHandler(c, std::bind(&MessagingInstance::x, this, _1, _2));
146 REGISTER_SYNC(FUN_MESSAGE_SERVICE_SYNC, MessageServiceSync);
147 REGISTER_SYNC(FUN_MESSAGE_SERVICE_STOP_SYNC, MessageServiceStopSync);
148 REGISTER_SYNC(FUN_MESSAGE_SERVICE_SYNC_FOLDER, MessageServiceSyncFolder);
149 REGISTER_SYNC(FUN_MESSAGE_STORAGE_ADD_MESSAGES_CHANGE_LISTENER,
150 MessageStorageAddMessagesChangeListener);
151 REGISTER_SYNC(FUN_MESSAGE_STORAGE_ADD_CONVERSATIONS_CHANGE_LISTENER,
152 MessageStorageAddConversationsChangeListener);
153 REGISTER_SYNC(FUN_MESSAGE_STORAGE_ADD_FOLDER_CHANGE_LISTENER,
154 MessageStorageAddFolderChangeListener);
155 REGISTER_SYNC(FUN_MESSAGE_STORAGE_REMOVE_CHANGE_LISTENER, MessageStorageRemoveChangeListener);
156 REGISTER_SYNC(FUN_MESSAGE_GET_MESSAGE_STATUS, MessageGetMessageStatus);
160 MessagingInstance::~MessagingInstance() {
164 #define POST_AND_RETURN(ret, json, obj) \
165 LogAndReportError(ret, &obj); \
166 queue_.addAndResolve(obj.at(JSON_CALLBACK_ID).get<double>(), PostPriority::HIGH, \
167 json->serialize()); \
170 #define CHECK_EXIST(args, name, out) \
171 if (!args.contains(name)) { \
172 std::string message = std::string(name) + " is required argument"; \
173 LogAndReportError(PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, message), &out); \
177 EmailManager& MessagingInstance::getEmailManager() {
178 return email_manager_;
181 ShortMsgManager& MessagingInstance::getShortMsgManager() {
182 return short_msg_manager_;
185 void MessagingInstance::GetMessageServices(const picojson::value& args, picojson::object& out) {
188 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
190 picojson::value serviceTag =
191 args.get<picojson::object>().at(GET_MESSAGE_SERVICES_ARGS_MESSAGE_SERVICE_TYPE);
192 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
193 // above values should be validated in js
194 manager_.getMessageServices(serviceTag.to_str(), callbackId);
197 void MessagingInstance::MessageServiceSendMessage(const picojson::value& args,
198 picojson::object& out) {
201 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
202 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
204 picojson::object data = args.get<picojson::object>();
205 picojson::value v_message = data.at(SEND_MESSAGE_ARGS_MESSAGE);
206 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
208 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
209 picojson::object& obj = json->get<picojson::object>();
210 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
212 std::shared_ptr<Message> message;
213 PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message, *this);
215 POST_AND_RETURN(ret, json, obj)
218 MessageRecipientsCallbackData* callback =
219 new MessageRecipientsCallbackData(queue_, callbackId, *this);
223 callback->setMessage(message);
224 serviceId = getServiceIdFromJSON(data);
225 callback->setAccountId(serviceId);
226 simIndex = static_cast<long>(
227 MessagingUtil::getValueFromJSONObject<double>(data, SEND_MESSAGE_ARGS_SIMINDEX));
229 bool cell_support = false;
230 system_info_get_platform_bool("http://tizen.org/feature/network.telephony", &cell_support);
232 LoggerD("cell_support is true");
233 if (!callback->setSimIndex(simIndex)) {
236 POST_AND_RETURN(PlatformResult(ErrorCode::UNKNOWN_ERR, "set sim index failed"), json, obj)
239 LoggerD("cell_support is false");
242 callback->AddToQueue();
243 auto service = manager_.getMessageService(serviceId);
245 ret = service->sendMessage(callback);
247 POST_AND_RETURN(ret, json, obj)
251 void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& args,
252 picojson::object& out) {
255 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
256 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
258 picojson::object data = args.get<picojson::object>();
260 picojson::value json_message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE);
261 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
263 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
264 picojson::object& obj = json->get<picojson::object>();
265 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
267 std::shared_ptr<Message> message;
268 PlatformResult ret = MessagingUtil::jsonToMessage(json_message, &message, *this);
270 POST_AND_RETURN(ret, json, obj)
273 MessageBodyCallbackData* callback = new MessageBodyCallbackData(queue_, callbackId, *this);
275 callback->setMessage(message);
277 callback->AddToQueue();
278 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
279 ret = service->loadMessageBody(callback);
281 POST_AND_RETURN(ret, json, obj)
285 void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::value& args,
286 picojson::object& out) {
289 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
290 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
292 picojson::object data = args.get<picojson::object>();
293 picojson::value attachment = data.at(LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT);
294 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
296 MessageAttachmentCallbackData* callback =
297 new MessageAttachmentCallbackData(queue_, callbackId, *this);
298 callback->setMessageAttachment(MessagingUtil::jsonToMessageAttachment(attachment));
300 callback->AddToQueue();
301 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
302 const auto result = service->loadMessageAttachment(callback);
303 if (result.IsError()) {
304 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
305 picojson::object& obj = json->get<picojson::object>();
306 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
307 POST_AND_RETURN(result, json, obj)
311 void MessagingInstance::MessageServiceSync(const picojson::value& args, picojson::object& out) {
314 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
315 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
317 picojson::object data = args.get<picojson::object>();
318 picojson::value v_id = data.at(SYNC_ARGS_ID);
319 picojson::value v_limit = data.at(SYNC_ARGS_LIMIT);
320 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
324 id = std::stoi(v_id.get<std::string>());
326 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out,
327 ("Problem with MessageService"));
331 if (v_limit.is<double>()) {
332 limit = static_cast<long>(v_limit.get<double>());
335 SyncCallbackData* callback = new SyncCallbackData(queue_, callbackId, *this);
336 callback->setAccountId(id);
337 callback->setLimit(limit);
339 callback->AddToQueue();
342 const auto result = manager_.getMessageService(id)->sync(callback, &op_id);
345 ReportSuccess(picojson::value(static_cast<double>(op_id)), out);
347 LogAndReportError(result, &out);
351 void MessagingInstance::MessageServiceSyncFolder(const picojson::value& args,
352 picojson::object& out) {
355 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
356 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
358 picojson::object data = args.get<picojson::object>();
359 picojson::value v_id = data.at(SYNC_FOLDER_ARGS_ID);
360 picojson::value v_folder = data.at(SYNC_FOLDER_ARGS_FOLDER);
361 picojson::value v_limit = data.at(SYNC_FOLDER_ARGS_LIMIT);
362 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
366 id = std::stoi(v_id.get<std::string>());
368 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out,
369 ("Problem with MessageService"));
374 if (v_limit.is<double>()) {
375 limit = static_cast<long>(v_limit.get<double>());
378 SyncFolderCallbackData* callback = new SyncFolderCallbackData(queue_, callbackId, *this);
379 callback->setAccountId(id);
380 callback->setMessageFolder(MessagingUtil::jsonToMessageFolder(v_folder));
381 callback->setLimit(limit);
383 callback->AddToQueue();
386 const auto result = manager_.getMessageService(id)->syncFolder(callback, &op_id);
388 ReportSuccess(picojson::value(static_cast<double>(op_id)), out);
390 LogAndReportError(result, &out);
394 void MessagingInstance::MessageServiceStopSync(const picojson::value& args, picojson::object& out) {
396 CHECK_EXIST(args, STOP_SYNC_ARGS_OPID, out);
398 picojson::object data = args.get<picojson::object>();
400 if (data.find(STOP_SYNC_ARGS_ID) != data.end()) {
401 picojson::value v_id = data.at(STOP_SYNC_ARGS_ID);
402 picojson::value v_op_id = data.at(STOP_SYNC_ARGS_OPID);
406 id = std::stoi(v_id.get<std::string>());
408 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out,
409 ("Problem with MessageService"));
414 if (v_op_id.is<double>()) {
415 op_id = static_cast<long>(v_op_id.get<double>());
418 const auto result = manager_.getMessageService(id)->stopSync(op_id);
423 LogAndReportError(result, &out);
426 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out, ("Unknown error"));
430 void MessagingInstance::MessageStorageAddDraft(const picojson::value& args, picojson::object& out) {
433 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
434 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
436 picojson::object data = args.get<picojson::object>();
437 picojson::value v_message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE);
438 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
440 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
441 picojson::object& obj = json->get<picojson::object>();
442 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
444 std::shared_ptr<Message> message;
445 PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message, *this);
447 POST_AND_RETURN(ret, json, obj)
450 MessageCallbackUserData* callback = new MessageCallbackUserData(queue_, callbackId, *this);
451 callback->setMessage(message);
453 int serviceId = getServiceIdFromJSON(data);
454 callback->setAccountId(serviceId);
456 callback->AddToQueue();
457 auto service = manager_.getMessageService(serviceId);
458 service->getMsgStorage()->addDraftMessage(callback);
461 void MessagingInstance::MessageStorageFindMessages(const picojson::value& args,
462 picojson::object& out) {
465 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
466 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
468 picojson::object data = args.get<picojson::object>();
469 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
471 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
472 picojson::object& obj = json->get<picojson::object>();
473 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
475 AbstractFilterPtr filter;
476 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
478 POST_AND_RETURN(ret, json, obj)
480 auto sortMode = MessagingUtil::jsonToSortMode(data);
482 long limit = static_cast<long>(
483 MessagingUtil::getValueFromJSONObject<double>(data, FIND_FOLDERS_ARGS_LIMIT));
485 long offset = static_cast<long>(
486 MessagingUtil::getValueFromJSONObject<double>(data, FIND_FOLDERS_ARGS_OFFSET));
488 int serviceId = getServiceIdFromJSON(data);
489 auto storage = manager_.getMessageService(serviceId)->getMsgStorage();
491 FindMsgCallbackUserData* callback = new FindMsgCallbackUserData(queue_, callbackId, *this);
492 callback->setFilter(filter);
493 callback->setLimit(limit);
494 callback->setOffset(offset);
495 callback->setAccountId(serviceId);
496 callback->setSortMode(sortMode);
498 callback->AddToQueue();
499 storage->findMessages(callback);
502 void MessagingInstance::MessageStorageRemoveMessages(const picojson::value& args,
503 picojson::object& out) {
506 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
507 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
509 picojson::object data = args.get<picojson::object>();
510 picojson::array messages = data.at(REMOVE_MESSAGES_ARGS_MESSAGES).get<picojson::array>();
511 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
513 MessagesCallbackUserData* callback = new MessagesCallbackUserData(queue_, callbackId, *this);
515 auto each = [callback, this](picojson::value& v) -> void {
516 std::shared_ptr<Message> message;
517 PlatformResult ret = MessagingUtil::jsonToMessage(v, &message, *this);
518 if (ret.IsSuccess()) {
519 callback->addMessage(message);
523 for_each(messages.begin(), messages.end(), each);
525 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
527 callback->AddToQueue();
528 service->getMsgStorage()->removeMessages(callback);
531 void MessagingInstance::MessageStorageUpdateMessages(const picojson::value& args,
532 picojson::object& out) {
535 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
536 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
538 picojson::object data = args.get<picojson::object>();
539 picojson::value pico_messages = data.at(UPDATE_MESSAGES_ARGS_MESSAGES);
540 auto pico_array = pico_messages.get<picojson::array>();
541 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
543 auto callback = new MessagesCallbackUserData(queue_, callbackId, *this);
545 std::for_each(pico_array.begin(), pico_array.end(),
546 [&callback, this](picojson::value& v) -> void {
547 std::shared_ptr<Message> message;
548 PlatformResult ret = MessagingUtil::jsonToMessage(v, &message, *this);
549 if (ret.IsSuccess()) {
550 callback->addMessage(message);
554 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
556 callback->AddToQueue();
557 service->getMsgStorage()->updateMessages(callback);
560 void MessagingInstance::MessageStorageFindConversations(const picojson::value& args,
561 picojson::object& out) {
564 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
565 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
567 picojson::object data = args.get<picojson::object>();
568 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
570 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
571 picojson::object& obj = json->get<picojson::object>();
572 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
574 AbstractFilterPtr filter;
575 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
577 POST_AND_RETURN(ret, json, obj)
579 auto sortMode = MessagingUtil::jsonToSortMode(data);
580 long limit = static_cast<long>(
581 MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_LIMIT));
582 long offset = static_cast<long>(
583 MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_OFFSET));
585 int serviceId = getServiceIdFromJSON(data);
587 ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId, *this);
588 callback->setFilter(filter);
589 callback->setLimit(limit);
590 callback->setOffset(offset);
591 callback->setAccountId(serviceId);
592 callback->setSortMode(sortMode);
594 callback->AddToQueue();
595 auto storage = manager_.getMessageService(serviceId)->getMsgStorage();
596 storage->findConversations(callback);
599 void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& args,
600 picojson::object& out) {
603 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
604 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
606 picojson::object data = args.get<picojson::object>();
607 picojson::array conversations =
608 data.at(REMOVE_CONVERSATIONS_ARGS_CONVERSATIONS).get<picojson::array>();
609 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
611 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
612 picojson::object& obj = json->get<picojson::object>();
613 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
615 ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId, *this);
617 PlatformResult ret(ErrorCode::NO_ERROR);
618 for (auto it = conversations.begin(); it != conversations.end(); ++it) {
619 std::shared_ptr<MessageConversation> conversation;
620 ret = MessagingUtil::jsonToMessageConversation(*it, &conversation);
623 POST_AND_RETURN(ret, json, obj)
625 callback->addConversation(conversation);
628 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
630 callback->AddToQueue();
631 service->getMsgStorage()->removeConversations(callback);
634 void MessagingInstance::MessageStorageFindFolders(const picojson::value& args,
635 picojson::object& out) {
638 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
639 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
641 picojson::object data = args.get<picojson::object>();
642 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
644 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
645 picojson::object& obj = json->get<picojson::object>();
646 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
648 AbstractFilterPtr filter;
649 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
651 POST_AND_RETURN(ret, json, obj)
654 FoldersCallbackData* callback = new FoldersCallbackData(queue_, callbackId, *this);
655 callback->setFilter(filter);
657 callback->AddToQueue();
658 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
659 service->getMsgStorage()->findFolders(callback);
662 void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson::value& args,
663 picojson::object& out) {
666 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
668 picojson::object data = args.get<picojson::object>();
670 AbstractFilterPtr filter;
671 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
673 ReportError(ret, &out);
677 int serviceId = getServiceIdFromJSON(data);
679 auto service = manager_.getMessageService(serviceId);
681 std::shared_ptr<MessagesChangeCallback> callback(new MessagesChangeCallback(
682 kDumbCallbackId, serviceId, service->getMsgServiceType(), queue_, *this));
684 callback->setFilter(filter);
686 long op_id = service->getMsgStorage()->addMessagesChangeListener(callback);
688 picojson::value v(static_cast<double>(op_id));
689 ReportSuccess(v, out);
692 void MessagingInstance::MessageStorageAddConversationsChangeListener(const picojson::value& args,
693 picojson::object& out) {
696 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
698 picojson::object data = args.get<picojson::object>();
700 AbstractFilterPtr filter;
701 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
703 ReportError(ret, &out);
707 int serviceId = getServiceIdFromJSON(data);
709 auto service = manager_.getMessageService(serviceId);
711 std::shared_ptr<ConversationsChangeCallback> callback(new ConversationsChangeCallback(
712 static_cast<long>(-1), serviceId, service->getMsgServiceType(), queue_, *this));
714 callback->setFilter(filter);
716 long op_id = service->getMsgStorage()->addConversationsChangeListener(callback);
718 picojson::value v(static_cast<double>(op_id));
719 ReportSuccess(v, out);
722 void MessagingInstance::MessageStorageAddFolderChangeListener(const picojson::value& args,
723 picojson::object& out) {
726 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
728 picojson::object data = args.get<picojson::object>();
730 AbstractFilterPtr filter;
731 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
733 ReportError(ret, &out);
737 int serviceId = getServiceIdFromJSON(data);
739 auto service = manager_.getMessageService(serviceId);
741 std::shared_ptr<FoldersChangeCallback> callback(new FoldersChangeCallback(
742 static_cast<long>(-1), serviceId, service->getMsgServiceType(), queue_, *this));
744 callback->setFilter(filter);
746 long op_id = service->getMsgStorage()->addFoldersChangeListener(callback);
748 picojson::value v(static_cast<double>(op_id));
749 ReportSuccess(v, out);
752 void MessagingInstance::MessageStorageRemoveChangeListener(const picojson::value& args,
753 picojson::object& out) {
756 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
758 picojson::object data = args.get<picojson::object>();
760 static_cast<long>(data.at(REMOVE_CHANGE_LISTENER_ARGS_WATCHID).get<double>());
762 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
764 service->getMsgStorage()->removeChangeListener(watchId);
768 void MessagingInstance::MessageGetMessageStatus(const picojson::value& args,
769 picojson::object& out) {
772 picojson::object data = args.get<picojson::object>();
773 const int id = stoi(data.at("id").get<std::string>());
774 const std::string& type = data.at("type").get<std::string>();
777 if (FUN_MESSAGE_MESSAGING_EMAIL == type) {
778 status = email_manager_.getMessageStatus(id);
780 status = short_msg_manager_.getMessageStatus(id);
783 ReportSuccess(picojson::value(status), out);
786 } // namespace messaging
787 } // namespace extension