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 var validator_ = xwalk.utils.validator;
18 var types_ = validator_.Types;
19 var T_ = xwalk.utils.type;
20 var bridge = xwalk.utils.NativeBridge(extension, true);
22 function throwException_(err) {
23 throw new WebAPIException(err.code, err.name, err.message);
27 W: 1 << 0, // WRITABLE
28 E: 1 << 1, // ENUMERABLE
29 C: 1 << 2 // CONFIGURABLE
32 function addTypeToFilter_(data)
36 for(var field in data) {
37 filter[field] = data[field];
40 if (data instanceof tizen.AttributeFilter) {
41 filter.filterType = "AttributeFilter";
43 filter.matchValue = String(filter.matchValue);
44 } else if (data instanceof tizen.AttributeRangeFilter) {
45 filter.filterType = "AttributeRangeFilter";
46 } else if (data instanceof tizen.CompositeFilter) {
47 filter.filterType = "CompositeFilter";
48 // recursively convert all sub-filters
50 for (var i = 0; i < data.filters.length; ++i) {
51 filter.filters[i] = addTypeToFilter_(data.filters[i]);
54 filter.filterType = "Unknown";
62 * function Messaging () {
63 * propertyFactory_(this, 'ids', [2,3,4], Property.W | Property.E | Property.C);
64 * propertyFactory_(this, 'name', 'Name', Property.E);
65 * propertyFactory_(this, 'age', 25, Property.W);
66 * propertyFactory_(this, 'something', 1);
67 * propertyFactory_(this, 'getSomething', Property.E, {get: function(){return 100;}});
70 * var m = new Messaging();
77 * m.name = 'A brand new name';
78 * console.log(m.name); // Name
80 function propertyFactory_(that, name, value, flags, options) {
82 if (options === null || typeof options !== 'object') {
85 if (!(options.get) && !(options.set)) {
86 options.value = value;
88 if ((flags & Property.W) != 0) { options.writable = true; }
89 if ((flags & Property.E) != 0) { options.enumerable = true; }
90 if ((flags & Property.C) != 0) { options.configurable = true; }
91 Object.defineProperty(
98 function InternalValues_(data) {
99 if (!(this instanceof InternalValues_)) {
100 return new InternalValues_(data);
102 for(var key in data) {
103 if (data.hasOwnProperty(key)) {
104 this[key] = data[key];
109 function updateInternal_(internal, data) {
110 var values = new InternalValues_(data);
111 for(var key in data) {
112 if (values.hasOwnProperty(key) && internal.hasOwnProperty(key)) {
113 internal[key] = values;
119 * Specifies the Messaging service tags.
121 var MessageServiceTag = ['messaging.sms', 'messaging.mms', 'messaging.email'];
123 function Message(type, data) {
124 if (!(this instanceof Message)) {
125 throw new TypeError("Constructor called like a function");
127 if (MessageServiceTag.indexOf(type) === -1) {
128 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
130 if ( !data || typeof data !== 'object') { // 'data' is optional
134 // set initial data from internal MessageInit_ object or to default values
135 var internal = data instanceof MessageInit_,
136 id = internal ? data.id : null,
137 conversationId = internal ? data.conversationId : null,
138 folderId = internal ? data.folderId : null,
139 timestamp = internal ? data.timestamp : null,
140 from = internal ? data.from : null,
141 hasAttachment = internal ? data.hasAttachment : false,
142 isRead = internal ? data.isRead : false,
143 inResponseTo = internal ? data.inResponseTo : null;
144 // create MessageBody object
145 var body = new MessageBody({messageId: id, plainBody: data.plainBody, htmlBody: data.htmlBody});
146 // check 'to', 'cc' and 'bcc' fields
148 if (!(to instanceof Array)) {
152 if (!(cc instanceof Array)) {
156 if (!(bcc instanceof Array)) {
159 // 'attachments' private variable, getter and setter
160 var attachments = (internal ? data.attachments : []) || [];
164 conversationId: conversationId || null,
165 folderId: folderId || null,
167 timestamp: timestamp || null,
173 isRead: isRead || false,
174 hasAttachment: hasAttachment || false,
175 isHighPriority: data.isHighPriority || false,
176 subject: data.subject || '',
177 inResponseTo: inResponseTo || null,
178 attachments: attachments
181 Object.defineProperty(
185 get: function () {return _internal.id;},
186 set: function (value) { if (value instanceof InternalValues_) _internal.id = value.id;},
192 Object.defineProperty(
196 get: function () {return _internal.conversationId;},
197 set: function (value) {
198 if (value instanceof InternalValues_)
199 _internal.conversationId = value.conversationId;
206 Object.defineProperty(
210 get: function () {return _internal.folderId;},
211 set: function (value) {
212 if (value instanceof InternalValues_) _internal.folderId = value.folderId;
219 Object.defineProperty(
223 get: function () {return _internal.type;},
224 set: function (value) {return;},
230 Object.defineProperty(
235 return _internal.timestamp ? new Date(_internal.timestamp * 1000) : _internal.timestamp;
237 set: function (value) {
238 if (value instanceof InternalValues_) {
239 _internal.timestamp = value.timestamp;
247 Object.defineProperty(
251 get: function () {return _internal.from;},
252 set: function (value) {
253 if (value instanceof InternalValues_) _internal.from = value.from;
260 Object.defineProperty(
264 get: function () {return _internal.to;},
265 set: function (value) {
266 if (value instanceof InternalValues_) value = value.to;
267 if (value instanceof Array) _internal.to = value;
274 Object.defineProperty(
278 get: function () {return _internal.cc;},
279 set: function (value) {
280 if (value instanceof InternalValues_) value = value.cc;
281 if (value instanceof Array) _internal.cc = value;
288 Object.defineProperty(
292 get: function () {return _internal.bcc;},
293 set: function (value) {
294 if (value instanceof InternalValues_) value = value.bcc;
295 if (value instanceof Array) _internal.bcc = value;
302 Object.defineProperty(
306 get: function () {return _internal.body;},
307 set: function (value) {
308 if (value instanceof InternalValues_) _internal.body = new MessageBody(value.body);
309 if (value instanceof MessageBody) _internal.body = value;
316 Object.defineProperty(
320 get: function () {return _internal.isRead;},
321 set: function (value) {
322 if (value instanceof InternalValues_) {value = value.isRead;}
323 _internal.isRead = !!value;
330 Object.defineProperty(
334 get: function () {return _internal.attachments.length > 0;},
335 set: function (value) {
336 if (value instanceof InternalValues_)
337 _internal.hasAttachment = value.hasAttachment;
344 Object.defineProperty(
348 get: function () {return _internal.isHighPriority;},
349 set: function (value) {
350 if (value instanceof InternalValues_) value = value.isHighPriority;
351 _internal.isHighPriority = !!value;
358 Object.defineProperty(
362 get: function () {return _internal.subject;},
363 set: function (value) {
364 if (value instanceof InternalValues_) value = value.subject;
365 _internal.subject = String(value);
372 Object.defineProperty(
376 get: function () {return _internal.inResponseTo;},
377 set: function (value) {
378 if (value instanceof InternalValues_) _internal.inResponseTo = value.inResponseTo;
385 Object.defineProperty(
391 // TODO create CPP layer
393 *return bridge.sync({
394 * cmd: 'Message_messageStatus',
400 return _internal.messageStatus;
405 set: function (value) {return;},
411 Object.defineProperty(
415 get: function () {return _internal.attachments;},
416 set: function(value) {
417 if (value instanceof InternalValues_) {
418 value = value.attachments;
419 for (var k = 0; k < value.length; ++k) {
420 if (!(value[k] instanceof tizen.MessageAttachment)) {
421 if (_internal.attachments[k]) {
422 updateInternal_(_internal.attachments[k], value[k]);
424 _internal.attachments[k] = new MessageAttachment(
425 new InternalValues_(value[k]));
428 _internal.attachments[k] = value[k];
431 // if new array is shorter than the old one, remove excess elements
432 if (value.length < _internal.length) {
433 _internal.splice(value.length, _internal.length - value.length);
435 } else if (T_.isArray(value)) {
436 for (var k = 0; k < value.length; ++k) {
437 if (!(value[k] instanceof tizen.MessageAttachment)) {
441 _internal.attachments = value;
449 function MessageInit(data) {
450 if (!(this instanceof MessageInit)) {
451 return new MessageInit(data);
453 if (data === null || typeof data !== 'object') {
456 propertyFactory_(this, 'subject' , data.subject || '' , Property.E | Property.W);
457 propertyFactory_(this, 'to' , data.to || [] , Property.E | Property.W);
458 propertyFactory_(this, 'cc' , data.cc || [] , Property.E | Property.W);
459 propertyFactory_(this, 'bcc' , data.bcc || [] , Property.E | Property.W);
460 propertyFactory_(this, 'plainBody' , data.plainBody || '' , Property.E | Property.W);
461 propertyFactory_(this, 'htmlBody' , data.htmlBody || '' , Property.E | Property.W);
462 propertyFactory_(this, 'isHighPriority', data.isHighPriority || false, Property.E | Property.W);
465 function MessageInit_(data) {
466 if (!(this instanceof MessageInit_)) {
467 return new MessageInit_(data);
469 if ( !data || typeof data !== 'object') {
472 this.id = data.id || null;
473 this.conversationId = data.conversationId || null;
474 this.folderId = data.folderId || null;
475 this.timestamp = data.timestamp || null;
476 this.from = data.from || '';
477 this.to = data.to || [];
478 this.cc = data.cc || [];
479 this.bcc = data.bcc || [];
480 this.isRead = data.isRead || false;
481 this.hasAttachment = data.hasAttachment || null;
482 this.isHighPriority = data.isHighPriority || false;
483 this.subject = data.subject || '';
484 this.inResponseTo = data.inResponseTo || null;
485 this.attachments = [];
486 this.plainBody = data.body ? data.body.plainBody : '';
487 this.htmlBody = data.body ? data.body.htmlBody : '';
490 if (data.attachments && data.attachments.constructor === Array) {
491 data.attachments.forEach(function(el) {
494 if (el.constructor === MessageAttachment) {
495 self.attachments.push(el);
497 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
503 function MessageBody(data) {
504 if (!this instanceof MessageBody) {
505 return new MessageBody(data);
507 if (data === null || typeof data !== 'object') {
512 messageId: data.messageId || null,
513 loaded: data.loaded || false,
514 plainBody: data.plainBody || '',
515 htmlBody: data.htmlBody || '',
516 inlineAttachments: data.inlineAttachments || []
520 Object.defineProperty(
524 get: function () {return _internal.messageId;},
525 set: function (value) {
526 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
533 Object.defineProperty(
537 get: function () {return _internal.loaded;},
538 set: function (value) {
539 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
546 Object.defineProperty(
550 get: function () {return _internal.plainBody;},
551 set: function (value) {
552 if (value instanceof InternalValues_) {
553 _internal.plainBody = String(value.plainBody);
555 _internal.plainBody = String(value);
563 Object.defineProperty(
567 get: function () {return _internal.htmlBody;},
568 set: function (value) {
569 if (value instanceof InternalValues_) {
570 _internal.htmlBody = String(value.htmlBody);
572 _internal.htmlBody = String(value);
580 Object.defineProperty(
584 get: function () {return _internal.inlineAttachments;},
585 set: function (value) {
586 if (value instanceof InternalValues_) {
587 _internal.inlineAttachments = value.inlineAttachments;
588 } else if (T_.isArray(value)) {
589 _internal.inlineAttachments = value;
597 var messageAttachmentsLoaded = {};
599 function MessageAttachment(first, second) {
600 validator_.isConstructorCall(this, MessageAttachment);
601 if (!this instanceof MessageAttachment) {
602 return new MessageAttachment(data);
605 var internalConstructor = first instanceof InternalValues_;
607 messageId: internalConstructor ? first.messageId : null,
608 id: internalConstructor ? first.id : null,
609 mimeType: internalConstructor ? first.mimeType : (undefined == second ? null : second),
610 filePath: internalConstructor ? first.filePath : first,
614 Object.defineProperty(
618 get: function () {return _internal.messageId;},
619 set: function (value) {
620 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
626 Object.defineProperty(
630 get: function () {return _internal.id;},
631 set: function (value) {
632 if (value instanceof InternalValues_) _internal.id = value.id;
638 Object.defineProperty(
642 get: function () {return _internal.mimeType;},
643 set: function (value) {
644 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
650 Object.defineProperty(
655 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
659 return _internal.filePath;
661 set: function (value) {
662 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
669 function Messaging() {};
672 * Gets the messaging service of a given type for a given account.
673 * @param {!MessageServiceTag} messageServiceType Type of the services to be retrieved.
674 * @param {!MessageServiceArraySuccessCallback} successCallback Callback function that is called
675 * when the services are successfully retrieved.
676 * @param {ErrorCallback} errorCallback Callback function that is called when an error occurs.
678 Messaging.prototype.getMessageServices = function () {
679 var args = validator_.validateArgs(arguments, [
680 {name: 'messageServiceType', type: types_.ENUM, values: MessageServiceTag},
681 {name: 'successCallback', type: types_.FUNCTION},
682 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
686 cmd: 'Messaging_getMessageServices',
688 messageServiceType: args.messageServiceType
691 success: function (data) {
692 var servicesArr = [];
693 data.forEach(function(e){
694 servicesArr.push(new MessageService(e));
696 args.successCallback.call(null, servicesArr);
698 error: function (e) {
699 if (args.errorCallback) {
700 args.errorCallback.call(
702 new WebAPIException(e.error)
708 function MessageStorage(){};
709 function MessageService(data) {
710 propertyFactory_(this, 'id', data.id, Property.E);
711 propertyFactory_(this, 'type', data.type, Property.E);
712 propertyFactory_(this, 'name', data.name, Property.E);
713 propertyFactory_(this, 'messageStorage', new MessageStorage(this), Property.E);
716 MessageService.prototype.sendMessage = function () {
717 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
719 var args = validator_.validateArgs(arguments, [
720 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
721 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
722 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
723 {name: 'simIndex', type: types_.LONG, optional: true, nullable: true}
726 if (args.message.type != this.type) {
727 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
732 cmd: 'MessageService_sendMessage',
734 message: args.message,
735 simIndex: args.simIndex || 1,
739 success: function (data) {
740 var message = data.message;
742 var body = message.body;
744 updateInternal_(args.message.body, body)
747 updateInternal_(args.message, message);
750 if (args.successCallback) {
751 args.successCallback.call(null, data.recipients);
754 error: function (e) {
755 if (args.errorCallback) {
756 args.errorCallback.call(
758 new WebAPIException(e.error)
765 MessageService.prototype.loadMessageBody = function () {
766 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
768 var args = validator_.validateArgs(arguments, [
769 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
770 {name: 'successCallback', type: types_.FUNCTION},
771 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
774 if (args.message.type != this.type) {
775 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
781 cmd: 'MessageService_loadMessageBody',
783 message: args.message,
787 success: function (data) {
788 var body = data.messageBody;
790 updateInternal_(args.message.body, body)
793 args.successCallback.call(
798 error: function (e) {
799 if (args.errorCallback) {
800 args.errorCallback.call(
802 new WebAPIException(e.error)
808 MessageService.prototype.loadMessageAttachment = function () {
809 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
811 var args = validator_.validateArgs(arguments, [
812 {name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment},
813 {name: 'successCallback', type: types_.FUNCTION},
814 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
818 var firstCall = false;
819 if (!messageAttachmentsLoaded[args.attachment.id]) {
821 messageAttachmentsLoaded[args.attachment.id] = true;
825 cmd: 'MessageService_loadMessageAttachment',
827 attachment: args.attachment,
831 success: function (data) {
832 if (args.successCallback) {
833 var messageAttachment = data.messageAttachment;
834 if (messageAttachment) {
835 updateInternal_(args.attachment, messageAttachment);
838 args.successCallback.call(
844 error: function (e) {
846 messageAttachmentsLoaded[args.attachment.id] = false;
848 if (args.errorCallback) {
849 args.errorCallback.call(
851 new WebAPIException(e.error)
858 MessageService.prototype.sync = function () {
859 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
861 var args = validator_.validateArgs(arguments, [
862 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
863 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
864 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
868 var cid = bridge.listener({
869 success: function () {
870 if (args.successCallback) {
871 args.successCallback.call(null);
874 error: function (e) {
875 if (args.errorCallback) {
876 args.errorCallback.call(
878 new WebAPIException(e.error)
884 var result = bridge.sync({
885 cmd: 'MessageService_sync',
889 limit: args.limit || null
896 MessageService.prototype.syncFolder = function () {
897 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
899 var args = validator_.validateArgs(arguments, [
900 {name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder},
901 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
902 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
903 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
907 var cid = bridge.listener({
908 success: function () {
909 if (args.successCallback) {
910 args.successCallback.call(null);
913 error: function (e) {
914 if (args.errorCallback) {
915 args.errorCallback.call(
917 new WebAPIException(e.error)
923 var result = bridge.sync({
924 cmd: 'MessageService_syncFolder',
929 limit: args.limit || null
936 MessageService.prototype.stopSync = function () {
937 var args = validator_.validateArgs(arguments, [
938 {name: 'opId', type: types_.LONG}
941 // Additionally to pass the MessageService_email_stopSync_opId_TypeMismatch test
942 if (!isFinite(arguments[0])) {
943 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
948 cmd: 'MessageService_stopSync',
956 function MessageStorage(service) {
957 propertyFactory_(this, 'service', service);
960 MessageStorage.prototype.addDraftMessage = function () {
961 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
963 var args = validator_.validateArgs(arguments, [
964 {name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message},
965 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
966 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
969 if (args.message.type != this.service.type) {
970 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
975 cmd: 'MessageStorage_addDraftMessage',
977 message: args.message,
978 serviceId: self.service.id
981 success: function (data) {
982 var message = data.message;
984 var body = message.body;
986 updateInternal_(args.message.body, body)
989 var attachments = message.attachments;
991 for (var i = 0; i < attachments.length; i++) {
992 messageAttachmentsLoaded[attachments[i].id] = true;
995 updateInternal_(args.message, message);
998 if (args.successCallback) {
999 args.successCallback.call(null);
1002 error: function (e) {
1003 if (args.errorCallback) {
1004 args.errorCallback.call(
1006 new WebAPIException(e.error)
1013 MessageStorage.prototype.findMessages = function () {
1014 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1016 var args = validator_.validateArgs(arguments, [
1019 type: types_.PLATFORM_OBJECT,
1020 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1022 {name: 'successCallback', type: types_.FUNCTION},
1023 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
1024 {name: 'sort', type: types_.PLATFORM_OBJECT, values: tizen.SortMode, optional: true,
1026 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true},
1027 {name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
1033 cmd: 'MessageStorage_findMessages',
1035 filter: addTypeToFilter_(args.filter) || null,
1036 sort: args.sort || null,
1037 limit: args.limit || null,
1038 offset: args.offset || null,
1039 serviceId: self.service.id,
1040 type: self.service.type
1043 success: function (data) {
1045 data.forEach(function (el) {
1046 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1048 args.successCallback.call(null, messages);
1050 error: function (e) {
1051 if (args.errorCallback) {
1052 args.errorCallback.call(
1054 new WebAPIException(e.error)
1061 MessageStorage.prototype.removeMessages = function () {
1062 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
1064 var args = validator_.validateArgs(arguments, [
1065 {name: 'messages', type: types_.ARRAY, values: Message},
1066 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1067 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1072 args.messages.forEach(function(msg) {
1073 if (msg.type != self.service.type) {
1074 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
1079 cmd: 'MessageStorage_removeMessages',
1081 messages: args.messages,
1082 serviceId: self.service.id,
1083 type: self.service.type
1086 success: function () {
1087 if (args.successCallback) {
1088 args.successCallback.call(null);
1091 error: function (e) {
1092 if (args.errorCallback) {
1093 args.errorCallback.call(
1095 new WebAPIException(e.error)
1102 MessageStorage.prototype.updateMessages = function () {
1103 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
1105 var args = validator_.validateArgs(arguments, [
1106 {name: 'messages', type: types_.ARRAY, values: Message},
1107 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1108 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1113 args.messages.forEach(function(msg) {
1114 if (msg.type != self.service.type) {
1115 throw new tizen.WebAPIException(tizen.WebAPIException.TYPE_MISMATCH_ERR);
1120 cmd: 'MessageStorage_updateMessages',
1122 messages: args.messages,
1123 serviceId: self.service.id
1126 success: function (data) {
1128 i = args.messages.length,
1131 m = args.messages[i];
1133 originals[m.id] = m;
1140 if (originals[m.oldId]) {
1143 updateInternal_(originals[m.oldId].body, body)
1146 updateInternal_(originals[m.oldId], m);
1150 if (args.successCallback) {
1151 args.successCallback.call(null);
1154 error: function (e) {
1155 if (args.errorCallback) {
1156 args.errorCallback.call(
1158 new WebAPIException(e.error)
1165 MessageStorage.prototype.findConversations = function () {
1166 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1168 var args = validator_.validateArgs(arguments, [
1171 type: types_.PLATFORM_OBJECT,
1172 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1174 {name: 'successCallback', type: types_.FUNCTION},
1175 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true},
1176 {name: 'sort', type: types_.PLATFORM_OBJECT, values: tizen.SortMode, optional: true,
1178 {name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true},
1179 {name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true}
1185 cmd: 'MessageStorage_findConversations',
1187 filter: addTypeToFilter_(args.filter),
1188 sort: args.sort || null,
1189 limit: args.limit || null,
1190 offset: args.offset || null,
1191 serviceId: self.service.id
1194 success: function (data) {
1195 var conversations = [];
1196 data.forEach(function (el) {
1197 conversations.push(new MessageConversation(el));
1199 args.successCallback.call(null, conversations);
1201 error: function (e) {
1202 if (args.errorCallback) {
1203 args.errorCallback.call(
1205 new WebAPIException(e.error)
1212 MessageStorage.prototype.removeConversations = function () {
1213 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_WRITE);
1215 var args = validator_.validateArgs(arguments, [
1216 {name: 'conversations', type: types_.ARRAY},
1217 {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
1218 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1221 args.conversations.forEach(function (el) {
1222 if (!el || el.constructor !== MessageConversation) {
1223 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1230 cmd: 'MessageStorage_removeConversations',
1232 conversations: args.conversations,
1233 serviceId: self.service.id,
1234 type: self.service.type
1237 success: function () {
1238 if (args.successCallback) {
1239 args.successCallback.call(null);
1242 error: function (e) {
1243 if (args.errorCallback) {
1244 args.errorCallback.call(
1246 new WebAPIException(e.error)
1253 MessageStorage.prototype.findFolders = function () {
1254 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1256 var args = validator_.validateArgs(arguments, [
1259 type: types_.PLATFORM_OBJECT,
1260 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter]
1262 {name: 'successCallback', type: types_.FUNCTION},
1263 {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
1269 cmd: 'MessageStorage_findFolders',
1271 filter: addTypeToFilter_(args.filter),
1272 sort: args.sort || null,
1273 limit: args.limit || null,
1274 offset: args.offset || null,
1275 serviceId: self.service.id
1278 success: function (data) {
1280 data.forEach(function (el) {
1281 folders.push(new MessageFolder(el));
1283 args.successCallback.call(null, folders);
1285 error: function (e) {
1286 if (args.errorCallback) {
1287 args.errorCallback.call(
1289 new WebAPIException(e.error)
1296 MessageStorage.prototype.addMessagesChangeListener = function () {
1297 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1299 var args = validator_.validateArgs(arguments, [
1300 {name: 'messagesChangeCallback', type: types_.LISTENER,
1301 values: ['messagesadded', 'messagesupdated', 'messagesremoved']},
1304 type: types_.PLATFORM_OBJECT,
1305 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1313 var cid = bridge.listener({
1314 messagesadded: function (data) {
1315 if (args.messagesChangeCallback.messagesadded) {
1317 data.forEach(function (el) {
1318 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1320 args.messagesChangeCallback.messagesadded.call(null, messages);
1323 messagesupdated: function (data) {
1324 if (args.messagesChangeCallback.messagesupdated) {
1326 data.forEach(function (el) {
1327 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1329 args.messagesChangeCallback.messagesupdated.call(null, messages);
1332 messagesremoved: function (data) {
1333 if (args.messagesChangeCallback.messagesremoved) {
1335 data.forEach(function (el) {
1336 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1338 args.messagesChangeCallback.messagesremoved.call(null, messages);
1343 var result = bridge.sync({
1344 cmd: 'MessageStorage_addMessagesChangeListener',
1347 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1348 serviceId: self.service.id
1352 bridge.attach(cid, 'watchId', result);
1356 MessageStorage.prototype.addConversationsChangeListener = function () {
1357 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1359 var args = validator_.validateArgs(arguments, [
1360 {name: 'conversationsChangeCallback', type: types_.LISTENER,
1361 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']},
1364 type: types_.PLATFORM_OBJECT,
1365 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1373 var cid = bridge.listener({
1374 conversationsadded: function (data) {
1375 if (args.conversationsChangeCallback.conversationsadded) {
1376 var conversations = [];
1377 data.forEach(function (el) {
1378 conversations.push(new MessageConversation(el));
1380 args.conversationsChangeCallback.conversationsadded.call(null, conversations);
1383 conversationsupdated: function (data) {
1384 if (args.conversationsChangeCallback.conversationsupdated) {
1385 var conversations = [];
1386 data.forEach(function (el) {
1387 conversations.push(new MessageConversation(el));
1389 args.conversationsChangeCallback.conversationsupdated.call(null, conversations);
1392 conversationsremoved: function (data) {
1393 if (args.conversationsChangeCallback.conversationsremoved) {
1394 var conversations = [];
1395 data.forEach(function (el) {
1396 conversations.push(new MessageConversation(el));
1398 args.conversationsChangeCallback.conversationsremoved.call(null, conversations);
1403 var result = bridge.sync({
1404 cmd: 'MessageStorage_addConversationsChangeListener',
1407 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1408 serviceId: self.service.id
1412 bridge.attach(cid, 'watchId', result);
1416 MessageStorage.prototype.addFoldersChangeListener = function () {
1417 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1419 var args = validator_.validateArgs(arguments, [
1420 {name: 'foldersChangeCallback', type: types_.LISTENER,
1421 values: ['foldersadded', 'foldersupdated', 'foldersremoved']},
1424 type: types_.PLATFORM_OBJECT,
1425 values: [tizen.AttributeFilter, tizen.AttributeRangeFilter, tizen.CompositeFilter],
1433 var cid = bridge.listener({
1434 foldersadded: function (data) {
1435 if (args.foldersChangeCallback.foldersadded) {
1437 data.forEach(function (el) {
1438 folders.push(new MessageFolder(el));
1440 args.foldersChangeCallback.foldersadded.call(null, folders);
1443 foldersupdated: function (data) {
1444 if (args.foldersChangeCallback.foldersupdated) {
1446 data.forEach(function (el) {
1447 folders.push(new MessageFolder(el));
1449 args.foldersChangeCallback.foldersupdated.call(null, folders);
1452 foldersremoved: function (data) {
1453 if (args.foldersChangeCallback.foldersremoved) {
1455 data.forEach(function (el) {
1456 folders.push(new MessageFolder(el));
1458 args.foldersChangeCallback.foldersremoved.call(null, folders);
1463 var result = bridge.sync({
1464 cmd: 'MessageStorage_addFoldersChangeListener',
1467 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1468 serviceId: self.service.id
1472 bridge.attach(cid, 'watchId', result);
1476 MessageStorage.prototype.removeChangeListener = function () {
1477 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.MESSAGING_READ);
1479 var args = validator_.validateArgs(arguments, [
1480 {name: 'watchId', type: types_.LONG}
1485 var result = bridge.sync({
1486 cmd: 'MessageStorage_removeChangeListener',
1488 watchId: args.watchId,
1489 serviceId: self.service.id
1493 bridge.find('watchId', args.watchId).forEach(function (e) {
1494 bridge.remove(e.id);
1499 function MessageConversation(data) {
1500 propertyFactory_(this, 'id' , data.id || null , Property.E);
1501 propertyFactory_(this, 'type' , data.type || '' , Property.E);
1502 propertyFactory_(this, 'timestamp' , data.timestamp ? new Date(data.timestamp * 1000) : null , Property.E);
1503 propertyFactory_(this, 'messageCount' , data.messageCount || 0 , Property.E);
1504 propertyFactory_(this, 'unreadMessages', data.unreadMessages || 0 , Property.E);
1505 propertyFactory_(this, 'preview' , data.preview || '' , Property.E);
1506 propertyFactory_(this, 'subject' , data.subject || '' , Property.E);
1507 propertyFactory_(this, 'isRead' , data.isRead || false, Property.E);
1508 propertyFactory_(this, 'from' , data.from || null , Property.E);
1509 propertyFactory_(this, 'to' , data.to || [] , Property.E);
1510 propertyFactory_(this, 'cc' , data.cc || [] , Property.E);
1511 propertyFactory_(this, 'bcc' , data.bcc || [] , Property.E);
1512 propertyFactory_(this, 'lastMessageId' , data.lastMessageId || null , Property.E);
1515 function MessageFolder(data) {
1517 id: data.id || null,
1518 parentId: data.parentId || null,
1519 serviceId: data.serviceId || '',
1520 contentType: data.contentType || '',
1521 name: data.name || '',
1522 path: data.path || '',
1523 type: data.type || '',
1524 synchronizable: data.synchronizable || false
1527 Object.defineProperty(
1531 get: function () {return _internal.id;},
1536 Object.defineProperty(
1540 get: function () {return _internal.parentId;},
1545 Object.defineProperty(
1549 get: function () {return _internal.serviceId;},
1554 Object.defineProperty(
1558 get: function () {return _internal.contentType;},
1563 Object.defineProperty(
1567 get: function () {return _internal.name;},
1568 set: function (value) { if (value) _internal.name = value;},
1573 Object.defineProperty(
1577 get: function () {return _internal.path;},
1582 Object.defineProperty(
1586 get: function () {return _internal.type;},
1591 Object.defineProperty(
1595 get: function () {return _internal.synchronizable;},
1596 set: function (value) { _internal.synchronizable = Boolean(value);},
1602 tizen.Message = Message;
1604 tizen.MessageAttachment = MessageAttachment;
1606 exports = new Messaging();