2016-08-23 00:46:04 +02:00

360 lines
8.1 KiB
JavaScript

// Copyright (c) 2013 Intel Corporation. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var g_next_async_call_id = 0;
var g_async_calls = [];
var g_listeners = [];
// Preserve 6 spaces to hold onreceived, onsent, ondeliverysuccess,
// ondeliveryerror, onserviceadded and onserviceremoved's
// callback functions.
var g_next_async_call_id = 6;
function AsyncCall(resolve, reject) {
this.resolve = resolve;
this.reject = reject;
}
function createPromise(msg) {
var promise = new Promise(function(resolve, reject) {
g_async_calls[g_next_async_call_id] = new AsyncCall(resolve, reject);
});
msg.asyncCallId = g_next_async_call_id;
extension.postMessage(JSON.stringify(msg));
++g_next_async_call_id;
return promise;
}
function _isFunction(fn) {
return !!fn && !fn.nodeName && fn.constructor != String
&& fn.constructor != RegExp && fn.constructor != Array
&& /function/i.test( fn + "" );
}
function SmsManager() {}
SmsManager.prototype.type = "sms";
Object.defineProperty(SmsManager.prototype, 'serviceIDs', {
get: function() {
var _msg = {
cmd: "msg_smsServiceId",
}
return JSON.parse(extension.internal.sendSyncMessage(JSON.stringify(_msg)));
}
});
SmsManager.prototype.send = function(to, text, serviceID) {
var _msg = {
cmd: "msg_smsSend",
data: {
phone: to,
message: text,
serviceID: serviceID
}
}
return createPromise(_msg);
}
SmsManager.prototype.clear = function(serviceID) {
var _msg = {
cmd: "msg_smsClear",
data: {
serviceID: serviceID
}
}
return createPromise(_msg);
}
SmsManager.prototype.segmentInfo = function(text, serviceID) {
var _msg = {
cmd: "msg_smsSegmentInfo",
data: {
text: text,
serviceID: serviceID
}
}
return createPromise(_msg);
}
var sms = new SmsManager();
exports.sms = sms;
Object.defineProperty(exports.sms, 'onreceived', {
set: function(callback) {
_addEventListener(true, 'received', callback);
}
});
Object.defineProperty(exports.sms, 'onsent', {
set: function(callback) {
_addEventListener(true, 'sent', callback);
}
});
Object.defineProperty(exports.sms, 'ondeliverysuccess', {
set: function(callback) {
_addEventListener(true, 'deliverysuccess', callback);
}
});
Object.defineProperty(exports.sms, 'ondeliveryerror', {
set: function(callback) {
_addEventListener(true, 'deliveryerror', callback);
}
});
Object.defineProperty(exports.sms, 'onserviceadded', {
set: function(callback) {
_addEventListener(true, 'serviceadded', callback);
}
});
Object.defineProperty(exports.sms, 'onserviceremoved', {
set: function(callback) {
_addEventListener(true, 'serviceremoved', callback);
}
});
function _addEventListener(isOn, eventName, callback) {
if (typeof eventName !== 'string') {
console.log("Invalid parameters of eventName!");
return -1;
}
if (!isOn && (typeof callback !== 'function')) {
console.log("Invalid parameters of callback!");
return -1;
}
if (isOn && (typeof callback !== null) && (typeof callback !== 'function')) {
console.log("Invalid parameters of callback!");
return -1;
}
var listener = {
'eventName': eventName,
'callback': callback
};
var listener_id;
if (isOn) {
switch(listener.eventName) {
case 'received':
g_listeners[0] = listener;
listener_id = 0;
break;
case 'sent':
g_listeners[1] = listener;
listener_id = 1;
break;
case 'deliverysuccess':
g_listeners[2] = listener;
listener_id = 2;
break;
case 'deliveryerror':
g_listeners[3] = listener;
listener_id = 3;
break;
case 'serviceadded':
g_listeners[4] = listener;
listener_id = 4;
break;
case 'serviceremoved':
g_listeners[5] = listener;
listener_id = 5;
break;
default:
console.log("Invalid event name!");
break;
}
} else {
listener_id = g_next_async_call_id;
g_next_async_call_id += 1;
g_listeners[listener_id] = listener;
}
return listener_id;
}
exports.sms.addEventListener = function(eventName, callback) {
return _addEventListener(false, eventName, callback);
}
function handleEvent(msg) {
for (var id in g_listeners) {
if (g_listeners[id]['eventName'] === msg.cmd && g_listeners[id]['callback']) {
g_listeners[id]['callback'](msg.data);
}
}
}
function MessagingCursor(element) {
this.messageIndex = 0;
this.element = element;
}
MessagingCursor.prototype.next = function() {
var ret = null;
if (this.messageIndex > this.element.length) {
this.messageIndex = this.element.length;
} else {
if (this.element) {
ret = this.element[this.messageIndex];
this.messageIndex++;
}
}
return ret;
}
MessagingCursor.prototype.previous = function() {
var ret = null;
if (this.messageIndex < 0) {
this.messageIndex = 0;
} else {
if (this.element) {
ret = this.element[this.messageIndex];
this.messageIndex--;
}
}
return ret;
}
function handleFindMessages(msgObj) {
if (msgObj.data.error) {
if (_isFunction(g_promises[msgObj.asyncCallId].reject)) {
g_promises[msgObj.asyncCallId].reject(msgObj.data.body);
}
} else {
if (_isFunction(g_promises[msgObj.asyncCallId].resolve)) {
var cursor = new MessagingCursor(msgObj.data.body.results);
g_promises[msgObj.asyncCallId].resolve(cursor);
}
}
delete g_promises[msgObj.asyncCallId];
}
function handlePromise(msgObj) {
if (msgObj.data.error) {
if (_isFunction(g_promises[msgObj.asyncCallId].reject)) {
g_promises[msgObj.asyncCallId].reject(msgObj.data.body);
}
} else {
if (_isFunction(g_promises[msgObj.asyncCallId].resolve)) {
g_promises[msgObj.asyncCallId].resolve(msgObj.data.body);
}
}
delete g_promises[msgObj.asyncCallId];
}
extension.setMessageListener(function(json) {
var _msg = JSON.parse(json);
switch (_msg.cmd) {
case "sent":
case "received":
case "deliverysuccess":
case "deliveryerror":
case "serviceadded":
case "serviceadded": {
handleEvent(_msg);
break;
}
case "msg_findMessages_ret": {
handleFindMessages(_msg);
break;
}
case "msg_smsSend_ret":
case "msg_smsClear_ret":
case "msg_smsSegmentInfo_ret":
case "msg_getMessage_ret":
case "msg_deleteMessage_ret":
case "msg_deleteConversation_ret":
case "msg_markMessageRead_ret":
case "msg_markConversationRead_ret": {
handlePromise(_msg);
break;
}
default:
break;
}
});
exports.findMessages = function(filter, options) {
var _msg = {
cmd: "msg_findMessages",
data: {
filter: filter,
options: options
}
}
return createPromise(_msg);
}
exports.findConversations = function(groupBy, filter, options) {
// TODO:(shawn) Spec is not ready for this part.
}
exports.getMessage = function(type, messageID) {
var _msg = {
cmd: "msg_getMessage",
data: {
type: type,
messageID: messageID
}
}
return createPromise(_msg);
}
exports.deleteMessage = function(type, messageID) {
var _msg = {
cmd: "msg_deleteMessage",
data: {
type: type,
messageID: messageID
}
}
return createPromise(_msg);
}
exports.deleteConversation = function(type, conversationID) {
var _msg = {
cmd: "msg_deleteConversation",
data: {
type: type,
conversationID: conversationID
}
}
return createPromise(_msg);
}
exports.markMessageRead = function(type, messageID, value) {
value = (typeof value === 'undefined') ? true : value;
var _msg = {
cmd: "msg_markMessageRead",
data: {
type: type,
messageID: messageID,
value: value
}
}
return createPromise(_msg);
}
exports.markConversationRead = function(type, conversationID, value) {
value = (typeof value === 'undefined') ? true : value;
var _msg = {
cmd: "msg_markConversationRead",
data: {
type: type,
conversationID: conversationID,
value: value
}
}
return createPromise(_msg);
}