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 native = new xwalk.utils.NativeManager(extension);
21 var privUtils_ = xwalk.utils;
23 function throwException_(err) {
24 throw new WebAPIException(err.code, err.name, err.message);
28 W: 1 << 0, // WRITABLE
29 E: 1 << 1, // ENUMERABLE
30 C: 1 << 2 // CONFIGURABLE
33 function addTypeToFilter_(data) {
36 for (var field in data) {
37 filter[field] = data[field];
40 if (data instanceof tizen.AttributeFilter) {
41 filter.filterType = 'AttributeFilter';
42 } else if (data instanceof tizen.AttributeRangeFilter) {
43 filter.filterType = 'AttributeRangeFilter';
44 } else if (data instanceof tizen.CompositeFilter) {
45 filter.filterType = 'CompositeFilter';
46 // recursively convert all sub-filters
48 for (var i = 0; i < data.filters.length; ++i) {
49 filter.filters[i] = addTypeToFilter_(data.filters[i]);
52 filter.filterType = 'Unknown';
60 * function Messaging () {
61 * propertyFactory_(this, 'ids', [2,3,4], Property.W | Property.E | Property.C);
62 * propertyFactory_(this, 'name', 'Name', Property.E);
63 * propertyFactory_(this, 'age', 25, Property.W);
64 * propertyFactory_(this, 'something', 1);
65 * propertyFactory_(this, 'getSomething', Property.E, {get: function(){return 100;}});
68 * var m = new Messaging();
75 * m.name = 'A brand new name';
76 * privUtils_.log(m.name); // Name
78 function propertyFactory_(that, name, value, flags, options) {
80 if (options === null || typeof options !== 'object') {
83 if (!options.get && !options.set) {
84 options.value = value;
86 if ((flags & Property.W) != 0) {
87 options.writable = true;
89 if ((flags & Property.E) != 0) {
90 options.enumerable = true;
92 if ((flags & Property.C) != 0) {
93 options.configurable = true;
95 Object.defineProperty(that, name, options);
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') {
131 // 'data' is optional
135 // set initial data from internal MessageInit_ object or to default values
136 var internal = data instanceof MessageInit_,
137 id = internal ? data.id : null,
138 conversationId = internal ? data.conversationId : null,
139 folderId = internal ? data.folderId : null,
140 timestamp = internal ? data.timestamp : null,
141 from = internal ? data.from : null,
142 hasAttachment = internal ? data.hasAttachment : false,
143 isRead = internal ? data.isRead : false,
144 inResponseTo = internal ? data.inResponseTo : null;
145 // create MessageBody object
146 var body = new MessageBody({
148 plainBody: data.plainBody,
149 htmlBody: data.htmlBody
151 // check 'to', 'cc' and 'bcc' fields
153 if (!(to instanceof Array)) {
157 if (!(cc instanceof Array)) {
161 if (!(bcc instanceof Array)) {
164 // 'attachments' private variable, getter and setter
165 var attachments = (internal ? data.attachments : []) || [];
169 conversationId: conversationId || null,
170 folderId: folderId || null,
172 timestamp: timestamp || null,
178 isRead: isRead || false,
179 hasAttachment: hasAttachment || false,
180 isHighPriority: data.isHighPriority || false,
181 subject: data.subject || '',
182 inResponseTo: inResponseTo || null,
183 attachments: attachments
186 Object.defineProperty(this, 'id', {
190 set: function(value) {
191 if (value instanceof InternalValues_) _internal.id = value.id;
197 Object.defineProperty(this, 'conversationId', {
199 return _internal.conversationId;
201 set: function(value) {
202 if (value instanceof InternalValues_)
203 _internal.conversationId = value.conversationId;
209 Object.defineProperty(this, 'folderId', {
211 return _internal.folderId;
213 set: function(value) {
214 if (value instanceof InternalValues_) _internal.folderId = value.folderId;
220 Object.defineProperty(this, 'type', {
222 return _internal.type;
224 set: function(value) {
231 Object.defineProperty(this, 'timestamp', {
233 return _internal.timestamp
234 ? new Date(_internal.timestamp * 1000)
235 : _internal.timestamp;
237 set: function(value) {
238 if (value instanceof InternalValues_) {
239 _internal.timestamp = value.timestamp;
246 Object.defineProperty(this, 'from', {
248 return _internal.from;
250 set: function(value) {
251 if (value instanceof InternalValues_) _internal.from = value.from;
257 Object.defineProperty(this, 'to', {
261 set: function(value) {
262 if (value instanceof InternalValues_) value = value.to;
263 if (value instanceof Array) _internal.to = value;
269 Object.defineProperty(this, 'cc', {
273 set: function(value) {
274 if (value instanceof InternalValues_) value = value.cc;
275 if (value instanceof Array) _internal.cc = value;
281 Object.defineProperty(this, 'bcc', {
283 return _internal.bcc;
285 set: function(value) {
286 if (value instanceof InternalValues_) value = value.bcc;
287 if (value instanceof Array) _internal.bcc = value;
293 Object.defineProperty(this, 'body', {
295 return _internal.body;
297 set: function(value) {
298 if (value instanceof InternalValues_)
299 _internal.body = new MessageBody(value.body);
300 if (value instanceof MessageBody) _internal.body = value;
306 Object.defineProperty(this, 'isRead', {
308 return _internal.isRead;
310 set: function(value) {
311 if (value instanceof InternalValues_) {
312 value = value.isRead;
314 _internal.isRead = !!value;
320 Object.defineProperty(this, 'hasAttachment', {
322 return _internal.attachments.length > 0;
324 set: function(value) {
325 if (value instanceof InternalValues_)
326 _internal.hasAttachment = value.hasAttachment;
332 Object.defineProperty(this, 'isHighPriority', {
334 return _internal.isHighPriority;
336 set: function(value) {
337 if (value instanceof InternalValues_) value = value.isHighPriority;
338 _internal.isHighPriority = !!value;
344 Object.defineProperty(this, 'subject', {
346 return _internal.subject;
348 set: function(value) {
349 if (value instanceof InternalValues_) value = value.subject;
350 _internal.subject = String(value);
356 Object.defineProperty(this, 'inResponseTo', {
358 return _internal.inResponseTo;
360 set: function(value) {
361 if (value instanceof InternalValues_)
362 _internal.inResponseTo = value.inResponseTo;
368 Object.defineProperty(this, 'messageStatus', {
375 var result = native.callSync('MessageGetMessageStatus', callArgs);
376 if (native.isSuccess(result)) {
377 return native.getResultObject(result);
382 set: function(value) {
389 Object.defineProperty(this, 'attachments', {
391 return _internal.attachments;
393 set: function(value) {
394 if (value instanceof InternalValues_) {
395 value = value.attachments;
396 for (var k = 0; k < value.length; ++k) {
397 if (!(value[k] instanceof tizen.MessageAttachment)) {
398 if (_internal.attachments[k]) {
399 updateInternal_(_internal.attachments[k], value[k]);
401 _internal.attachments[k] = new MessageAttachment(
402 new InternalValues_(value[k])
406 _internal.attachments[k] = value[k];
409 // if new array is shorter than the old one, remove excess elements
410 if (value.length < _internal.length) {
411 _internal.splice(value.length, _internal.length - value.length);
413 } else if (T_.isArray(value)) {
414 for (var k = 0; k < value.length; ++k) {
415 if (!(value[k] instanceof tizen.MessageAttachment)) {
419 _internal.attachments = value;
426 function MessageInit(data) {
427 if (!(this instanceof MessageInit)) {
428 return new MessageInit(data);
430 if (data === null || typeof data !== 'object') {
433 propertyFactory_(this, 'subject', data.subject || '', Property.E | Property.W);
434 propertyFactory_(this, 'to', data.to || [], Property.E | Property.W);
435 propertyFactory_(this, 'cc', data.cc || [], Property.E | Property.W);
436 propertyFactory_(this, 'bcc', data.bcc || [], Property.E | Property.W);
437 propertyFactory_(this, 'plainBody', data.plainBody || '', Property.E | Property.W);
438 propertyFactory_(this, 'htmlBody', data.htmlBody || '', Property.E | Property.W);
442 data.isHighPriority || false,
443 Property.E | Property.W
447 function MessageInit_(data) {
448 if (!(this instanceof MessageInit_)) {
449 return new MessageInit_(data);
451 if (!data || typeof data !== 'object') {
454 this.id = data.id || null;
455 this.conversationId = data.conversationId || null;
456 this.folderId = data.folderId || null;
457 this.timestamp = data.timestamp || null;
458 this.from = data.from || '';
459 this.to = data.to || [];
460 this.cc = data.cc || [];
461 this.bcc = data.bcc || [];
462 this.isRead = data.isRead || false;
463 this.hasAttachment = data.hasAttachment || null;
464 this.isHighPriority = data.isHighPriority || false;
465 this.subject = data.subject || '';
466 this.inResponseTo = data.inResponseTo || null;
467 this.attachments = [];
468 this.plainBody = data.body ? data.body.plainBody : '';
469 this.htmlBody = data.body ? data.body.htmlBody : '';
472 if (data.attachments && data.attachments.constructor === Array) {
473 data.attachments.forEach(function(el) {
476 if (el.constructor === MessageAttachment) {
477 self.attachments.push(el);
479 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
485 function MessageBody(data) {
486 if (!this instanceof MessageBody) {
487 return new MessageBody(data);
489 if (data === null || typeof data !== 'object') {
494 messageId: data.messageId || null,
495 loaded: data.loaded || false,
496 plainBody: data.plainBody || '',
497 htmlBody: data.htmlBody || '',
498 inlineAttachments: data.inlineAttachments || []
502 Object.defineProperty(this, 'messageId', {
504 return _internal.messageId;
506 set: function(value) {
507 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
513 Object.defineProperty(this, 'loaded', {
515 return _internal.loaded;
517 set: function(value) {
518 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
524 Object.defineProperty(this, 'plainBody', {
526 return _internal.plainBody;
528 set: function(value) {
529 if (value instanceof InternalValues_) {
530 _internal.plainBody = String(value.plainBody);
532 _internal.plainBody = String(value);
539 Object.defineProperty(this, 'htmlBody', {
541 return _internal.htmlBody;
543 set: function(value) {
544 if (value instanceof InternalValues_) {
545 _internal.htmlBody = String(value.htmlBody);
547 _internal.htmlBody = String(value);
554 Object.defineProperty(this, 'inlineAttachments', {
556 return _internal.inlineAttachments;
558 set: function(value) {
559 if (value instanceof InternalValues_) {
560 _internal.inlineAttachments = value.inlineAttachments;
561 } else if (T_.isArray(value)) {
562 _internal.inlineAttachments = value;
569 var messageAttachmentsLoaded = {};
571 function MessageAttachment(first, second) {
572 validator_.isConstructorCall(this, MessageAttachment);
573 if (!this instanceof MessageAttachment) {
574 return new MessageAttachment(data);
577 var internalConstructor = first instanceof InternalValues_;
579 messageId: internalConstructor ? first.messageId : null,
580 id: internalConstructor ? first.id : null,
581 mimeType: internalConstructor
583 : undefined == second
586 filePath: internalConstructor ? first.filePath : first
590 Object.defineProperty(this, 'messageId', {
592 return _internal.messageId;
594 set: function(value) {
595 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
600 Object.defineProperty(this, 'id', {
604 set: function(value) {
605 if (value instanceof InternalValues_) _internal.id = value.id;
610 Object.defineProperty(this, 'mimeType', {
612 return _internal.mimeType;
614 set: function(value) {
615 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
620 Object.defineProperty(this, 'filePath', {
622 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
626 return _internal.filePath;
628 set: function(value) {
629 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
635 function Messaging() {}
638 * Gets the messaging service of a given type for a given account.
639 * @param {!MessageServiceTag} messageServiceType Type of the services to be retrieved.
640 * @param {!MessageServiceArraySuccessCallback} successCallback Callback function that
641 * is called when the services are successfully retrieved.
642 * @param {ErrorCallback} errorCallback Callback function that is called when
645 Messaging.prototype.getMessageServices = function() {
646 var args = validator_.validateArgs(arguments, [
647 { name: 'messageServiceType', type: types_.ENUM, values: MessageServiceTag },
648 { name: 'successCallback', type: types_.FUNCTION },
649 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
652 var callArgs = { messageServiceType: args.messageServiceType };
653 var callback = function(result) {
654 if (native.isFailure(result)) {
655 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
657 var data = native.getResultObject(result);
658 var servicesArr = [];
659 data.forEach(function(e) {
660 servicesArr.push(new MessageService(e));
662 args.successCallback(servicesArr);
665 var result = native.call('GetMessageServices', callArgs, callback);
666 if (native.isFailure(result)) {
667 throw native.getErrorObject(result);
671 function MessageStorage() {}
672 function MessageService(data) {
673 propertyFactory_(this, 'id', data.id, Property.E);
674 propertyFactory_(this, 'type', data.type, Property.E);
675 propertyFactory_(this, 'name', data.name, Property.E);
676 propertyFactory_(this, 'messageStorage', new MessageStorage(this), Property.E);
679 MessageService.prototype.sendMessage = function() {
680 var args = validator_.validateArgs(arguments, [
681 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
683 name: 'successCallback',
684 type: types_.FUNCTION,
688 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
689 { name: 'simIndex', type: types_.LONG, optional: true, nullable: true }
692 if (args.message.type != this.type) {
693 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
699 message: args.message,
700 simIndex: args.simIndex || 1,
703 var callback = function(result) {
704 if (native.isFailure(result)) {
705 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
707 var data = native.getResultObject(result);
708 var message = data.message;
710 var body = message.body;
712 updateInternal_(args.message.body, body);
715 updateInternal_(args.message, message);
717 native.callIfPossible(args.successCallback, data.recipients);
720 var result = native.call('MessageServiceSendMessage', callArgs, callback);
721 if (native.isFailure(result)) {
722 throw native.getErrorObject(result);
726 MessageService.prototype.loadMessageBody = function() {
727 var args = validator_.validateArgs(arguments, [
728 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
729 { name: 'successCallback', type: types_.FUNCTION },
730 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
733 if (args.message.type != this.type) {
734 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
740 message: args.message,
744 var callback = function(result) {
745 if (native.isFailure(result)) {
746 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
748 var data = native.getResultObject(result);
749 var body = data.messageBody;
751 updateInternal_(args.message.body, body);
754 args.successCallback(args.message);
758 var result = native.call('MessageServiceLoadMessageBody', callArgs, callback);
760 if (native.isFailure(result)) {
761 throw native.getErrorObject(result);
764 MessageService.prototype.loadMessageAttachment = function() {
765 var args = validator_.validateArgs(arguments, [
766 { name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment },
767 { name: 'successCallback', type: types_.FUNCTION },
768 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
772 var firstCall = false;
773 if (!messageAttachmentsLoaded[args.attachment.id]) {
775 messageAttachmentsLoaded[args.attachment.id] = true;
779 attachment: args.attachment,
783 var callback = function(result) {
784 if (native.isFailure(result)) {
785 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
787 var data = native.getResultObject(result);
788 var messageAttachment = data.messageAttachment;
789 if (messageAttachment) {
790 updateInternal_(args.attachment, messageAttachment);
793 args.successCallback(args.attachment);
797 var result = native.call('MessageServiceLoadMessageAttachment', callArgs, callback);
799 if (native.isFailure(result)) {
800 throw native.getErrorObject(result);
804 MessageService.prototype.sync = function() {
805 var args = validator_.validateArgs(arguments, [
807 name: 'successCallback',
808 type: types_.FUNCTION,
812 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
813 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
820 limit: args.limit || null
823 var callback = function(result) {
824 if (native.isFailure(result)) {
825 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
827 native.callIfPossible(args.successCallback);
831 var result = native.call('MessageServiceSync', callArgs, callback);
833 if (native.isFailure(result)) {
834 throw native.getErrorObject(result);
837 return native.getResultObject(result);
840 MessageService.prototype.syncFolder = function() {
841 var args = validator_.validateArgs(arguments, [
842 { name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder },
844 name: 'successCallback',
845 type: types_.FUNCTION,
849 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
850 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
858 limit: args.limit || null
861 var callback = function(result) {
862 if (native.isFailure(result)) {
863 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
865 native.callIfPossible(args.successCallback);
869 var result = native.call('MessageServiceSyncFolder', callArgs, callback);
871 if (native.isFailure(result)) {
872 throw native.getErrorObject(result);
875 return native.getResultObject(result);
878 MessageService.prototype.stopSync = function() {
879 var args = validator_.validateArgs(arguments, [{ name: 'opId', type: types_.LONG }]);
886 var result = native.callSync('MessageServiceStopSync', callArgs);
887 if (native.isFailure(result)) {
888 throw native.getErrorObject(result);
892 function MessageStorage(service) {
893 propertyFactory_(this, 'service', service);
896 MessageStorage.prototype.addDraftMessage = function() {
897 var args = validator_.validateArgs(arguments, [
898 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
900 name: 'successCallback',
901 type: types_.FUNCTION,
905 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
908 if (args.message.type != this.service.type) {
909 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
915 message: args.message,
916 serviceId: self.service.id
918 var callback = function(result) {
919 if (native.isFailure(result)) {
920 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
922 var data = native.getResultObject(result);
923 var message = data.message;
925 var body = message.body;
927 updateInternal_(args.message.body, body);
930 var attachments = message.attachments;
932 for (var i = 0; i < attachments.length; i++) {
933 messageAttachmentsLoaded[attachments[i].id] = true;
936 updateInternal_(args.message, message);
938 native.callIfPossible(args.successCallback, data.recipients);
941 var result = native.call('MessageStorageAddDraftMessage', callArgs, callback);
942 if (native.isFailure(result)) {
943 throw native.getErrorObject(result);
947 MessageStorage.prototype.findMessages = function() {
948 var args = validator_.validateArgs(arguments, [
951 type: types_.PLATFORM_OBJECT,
953 tizen.AttributeFilter,
954 tizen.AttributeRangeFilter,
955 tizen.CompositeFilter
958 { name: 'successCallback', type: types_.FUNCTION },
959 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
962 type: types_.PLATFORM_OBJECT,
963 values: tizen.SortMode,
967 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
968 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
974 filter: addTypeToFilter_(args.filter) || null,
975 sort: args.sort || null,
976 limit: args.limit || null,
977 offset: args.offset || null,
978 serviceId: self.service.id,
979 type: self.service.type
981 var callback = function(result) {
982 if (native.isFailure(result)) {
983 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
985 var data = native.getResultObject(result);
987 data.forEach(function(el) {
988 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
990 native.callIfPossible(args.successCallback, messages);
993 var result = native.call('MessageStorageFindMessages', callArgs, callback);
994 if (native.isFailure(result)) {
995 throw native.getErrorObject(result);
999 MessageStorage.prototype.removeMessages = function() {
1000 var args = validator_.validateArgs(arguments, [
1001 { name: 'messages', type: types_.ARRAY, values: Message },
1003 name: 'successCallback',
1004 type: types_.FUNCTION,
1008 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1013 args.messages.forEach(function(msg) {
1014 if (msg.type != self.service.type) {
1015 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1020 messages: args.messages,
1021 serviceId: self.service.id,
1022 type: self.service.type
1024 var callback = function(result) {
1025 if (native.isFailure(result)) {
1026 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1028 native.callIfPossible(args.successCallback);
1031 var result = native.call('MessageStorageRemoveMessages', callArgs, callback);
1032 if (native.isFailure(result)) {
1033 throw native.getErrorObject(result);
1037 MessageStorage.prototype.updateMessages = function() {
1038 var args = validator_.validateArgs(arguments, [
1039 { name: 'messages', type: types_.ARRAY, values: Message },
1041 name: 'successCallback',
1042 type: types_.FUNCTION,
1046 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1051 args.messages.forEach(function(msg) {
1052 if (msg.type != self.service.type) {
1053 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1058 messages: args.messages,
1059 serviceId: self.service.id
1061 var callback = function(result) {
1062 if (native.isFailure(result)) {
1063 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1065 var data = native.getResultObject(result);
1067 i = args.messages.length,
1070 m = args.messages[i];
1072 originals[m.id] = m;
1079 if (originals[m.oldId]) {
1082 updateInternal_(originals[m.oldId].body, body);
1085 updateInternal_(originals[m.oldId], m);
1089 native.callIfPossible(args.successCallback);
1092 var result = native.call('MessageStorageUpdateMessages', callArgs, callback);
1093 if (native.isFailure(result)) {
1094 throw native.getErrorObject(result);
1098 MessageStorage.prototype.findConversations = function() {
1099 var args = validator_.validateArgs(arguments, [
1102 type: types_.PLATFORM_OBJECT,
1104 tizen.AttributeFilter,
1105 tizen.AttributeRangeFilter,
1106 tizen.CompositeFilter
1109 { name: 'successCallback', type: types_.FUNCTION },
1110 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
1113 type: types_.PLATFORM_OBJECT,
1114 values: tizen.SortMode,
1118 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
1119 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
1125 filter: addTypeToFilter_(args.filter),
1126 sort: args.sort || null,
1127 limit: args.limit || null,
1128 offset: args.offset || null,
1129 serviceId: self.service.id
1131 var callback = function(result) {
1132 if (native.isFailure(result)) {
1133 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1135 var data = native.getResultObject(result);
1136 var conversations = [];
1137 data.forEach(function(el) {
1138 conversations.push(new MessageConversation(el));
1140 args.successCallback(conversations);
1143 var result = native.call('MessageStorageFindConversations', callArgs, callback);
1144 if (native.isFailure(result)) {
1145 throw native.getErrorObject(result);
1149 MessageStorage.prototype.removeConversations = function() {
1150 var args = validator_.validateArgs(arguments, [
1151 { name: 'conversations', type: types_.ARRAY },
1153 name: 'successCallback',
1154 type: types_.FUNCTION,
1158 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1161 args.conversations.forEach(function(el) {
1162 if (!el || el.constructor !== MessageConversation) {
1163 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1170 conversations: args.conversations,
1171 serviceId: self.service.id,
1172 type: self.service.type
1174 var callback = function(result) {
1175 if (native.isFailure(result)) {
1176 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1178 native.callIfPossible(args.successCallback);
1181 var result = native.call('MessageStorageRemoveConversations', callArgs, callback);
1182 if (native.isFailure(result)) {
1183 throw native.getErrorObject(result);
1187 MessageStorage.prototype.findFolders = function() {
1188 var args = validator_.validateArgs(arguments, [
1191 type: types_.PLATFORM_OBJECT,
1193 tizen.AttributeFilter,
1194 tizen.AttributeRangeFilter,
1195 tizen.CompositeFilter
1198 { name: 'successCallback', type: types_.FUNCTION },
1199 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1205 filter: addTypeToFilter_(args.filter),
1206 sort: args.sort || null,
1207 limit: args.limit || null,
1208 offset: args.offset || null,
1209 serviceId: self.service.id
1211 var callback = function(result) {
1212 if (native.isFailure(result)) {
1213 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1215 var data = native.getResultObject(result);
1217 data.forEach(function(el) {
1218 folders.push(new MessageFolder(el));
1220 args.successCallback(folders);
1223 var result = native.call('MessageStorageFindFolders', callArgs, callback);
1224 if (native.isFailure(result)) {
1225 throw native.getErrorObject(result);
1229 function pushMessage(messages, el) {
1230 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1233 function pushConversation(conversations, el) {
1234 conversations.push(new MessageConversation(el));
1237 function pushFolder(folders, el) {
1238 folders.push(new MessageFolder(el));
1241 function getListenerFunction(listenerMap, pushMethod) {
1242 return function(msg) {
1243 var action = msg.action;
1244 var data = native.getResultObject(msg);
1246 data.forEach(function(el) {
1247 pushMethod(messages, el);
1250 for (var key in listenerMap) {
1251 if (listenerMap.hasOwnProperty(key)) {
1252 native.callIfPossible(listenerMap[key][action], messages);
1258 var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener';
1259 var MessagesChangeListeners = {};
1261 MESSAGES_CHANGE_LISTENER,
1262 getListenerFunction(MessagesChangeListeners, pushMessage)
1265 var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener';
1266 var ConversationsChangeListeners = {};
1268 CONVERSATIONS_CHANGE_LISTENER,
1269 getListenerFunction(ConversationsChangeListeners, pushConversation)
1272 var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener';
1273 var FoldersChangeListeners = {};
1275 FOLDERS_CHANGE_LISTENER,
1276 getListenerFunction(FoldersChangeListeners, pushFolder)
1279 MessageStorage.prototype.addMessagesChangeListener = function() {
1280 var args = validator_.validateArgs(arguments, [
1282 name: 'messagesChangeCallback',
1283 type: types_.LISTENER,
1284 values: ['messagesadded', 'messagesupdated', 'messagesremoved']
1288 type: types_.PLATFORM_OBJECT,
1290 tizen.AttributeFilter,
1291 tizen.AttributeRangeFilter,
1292 tizen.CompositeFilter
1302 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1303 serviceId: self.service.id
1305 var result = native.callSync('MessageStorageAddMessagesChangeListener', callArgs);
1306 if (native.isFailure(result)) {
1307 throw native.getErrorObject(result);
1309 var opId = native.getResultObject(result);
1310 MessagesChangeListeners[opId] = args.messagesChangeCallback;
1315 MessageStorage.prototype.addConversationsChangeListener = function() {
1316 var args = validator_.validateArgs(arguments, [
1318 name: 'conversationsChangeCallback',
1319 type: types_.LISTENER,
1320 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']
1324 type: types_.PLATFORM_OBJECT,
1326 tizen.AttributeFilter,
1327 tizen.AttributeRangeFilter,
1328 tizen.CompositeFilter
1338 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1339 serviceId: self.service.id
1341 var result = native.callSync(
1342 'MessageStorageAddConversationsChangeListener',
1345 if (native.isFailure(result)) {
1346 throw native.getErrorObject(result);
1348 var opId = native.getResultObject(result);
1349 ConversationsChangeListeners[opId] = args.conversationsChangeCallback;
1354 MessageStorage.prototype.addFoldersChangeListener = function() {
1355 var args = validator_.validateArgs(arguments, [
1357 name: 'foldersChangeCallback',
1358 type: types_.LISTENER,
1359 values: ['foldersadded', 'foldersupdated', 'foldersremoved']
1363 type: types_.PLATFORM_OBJECT,
1365 tizen.AttributeFilter,
1366 tizen.AttributeRangeFilter,
1367 tizen.CompositeFilter
1377 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1378 serviceId: self.service.id
1380 var result = native.callSync('MessageStorageAddFolderChangeListener', callArgs);
1381 if (native.isFailure(result)) {
1382 throw native.getErrorObject(result);
1384 var opId = native.getResultObject(result);
1385 FoldersChangeListeners[opId] = args.foldersChangeCallback;
1390 MessageStorage.prototype.removeChangeListener = function() {
1391 var args = validator_.validateArgs(arguments, [
1392 { name: 'watchId', type: types_.LONG }
1398 watchId: args.watchId,
1399 serviceId: self.service.id
1401 var result = native.callSync('MessageStorageRemoveChangeListener', callArgs);
1402 if (native.isFailure(result)) {
1403 throw native.getErrorObject(result);
1405 if (MessagesChangeListeners.hasOwnProperty(args.watchId)) {
1406 delete MessagesChangeListeners[args.watchId];
1407 } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) {
1408 delete ConversationsChangeListeners[args.watchId];
1409 } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) {
1410 delete FoldersChangeListeners[args.watchId];
1415 function MessageConversation(data) {
1416 propertyFactory_(this, 'id', data.id || null, Property.E);
1417 propertyFactory_(this, 'type', data.type || '', Property.E);
1421 data.timestamp ? new Date(data.timestamp * 1000) : null,
1424 propertyFactory_(this, 'messageCount', data.messageCount || 0, Property.E);
1425 propertyFactory_(this, 'unreadMessages', data.unreadMessages || 0, Property.E);
1426 propertyFactory_(this, 'preview', data.preview || '', Property.E);
1427 propertyFactory_(this, 'subject', data.subject || '', Property.E);
1428 propertyFactory_(this, 'isRead', data.isRead || false, Property.E);
1429 propertyFactory_(this, 'from', data.from || null, Property.E);
1430 propertyFactory_(this, 'to', data.to || [], Property.E);
1431 propertyFactory_(this, 'cc', data.cc || [], Property.E);
1432 propertyFactory_(this, 'bcc', data.bcc || [], Property.E);
1433 propertyFactory_(this, 'lastMessageId', data.lastMessageId || null, Property.E);
1436 function MessageFolder(data) {
1438 id: data.id || null,
1439 parentId: data.parentId || null,
1440 serviceId: data.serviceId || '',
1441 contentType: data.contentType || '',
1442 name: data.name || '',
1443 path: data.path || '',
1444 type: data.type || '',
1445 synchronizable: data.synchronizable || false
1448 Object.defineProperty(this, 'id', {
1450 return _internal.id;
1455 Object.defineProperty(this, 'parentId', {
1457 return _internal.parentId;
1462 Object.defineProperty(this, 'serviceId', {
1464 return _internal.serviceId;
1469 Object.defineProperty(this, 'contentType', {
1471 return _internal.contentType;
1476 Object.defineProperty(this, 'name', {
1478 return _internal.name;
1480 set: function(value) {
1481 if (value) _internal.name = value;
1486 Object.defineProperty(this, 'path', {
1488 return _internal.path;
1493 Object.defineProperty(this, 'type', {
1495 return _internal.type;
1500 Object.defineProperty(this, 'synchronizable', {
1502 return _internal.synchronizable;
1504 set: function(value) {
1505 _internal.synchronizable = Boolean(value);
1511 tizen.Message = Message;
1513 tizen.MessageAttachment = MessageAttachment;
1515 exports = new Messaging();