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/filesystem/filesystem_provider.h"
24 #include "common/logger.h"
25 #include "common/tools.h"
27 #include "MsgCommon/AbstractFilter.h"
28 #include "conversations_change_callback.h"
29 #include "email_manager.h"
30 #include "find_msg_callback_user_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;
43 using common::tools::ReportError;
49 const char* GET_MESSAGE_SERVICES_ARGS_MESSAGE_SERVICE_TYPE = "messageServiceType";
50 const char* SEND_MESSAGE_ARGS_MESSAGE = "message";
51 const char* SEND_MESSAGE_ARGS_SIMINDEX = "simIndex";
52 const char* LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT = "attachment";
53 const char* SYNC_ARGS_ID = "id";
54 const char* SYNC_ARGS_LIMIT = "limit";
55 const char* SYNC_FOLDER_ARGS_ID = "id";
56 const char* SYNC_FOLDER_ARGS_FOLDER = "folder";
57 const char* SYNC_FOLDER_ARGS_LIMIT = "limit";
58 const char* STOP_SYNC_ARGS_ID = "id";
59 const char* STOP_SYNC_ARGS_OPID = "opId";
60 const char* ADD_DRAFT_MESSAGE_ARGS_MESSAGE = "message";
61 const char* REMOVE_MESSAGES_ARGS_MESSAGES = "messages";
62 const char* UPDATE_MESSAGES_ARGS_MESSAGES = "messages";
63 const char* FIND_CONVERSATIONS_ARGS_LIMIT = "limit";
64 const char* FIND_CONVERSATIONS_ARGS_OFFSET = "offset";
65 const char* REMOVE_CONVERSATIONS_ARGS_CONVERSATIONS = "conversations";
66 const char* FIND_FOLDERS_ARGS_LIMIT = "limit";
67 const char* FIND_FOLDERS_ARGS_OFFSET = "offset";
68 const char* REMOVE_CHANGE_LISTENER_ARGS_WATCHID = "watchId";
69 const char* FUNCTIONS_HIDDEN_ARGS_SERVICE_ID = "serviceId";
70 const char* FUN_MESSAGE_MESSAGING_EMAIL = "messaging.email";
72 int getServiceIdFromJSON(const picojson::object& data) {
75 MessagingUtil::getValueFromJSONObject<std::string>(data, FUNCTIONS_HIDDEN_ARGS_SERVICE_ID));
81 const std::string kPrivilegeMessagingRead = "http://tizen.org/privilege/messaging.read";
82 const std::string kPrivilegeMessagingWrite = "http://tizen.org/privilege/messaging.write";
84 const long kDumbCallbackId = -1;
87 MessagingInstance::MessagingInstance() : manager_(*this), queue_(*this) {
89 using std::placeholders::_1;
90 using std::placeholders::_2;
92 #define REGISTER_METHOD(M) RegisterSyncHandler(#M, std::bind(&MessagingInstance::M, this, _1, _2))
93 REGISTER_METHOD(GetMessageServices);
94 REGISTER_METHOD(MessageServiceSendMessage);
95 REGISTER_METHOD(MessageServiceLoadMessageBody);
96 REGISTER_METHOD(MessageServiceLoadMessageAttachment);
97 REGISTER_METHOD(MessageStorageAddDraftMessage);
98 REGISTER_METHOD(MessageStorageFindMessages);
99 REGISTER_METHOD(MessageStorageRemoveMessages);
100 REGISTER_METHOD(MessageStorageUpdateMessages);
101 REGISTER_METHOD(MessageStorageFindConversations);
102 REGISTER_METHOD(MessageStorageRemoveConversations);
103 REGISTER_METHOD(MessageStorageFindFolders);
105 REGISTER_METHOD(MessageServiceSync);
106 REGISTER_METHOD(MessageServiceStopSync);
107 REGISTER_METHOD(MessageServiceSyncFolder);
108 REGISTER_METHOD(MessageStorageAddMessagesChangeListener);
109 REGISTER_METHOD(MessageStorageAddConversationsChangeListener);
110 REGISTER_METHOD(MessageStorageAddFolderChangeListener);
111 REGISTER_METHOD(MessageStorageRemoveChangeListener);
112 REGISTER_METHOD(MessageGetMessageStatus);
113 #undef REGISTER_METHOD
116 MessagingInstance::~MessagingInstance() {
120 #define POST_AND_RETURN(ret, json, obj) \
121 LogAndReportError(ret, &obj); \
122 queue_.addAndResolve(obj.at(JSON_CALLBACK_ID).get<double>(), PostPriority::HIGH, \
123 json->serialize()); \
126 #define CHECK_EXIST(args, name, out) \
127 if (!args.contains(name)) { \
128 std::string message = std::string(name) + " is required argument"; \
129 LogAndReportError(PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, message), &out); \
133 EmailManager& MessagingInstance::getEmailManager() {
134 return email_manager_;
137 ShortMsgManager& MessagingInstance::getShortMsgManager() {
138 return short_msg_manager_;
141 void MessagingInstance::GetMessageServices(const picojson::value& args, picojson::object& out) {
144 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
146 picojson::value serviceTag =
147 args.get<picojson::object>().at(GET_MESSAGE_SERVICES_ARGS_MESSAGE_SERVICE_TYPE);
148 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
149 // above values should be validated in js
150 manager_.getMessageServices(serviceTag.to_str(), callbackId);
153 void MessagingInstance::MessageServiceSendMessage(const picojson::value& args,
154 picojson::object& out) {
157 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
158 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
160 picojson::object data = args.get<picojson::object>();
161 picojson::value v_message = data.at(SEND_MESSAGE_ARGS_MESSAGE);
163 bool has_attachments = v_message.get("hasAttachment").get<bool>();
164 if (has_attachments) {
165 const auto& attachments = v_message.get("attachments").get<std::vector<picojson::value>>();
166 for (const auto& att : attachments) {
167 const auto& attachment_path = att.get("filePath").get<std::string>();
168 const auto& attachment_real_path =
169 common::FilesystemProvider::Create().GetRealPath(attachment_path);
170 CHECK_STORAGE_ACCESS(attachment_real_path, &out);
174 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
176 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
177 picojson::object& obj = json->get<picojson::object>();
178 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
180 std::shared_ptr<Message> message;
181 PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message, *this);
183 POST_AND_RETURN(ret, json, obj)
186 MessageRecipientsCallbackData* callback =
187 new MessageRecipientsCallbackData(queue_, callbackId, *this);
191 callback->setMessage(message);
192 serviceId = getServiceIdFromJSON(data);
193 callback->setAccountId(serviceId);
194 simIndex = static_cast<long>(
195 MessagingUtil::getValueFromJSONObject<double>(data, SEND_MESSAGE_ARGS_SIMINDEX));
197 bool cell_support = false;
198 system_info_get_platform_bool("http://tizen.org/feature/network.telephony", &cell_support);
200 LoggerD("cell_support is true");
201 if (!callback->setSimIndex(simIndex)) {
204 POST_AND_RETURN(PlatformResult(ErrorCode::UNKNOWN_ERR, "set sim index failed"), json, obj)
207 LoggerD("cell_support is false");
210 callback->AddToQueue();
211 auto service = manager_.getMessageService(serviceId);
213 ret = service->sendMessage(callback);
215 POST_AND_RETURN(ret, json, obj)
219 void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& args,
220 picojson::object& out) {
223 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
224 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
226 picojson::object data = args.get<picojson::object>();
228 picojson::value json_message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE);
229 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
231 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
232 picojson::object& obj = json->get<picojson::object>();
233 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
235 std::shared_ptr<Message> message;
236 PlatformResult ret = MessagingUtil::jsonToMessage(json_message, &message, *this);
238 POST_AND_RETURN(ret, json, obj)
241 MessageBodyCallbackData* callback = new MessageBodyCallbackData(queue_, callbackId, *this);
243 callback->setMessage(message);
245 callback->AddToQueue();
246 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
247 ret = service->loadMessageBody(callback);
249 POST_AND_RETURN(ret, json, obj)
253 void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::value& args,
254 picojson::object& out) {
257 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
258 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
260 picojson::object data = args.get<picojson::object>();
261 picojson::value attachment = data.at(LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT);
262 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
264 MessageAttachmentCallbackData* callback =
265 new MessageAttachmentCallbackData(queue_, callbackId, *this);
266 callback->setMessageAttachment(MessagingUtil::jsonToMessageAttachment(attachment));
268 callback->AddToQueue();
269 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
270 const auto result = service->loadMessageAttachment(callback);
271 if (result.IsError()) {
272 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
273 picojson::object& obj = json->get<picojson::object>();
274 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
275 POST_AND_RETURN(result, json, obj)
279 void MessagingInstance::MessageServiceSync(const picojson::value& args, picojson::object& out) {
282 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
283 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
285 picojson::object data = args.get<picojson::object>();
286 picojson::value v_id = data.at(SYNC_ARGS_ID);
287 picojson::value v_limit = data.at(SYNC_ARGS_LIMIT);
288 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
292 id = std::stoi(v_id.get<std::string>());
294 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out,
295 ("Problem with MessageService"));
299 if (v_limit.is<double>()) {
300 limit = static_cast<long>(v_limit.get<double>());
303 SyncCallbackData* callback = new SyncCallbackData(queue_, callbackId, *this);
304 callback->setAccountId(id);
305 callback->setLimit(limit);
307 callback->AddToQueue();
310 const auto result = manager_.getMessageService(id)->sync(callback, &op_id);
313 ReportSuccess(picojson::value(static_cast<double>(op_id)), out);
315 LogAndReportError(result, &out);
319 void MessagingInstance::MessageServiceSyncFolder(const picojson::value& args,
320 picojson::object& out) {
323 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
324 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
326 picojson::object data = args.get<picojson::object>();
327 picojson::value v_id = data.at(SYNC_FOLDER_ARGS_ID);
328 picojson::value v_folder = data.at(SYNC_FOLDER_ARGS_FOLDER);
329 picojson::value v_limit = data.at(SYNC_FOLDER_ARGS_LIMIT);
330 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
334 id = std::stoi(v_id.get<std::string>());
336 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out,
337 ("Problem with MessageService"));
342 if (v_limit.is<double>()) {
343 limit = static_cast<long>(v_limit.get<double>());
346 SyncFolderCallbackData* callback = new SyncFolderCallbackData(queue_, callbackId, *this);
347 callback->setAccountId(id);
348 auto folder_ptr = std::make_shared<MessageFolder>();
349 folder_ptr->attributes = v_folder;
350 callback->setMessageFolder(folder_ptr);
351 callback->setLimit(limit);
353 callback->AddToQueue();
356 const auto result = manager_.getMessageService(id)->syncFolder(callback, &op_id);
358 ReportSuccess(picojson::value(static_cast<double>(op_id)), out);
360 LogAndReportError(result, &out);
364 void MessagingInstance::MessageServiceStopSync(const picojson::value& args, picojson::object& out) {
366 CHECK_EXIST(args, STOP_SYNC_ARGS_OPID, out);
368 picojson::object data = args.get<picojson::object>();
370 if (data.find(STOP_SYNC_ARGS_ID) != data.end()) {
371 picojson::value v_id = data.at(STOP_SYNC_ARGS_ID);
372 picojson::value v_op_id = data.at(STOP_SYNC_ARGS_OPID);
376 id = std::stoi(v_id.get<std::string>());
378 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out,
379 ("Problem with MessageService"));
384 if (v_op_id.is<double>()) {
385 op_id = static_cast<long>(v_op_id.get<double>());
388 const auto result = manager_.getMessageService(id)->stopSync(op_id);
393 LogAndReportError(result, &out);
396 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &out, ("Unknown error"));
400 void MessagingInstance::MessageStorageAddDraftMessage(const picojson::value& args,
401 picojson::object& out) {
404 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
405 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
407 picojson::object data = args.get<picojson::object>();
408 picojson::value v_message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE);
409 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
411 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
412 picojson::object& obj = json->get<picojson::object>();
413 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
415 std::shared_ptr<Message> message;
416 PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message, *this);
418 POST_AND_RETURN(ret, json, obj)
421 MessageCallbackUserData* callback = new MessageCallbackUserData(queue_, callbackId, *this);
422 callback->setMessage(message);
424 int serviceId = getServiceIdFromJSON(data);
425 callback->setAccountId(serviceId);
427 callback->AddToQueue();
428 auto service = manager_.getMessageService(serviceId);
429 service->getMsgStorage()->addDraftMessage(callback);
432 void MessagingInstance::MessageStorageFindMessages(const picojson::value& args,
433 picojson::object& out) {
436 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
437 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
439 picojson::object data = args.get<picojson::object>();
440 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
442 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
443 picojson::object& obj = json->get<picojson::object>();
444 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
446 AbstractFilterPtr filter;
447 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
449 POST_AND_RETURN(ret, json, obj)
451 auto sortMode = MessagingUtil::jsonToSortMode(data);
453 long limit = static_cast<long>(
454 MessagingUtil::getValueFromJSONObject<double>(data, FIND_FOLDERS_ARGS_LIMIT));
456 long offset = static_cast<long>(
457 MessagingUtil::getValueFromJSONObject<double>(data, FIND_FOLDERS_ARGS_OFFSET));
459 int serviceId = getServiceIdFromJSON(data);
460 auto storage = manager_.getMessageService(serviceId)->getMsgStorage();
462 FindMsgCallbackUserData* callback = new FindMsgCallbackUserData(queue_, callbackId, *this);
463 callback->setFilter(filter);
464 callback->setLimit(limit);
465 callback->setOffset(offset);
466 callback->setAccountId(serviceId);
467 callback->setSortMode(sortMode);
469 callback->AddToQueue();
470 storage->findMessages(callback);
473 void MessagingInstance::MessageStorageRemoveMessages(const picojson::value& args,
474 picojson::object& out) {
477 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
478 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
480 picojson::object data = args.get<picojson::object>();
481 picojson::array messages = data.at(REMOVE_MESSAGES_ARGS_MESSAGES).get<picojson::array>();
482 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
484 MessagesCallbackUserData* callback = new MessagesCallbackUserData(queue_, callbackId, *this);
486 auto each = [callback, this](picojson::value& v) -> void {
487 std::shared_ptr<Message> message;
488 PlatformResult ret = MessagingUtil::jsonToMessage(v, &message, *this);
489 if (ret.IsSuccess()) {
490 callback->addMessage(message);
494 for_each(messages.begin(), messages.end(), each);
496 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
498 callback->AddToQueue();
499 service->getMsgStorage()->removeMessages(callback);
502 void MessagingInstance::MessageStorageUpdateMessages(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::value pico_messages = data.at(UPDATE_MESSAGES_ARGS_MESSAGES);
511 auto pico_array = pico_messages.get<picojson::array>();
512 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
514 auto callback = new MessagesCallbackUserData(queue_, callbackId, *this);
516 std::for_each(pico_array.begin(), pico_array.end(),
517 [&callback, this](picojson::value& v) -> void {
518 std::shared_ptr<Message> message;
519 PlatformResult ret = MessagingUtil::jsonToMessage(v, &message, *this);
520 if (ret.IsSuccess()) {
521 callback->addMessage(message);
525 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
527 callback->AddToQueue();
528 service->getMsgStorage()->updateMessages(callback);
531 void MessagingInstance::MessageStorageFindConversations(const picojson::value& args,
532 picojson::object& out) {
535 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
536 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
538 picojson::object data = args.get<picojson::object>();
539 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
541 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
542 picojson::object& obj = json->get<picojson::object>();
543 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
545 AbstractFilterPtr filter;
546 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
548 POST_AND_RETURN(ret, json, obj)
550 auto sortMode = MessagingUtil::jsonToSortMode(data);
551 long limit = static_cast<long>(
552 MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_LIMIT));
553 long offset = static_cast<long>(
554 MessagingUtil::getValueFromJSONObject<double>(data, FIND_CONVERSATIONS_ARGS_OFFSET));
556 int serviceId = getServiceIdFromJSON(data);
558 ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId, *this);
559 callback->setFilter(filter);
560 callback->setLimit(limit);
561 callback->setOffset(offset);
562 callback->setAccountId(serviceId);
563 callback->setSortMode(sortMode);
565 callback->AddToQueue();
566 auto storage = manager_.getMessageService(serviceId)->getMsgStorage();
567 storage->findConversations(callback);
570 void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& args,
571 picojson::object& out) {
574 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out);
575 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
577 picojson::object data = args.get<picojson::object>();
578 picojson::array conversations =
579 data.at(REMOVE_CONVERSATIONS_ARGS_CONVERSATIONS).get<picojson::array>();
580 const double callbackId = args.get(JSON_CALLBACK_ID).get<double>();
582 auto json = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
583 picojson::object& obj = json->get<picojson::object>();
584 obj[JSON_CALLBACK_ID] = picojson::value(callbackId);
586 ConversationCallbackData* callback = new ConversationCallbackData(queue_, callbackId, *this);
588 PlatformResult ret(ErrorCode::NO_ERROR);
589 for (auto it = conversations.begin(); it != conversations.end(); ++it) {
590 std::shared_ptr<MessageConversation> conversation;
591 ret = MessagingUtil::jsonToMessageConversation(*it, &conversation);
594 POST_AND_RETURN(ret, json, obj)
596 callback->addConversation(conversation);
599 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
601 callback->AddToQueue();
602 service->getMsgStorage()->removeConversations(callback);
605 void MessagingInstance::MessageStorageFindFolders(const picojson::value& args,
606 picojson::object& out) {
609 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
610 CHECK_EXIST(args, JSON_CALLBACK_ID, out);
612 const auto& data = args.get<picojson::object>();
613 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
615 auto task_params = new FindFoldersTaskParams();
616 task_params->instance = this;
617 task_params->callback_id = args.get(JSON_CALLBACK_ID).get<double>();
618 task_params->account_id = service->getMsgServiceId();
619 task_params->message_type = service->getMsgServiceTypeString();
621 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &(task_params->filter));
623 LoggerE("Cannot convert json to AbstractFilter: %s", args.serialize().c_str());
624 ReportError(ret, &out);
629 service->getMsgStorage()->findFolders(task_params);
632 void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson::value& args,
633 picojson::object& out) {
636 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
638 picojson::object data = args.get<picojson::object>();
640 AbstractFilterPtr filter;
641 PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter);
643 ReportError(ret, &out);
647 int serviceId = getServiceIdFromJSON(data);
649 auto service = manager_.getMessageService(serviceId);
651 std::shared_ptr<MessagesChangeCallback> callback(new MessagesChangeCallback(
652 kDumbCallbackId, serviceId, service->getMsgServiceType(), queue_, *this));
654 callback->setFilter(filter);
656 long op_id = service->getMsgStorage()->addMessagesChangeListener(callback);
658 picojson::value v(static_cast<double>(op_id));
659 ReportSuccess(v, out);
662 void MessagingInstance::MessageStorageAddConversationsChangeListener(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<ConversationsChangeCallback> callback(new ConversationsChangeCallback(
682 static_cast<long>(-1), serviceId, service->getMsgServiceType(), queue_, *this));
684 callback->setFilter(filter);
686 long op_id = service->getMsgStorage()->addConversationsChangeListener(callback);
688 picojson::value v(static_cast<double>(op_id));
689 ReportSuccess(v, out);
692 void MessagingInstance::MessageStorageAddFolderChangeListener(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<FoldersChangeCallback> callback(
712 new FoldersChangeCallback(serviceId, service->getMsgServiceType(), *this));
714 callback->setFilter(filter);
716 long op_id = service->getMsgStorage()->addFoldersChangeListener(callback);
718 picojson::value v(static_cast<double>(op_id));
719 ReportSuccess(v, out);
722 void MessagingInstance::MessageStorageRemoveChangeListener(const picojson::value& args,
723 picojson::object& out) {
726 CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out);
728 picojson::object data = args.get<picojson::object>();
730 static_cast<long>(data.at(REMOVE_CHANGE_LISTENER_ARGS_WATCHID).get<double>());
732 auto service = manager_.getMessageService(getServiceIdFromJSON(data));
734 service->getMsgStorage()->removeChangeListener(watchId);
738 void MessagingInstance::MessageGetMessageStatus(const picojson::value& args,
739 picojson::object& out) {
742 picojson::object data = args.get<picojson::object>();
743 const int id = stoi(data.at("id").get<std::string>());
744 const std::string& type = data.at("type").get<std::string>();
747 if (FUN_MESSAGE_MESSAGING_EMAIL == type) {
748 status = email_manager_.getMessageStatus(id);
750 status = short_msg_manager_.getMessageStatus(id);
753 ReportSuccess(picojson::value(status), out);
756 } // namespace messaging
757 } // namespace extension