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;
29 function addTypeToFilter_(data) {
32 for (var field in data) {
33 filter[field] = data[field];
36 if (data instanceof tizen.AttributeFilter) {
37 filter.filterType = 'AttributeFilter';
38 filter.matchValue = filter.matchValue;
39 } else if (data instanceof tizen.AttributeRangeFilter) {
40 filter.filterType = 'AttributeRangeFilter';
41 } else if (data instanceof tizen.CompositeFilter) {
42 filter.filterType = 'CompositeFilter';
43 // recursively convert all sub-filters
45 for (var i = 0; i < data.filters.length; ++i) {
46 filter.filters[i] = addTypeToFilter_(data.filters[i]);
49 filter.filterType = 'Unknown';
55 function propertyFactory_(that, name, value, flags, options) {
57 if (options === null || typeof options !== 'object') {
60 if (!options.get && !options.set) {
61 options.value = value;
63 if ((flags & Property.WRITEABLE) != 0) {
64 options.writable = true;
66 if ((flags & Property.ENUMERABLE) != 0) {
67 options.enumerable = true;
69 if ((flags & Property.CONFIGURABLE) != 0) {
70 options.configurable = true;
72 Object.defineProperty(that, name, options);
75 function InternalValues_(data) {
76 if (!(this instanceof InternalValues_)) {
77 return new InternalValues_(data);
79 for (var key in data) {
80 if (data.hasOwnProperty(key)) {
81 this[key] = data[key];
86 function updateInternal_(internal, data) {
87 var values = new InternalValues_(data);
88 for (var key in data) {
89 if (values.hasOwnProperty(key) && internal.hasOwnProperty(key)) {
90 internal[key] = values;
95 var MessageServiceTag = {
98 EMAIL: "messaging.email"
101 function Message(type, data) {
102 validator_.isConstructorCall(this, Message);
104 if (Object.values(MessageServiceTag).indexOf(type) == -1) {
105 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
108 if (!data || typeof data !== 'object') {
112 var internal = data instanceof MessageInit_,
113 id = internal ? data.id : null,
114 conversationId = internal ? data.conversationId : null,
115 folderId = internal ? data.folderId : null,
116 timestamp = internal ? data.timestamp : null,
117 from = internal ? data.from : null,
118 hasAttachment = internal ? data.hasAttachment : false,
119 isRead = internal ? data.isRead : false,
120 inResponseTo = internal ? data.inResponseTo : null;
122 var body = new MessageBody({
124 plainBody: data.plainBody,
125 htmlBody: data.htmlBody
129 if (!(to instanceof Array)) {
134 if (!(cc instanceof Array)) {
139 if (!(bcc instanceof Array)) {
143 var attachments = (internal ? data.attachments : []) || [];
147 conversationId: conversationId || null,
148 folderId: folderId || null,
150 timestamp: timestamp || null,
156 isRead: isRead || false,
157 hasAttachment: hasAttachment || false,
158 isHighPriority: data.isHighPriority || false,
159 subject: data.subject || '',
160 inResponseTo: inResponseTo || null,
161 attachments: attachments
164 Object.defineProperty(this, 'id', {
168 set: function(value) {
169 if (value instanceof InternalValues_) _internal.id = value.id;
174 Object.defineProperty(this, 'conversationId', {
176 return _internal.conversationId;
178 set: function(value) {
179 if (value instanceof InternalValues_)
180 _internal.conversationId = value.conversationId;
185 Object.defineProperty(this, 'folderId', {
187 return _internal.folderId;
189 set: function(value) {
190 if (value instanceof InternalValues_) _internal.folderId = value.folderId;
195 Object.defineProperty(this, 'type', {
197 return _internal.type;
199 set: function(value) {
205 Object.defineProperty(this, 'timestamp', {
207 return _internal.timestamp
208 ? new Date(_internal.timestamp * 1000)
209 : _internal.timestamp;
211 set: function(value) {
212 if (value instanceof InternalValues_) {
213 _internal.timestamp = value.timestamp;
219 Object.defineProperty(this, 'from', {
221 return _internal.from;
223 set: function(value) {
224 if (value instanceof InternalValues_) _internal.from = value.from;
229 Object.defineProperty(this, 'to', {
233 set: function(value) {
234 if (value instanceof InternalValues_) value = value.to;
235 if (value instanceof Array) _internal.to = value;
240 Object.defineProperty(this, 'cc', {
244 set: function(value) {
245 if (value instanceof InternalValues_) value = value.cc;
246 if (value instanceof Array) _internal.cc = value;
251 Object.defineProperty(this, 'bcc', {
253 return _internal.bcc;
255 set: function(value) {
256 if (value instanceof InternalValues_) value = value.bcc;
257 if (value instanceof Array) _internal.bcc = value;
262 Object.defineProperty(this, 'body', {
264 return _internal.body;
266 set: function(value) {
267 if (value instanceof InternalValues_)
268 _internal.body = new MessageBody(value.body);
269 if (value instanceof MessageBody) _internal.body = value;
274 Object.defineProperty(this, 'isRead', {
276 return _internal.isRead;
278 set: function(value) {
279 if (value instanceof InternalValues_) {
280 value = value.isRead;
282 _internal.isRead = !!value;
287 Object.defineProperty(this, 'hasAttachment', {
289 return _internal.attachments.length > 0;
291 set: function(value) {
292 if (value instanceof InternalValues_)
293 _internal.hasAttachment = value.hasAttachment;
298 Object.defineProperty(this, 'isHighPriority', {
300 return _internal.isHighPriority;
302 set: function(value) {
303 if (value instanceof InternalValues_) value = value.isHighPriority;
304 _internal.isHighPriority = !!value;
309 Object.defineProperty(this, 'subject', {
311 return _internal.subject;
313 set: function(value) {
314 if (value instanceof InternalValues_) value = value.subject;
315 _internal.subject = String(value);
320 Object.defineProperty(this, 'inResponseTo', {
322 return _internal.inResponseTo;
324 set: function(value) {
325 if (value instanceof InternalValues_)
326 _internal.inResponseTo = value.inResponseTo;
331 Object.defineProperty(this, 'messageStatus', {
338 var result = native.callSync('MessageGetMessageStatus', callArgs);
339 if (native.isSuccess(result)) {
340 return native.getResultObject(result);
345 set: function(value) {
351 Object.defineProperty(this, 'attachments', {
353 return _internal.attachments;
355 set: function(value) {
356 if (value instanceof InternalValues_) {
357 value = value.attachments;
358 for (var k = 0; k < value.length; ++k) {
359 if (!(value[k] instanceof tizen.MessageAttachment)) {
360 if (_internal.attachments[k]) {
361 updateInternal_(_internal.attachments[k], value[k]);
363 _internal.attachments[k] = new MessageAttachment(
364 new InternalValues_(value[k])
368 _internal.attachments[k] = value[k];
371 // if new array is shorter than the old one, remove excess elements
372 if (value.length < _internal.length) {
373 _internal.splice(value.length, _internal.length - value.length);
375 } else if (T_.isArray(value)) {
376 for (var k = 0; k < value.length; ++k) {
377 if (!(value[k] instanceof tizen.MessageAttachment)) {
381 _internal.attachments = value;
388 function MessageInit_(data) {
389 if (!(this instanceof MessageInit_)) {
390 return new MessageInit_(data);
392 if (!data || typeof data !== 'object') {
395 this.id = data.id || null;
396 this.conversationId = data.conversationId || null;
397 this.folderId = data.folderId || null;
398 this.timestamp = data.timestamp || null;
399 this.from = data.from || '';
400 this.to = data.to || [];
401 this.cc = data.cc || [];
402 this.bcc = data.bcc || [];
403 this.isRead = data.isRead || false;
404 this.hasAttachment = data.hasAttachment || null;
405 this.isHighPriority = data.isHighPriority || false;
406 this.subject = data.subject || '';
407 this.inResponseTo = data.inResponseTo || null;
408 this.attachments = [];
409 this.plainBody = data.body ? data.body.plainBody : '';
410 this.htmlBody = data.body ? data.body.htmlBody : '';
413 if (data.attachments && data.attachments.constructor === Array) {
414 data.attachments.forEach(function(el) {
417 if (el.constructor === MessageAttachment) {
418 self.attachments.push(el);
420 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
426 function MessageBody(data) {
427 if (!this instanceof MessageBody) {
428 return new MessageBody(data);
430 if (data === null || typeof data !== 'object') {
435 messageId: data.messageId || null,
436 loaded: data.loaded || false,
437 plainBody: data.plainBody || '',
438 htmlBody: data.htmlBody || '',
439 inlineAttachments: data.inlineAttachments || []
442 Object.defineProperty(this, 'messageId', {
444 return _internal.messageId;
446 set: function(value) {
447 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
452 Object.defineProperty(this, 'loaded', {
454 return _internal.loaded;
456 set: function(value) {
457 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
462 Object.defineProperty(this, 'plainBody', {
464 return _internal.plainBody;
466 set: function(value) {
467 if (value instanceof InternalValues_) {
468 _internal.plainBody = String(value.plainBody);
470 _internal.plainBody = String(value);
476 Object.defineProperty(this, 'htmlBody', {
478 return _internal.htmlBody;
480 set: function(value) {
481 if (value instanceof InternalValues_) {
482 _internal.htmlBody = String(value.htmlBody);
484 _internal.htmlBody = String(value);
490 Object.defineProperty(this, 'inlineAttachments', {
492 return _internal.inlineAttachments;
494 set: function(value) {
495 if (value instanceof InternalValues_) {
496 _internal.inlineAttachments = value.inlineAttachments;
497 } else if (T_.isArray(value)) {
498 _internal.inlineAttachments = value;
505 var messageAttachmentsLoaded = {};
507 function MessageAttachment(first, second) {
508 validator_.isConstructorCall(this, MessageAttachment);
509 if (!this instanceof MessageAttachment) {
510 return new MessageAttachment(data);
513 var internalConstructor = first instanceof InternalValues_;
515 messageId: internalConstructor ? first.messageId : null,
516 id: internalConstructor ? first.id : null,
517 mimeType: internalConstructor
519 : undefined == second
522 filePath: internalConstructor ? first.filePath : first
525 Object.defineProperty(this, 'messageId', {
527 return _internal.messageId;
529 set: function(value) {
530 if (value instanceof InternalValues_) _internal.messageId = value.messageId;
535 Object.defineProperty(this, 'id', {
539 set: function(value) {
540 if (value instanceof InternalValues_) _internal.id = value.id;
545 Object.defineProperty(this, 'mimeType', {
547 return _internal.mimeType;
549 set: function(value) {
550 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
555 Object.defineProperty(this, 'filePath', {
557 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
561 return _internal.filePath;
563 set: function(value) {
564 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
570 function Messaging() {}
572 Messaging.prototype.getMessageServices = function() {
573 var args = validator_.validateArgs(arguments, [
574 { name: 'messageServiceType', type: types_.ENUM, values: Object.values(MessageServiceTag) },
575 { name: 'successCallback', type: types_.FUNCTION },
576 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
579 var callArgs = { messageServiceType: args.messageServiceType };
580 var callback = function(result) {
581 if (native.isFailure(result)) {
582 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
584 var data = native.getResultObject(result);
585 var servicesArr = [];
586 data.forEach(function(e) {
587 servicesArr.push(new MessageService(e));
589 args.successCallback(servicesArr);
592 var result = native.call('GetMessageServices', callArgs, callback);
593 if (native.isFailure(result)) {
594 throw native.getErrorObject(result);
598 function MessageStorage() {}
599 function MessageService(data) {
600 propertyFactory_(this, 'id', data.id, Property.ENUMERABLE);
601 propertyFactory_(this, 'type', data.type, Property.ENUMERABLE);
602 propertyFactory_(this, 'name', data.name, Property.ENUMERABLE);
603 propertyFactory_(this, 'messageStorage', new MessageStorage(this), Property.ENUMERABLE);
606 MessageService.prototype.sendMessage = function() {
607 var args = validator_.validateArgs(arguments, [
608 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
610 name: 'successCallback',
611 type: types_.FUNCTION,
615 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
616 { name: 'simIndex', type: types_.LONG, optional: true, nullable: true }
619 if (args.message.type != this.type) {
620 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
626 message: args.message,
627 simIndex: args.simIndex || 1,
630 var callback = function(result) {
631 if (native.isFailure(result)) {
632 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
634 var data = native.getResultObject(result);
635 var message = data.message;
637 var body = message.body;
639 updateInternal_(args.message.body, body);
642 updateInternal_(args.message, message);
644 native.callIfPossible(args.successCallback, data.recipients);
647 var result = native.call('MessageServiceSendMessage', callArgs, callback);
648 if (native.isFailure(result)) {
649 throw native.getErrorObject(result);
653 MessageService.prototype.loadMessageBody = function() {
654 var args = validator_.validateArgs(arguments, [
655 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
656 { name: 'successCallback', type: types_.FUNCTION },
657 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
660 if (args.message.type != this.type) {
661 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
667 message: args.message,
671 var callback = function(result) {
672 if (native.isFailure(result)) {
673 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
675 var data = native.getResultObject(result);
676 var body = data.messageBody;
678 updateInternal_(args.message.body, body);
681 args.successCallback(args.message);
685 var result = native.call('MessageServiceLoadMessageBody', callArgs, callback);
687 if (native.isFailure(result)) {
688 throw native.getErrorObject(result);
691 MessageService.prototype.loadMessageAttachment = function() {
692 var args = validator_.validateArgs(arguments, [
693 { name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment },
694 { name: 'successCallback', type: types_.FUNCTION },
695 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
699 var firstCall = false;
700 if (!messageAttachmentsLoaded[args.attachment.id]) {
702 messageAttachmentsLoaded[args.attachment.id] = true;
706 attachment: args.attachment,
710 var callback = function(result) {
711 if (native.isFailure(result)) {
712 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
714 var data = native.getResultObject(result);
715 var messageAttachment = data.messageAttachment;
716 if (messageAttachment) {
717 updateInternal_(args.attachment, messageAttachment);
720 args.successCallback(args.attachment);
724 var result = native.call('MessageServiceLoadMessageAttachment', callArgs, callback);
726 if (native.isFailure(result)) {
727 throw native.getErrorObject(result);
731 MessageService.prototype.sync = function() {
732 var args = validator_.validateArgs(arguments, [
734 name: 'successCallback',
735 type: types_.FUNCTION,
739 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
740 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
747 limit: args.limit || null
750 var callback = function(result) {
751 if (native.isFailure(result)) {
752 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
754 native.callIfPossible(args.successCallback);
758 var result = native.call('MessageServiceSync', callArgs, callback);
760 if (native.isFailure(result)) {
761 throw native.getErrorObject(result);
764 return native.getResultObject(result);
767 MessageService.prototype.syncFolder = function() {
768 var args = validator_.validateArgs(arguments, [
769 { name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder },
771 name: 'successCallback',
772 type: types_.FUNCTION,
776 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
777 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
785 limit: args.limit || null
788 var callback = function(result) {
789 if (native.isFailure(result)) {
790 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
792 native.callIfPossible(args.successCallback);
796 var result = native.call('MessageServiceSyncFolder', callArgs, callback);
798 if (native.isFailure(result)) {
799 throw native.getErrorObject(result);
802 return native.getResultObject(result);
805 MessageService.prototype.stopSync = function() {
806 var args = validator_.validateArgs(arguments, [{ name: 'opId', type: types_.LONG }]);
813 var result = native.callSync('MessageServiceStopSync', callArgs);
814 if (native.isFailure(result)) {
815 throw native.getErrorObject(result);
819 function MessageStorage(service) {
820 propertyFactory_(this, 'service', service);
823 MessageStorage.prototype.addDraftMessage = function() {
824 var args = validator_.validateArgs(arguments, [
825 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
827 name: 'successCallback',
828 type: types_.FUNCTION,
832 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
835 if (args.message.type != this.service.type) {
836 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
842 message: args.message,
843 serviceId: self.service.id
845 var callback = function(result) {
846 if (native.isFailure(result)) {
847 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
849 var data = native.getResultObject(result);
850 var message = data.message;
852 var body = message.body;
854 updateInternal_(args.message.body, body);
857 var attachments = message.attachments;
859 for (var i = 0; i < attachments.length; i++) {
860 messageAttachmentsLoaded[attachments[i].id] = true;
863 updateInternal_(args.message, message);
865 native.callIfPossible(args.successCallback, data.recipients);
868 var result = native.call('MessageStorageAddDraftMessage', callArgs, callback);
869 if (native.isFailure(result)) {
870 throw native.getErrorObject(result);
874 MessageStorage.prototype.findMessages = function() {
875 var args = validator_.validateArgs(arguments, [
878 type: types_.PLATFORM_OBJECT,
880 tizen.AttributeFilter,
881 tizen.AttributeRangeFilter,
882 tizen.CompositeFilter
885 { name: 'successCallback', type: types_.FUNCTION },
886 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
889 type: types_.PLATFORM_OBJECT,
890 values: tizen.SortMode,
894 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
895 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
901 filter: addTypeToFilter_(args.filter) || null,
902 sort: args.sort || null,
903 limit: args.limit || null,
904 offset: args.offset || null,
905 serviceId: self.service.id,
906 type: self.service.type
908 var callback = function(result) {
909 if (native.isFailure(result)) {
910 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
912 var data = native.getResultObject(result);
914 data.forEach(function(el) {
915 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
917 native.callIfPossible(args.successCallback, messages);
920 var result = native.call('MessageStorageFindMessages', callArgs, callback);
921 if (native.isFailure(result)) {
922 throw native.getErrorObject(result);
926 MessageStorage.prototype.removeMessages = function() {
927 var args = validator_.validateArgs(arguments, [
928 { name: 'messages', type: types_.ARRAY, values: Message },
930 name: 'successCallback',
931 type: types_.FUNCTION,
935 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
940 args.messages.forEach(function(msg) {
941 if (msg.type != self.service.type) {
942 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
947 messages: args.messages,
948 serviceId: self.service.id,
949 type: self.service.type
951 var callback = function(result) {
952 if (native.isFailure(result)) {
953 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
955 native.callIfPossible(args.successCallback);
958 var result = native.call('MessageStorageRemoveMessages', callArgs, callback);
959 if (native.isFailure(result)) {
960 throw native.getErrorObject(result);
964 MessageStorage.prototype.updateMessages = function() {
965 var args = validator_.validateArgs(arguments, [
966 { name: 'messages', type: types_.ARRAY, values: Message },
968 name: 'successCallback',
969 type: types_.FUNCTION,
973 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
978 args.messages.forEach(function(msg) {
979 if (msg.type != self.service.type) {
980 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
985 messages: args.messages,
986 serviceId: self.service.id
988 var callback = function(result) {
989 if (native.isFailure(result)) {
990 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
992 var data = native.getResultObject(result);
994 i = args.messages.length,
997 m = args.messages[i];
1006 if (originals[m.oldId]) {
1009 updateInternal_(originals[m.oldId].body, body);
1012 updateInternal_(originals[m.oldId], m);
1016 native.callIfPossible(args.successCallback);
1019 var result = native.call('MessageStorageUpdateMessages', callArgs, callback);
1020 if (native.isFailure(result)) {
1021 throw native.getErrorObject(result);
1025 MessageStorage.prototype.findConversations = function() {
1026 var args = validator_.validateArgs(arguments, [
1029 type: types_.PLATFORM_OBJECT,
1031 tizen.AttributeFilter,
1032 tizen.AttributeRangeFilter,
1033 tizen.CompositeFilter
1036 { name: 'successCallback', type: types_.FUNCTION },
1037 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
1040 type: types_.PLATFORM_OBJECT,
1041 values: tizen.SortMode,
1045 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
1046 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
1052 filter: addTypeToFilter_(args.filter),
1053 sort: args.sort || null,
1054 limit: args.limit || null,
1055 offset: args.offset || null,
1056 serviceId: self.service.id
1058 var callback = function(result) {
1059 if (native.isFailure(result)) {
1060 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1062 var data = native.getResultObject(result);
1063 var conversations = [];
1064 data.forEach(function(el) {
1065 conversations.push(new MessageConversation(el));
1067 args.successCallback(conversations);
1070 var result = native.call('MessageStorageFindConversations', callArgs, callback);
1071 if (native.isFailure(result)) {
1072 throw native.getErrorObject(result);
1076 MessageStorage.prototype.removeConversations = function() {
1077 var args = validator_.validateArgs(arguments, [
1078 { name: 'conversations', type: types_.ARRAY },
1080 name: 'successCallback',
1081 type: types_.FUNCTION,
1085 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1088 args.conversations.forEach(function(el) {
1089 if (!el || el.constructor !== MessageConversation) {
1090 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1097 conversations: args.conversations,
1098 serviceId: self.service.id,
1099 type: self.service.type
1101 var callback = function(result) {
1102 if (native.isFailure(result)) {
1103 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1105 native.callIfPossible(args.successCallback);
1108 var result = native.call('MessageStorageRemoveConversations', callArgs, callback);
1109 if (native.isFailure(result)) {
1110 throw native.getErrorObject(result);
1114 MessageStorage.prototype.findFolders = function() {
1115 var args = validator_.validateArgs(arguments, [
1118 type: types_.PLATFORM_OBJECT,
1120 tizen.AttributeFilter,
1121 tizen.AttributeRangeFilter,
1122 tizen.CompositeFilter
1125 { name: 'successCallback', type: types_.FUNCTION },
1126 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1132 filter: addTypeToFilter_(args.filter),
1133 sort: args.sort || null,
1134 limit: args.limit || null,
1135 offset: args.offset || null,
1136 serviceId: self.service.id
1138 var callback = function(result) {
1139 if (native.isFailure(result)) {
1140 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1142 var data = native.getResultObject(result);
1144 data.forEach(function(el) {
1145 folders.push(new MessageFolder(el));
1147 args.successCallback(folders);
1150 var result = native.call('MessageStorageFindFolders', callArgs, callback);
1151 if (native.isFailure(result)) {
1152 throw native.getErrorObject(result);
1156 function pushMessage(messages, el) {
1157 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1160 function pushConversation(conversations, el) {
1161 conversations.push(new MessageConversation(el));
1164 function pushFolder(folders, el) {
1165 folders.push(new MessageFolder(el));
1168 function getListenerFunction(listenerMap, pushMethod) {
1169 return function(msg) {
1170 var action = msg.action;
1171 var data = native.getResultObject(msg);
1173 data.forEach(function(el) {
1174 pushMethod(messages, el);
1177 for (var key in listenerMap) {
1178 if (listenerMap.hasOwnProperty(key)) {
1179 native.callIfPossible(listenerMap[key][action], messages);
1185 var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener';
1186 var MessagesChangeListeners = {};
1188 MESSAGES_CHANGE_LISTENER,
1189 getListenerFunction(MessagesChangeListeners, pushMessage)
1192 var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener';
1193 var ConversationsChangeListeners = {};
1195 CONVERSATIONS_CHANGE_LISTENER,
1196 getListenerFunction(ConversationsChangeListeners, pushConversation)
1199 var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener';
1200 var FoldersChangeListeners = {};
1202 FOLDERS_CHANGE_LISTENER,
1203 getListenerFunction(FoldersChangeListeners, pushFolder)
1206 MessageStorage.prototype.addMessagesChangeListener = function() {
1207 var args = validator_.validateArgs(arguments, [
1209 name: 'messagesChangeCallback',
1210 type: types_.LISTENER,
1211 values: ['messagesadded', 'messagesupdated', 'messagesremoved']
1215 type: types_.PLATFORM_OBJECT,
1217 tizen.AttributeFilter,
1218 tizen.AttributeRangeFilter,
1219 tizen.CompositeFilter
1229 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1230 serviceId: self.service.id
1232 var result = native.callSync('MessageStorageAddMessagesChangeListener', callArgs);
1233 if (native.isFailure(result)) {
1234 throw native.getErrorObject(result);
1236 var opId = native.getResultObject(result);
1237 MessagesChangeListeners[opId] = args.messagesChangeCallback;
1242 MessageStorage.prototype.addConversationsChangeListener = function() {
1243 var args = validator_.validateArgs(arguments, [
1245 name: 'conversationsChangeCallback',
1246 type: types_.LISTENER,
1247 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']
1251 type: types_.PLATFORM_OBJECT,
1253 tizen.AttributeFilter,
1254 tizen.AttributeRangeFilter,
1255 tizen.CompositeFilter
1265 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1266 serviceId: self.service.id
1268 var result = native.callSync(
1269 'MessageStorageAddConversationsChangeListener',
1272 if (native.isFailure(result)) {
1273 throw native.getErrorObject(result);
1275 var opId = native.getResultObject(result);
1276 ConversationsChangeListeners[opId] = args.conversationsChangeCallback;
1281 MessageStorage.prototype.addFoldersChangeListener = function() {
1282 var args = validator_.validateArgs(arguments, [
1284 name: 'foldersChangeCallback',
1285 type: types_.LISTENER,
1286 values: ['foldersadded', 'foldersupdated', 'foldersremoved']
1290 type: types_.PLATFORM_OBJECT,
1292 tizen.AttributeFilter,
1293 tizen.AttributeRangeFilter,
1294 tizen.CompositeFilter
1304 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1305 serviceId: self.service.id
1307 var result = native.callSync('MessageStorageAddFolderChangeListener', callArgs);
1308 if (native.isFailure(result)) {
1309 throw native.getErrorObject(result);
1311 var opId = native.getResultObject(result);
1312 FoldersChangeListeners[opId] = args.foldersChangeCallback;
1317 MessageStorage.prototype.removeChangeListener = function() {
1318 var args = validator_.validateArgs(arguments, [
1319 { name: 'watchId', type: types_.LONG }
1325 watchId: args.watchId,
1326 serviceId: self.service.id
1328 var result = native.callSync('MessageStorageRemoveChangeListener', callArgs);
1329 if (native.isFailure(result)) {
1330 throw native.getErrorObject(result);
1332 if (MessagesChangeListeners.hasOwnProperty(args.watchId)) {
1333 delete MessagesChangeListeners[args.watchId];
1334 } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) {
1335 delete ConversationsChangeListeners[args.watchId];
1336 } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) {
1337 delete FoldersChangeListeners[args.watchId];
1342 function MessageConversation(data) {
1343 propertyFactory_(this, 'id', data.id || null, Property.ENUMERABLE);
1344 propertyFactory_(this, 'type', data.type || '', Property.ENUMERABLE);
1348 data.timestamp ? new Date(data.timestamp * 1000) : null,
1351 propertyFactory_(this, 'messageCount', data.messageCount || 0, Property.ENUMERABLE);
1352 propertyFactory_(this, 'unreadMessages', data.unreadMessages || 0, Property.ENUMERABLE);
1353 propertyFactory_(this, 'preview', data.preview || '', Property.ENUMERABLE);
1354 propertyFactory_(this, 'subject', data.subject || '', Property.ENUMERABLE);
1355 propertyFactory_(this, 'isRead', data.isRead || false, Property.ENUMERABLE);
1356 propertyFactory_(this, 'from', data.from || null, Property.ENUMERABLE);
1357 propertyFactory_(this, 'to', data.to || [], Property.ENUMERABLE);
1358 propertyFactory_(this, 'cc', data.cc || [], Property.ENUMERABLE);
1359 propertyFactory_(this, 'bcc', data.bcc || [], Property.ENUMERABLE);
1360 propertyFactory_(this, 'lastMessageId', data.lastMessageId || null, Property.ENUMERABLE);
1363 function MessageFolder(data) {
1365 id: data.id || null,
1366 parentId: data.parentId || null,
1367 serviceId: data.serviceId || '',
1368 contentType: data.contentType || '',
1369 name: data.name || '',
1370 path: data.path || '',
1371 type: data.type || '',
1372 synchronizable: data.synchronizable || false
1375 Object.defineProperty(this, 'id', {
1377 return _internal.id;
1382 Object.defineProperty(this, 'parentId', {
1384 return _internal.parentId;
1389 Object.defineProperty(this, 'serviceId', {
1391 return _internal.serviceId;
1396 Object.defineProperty(this, 'contentType', {
1398 return _internal.contentType;
1403 Object.defineProperty(this, 'name', {
1405 return _internal.name;
1407 set: function(value) {
1408 if (value) _internal.name = value;
1413 Object.defineProperty(this, 'path', {
1415 return _internal.path;
1420 Object.defineProperty(this, 'type', {
1422 return _internal.type;
1427 Object.defineProperty(this, 'synchronizable', {
1429 return _internal.synchronizable;
1431 set: function(value) {
1432 _internal.synchronizable = Boolean(value);
1438 tizen.Message = Message;
1440 tizen.MessageAttachment = MessageAttachment;
1442 exports = new Messaging();