From: Piotr Kosko Date: Wed, 4 Nov 2015 13:30:17 +0000 (+0100) Subject: Revert "[Messaging] Privilege checks moved to JS." X-Git-Tag: submit/tizen_mobile/20151215.080542^2~6^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f5c50c5c90b1fb509f6696860e092ab19ff1ef74;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git Revert "[Messaging] Privilege checks moved to JS." This reverts commit 5610b88186d4cf0f5d9a149cbe6ac5e10768866a. Also applied: [Messaging] Refactored to use NativeManager instead of NativeBridge Ie5263f22be139722b2bec86fc7d3b0dacebd19bb [Verification] Code compiles without errors. Unable to run TCT for SMS, MMS and email. Change-Id: Iea5a6331ab8432ef672757212bb7480034f3774e Signed-off-by: Piotr Kosko --- diff --git a/src/messaging/callback_user_data.cc b/src/messaging/callback_user_data.cc index ae1cf0b3..4816ce6c 100755 --- a/src/messaging/callback_user_data.cc +++ b/src/messaging/callback_user_data.cc @@ -17,6 +17,10 @@ #include "messaging/callback_user_data.h" #include "common/logger.h" +#include "common/tools.h" + +using common::tools::ReportSuccess; +using common::tools::ReportError; namespace extension { namespace messaging { @@ -28,8 +32,10 @@ CallbackUserData::CallbackUserData(PostQueue& queue, long cid, bool keep /* = fa queue_(queue), result_(common::ErrorCode::NO_ERROR) { LoggerD("Entered"); - AddJsonData(JSON_CALLBACK_ID, picojson::value(static_cast(cid_))); - AddJsonData(JSON_CALLBACK_KEEP, picojson::value(keep)); + if (!keep) { + // this is not listener, add callbackId + AddJsonData(JSON_CALLBACK_ID, picojson::value(static_cast(cid_))); + } } CallbackUserData::~CallbackUserData() { @@ -43,20 +49,18 @@ bool CallbackUserData::IsError() const { void CallbackUserData::SetError(const common::PlatformResult& error) { LoggerD("Entered"); - // keep only the first error if (!IsError()) { + ReportError(error, &obj_); result_ = error; - SetAction(JSON_CALLBACK_ERROR, error.ToJSON()); } } void CallbackUserData::SetSuccess(const picojson::value& data /* = picojson::value()*/) { LoggerD("Entered"); - // do not allow to overwrite the error if (!IsError()) { - SetAction(JSON_CALLBACK_SUCCCESS, data); + ReportSuccess(data, obj_); } } @@ -64,7 +68,12 @@ void CallbackUserData::SetAction(const char* action, const picojson::value& data LoggerD("Entered"); AddJsonData(JSON_ACTION, picojson::value(action)); - AddJsonData(JSON_DATA, data); + // ReportSuccess cannot be used here, update of this field is necessary (this is a special case) + AddJsonData(JSON_RESULT, data); +} + +void CallbackUserData::SetListenerId(const char* id) { + AddJsonData(JSON_LISTENER_ID, picojson::value(id)); } void CallbackUserData::AddToQueue() { diff --git a/src/messaging/callback_user_data.h b/src/messaging/callback_user_data.h index 5b62e2be..6f72c83e 100755 --- a/src/messaging/callback_user_data.h +++ b/src/messaging/callback_user_data.h @@ -35,6 +35,7 @@ class CallbackUserData { void SetError(const common::PlatformResult& error); void SetSuccess(const picojson::value& data = picojson::value()); void SetAction(const char* action, const picojson::value& data); + void SetListenerId(const char* id); void AddToQueue(); void Post(); diff --git a/src/messaging/conversations_change_callback.cc b/src/messaging/conversations_change_callback.cc index d98308f4..95d75f31 100755 --- a/src/messaging/conversations_change_callback.cc +++ b/src/messaging/conversations_change_callback.cc @@ -50,6 +50,7 @@ ConversationsChangeCallback::ConversationsChangeCallback( m_is_act(true) { LoggerD("Entered"); + m_callback_data.SetListenerId("ConversationsChangeListener"); } ConversationsChangeCallback::~ConversationsChangeCallback() diff --git a/src/messaging/folders_change_callback.cc b/src/messaging/folders_change_callback.cc index 1998e552..adb821ea 100755 --- a/src/messaging/folders_change_callback.cc +++ b/src/messaging/folders_change_callback.cc @@ -38,6 +38,7 @@ FoldersChangeCallback::FoldersChangeCallback( m_is_act(true) { LoggerD("Entered"); + m_callback_data.SetListenerId("FoldersChangeListener"); } FoldersChangeCallback::~FoldersChangeCallback() diff --git a/src/messaging/messages_change_callback.cc b/src/messaging/messages_change_callback.cc index e2fcdb6e..c95e22e7 100755 --- a/src/messaging/messages_change_callback.cc +++ b/src/messaging/messages_change_callback.cc @@ -59,6 +59,7 @@ MessagesChangeCallback::MessagesChangeCallback( m_is_act(true) { LoggerD("Entered"); + m_callback_data.SetListenerId("MessagesChangeListener"); } MessagesChangeCallback::~MessagesChangeCallback() diff --git a/src/messaging/messaging_api.js b/src/messaging/messaging_api.js index 984e60ee..dbae2b48 100755 --- a/src/messaging/messaging_api.js +++ b/src/messaging/messaging_api.js @@ -17,7 +17,7 @@ var validator_ = xwalk.utils.validator; var types_ = validator_.Types; var T_ = xwalk.utils.type; -var bridge = xwalk.utils.NativeBridge(extension, true); +var native = new xwalk.utils.NativeManager(extension); function throwException_(err) { throw new WebAPIException(err.code, err.name, err.message); @@ -388,16 +388,16 @@ function Message(type, data) { { get: function () { if (_internal.id) { - return bridge.sync({ - cmd: 'Message_messageStatus', - args: { - id: _internal.id, - type: _internal.type - } - }); - } else { - return ''; + var callArgs = { + id: _internal.id, + type: _internal.type + }; + var result = native.callSync('Message_messageStatus', callArgs); + if (native.isSuccess(result)) { + return native.getResultObject(result); + } } + return ''; }, set: function (value) {return;}, enumerable: true @@ -679,29 +679,25 @@ Messaging.prototype.getMessageServices = function () { {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true} ]); - bridge.async({ - cmd: 'Messaging_getMessageServices', - args: { - messageServiceType: args.messageServiceType - } - }).then({ - success: function (data) { - var servicesArr = []; - data.forEach(function(e){ - servicesArr.push(new MessageService(e)); - }); - args.successCallback.call(null, servicesArr); - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); + var callArgs = {messageServiceType: args.messageServiceType}; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var servicesArr = []; + data.forEach(function(e){ + servicesArr.push(new MessageService(e)); + }); + args.successCallback(servicesArr); + } + }; + var result = native.call('Messaging_getMessageServices', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } } + function MessageStorage(){}; function MessageService(data) { propertyFactory_(this, 'id', data.id, Property.E); @@ -711,8 +707,6 @@ function MessageService(data) { }; MessageService.prototype.sendMessage = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message}, {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -721,47 +715,40 @@ MessageService.prototype.sendMessage = function () { ]); if (args.message.type != this.type) { - throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR); + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR); } var self = this; - bridge.async({ - cmd: 'MessageService_sendMessage', - args: { - message: args.message, - simIndex: args.simIndex || 1, - serviceId: self.id - } - }).then({ - success: function (data) { - var message = data.message; - if (message) { - var body = message.body; - if (body) { - updateInternal_(args.message.body, body) - delete message.body; - } - updateInternal_(args.message, message); - } - if (args.successCallback) { - args.successCallback.call(null, data.recipients); - } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) + var callArgs = { + message: args.message, + simIndex: args.simIndex || 1, + serviceId: self.id + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var message = data.message; + if (message) { + var body = message.body; + if (body) { + updateInternal_(args.message.body, body) + delete message.body; } + updateInternal_(args.message, message); } - }); + native.callIfPossible(args.successCallback, data.recipients); + } + }; + var result = native.call('MessageService_sendMessage', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageService.prototype.loadMessageBody = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message}, {name: 'successCallback', type: types_.FUNCTION}, @@ -769,42 +756,38 @@ MessageService.prototype.loadMessageBody = function () { ]); if (args.message.type != this.type) { - throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR); + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR); } var self = this; - bridge.async({ - cmd: 'MessageService_loadMessageBody', - args: { - message: args.message, - serviceId: self.id - } - }).then({ - success: function (data) { - var body = data.messageBody; - if (body) { - updateInternal_(args.message.body, body) - } + var callArgs = { + message: args.message, + serviceId: self.id + }; - args.successCallback.call( - null, - args.message - ); - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var body = data.messageBody; + if (body) { + updateInternal_(args.message.body, body) } - }); + + args.successCallback(args.message); + } + }; + + var result = native.call('MessageService_loadMessageBody', callArgs, callback); + + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } + }; MessageService.prototype.loadMessageAttachment = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment}, {name: 'successCallback', type: types_.FUNCTION}, @@ -818,43 +801,34 @@ MessageService.prototype.loadMessageAttachment = function () { messageAttachmentsLoaded[args.attachment.id] = true; } - bridge.async({ - cmd: 'MessageService_loadMessageAttachment', - args: { - attachment: args.attachment, - serviceId: self.id - } - }).then({ - success: function (data) { - if (args.successCallback) { - var messageAttachment = data.messageAttachment; - if (messageAttachment) { - updateInternal_(args.attachment, messageAttachment); - } + var callArgs = { + attachment: args.attachment, + serviceId: self.id + }; - args.successCallback.call( - null, - args.attachment - ); - } - }, - error: function (e) { - if (firstCall) { - messageAttachmentsLoaded[args.attachment.id] = false; - } - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var messageAttachment = data.messageAttachment; + if (messageAttachment) { + updateInternal_(args.attachment, messageAttachment); } - }); + + args.successCallback(args.attachment); + } + }; + + var result = native.call('MessageService_loadMessageAttachment', callArgs, callback); + + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } + }; MessageService.prototype.sync = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -862,37 +836,30 @@ MessageService.prototype.sync = function () { ]); var self = this; - var cid = bridge.listener({ - success: function () { - if (args.successCallback) { - args.successCallback.call(null); - } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); - var result = bridge.sync({ - cmd: 'MessageService_sync', - cid: cid, - args: { - id: self.id, - limit: args.limit || null - } - }); + var callArgs = { + id: self.id, + limit: args.limit || null + }; - return result; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + native.callIfPossible(args.successCallback); + } + }; + + var result = native.call('MessageService_sync', callArgs, callback); + + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } + + return native.getResultObject(result); }; MessageService.prototype.syncFolder = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder}, {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -901,33 +868,29 @@ MessageService.prototype.syncFolder = function () { ]); var self = this; - var cid = bridge.listener({ - success: function () { - if (args.successCallback) { - args.successCallback.call(null); - } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); - var result = bridge.sync({ - cmd: 'MessageService_syncFolder', - cid: cid, - args: { - id: self.id, - folder: args.folder, - limit: args.limit || null - } - }); + var callArgs = { + id: self.id, + folder: args.folder, + limit: args.limit || null + }; + + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + native.callIfPossible(args.successCallback); + } + }; + + var result = native.call('MessageService_syncFolder', callArgs, callback); + + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } + + return native.getResultObject(result); - return result; }; MessageService.prototype.stopSync = function () { @@ -936,13 +899,14 @@ MessageService.prototype.stopSync = function () { ]); var self = this; - bridge.sync({ - cmd: 'MessageService_stopSync', - args: { - id: self.id, - opId: args.opId - } - }); + var callArgs = { + id: self.id, + opId: args.opId + }; + var result = native.callSync('MessageService_stopSync', callArgs); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; function MessageStorage(service) { @@ -950,8 +914,6 @@ function MessageStorage(service) { }; MessageStorage.prototype.addDraftMessage = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message}, {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -959,52 +921,45 @@ MessageStorage.prototype.addDraftMessage = function () { ]); if (args.message.type != this.service.type) { - throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR); + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR); } var self = this; - bridge.async({ - cmd: 'MessageStorage_addDraftMessage', - args: { - message: args.message, - serviceId: self.service.id - } - }).then({ - success: function (data) { - var message = data.message; - if (message) { - var body = message.body; - if (body) { - updateInternal_(args.message.body, body) - delete message.body; - } - var attachments = message.attachments; - if (attachments) { - for (var i = 0; i < attachments.length; i++) { - messageAttachmentsLoaded[attachments[i].id] = true; - } - } - updateInternal_(args.message, message); - } - if (args.successCallback) { - args.successCallback.call(null); + var callArgs = { + message: args.message, + serviceId: self.service.id + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var message = data.message; + if (message) { + var body = message.body; + if (body) { + updateInternal_(args.message.body, body) + delete message.body; } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) + var attachments = message.attachments; + if (attachments) { + for (var i = 0; i < attachments.length; i++) { + messageAttachmentsLoaded[attachments[i].id] = true; + } } + updateInternal_(args.message, message); } - }); + native.callIfPossible(args.successCallback, data.recipients); + } + }; + var result = native.call('MessageStorage_addDraftMessage', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageStorage.prototype.findMessages = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); - var args = validator_.validateArgs(arguments, [ { name: 'filter', @@ -1021,38 +976,33 @@ MessageStorage.prototype.findMessages = function () { var self = this; - bridge.async({ - cmd: 'MessageStorage_findMessages', - args: { - filter: addTypeToFilter_(args.filter) || null, - sort: args.sort || null, - limit: args.limit || null, - offset: args.offset || null, - serviceId: self.service.id, - type: self.service.type - } - }).then({ - success: function (data) { - var messages = []; - data.forEach(function (el) { - messages.push(new tizen.Message(el.type, new MessageInit_(el))); - }); - args.successCallback.call(null, messages); - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); + var callArgs = { + filter: addTypeToFilter_(args.filter) || null, + sort: args.sort || null, + limit: args.limit || null, + offset: args.offset || null, + serviceId: self.service.id, + type: self.service.type + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var messages = []; + data.forEach(function (el) { + messages.push(new tizen.Message(el.type, new MessageInit_(el))); + }); + native.callIfPossible(args.successCallback, messages); + } + }; + var result = native.call('MessageStorage_findMessages', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageStorage.prototype.removeMessages = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'messages', type: types_.ARRAY, values: Message}, {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -1063,37 +1013,29 @@ MessageStorage.prototype.removeMessages = function () { args.messages.forEach(function(msg) { if (msg.type != self.service.type) { - throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR); + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR); } }); - bridge.async({ - cmd: 'MessageStorage_removeMessages', - args: { - messages: args.messages, - serviceId: self.service.id, - type: self.service.type - } - }).then({ - success: function () { - if (args.successCallback) { - args.successCallback.call(null); - } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); + var callArgs = { + messages: args.messages, + serviceId: self.service.id, + type: self.service.type + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + native.callIfPossible(args.successCallback); + } + }; + var result = native.call('MessageStorage_removeMessages', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageStorage.prototype.updateMessages = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'messages', type: types_.ARRAY, values: Message}, {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -1104,59 +1046,52 @@ MessageStorage.prototype.updateMessages = function () { args.messages.forEach(function(msg) { if (msg.type != self.service.type) { - throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR); + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR); } }); - bridge.async({ - cmd: 'MessageStorage_updateMessages', - args: { - messages: args.messages, - serviceId: self.service.id - } - }).then({ - success: function (data) { - var originals = {}, - i = args.messages.length, - m; - while (i--) { - m = args.messages[i]; - if (m.id) { - originals[m.id] = m; - } - } - - i = data.length; - while (i--) { - m = data[i]; - if (originals[m.oldId]) { - var body = m.body; - if (body) { - updateInternal_(originals[m.oldId].body, body) - delete m.body; - } - updateInternal_(originals[m.oldId], m); - } - } - - if (args.successCallback) { - args.successCallback.call(null); - } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) + var callArgs = { + messages: args.messages, + serviceId: self.service.id + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var originals = {}, + i = args.messages.length, + m; + while (i--) { + m = args.messages[i]; + if (m.id) { + originals[m.id] = m; + } + } + + i = data.length; + while (i--) { + m = data[i]; + if (originals[m.oldId]) { + var body = m.body; + if (body) { + updateInternal_(originals[m.oldId].body, body) + delete m.body; } + updateInternal_(originals[m.oldId], m); + } } - }); + + native.callIfPossible(args.successCallback); + } + }; + var result = native.call('MessageStorage_updateMessages', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageStorage.prototype.findConversations = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); - var args = validator_.validateArgs(arguments, [ { name: 'filter', @@ -1173,37 +1108,32 @@ MessageStorage.prototype.findConversations = function () { var self = this; - bridge.async({ - cmd: 'MessageStorage_findConversations', - args: { - filter: addTypeToFilter_(args.filter), - sort: args.sort || null, - limit: args.limit || null, - offset: args.offset || null, - serviceId: self.service.id - } - }).then({ - success: function (data) { - var conversations = []; - data.forEach(function (el) { - conversations.push(new MessageConversation(el)); - }); - args.successCallback.call(null, conversations); - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); + var callArgs = { + filter: addTypeToFilter_(args.filter), + sort: args.sort || null, + limit: args.limit || null, + offset: args.offset || null, + serviceId: self.service.id + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var conversations = []; + data.forEach(function (el) { + conversations.push(new MessageConversation(el)); + }); + args.successCallback(conversations); + } + }; + var result = native.call('MessageStorage_findConversations', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageStorage.prototype.removeConversations = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE); - var args = validator_.validateArgs(arguments, [ {name: 'conversations', type: types_.ARRAY}, {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true}, @@ -1218,33 +1148,25 @@ MessageStorage.prototype.removeConversations = function () { var self = this; - bridge.async({ - cmd: 'MessageStorage_removeConversations', - args: { - conversations: args.conversations, - serviceId: self.service.id, - type: self.service.type - } - }).then({ - success: function () { - if (args.successCallback) { - args.successCallback.call(null); - } - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } - }); + var callArgs = { + conversations: args.conversations, + serviceId: self.service.id, + type: self.service.type + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + native.callIfPossible(args.successCallback); + } + }; + var result = native.call('MessageStorage_removeConversations', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } }; MessageStorage.prototype.findFolders = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); - var args = validator_.validateArgs(arguments, [ { name: 'filter', @@ -1257,38 +1179,77 @@ MessageStorage.prototype.findFolders = function () { var self = this; - bridge.async({ - cmd: 'MessageStorage_findFolders', - args: { - filter: addTypeToFilter_(args.filter), - sort: args.sort || null, - limit: args.limit || null, - offset: args.offset || null, - serviceId: self.service.id - } - }).then({ - success: function (data) { - var folders = []; - data.forEach(function (el) { - folders.push(new MessageFolder(el)); - }); - args.successCallback.call(null, folders); - }, - error: function (e) { - if (args.errorCallback) { - args.errorCallback.call( - null, - new WebAPIException(e.error) - ) - } - } + var callArgs = { + filter: addTypeToFilter_(args.filter), + sort: args.sort || null, + limit: args.limit || null, + offset: args.offset || null, + serviceId: self.service.id + }; + var callback = function(result) { + if (native.isFailure(result)) { + native.callIfPossible(args.errorCallback, native.getErrorObject(result)); + } else { + var data = native.getResultObject(result); + var folders = []; + data.forEach(function (el) { + folders.push(new MessageFolder(el)); + }); + args.successCallback(folders); + } + }; + var result = native.call('MessageStorage_findFolders', callArgs, callback); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } +}; + +function pushMessage(messages, el) { + messages.push(new tizen.Message(el.type, new MessageInit_(el))); +}; + +function pushConversation(conversations, el) { + conversations.push(new MessageConversation(el)); +}; + +function pushFolder(folders, el) { + folders.push(new MessageFolder(el)); +}; + +function getListenerFunction(listenerMap, pushMethod) { + return function(msg) { + var action = msg.action; + var data = native.getResultObject(msg); + var messages = []; + data.forEach(function (el) { + pushMethod(messages, el); }); + + for (var key in listenerMap) { + if (listenerMap.hasOwnProperty(key)) { + native.callIfPossible(listenerMap[key][action], messages); + } + } + } }; -MessageStorage.prototype.addMessagesChangeListener = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); +var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener'; +var MessagesChangeListeners = {}; +native.addListener(MESSAGES_CHANGE_LISTENER, + getListenerFunction(MessagesChangeListeners, pushMessage)); - var args = validator_.validateArgs(arguments, [ +var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener'; +var ConversationsChangeListeners = {}; +native.addListener(CONVERSATIONS_CHANGE_LISTENER, + getListenerFunction(ConversationsChangeListeners, pushConversation)); + +var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener'; +var FoldersChangeListeners = {}; +native.addListener(FOLDERS_CHANGE_LISTENER, + getListenerFunction(FoldersChangeListeners, pushFolder)); + +MessageStorage.prototype.addMessagesChangeListener = function () { + var args = validator_.validateArgs(arguments, [ {name: 'messagesChangeCallback', type: types_.LISTENER, values: ['messagesadded', 'messagesupdated', 'messagesremoved']}, { @@ -1302,52 +1263,21 @@ MessageStorage.prototype.addMessagesChangeListener = function () { var self = this; - var cid = bridge.listener({ - messagesadded: function (data) { - if (args.messagesChangeCallback.messagesadded) { - var messages = []; - data.forEach(function (el) { - messages.push(new tizen.Message(el.type, new MessageInit_(el))); - }); - args.messagesChangeCallback.messagesadded.call(null, messages); - } - }, - messagesupdated: function (data) { - if (args.messagesChangeCallback.messagesupdated) { - var messages = []; - data.forEach(function (el) { - messages.push(new tizen.Message(el.type, new MessageInit_(el))); - }); - args.messagesChangeCallback.messagesupdated.call(null, messages); - } - }, - messagesremoved: function (data) { - if (args.messagesChangeCallback.messagesremoved) { - var messages = []; - data.forEach(function (el) { - messages.push(new tizen.Message(el.type, new MessageInit_(el))); - }); - args.messagesChangeCallback.messagesremoved.call(null, messages); - } - } - }); - - var result = bridge.sync({ - cmd: 'MessageStorage_addMessagesChangeListener', - cid: cid, - args: { - filter: args.filter ? addTypeToFilter_(args.filter) : null, - serviceId: self.service.id - } - }); - - bridge.attach(cid, 'watchId', result); - return result; + var callArgs = { + filter: args.filter ? addTypeToFilter_(args.filter) : null, + serviceId: self.service.id + }; + var result = native.callSync('MessageStorage_addMessagesChangeListener', callArgs); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } else { + var opId = native.getResultObject(result); + MessagesChangeListeners[opId] = args.messagesChangeCallback; + return opId; + } }; MessageStorage.prototype.addConversationsChangeListener = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); - var args = validator_.validateArgs(arguments, [ {name: 'conversationsChangeCallback', type: types_.LISTENER, values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']}, @@ -1362,52 +1292,21 @@ MessageStorage.prototype.addConversationsChangeListener = function () { var self = this; - var cid = bridge.listener({ - conversationsadded: function (data) { - if (args.conversationsChangeCallback.conversationsadded) { - var conversations = []; - data.forEach(function (el) { - conversations.push(new MessageConversation(el)); - }); - args.conversationsChangeCallback.conversationsadded.call(null, conversations); - } - }, - conversationsupdated: function (data) { - if (args.conversationsChangeCallback.conversationsupdated) { - var conversations = []; - data.forEach(function (el) { - conversations.push(new MessageConversation(el)); - }); - args.conversationsChangeCallback.conversationsupdated.call(null, conversations); - } - }, - conversationsremoved: function (data) { - if (args.conversationsChangeCallback.conversationsremoved) { - var conversations = []; - data.forEach(function (el) { - conversations.push(new MessageConversation(el)); - }); - args.conversationsChangeCallback.conversationsremoved.call(null, conversations); - } - } - }); - - var result = bridge.sync({ - cmd: 'MessageStorage_addConversationsChangeListener', - cid: cid, - args: { - filter: args.filter ? addTypeToFilter_(args.filter) : null, - serviceId: self.service.id - } - }); - - bridge.attach(cid, 'watchId', result); - return result; + var callArgs = { + filter: args.filter ? addTypeToFilter_(args.filter) : null, + serviceId: self.service.id + }; + var result = native.callSync('MessageStorage_addConversationsChangeListener', callArgs); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } else { + var opId = native.getResultObject(result); + ConversationsChangeListeners[opId] = args.conversationsChangeCallback; + return opId; + } }; MessageStorage.prototype.addFoldersChangeListener = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); - var args = validator_.validateArgs(arguments, [ {name: 'foldersChangeCallback', type: types_.LISTENER, values: ['foldersadded', 'foldersupdated', 'foldersremoved']}, @@ -1422,70 +1321,43 @@ MessageStorage.prototype.addFoldersChangeListener = function () { var self = this; - var cid = bridge.listener({ - foldersadded: function (data) { - if (args.foldersChangeCallback.foldersadded) { - var folders = []; - data.forEach(function (el) { - folders.push(new MessageFolder(el)); - }); - args.foldersChangeCallback.foldersadded.call(null, folders); - } - }, - foldersupdated: function (data) { - if (args.foldersChangeCallback.foldersupdated) { - var folders = []; - data.forEach(function (el) { - folders.push(new MessageFolder(el)); - }); - args.foldersChangeCallback.foldersupdated.call(null, folders); - } - }, - foldersremoved: function (data) { - if (args.foldersChangeCallback.foldersremoved) { - var folders = []; - data.forEach(function (el) { - folders.push(new MessageFolder(el)); - }); - args.foldersChangeCallback.foldersremoved.call(null, folders); - } - } - }); - - var result = bridge.sync({ - cmd: 'MessageStorage_addFoldersChangeListener', - cid: cid, - args: { - filter: args.filter ? addTypeToFilter_(args.filter) : null, - serviceId: self.service.id - } - }); - - bridge.attach(cid, 'watchId', result); - return result; + var callArgs = { + filter: args.filter ? addTypeToFilter_(args.filter) : null, + serviceId: self.service.id + }; + var result = native.callSync('MessageStorage_addFoldersChangeListener', callArgs); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } else { + var opId = native.getResultObject(result); + FoldersChangeListeners[opId] = args.foldersChangeCallback; + return opId; + } }; MessageStorage.prototype.removeChangeListener = function () { - xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ); - var args = validator_.validateArgs(arguments, [ {name: 'watchId', type: types_.LONG} ]); var self = this; - var result = bridge.sync({ - cmd: 'MessageStorage_removeChangeListener', - args: { - watchId: args.watchId, - serviceId: self.service.id - } - }); - - bridge.find('watchId', args.watchId).forEach(function (e) { - bridge.remove(e.id); - }); - return result; + var callArgs = { + watchId: args.watchId, + serviceId: self.service.id + }; + var result = native.callSync('MessageStorage_removeChangeListener', callArgs); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } else { + if (MessagesChangeListeners.hasOwnProperty(args.watchId)) { + delete MessagesChangeListeners[args.watchId]; + } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) { + delete ConversationsChangeListeners[args.watchId]; + } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) { + delete FoldersChangeListeners[args.watchId]; + } + } }; function MessageConversation(data) { diff --git a/src/messaging/messaging_instance.cc b/src/messaging/messaging_instance.cc index b8c7df4b..9d6b2048 100755 --- a/src/messaging/messaging_instance.cc +++ b/src/messaging/messaging_instance.cc @@ -21,6 +21,7 @@ #include #include "common/logger.h" +#include "common/tools.h" #include "MsgCommon/AbstractFilter.h" #include "messages_change_callback.h" @@ -37,6 +38,7 @@ #include "email_manager.h" using common::ErrorCode; +using common::TypeMismatchException; using common::PlatformResult; namespace extension { @@ -118,6 +120,10 @@ auto getServiceIdFromJSON = [](picojson::object& data) -> int { } }; +const std::string kPrivilegeMessagingRead = "http://tizen.org/privilege/messaging.read"; +const std::string kPrivilegeMessagingWrite = "http://tizen.org/privilege/messaging.write"; + +const long kDumbCallbackId= -1; } MessagingInstance::MessagingInstance(): @@ -128,7 +134,7 @@ MessagingInstance::MessagingInstance(): using std::placeholders::_1; using std::placeholders::_2; #define REGISTER_ASYNC(c,x) \ - RegisterHandler(c, std::bind(&MessagingInstance::x, this, _1, _2)); + RegisterSyncHandler(c, std::bind(&MessagingInstance::x, this, _1, _2)); REGISTER_ASYNC(FUN_GET_MESSAGE_SERVICES, GetMessageServices); REGISTER_ASYNC(FUN_MESSAGE_SERVICE_SEND_MESSAGE, MessageServiceSendMessage); REGISTER_ASYNC(FUN_MESSAGE_SERVICE_LOAD_MESSAGE_BODY, MessageServiceLoadMessageBody); @@ -159,11 +165,8 @@ MessagingInstance::~MessagingInstance() LoggerD("Entered"); } -#define POST_AND_RETURN(ret, json, obj, action) \ - picojson::object args; \ - LogAndReportError(ret, &args); \ - obj[JSON_DATA] = picojson::value(args); \ - obj[JSON_ACTION] = picojson::value(action); \ +#define POST_AND_RETURN(ret, json, obj) \ + LogAndReportError(ret, &obj); \ queue_.addAndResolve( \ obj.at(JSON_CALLBACK_ID).get(), \ PostPriority::HIGH, \ @@ -171,19 +174,21 @@ MessagingInstance::~MessagingInstance() ); \ return; +#define CHECK_EXIST(args, name, out) \ + if (!args.contains(name)) {\ + std::string message = std::string(name) + " is required argument";\ + LogAndReportError(PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, message), &out);\ + return;\ + } + void MessagingInstance::GetMessageServices(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::value data = args.get(JSON_DATA); - picojson::value serviceTag = data.get(). + picojson::value serviceTag = args.get(). at(GET_MESSAGE_SERVICES_ARGS_MESSAGE_SERVICE_TYPE); const double callbackId = args.get(JSON_CALLBACK_ID).get(); // above values should be validated in js @@ -195,13 +200,10 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value v_message = data.at(SEND_MESSAGE_ARGS_MESSAGE); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -212,7 +214,7 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, std::shared_ptr message; PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } MessageRecipientsCallbackData* callback = new MessageRecipientsCallbackData(queue_, callbackId); @@ -233,7 +235,7 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, delete callback; callback = nullptr; POST_AND_RETURN(PlatformResult(ErrorCode::UNKNOWN_ERR, "set sim index failed"), - json, obj, JSON_CALLBACK_ERROR) + json, obj) } } else { LoggerD("cell_support is false"); @@ -244,7 +246,7 @@ void MessagingInstance::MessageServiceSendMessage(const picojson::value& args, ret = service->sendMessage(callback); if (!ret) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } } @@ -253,13 +255,10 @@ void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& arg { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value json_message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -271,7 +270,7 @@ void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& arg std::shared_ptr message; PlatformResult ret = MessagingUtil::jsonToMessage(json_message, &message); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } MessageBodyCallbackData* callback = new MessageBodyCallbackData(queue_, callbackId); @@ -282,7 +281,7 @@ void MessagingInstance::MessageServiceLoadMessageBody(const picojson::value& arg auto service = manager_.getMessageService(getServiceIdFromJSON(data)); ret = service->loadMessageBody(callback); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } } @@ -291,13 +290,10 @@ void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::valu { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value attachment = data.at(LOAD_MESSAGE_ATTACHMENT_ARGS_ATTACHMENT); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -311,7 +307,7 @@ void MessagingInstance::MessageServiceLoadMessageAttachment(const picojson::valu auto json = std::shared_ptr(new picojson::value(picojson::object())); picojson::object& obj = json->get(); obj[JSON_CALLBACK_ID] = picojson::value(callbackId); - POST_AND_RETURN(result, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(result, json, obj) } } @@ -320,13 +316,10 @@ void MessagingInstance::MessageServiceSync(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value v_id = data.at(SYNC_ARGS_ID); picojson::value v_limit = data.at(SYNC_ARGS_LIMIT); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -365,13 +358,10 @@ void MessagingInstance::MessageServiceSyncFolder(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value v_id = data.at(SYNC_FOLDER_ARGS_ID); picojson::value v_folder = data.at(SYNC_FOLDER_ARGS_FOLDER); picojson::value v_limit = data.at(SYNC_FOLDER_ARGS_LIMIT); @@ -411,14 +401,9 @@ void MessagingInstance::MessageServiceStopSync(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } - - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); if (data.find(STOP_SYNC_ARGS_ID) != data.end()) { picojson::value v_id = data.at(STOP_SYNC_ARGS_ID); @@ -456,13 +441,10 @@ void MessagingInstance::MessageStorageAddDraft(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value v_message = data.at(ADD_DRAFT_MESSAGE_ARGS_MESSAGE); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -473,7 +455,7 @@ void MessagingInstance::MessageStorageAddDraft(const picojson::value& args, std::shared_ptr message; PlatformResult ret = MessagingUtil::jsonToMessage(v_message, &message); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } MessageCallbackUserData* callback = new MessageCallbackUserData(queue_, callbackId); @@ -492,13 +474,10 @@ void MessagingInstance::MessageStorageFindMessages(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); auto json = std::shared_ptr(new picojson::value(picojson::object())); @@ -508,7 +487,7 @@ void MessagingInstance::MessageStorageFindMessages(const picojson::value& args, AbstractFilterPtr filter; PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } auto sortMode = MessagingUtil::jsonToSortMode(data); @@ -537,13 +516,10 @@ void MessagingInstance::MessageStorageRemoveMessages(const picojson::value& args { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::array messages = data.at(REMOVE_MESSAGES_ARGS_MESSAGES).get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -570,13 +546,10 @@ void MessagingInstance::MessageStorageUpdateMessages(const picojson::value& args { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::value pico_messages = data.at(UPDATE_MESSAGES_ARGS_MESSAGES); auto pico_array = pico_messages.get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -602,13 +575,10 @@ void MessagingInstance::MessageStorageFindConversations(const picojson::value& a { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); auto json = std::shared_ptr(new picojson::value(picojson::object())); @@ -618,7 +588,7 @@ void MessagingInstance::MessageStorageFindConversations(const picojson::value& a AbstractFilterPtr filter; PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } auto sortMode = MessagingUtil::jsonToSortMode(data); long limit = static_cast @@ -645,13 +615,10 @@ void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingWrite, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); picojson::array conversations = data.at(REMOVE_CONVERSATIONS_ARGS_CONVERSATIONS).get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); @@ -667,7 +634,7 @@ void MessagingInstance::MessageStorageRemoveConversations(const picojson::value& ret = MessagingUtil::jsonToMessageConversation(*it, &conversation); if (ret.IsError()) { delete callback; - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } callback->addConversation(conversation); } @@ -683,13 +650,10 @@ void MessagingInstance::MessageStorageFindFolders(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); + CHECK_EXIST(args, JSON_CALLBACK_ID, out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); const double callbackId = args.get(JSON_CALLBACK_ID).get(); auto json = std::shared_ptr(new picojson::value(picojson::object())); @@ -699,7 +663,7 @@ void MessagingInstance::MessageStorageFindFolders(const picojson::value& args, AbstractFilterPtr filter; PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + POST_AND_RETURN(ret, json, obj) } FoldersCallbackData* callback = new FoldersCallbackData(queue_, callbackId); @@ -715,23 +679,15 @@ void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson:: { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } - - picojson::object data = args.get(JSON_DATA).get(); - const double callbackId = args.get(JSON_CALLBACK_ID).get(); + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); - auto json = std::shared_ptr(new picojson::value(picojson::object())); - picojson::object& obj = json->get(); - obj[JSON_CALLBACK_ID] = picojson::value(callbackId); + picojson::object data = args.get(); AbstractFilterPtr filter; PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + ReportError(ret, &out); + return; } int serviceId = getServiceIdFromJSON(data); @@ -739,7 +695,7 @@ void MessagingInstance::MessageStorageAddMessagesChangeListener(const picojson:: auto service = manager_.getMessageService(serviceId); std::shared_ptr callback(new MessagesChangeCallback( - static_cast(callbackId), serviceId, service->getMsgServiceType(),queue_)); + kDumbCallbackId, serviceId, service->getMsgServiceType(),queue_)); callback->setFilter(filter); @@ -754,23 +710,15 @@ void MessagingInstance::MessageStorageAddConversationsChangeListener(const picoj { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); - picojson::object data = args.get(JSON_DATA).get(); - const double callbackId = args.get(JSON_CALLBACK_ID).get(); - - auto json = std::shared_ptr(new picojson::value(picojson::object())); - picojson::object& obj = json->get(); - obj[JSON_CALLBACK_ID] = picojson::value(callbackId); + picojson::object data = args.get(); AbstractFilterPtr filter; PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + ReportError(ret, &out); + return; } int serviceId = getServiceIdFromJSON(data); @@ -778,7 +726,7 @@ void MessagingInstance::MessageStorageAddConversationsChangeListener(const picoj auto service = manager_.getMessageService(serviceId); std::shared_ptr callback(new ConversationsChangeCallback( - static_cast(callbackId), serviceId, service->getMsgServiceType(), queue_)); + static_cast(-1), serviceId, service->getMsgServiceType(), queue_)); callback->setFilter(filter); @@ -793,23 +741,15 @@ void MessagingInstance::MessageStorageAddFolderChangeListener(const picojson::va { LoggerD("Entered"); - if (!args.contains(JSON_DATA) || !args.contains(JSON_CALLBACK_ID) || - !args.get(JSON_CALLBACK_ID).is()) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); - picojson::object data = args.get(JSON_DATA).get(); - const double callbackId = args.get(JSON_CALLBACK_ID).get(); - - auto json = std::shared_ptr(new picojson::value(picojson::object())); - picojson::object& obj = json->get(); - obj[JSON_CALLBACK_ID] = picojson::value(callbackId); + picojson::object data = args.get(); AbstractFilterPtr filter; PlatformResult ret = MessagingUtil::jsonToAbstractFilter(data, &filter); if (ret.IsError()) { - POST_AND_RETURN(ret, json, obj, JSON_CALLBACK_ERROR) + ReportError(ret, &out); + return; } int serviceId = getServiceIdFromJSON(data); @@ -817,7 +757,7 @@ void MessagingInstance::MessageStorageAddFolderChangeListener(const picojson::va auto service = manager_.getMessageService(serviceId); std::shared_ptr callback(new FoldersChangeCallback( - static_cast(callbackId), serviceId, service->getMsgServiceType(), queue_)); + static_cast(-1), serviceId, service->getMsgServiceType(), queue_)); callback->setFilter(filter); @@ -832,12 +772,9 @@ void MessagingInstance::MessageStorageRemoveChangeListener(const picojson::value { LoggerD("Entered"); - if (!args.contains(JSON_DATA)) { - LoggerE("json is incorrect - missing required member"); - return; - } + CHECK_PRIVILEGE_ACCESS(kPrivilegeMessagingRead, &out); - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); const long watchId = static_cast( data.at(REMOVE_CHANGE_LISTENER_ARGS_WATCHID).get()); @@ -852,13 +789,7 @@ void MessagingInstance::MessageGetMessageStatus(const picojson::value& args, { LoggerD("Entered"); - if (!args.contains(JSON_DATA)) { - LoggerE("json is incorrect - missing required member"); - ReportSuccess(picojson::value(""), out); - return; - } - - picojson::object data = args.get(JSON_DATA).get(); + picojson::object data = args.get(); const int id = stoi(data.at("id").get()); const std::string& type = data.at("type").get(); diff --git a/src/messaging/messaging_manager.cc b/src/messaging/messaging_manager.cc index f4bc602a..a1e0e1b2 100755 --- a/src/messaging/messaging_manager.cc +++ b/src/messaging/messaging_manager.cc @@ -28,6 +28,7 @@ #include "common/picojson.h" #include "common/platform_exception.h" #include "common/task-queue.h" +#include "common/tools.h" #include "messaging_instance.h" #include "short_message_manager.h" @@ -35,6 +36,8 @@ using common::ErrorCode; using common::PlatformResult; +using common::tools::ReportSuccess; +using common::tools::ReportError; namespace extension { namespace messaging { @@ -106,7 +109,8 @@ static void* getMsgServicesThread(const std::shared_ptr& picojson::object& obj = response->get(); MessageType type = MessageType::UNDEFINED; - auto platform_result = MessagingUtil::stringToMessageType(response->get(JSON_DATA).get(), &type); + auto platform_result = MessagingUtil::stringToMessageType(user_data->type, &type); + //after extraction of input data, remove it if (platform_result) { switch (type) { @@ -127,8 +131,7 @@ static void* getMsgServicesThread(const std::shared_ptr& picojson::array array; array.push_back(picojson::value(service->toPicoJS())); - obj[JSON_DATA] = picojson::value(array); - obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); + ReportSuccess(picojson::value(array), obj); // service is stored, so it cannot be deleted service = nullptr; @@ -153,8 +156,7 @@ static void* getMsgServicesThread(const std::shared_ptr& picojson::array array; array.push_back(picojson::value(service->toPicoJS())); - obj[JSON_DATA] = picojson::value(array); - obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); + ReportSuccess(picojson::value(array), obj); // service is stored, so it cannot be deleted service = nullptr; @@ -221,8 +223,7 @@ static void* getMsgServicesThread(const std::shared_ptr& response.push_back(picojson::value(service->toPicoJS())); email_services.insert(std::pair(service->getMsgServiceId(), service)); }); - obj[JSON_DATA] = picojson::value(response); - obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_SUCCCESS); + ReportSuccess(picojson::value(response), obj); } } } @@ -236,8 +237,7 @@ static void* getMsgServicesThread(const std::shared_ptr& if (!platform_result) { LoggerE("Unknown error"); - obj[JSON_DATA] = platform_result.ToJSON(); - obj[JSON_ACTION] = picojson::value(JSON_CALLBACK_ERROR); + ReportError(platform_result, &obj); } return nullptr; @@ -250,9 +250,9 @@ void MessagingManager::getMessageServices(const std::string& type, double callba auto json = std::shared_ptr(new picojson::value(picojson::object())); picojson::object& obj = json->get(); obj[JSON_CALLBACK_ID] = picojson::value(callbackId); - obj[JSON_DATA] = picojson::value(type); auto user_data = std::shared_ptr(new MsgManagerCallbackData(instance_)); + user_data->type = type; user_data->json = json; user_data->services_map = &m_email_services; user_data->sms_service = &m_sms_service; diff --git a/src/messaging/messaging_manager.h b/src/messaging/messaging_manager.h index 4f26b62e..68e1ddb5 100755 --- a/src/messaging/messaging_manager.h +++ b/src/messaging/messaging_manager.h @@ -32,6 +32,7 @@ class MessagingInstance; class MsgManagerCallbackData { public: explicit MsgManagerCallbackData(MessagingInstance& instance_); + std::string type; std::shared_ptr json; std::map* services_map; std::pair* sms_service; diff --git a/src/messaging/messaging_util.cc b/src/messaging/messaging_util.cc index ebe68bf4..31e037dd 100755 --- a/src/messaging/messaging_util.cc +++ b/src/messaging/messaging_util.cc @@ -45,20 +45,14 @@ namespace extension { namespace messaging { using namespace common; +const char* JSON_LISTENER_ID = "listenerId"; +const char* JSON_CALLBACK_ID = "callbackId"; const char* JSON_ACTION = "action"; -const char* JSON_CALLBACK_ID = "cid"; -const char* JSON_CALLBACK_SUCCCESS = "success"; -const char* JSON_CALLBACK_ERROR = "error"; -const char* JSON_CALLBACK_PROGRESS = "progress"; -const char* JSON_CALLBACK_KEEP = "keep"; -const char* JSON_DATA = "args"; +const char* JSON_RESULT = "result"; const char* JSON_DATA_MESSAGE = "message"; const char* JSON_DATA_MESSAGE_BODY = "messageBody"; const char* JSON_DATA_MESSAGE_ATTACHMENT = "messageAttachment"; const char* JSON_DATA_RECIPIENTS = "recipients"; -const char* JSON_ERROR_MESSAGE = "message"; -const char* JSON_ERROR_NAME = "name"; -const char* JSON_ERROR_CODE = "code"; const char* MESSAGE_ATTRIBUTE_ID = "id"; const char* MESSAGE_ATTRIBUTE_OLD_ID = "oldId"; diff --git a/src/messaging/messaging_util.h b/src/messaging/messaging_util.h index cbd8bcd8..136a5ebf 100644 --- a/src/messaging/messaging_util.h +++ b/src/messaging/messaging_util.h @@ -38,20 +38,14 @@ namespace extension { namespace messaging { -extern const char* JSON_ACTION; +extern const char* JSON_LISTENER_ID; extern const char* JSON_CALLBACK_ID; -extern const char* JSON_CALLBACK_SUCCCESS; -extern const char* JSON_CALLBACK_ERROR; -extern const char* JSON_CALLBACK_PROGRESS; -extern const char* JSON_CALLBACK_KEEP; -extern const char* JSON_DATA; +extern const char* JSON_ACTION; +extern const char* JSON_RESULT; extern const char* JSON_DATA_MESSAGE; extern const char* JSON_DATA_MESSAGE_BODY; extern const char* JSON_DATA_MESSAGE_ATTACHMENT; extern const char* JSON_DATA_RECIPIENTS; -extern const char* JSON_ERROR_MESSAGE; -extern const char* JSON_ERROR_NAME; -extern const char* JSON_ERROR_CODE; extern const char* MESSAGE_ATTRIBUTE_ID; extern const char* MESSAGE_ATTRIBUTE_CONVERSATION_ID;