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';
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 * privUtils_.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) {
89 options.writable = true;
91 if ((flags & Property.E) != 0) {
92 options.enumerable = true;
94 if ((flags & Property.C) != 0) {
95 options.configurable = true;
97 Object.defineProperty(that, name, options);
100 function InternalValues_(data) {
101 if (!(this instanceof InternalValues_)) {
102 return new InternalValues_(data);
104 for (var key in data) {
105 if (data.hasOwnProperty(key)) {
106 this[key] = data[key];
111 function updateInternal_(internal, data) {
112 var values = new InternalValues_(data);
113 for (var key in data) {
114 if (values.hasOwnProperty(key) && internal.hasOwnProperty(key)) {
115 internal[key] = values;
121 * Specifies the Messaging service tags.
123 var MessageServiceTag = ['messaging.sms', 'messaging.mms', 'messaging.email'];
125 function Message(type, data) {
126 if (!(this instanceof Message)) {
127 throw new TypeError('Constructor called like a function');
129 if (MessageServiceTag.indexOf(type) === -1) {
130 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
132 if (!data || typeof data !== 'object') {
133 // 'data' is optional
137 // set initial data from internal MessageInit_ object or to default values
138 var internal = data instanceof MessageInit_,
139 id = internal ? data.id : null,
140 conversationId = internal ? data.conversationId : null,
141 folderId = internal ? data.folderId : null,
142 timestamp = internal ? data.timestamp : null,
143 from = internal ? data.from : null,
144 hasAttachment = internal ? data.hasAttachment : false,
145 isRead = internal ? data.isRead : false,
146 inResponseTo = internal ? data.inResponseTo : null;
147 // create MessageBody object
148 var body = new MessageBody({
150 plainBody: data.plainBody,
151 htmlBody: data.htmlBody
153 // check 'to', 'cc' and 'bcc' fields
155 if (!(to instanceof Array)) {
159 if (!(cc instanceof Array)) {
163 if (!(bcc instanceof Array)) {
166 // 'attachments' private variable, getter and setter
167 var attachments = (internal ? data.attachments : []) || [];
171 conversationId: conversationId || null,
172 folderId: folderId || null,
174 timestamp: timestamp || null,
180 isRead: isRead || false,
181 hasAttachment: hasAttachment || false,
182 isHighPriority: data.isHighPriority || false,
183 subject: data.subject || '',
184 inResponseTo: inResponseTo || null,
185 attachments: attachments
188 Object.defineProperty(this, 'id', {
192 set: function(value) {
193 if (value instanceof InternalValues_) _internal.id = value.id;
199 Object.defineProperty(this, 'conversationId', {
201 return _internal.conversationId;
203 set: function(value) {
204 if (value instanceof InternalValues_)
205 _internal.conversationId = value.conversationId;
211 Object.defineProperty(this, 'folderId', {
213 return _internal.folderId;
215 set: function(value) {
216 if (value instanceof InternalValues_) {
217 _internal.folderId = value.folderId;
224 Object.defineProperty(this, 'type', {
226 return _internal.type;
228 set: function(value) {
235 Object.defineProperty(this, 'timestamp', {
237 return _internal.timestamp
238 ? new Date(_internal.timestamp * 1000)
239 : _internal.timestamp;
241 set: function(value) {
242 if (value instanceof InternalValues_) {
243 _internal.timestamp = value.timestamp;
250 Object.defineProperty(this, 'from', {
252 return _internal.from;
254 set: function(value) {
255 if (value instanceof InternalValues_) _internal.from = value.from;
261 Object.defineProperty(this, 'to', {
265 set: function(value) {
266 if (value instanceof InternalValues_) value = value.to;
267 if (value instanceof Array) _internal.to = value;
273 Object.defineProperty(this, 'cc', {
277 set: function(value) {
278 if (value instanceof InternalValues_) value = value.cc;
279 if (value instanceof Array) _internal.cc = value;
285 Object.defineProperty(this, 'bcc', {
287 return _internal.bcc;
289 set: function(value) {
290 if (value instanceof InternalValues_) value = value.bcc;
291 if (value instanceof Array) _internal.bcc = value;
297 Object.defineProperty(this, 'body', {
299 return _internal.body;
301 set: function(value) {
302 if (value instanceof InternalValues_) {
303 _internal.body = new MessageBody(value.body);
305 if (value instanceof MessageBody) _internal.body = value;
311 Object.defineProperty(this, 'isRead', {
313 return _internal.isRead;
315 set: function(value) {
316 if (value instanceof InternalValues_) {
317 value = value.isRead;
319 _internal.isRead = !!value;
325 Object.defineProperty(this, 'hasAttachment', {
327 return _internal.attachments.length > 0;
329 set: function(value) {
330 if (value instanceof InternalValues_)
331 _internal.hasAttachment = value.hasAttachment;
337 Object.defineProperty(this, 'isHighPriority', {
339 return _internal.isHighPriority;
341 set: function(value) {
342 if (value instanceof InternalValues_) value = value.isHighPriority;
343 _internal.isHighPriority = !!value;
349 Object.defineProperty(this, 'subject', {
351 return _internal.subject;
353 set: function(value) {
354 if (value instanceof InternalValues_) value = value.subject;
355 _internal.subject = String(value);
361 Object.defineProperty(this, 'inResponseTo', {
363 return _internal.inResponseTo;
365 set: function(value) {
366 if (value instanceof InternalValues_) {
367 _internal.inResponseTo = value.inResponseTo;
374 Object.defineProperty(this, 'messageStatus', {
381 var result = native.callSync('Message_messageStatus', callArgs);
382 if (native.isSuccess(result)) {
383 return native.getResultObject(result);
388 set: function(value) {
395 Object.defineProperty(this, 'attachments', {
397 return _internal.attachments;
399 set: function(value) {
400 if (value instanceof InternalValues_) {
401 value = value.attachments;
402 for (var k = 0; k < value.length; ++k) {
403 if (!(value[k] instanceof tizen.MessageAttachment)) {
404 if (_internal.attachments[k]) {
405 updateInternal_(_internal.attachments[k], value[k]);
407 _internal.attachments[k] = new MessageAttachment(
408 new InternalValues_(value[k])
412 _internal.attachments[k] = value[k];
415 // if new array is shorter than the old one, remove excess elements
416 if (value.length < _internal.length) {
417 _internal.splice(value.length, _internal.length - value.length);
419 } else if (T_.isArray(value)) {
420 for (var k = 0; k < value.length; ++k) {
421 if (!(value[k] instanceof tizen.MessageAttachment)) {
425 _internal.attachments = value;
432 function MessageInit(data) {
433 if (!(this instanceof MessageInit)) {
434 return new MessageInit(data);
436 if (data === null || typeof data !== 'object') {
439 propertyFactory_(this, 'subject', data.subject || '', Property.E | Property.W);
440 propertyFactory_(this, 'to', data.to || [], Property.E | Property.W);
441 propertyFactory_(this, 'cc', data.cc || [], Property.E | Property.W);
442 propertyFactory_(this, 'bcc', data.bcc || [], Property.E | Property.W);
443 propertyFactory_(this, 'plainBody', data.plainBody || '', Property.E | Property.W);
444 propertyFactory_(this, 'htmlBody', data.htmlBody || '', Property.E | Property.W);
448 data.isHighPriority || false,
449 Property.E | Property.W
453 function MessageInit_(data) {
454 if (!(this instanceof MessageInit_)) {
455 return new MessageInit_(data);
457 if (!data || typeof data !== 'object') {
460 this.id = data.id || null;
461 this.conversationId = data.conversationId || null;
462 this.folderId = data.folderId || null;
463 this.timestamp = data.timestamp || null;
464 this.from = data.from || '';
465 this.to = data.to || [];
466 this.cc = data.cc || [];
467 this.bcc = data.bcc || [];
468 this.isRead = data.isRead || false;
469 this.hasAttachment = data.hasAttachment || null;
470 this.isHighPriority = data.isHighPriority || false;
471 this.subject = data.subject || '';
472 this.inResponseTo = data.inResponseTo || null;
473 this.attachments = [];
474 this.plainBody = data.body ? data.body.plainBody : '';
475 this.htmlBody = data.body ? data.body.htmlBody : '';
478 if (data.attachments && data.attachments.constructor === Array) {
479 data.attachments.forEach(function(el) {
482 if (el.constructor === MessageAttachment) {
483 self.attachments.push(el);
485 self.attachments.push(new MessageAttachment(new InternalValues_(el)));
491 function MessageBody(data) {
492 if (!this instanceof MessageBody) {
493 return new MessageBody(data);
495 if (data === null || typeof data !== 'object') {
500 messageId: data.messageId || null,
501 loaded: data.loaded || false,
502 plainBody: data.plainBody || '',
503 htmlBody: data.htmlBody || '',
504 inlineAttachments: data.inlineAttachments || []
508 Object.defineProperty(this, 'messageId', {
510 return _internal.messageId;
512 set: function(value) {
513 if (value instanceof InternalValues_) {
514 _internal.messageId = value.messageId;
521 Object.defineProperty(this, 'loaded', {
523 return _internal.loaded;
525 set: function(value) {
526 if (value instanceof InternalValues_) _internal.loaded = value.loaded;
532 Object.defineProperty(this, 'plainBody', {
534 return _internal.plainBody;
536 set: function(value) {
537 if (value instanceof InternalValues_) {
538 _internal.plainBody = String(value.plainBody);
540 _internal.plainBody = String(value);
547 Object.defineProperty(this, 'htmlBody', {
549 return _internal.htmlBody;
551 set: function(value) {
552 if (value instanceof InternalValues_) {
553 _internal.htmlBody = String(value.htmlBody);
555 _internal.htmlBody = String(value);
562 Object.defineProperty(this, 'inlineAttachments', {
564 return _internal.inlineAttachments;
566 set: function(value) {
567 if (value instanceof InternalValues_) {
568 _internal.inlineAttachments = value.inlineAttachments;
569 } else if (T_.isArray(value)) {
570 _internal.inlineAttachments = value;
577 var messageAttachmentsLoaded = {};
579 function MessageAttachment(first, second) {
580 validator_.isConstructorCall(this, MessageAttachment);
581 if (!this instanceof MessageAttachment) {
582 return new MessageAttachment(data);
585 var internalConstructor = first instanceof InternalValues_;
587 messageId: internalConstructor ? first.messageId : null,
588 id: internalConstructor ? first.id : null,
589 mimeType: internalConstructor
591 : undefined == second
594 filePath: internalConstructor ? first.filePath : first
598 Object.defineProperty(this, 'messageId', {
600 return _internal.messageId;
602 set: function(value) {
603 if (value instanceof InternalValues_) {
604 _internal.messageId = value.messageId;
610 Object.defineProperty(this, 'id', {
614 set: function(value) {
615 if (value instanceof InternalValues_) _internal.id = value.id;
620 Object.defineProperty(this, 'mimeType', {
622 return _internal.mimeType;
624 set: function(value) {
625 if (value instanceof InternalValues_) _internal.mimeType = value.mimeType;
630 Object.defineProperty(this, 'filePath', {
632 if (_internal.id && !messageAttachmentsLoaded[_internal.id]) {
636 return _internal.filePath;
638 set: function(value) {
639 if (value instanceof InternalValues_) _internal.filePath = value.filePath;
645 function Messaging() {}
648 * Gets the messaging service of a given type for a given account.
649 * @param {!MessageServiceTag} messageServiceType Type of the services to be retrieved.
650 * @param {!MessageServiceArraySuccessCallback} successCallback Callback function
651 * that is called when the services are successfully retrieved.
652 * @param {ErrorCallback} errorCallback Callback function that is called
653 * when an error occurs.
655 Messaging.prototype.getMessageServices = function() {
656 var args = validator_.validateArgs(arguments, [
657 { name: 'messageServiceType', type: types_.ENUM, values: MessageServiceTag },
658 { name: 'successCallback', type: types_.FUNCTION },
659 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
662 var callArgs = { messageServiceType: args.messageServiceType };
663 var callback = function(result) {
664 if (native.isFailure(result)) {
665 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
667 var data = native.getResultObject(result);
668 var servicesArr = [];
669 data.forEach(function(e) {
670 servicesArr.push(new MessageService(e));
672 args.successCallback(servicesArr);
675 var result = native.call('Messaging_getMessageServices', callArgs, callback);
676 if (native.isFailure(result)) {
677 throw native.getErrorObject(result);
681 function MessageStorage() {}
682 function MessageService(data) {
683 propertyFactory_(this, 'id', data.id, Property.E);
684 propertyFactory_(this, 'type', data.type, Property.E);
685 propertyFactory_(this, 'name', data.name, Property.E);
686 propertyFactory_(this, 'messageStorage', new MessageStorage(this), Property.E);
689 MessageService.prototype.sendMessage = function() {
690 var args = validator_.validateArgs(arguments, [
691 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
693 name: 'successCallback',
694 type: types_.FUNCTION,
698 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
699 { name: 'simIndex', type: types_.LONG, optional: true, nullable: true }
702 if (args.message.type != this.type) {
703 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
709 message: args.message,
710 simIndex: args.simIndex || 1,
713 var callback = function(result) {
714 if (native.isFailure(result)) {
715 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
717 var data = native.getResultObject(result);
718 var message = data.message;
720 var body = message.body;
722 updateInternal_(args.message.body, body);
725 updateInternal_(args.message, message);
727 native.callIfPossible(args.successCallback, data.recipients);
730 var result = native.call('MessageService_sendMessage', callArgs, callback);
731 if (native.isFailure(result)) {
732 throw native.getErrorObject(result);
736 MessageService.prototype.loadMessageBody = function() {
737 var args = validator_.validateArgs(arguments, [
738 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
739 { name: 'successCallback', type: types_.FUNCTION },
740 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
743 if (args.message.type != this.type) {
744 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
750 message: args.message,
754 var callback = function(result) {
755 if (native.isFailure(result)) {
756 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
758 var data = native.getResultObject(result);
759 var body = data.messageBody;
761 updateInternal_(args.message.body, body);
764 args.successCallback(args.message);
768 var result = native.call('MessageService_loadMessageBody', callArgs, callback);
770 if (native.isFailure(result)) {
771 throw native.getErrorObject(result);
774 MessageService.prototype.loadMessageAttachment = function() {
775 var args = validator_.validateArgs(arguments, [
776 { name: 'attachment', type: types_.PLATFORM_OBJECT, values: MessageAttachment },
777 { name: 'successCallback', type: types_.FUNCTION },
778 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
782 var firstCall = false;
783 if (!messageAttachmentsLoaded[args.attachment.id]) {
785 messageAttachmentsLoaded[args.attachment.id] = true;
789 attachment: args.attachment,
793 var callback = function(result) {
794 if (native.isFailure(result)) {
795 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
797 var data = native.getResultObject(result);
798 var messageAttachment = data.messageAttachment;
799 if (messageAttachment) {
800 updateInternal_(args.attachment, messageAttachment);
803 args.successCallback(args.attachment);
807 var result = native.call('MessageService_loadMessageAttachment', callArgs, callback);
809 if (native.isFailure(result)) {
810 throw native.getErrorObject(result);
814 MessageService.prototype.sync = function() {
815 var args = validator_.validateArgs(arguments, [
817 name: 'successCallback',
818 type: types_.FUNCTION,
822 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
823 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
830 limit: args.limit || null
833 var callback = function(result) {
834 if (native.isFailure(result)) {
835 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
837 native.callIfPossible(args.successCallback);
841 var result = native.call('MessageService_sync', callArgs, callback);
843 if (native.isFailure(result)) {
844 throw native.getErrorObject(result);
847 return native.getResultObject(result);
850 MessageService.prototype.syncFolder = function() {
851 var args = validator_.validateArgs(arguments, [
852 { name: 'folder', type: types_.PLATFORM_OBJECT, values: MessageFolder },
854 name: 'successCallback',
855 type: types_.FUNCTION,
859 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
860 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
868 limit: args.limit || null
871 var callback = function(result) {
872 if (native.isFailure(result)) {
873 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
875 native.callIfPossible(args.successCallback);
879 var result = native.call('MessageService_syncFolder', callArgs, callback);
881 if (native.isFailure(result)) {
882 throw native.getErrorObject(result);
885 return native.getResultObject(result);
888 MessageService.prototype.stopSync = function() {
889 var args = validator_.validateArgs(arguments, [{ name: 'opId', type: types_.LONG }]);
896 var result = native.callSync('MessageService_stopSync', callArgs);
897 if (native.isFailure(result)) {
898 throw native.getErrorObject(result);
902 function MessageStorage(service) {
903 propertyFactory_(this, 'service', service);
906 MessageStorage.prototype.addDraftMessage = function() {
907 var args = validator_.validateArgs(arguments, [
908 { name: 'message', type: types_.PLATFORM_OBJECT, values: tizen.Message },
910 name: 'successCallback',
911 type: types_.FUNCTION,
915 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
918 if (args.message.type != this.service.type) {
919 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
925 message: args.message,
926 serviceId: self.service.id
928 var callback = function(result) {
929 if (native.isFailure(result)) {
930 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
932 var data = native.getResultObject(result);
933 var message = data.message;
935 var body = message.body;
937 updateInternal_(args.message.body, body);
940 var attachments = message.attachments;
942 for (var i = 0; i < attachments.length; i++) {
943 messageAttachmentsLoaded[attachments[i].id] = true;
946 updateInternal_(args.message, message);
948 native.callIfPossible(args.successCallback, data.recipients);
951 var result = native.call('MessageStorage_addDraftMessage', callArgs, callback);
952 if (native.isFailure(result)) {
953 throw native.getErrorObject(result);
957 MessageStorage.prototype.findMessages = function() {
958 var args = validator_.validateArgs(arguments, [
961 type: types_.PLATFORM_OBJECT,
963 tizen.AttributeFilter,
964 tizen.AttributeRangeFilter,
965 tizen.CompositeFilter
968 { name: 'successCallback', type: types_.FUNCTION },
969 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
972 type: types_.PLATFORM_OBJECT,
973 values: tizen.SortMode,
977 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
978 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
984 filter: addTypeToFilter_(args.filter) || null,
985 sort: args.sort || null,
986 limit: args.limit || null,
987 offset: args.offset || null,
988 serviceId: self.service.id,
989 type: self.service.type
991 var callback = function(result) {
992 if (native.isFailure(result)) {
993 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
995 var data = native.getResultObject(result);
997 data.forEach(function(el) {
998 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1000 native.callIfPossible(args.successCallback, messages);
1003 var result = native.call('MessageStorage_findMessages', callArgs, callback);
1004 if (native.isFailure(result)) {
1005 throw native.getErrorObject(result);
1009 MessageStorage.prototype.removeMessages = function() {
1010 var args = validator_.validateArgs(arguments, [
1011 { name: 'messages', type: types_.ARRAY, values: Message },
1013 name: 'successCallback',
1014 type: types_.FUNCTION,
1018 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1023 args.messages.forEach(function(msg) {
1024 if (msg.type != self.service.type) {
1025 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1030 messages: args.messages,
1031 serviceId: self.service.id,
1032 type: self.service.type
1034 var callback = function(result) {
1035 if (native.isFailure(result)) {
1036 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1038 native.callIfPossible(args.successCallback);
1041 var result = native.call('MessageStorage_removeMessages', callArgs, callback);
1042 if (native.isFailure(result)) {
1043 throw native.getErrorObject(result);
1047 MessageStorage.prototype.updateMessages = function() {
1048 var args = validator_.validateArgs(arguments, [
1049 { name: 'messages', type: types_.ARRAY, values: Message },
1051 name: 'successCallback',
1052 type: types_.FUNCTION,
1056 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1061 args.messages.forEach(function(msg) {
1062 if (msg.type != self.service.type) {
1063 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1068 messages: args.messages,
1069 serviceId: self.service.id
1071 var callback = function(result) {
1072 if (native.isFailure(result)) {
1073 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1075 var data = native.getResultObject(result);
1077 i = args.messages.length,
1080 m = args.messages[i];
1082 originals[m.id] = m;
1089 if (originals[m.oldId]) {
1092 updateInternal_(originals[m.oldId].body, body);
1095 updateInternal_(originals[m.oldId], m);
1099 native.callIfPossible(args.successCallback);
1102 var result = native.call('MessageStorage_updateMessages', callArgs, callback);
1103 if (native.isFailure(result)) {
1104 throw native.getErrorObject(result);
1108 MessageStorage.prototype.findConversations = function() {
1109 var args = validator_.validateArgs(arguments, [
1112 type: types_.PLATFORM_OBJECT,
1114 tizen.AttributeFilter,
1115 tizen.AttributeRangeFilter,
1116 tizen.CompositeFilter
1119 { name: 'successCallback', type: types_.FUNCTION },
1120 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true },
1123 type: types_.PLATFORM_OBJECT,
1124 values: tizen.SortMode,
1128 { name: 'limit', type: types_.UNSIGNED_LONG, optional: true, nullable: true },
1129 { name: 'offset', type: types_.UNSIGNED_LONG, optional: true, nullable: true }
1135 filter: addTypeToFilter_(args.filter),
1136 sort: args.sort || null,
1137 limit: args.limit || null,
1138 offset: args.offset || null,
1139 serviceId: self.service.id
1141 var callback = function(result) {
1142 if (native.isFailure(result)) {
1143 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1145 var data = native.getResultObject(result);
1146 var conversations = [];
1147 data.forEach(function(el) {
1148 conversations.push(new MessageConversation(el));
1150 args.successCallback(conversations);
1153 var result = native.call('MessageStorage_findConversations', callArgs, callback);
1154 if (native.isFailure(result)) {
1155 throw native.getErrorObject(result);
1159 MessageStorage.prototype.removeConversations = function() {
1160 var args = validator_.validateArgs(arguments, [
1161 { name: 'conversations', type: types_.ARRAY },
1163 name: 'successCallback',
1164 type: types_.FUNCTION,
1168 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1171 args.conversations.forEach(function(el) {
1172 if (!el || el.constructor !== MessageConversation) {
1173 throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
1180 conversations: args.conversations,
1181 serviceId: self.service.id,
1182 type: self.service.type
1184 var callback = function(result) {
1185 if (native.isFailure(result)) {
1186 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1188 native.callIfPossible(args.successCallback);
1191 var result = native.call('MessageStorage_removeConversations', callArgs, callback);
1192 if (native.isFailure(result)) {
1193 throw native.getErrorObject(result);
1197 MessageStorage.prototype.findFolders = function() {
1198 var args = validator_.validateArgs(arguments, [
1201 type: types_.PLATFORM_OBJECT,
1203 tizen.AttributeFilter,
1204 tizen.AttributeRangeFilter,
1205 tizen.CompositeFilter
1208 { name: 'successCallback', type: types_.FUNCTION },
1209 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1215 filter: addTypeToFilter_(args.filter),
1216 sort: args.sort || null,
1217 limit: args.limit || null,
1218 offset: args.offset || null,
1219 serviceId: self.service.id
1221 var callback = function(result) {
1222 if (native.isFailure(result)) {
1223 native.callIfPossible(args.errorCallback, native.getErrorObject(result));
1225 var data = native.getResultObject(result);
1227 data.forEach(function(el) {
1228 folders.push(new MessageFolder(el));
1230 args.successCallback(folders);
1233 var result = native.call('MessageStorage_findFolders', callArgs, callback);
1234 if (native.isFailure(result)) {
1235 throw native.getErrorObject(result);
1239 function pushMessage(messages, el) {
1240 messages.push(new tizen.Message(el.type, new MessageInit_(el)));
1243 function pushConversation(conversations, el) {
1244 conversations.push(new MessageConversation(el));
1247 function pushFolder(folders, el) {
1248 folders.push(new MessageFolder(el));
1251 function getListenerFunction(listenerMap, pushMethod) {
1252 return function(msg) {
1253 var action = msg.action;
1254 var data = native.getResultObject(msg);
1256 data.forEach(function(el) {
1257 pushMethod(messages, el);
1260 for (var key in listenerMap) {
1261 if (listenerMap.hasOwnProperty(key)) {
1262 native.callIfPossible(listenerMap[key][action], messages);
1268 var MESSAGES_CHANGE_LISTENER = 'MessagesChangeListener';
1269 var MessagesChangeListeners = {};
1271 MESSAGES_CHANGE_LISTENER,
1272 getListenerFunction(MessagesChangeListeners, pushMessage)
1275 var CONVERSATIONS_CHANGE_LISTENER = 'ConversationsChangeListener';
1276 var ConversationsChangeListeners = {};
1278 CONVERSATIONS_CHANGE_LISTENER,
1279 getListenerFunction(ConversationsChangeListeners, pushConversation)
1282 var FOLDERS_CHANGE_LISTENER = 'FoldersChangeListener';
1283 var FoldersChangeListeners = {};
1285 FOLDERS_CHANGE_LISTENER,
1286 getListenerFunction(FoldersChangeListeners, pushFolder)
1289 MessageStorage.prototype.addMessagesChangeListener = function() {
1290 var args = validator_.validateArgs(arguments, [
1292 name: 'messagesChangeCallback',
1293 type: types_.LISTENER,
1294 values: ['messagesadded', 'messagesupdated', 'messagesremoved']
1298 type: types_.PLATFORM_OBJECT,
1300 tizen.AttributeFilter,
1301 tizen.AttributeRangeFilter,
1302 tizen.CompositeFilter
1312 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1313 serviceId: self.service.id
1315 var result = native.callSync('MessageStorage_addMessagesChangeListener', callArgs);
1316 if (native.isFailure(result)) {
1317 throw native.getErrorObject(result);
1319 var opId = native.getResultObject(result);
1320 MessagesChangeListeners[opId] = args.messagesChangeCallback;
1325 MessageStorage.prototype.addConversationsChangeListener = function() {
1326 var args = validator_.validateArgs(arguments, [
1328 name: 'conversationsChangeCallback',
1329 type: types_.LISTENER,
1330 values: ['conversationsadded', 'conversationsupdated', 'conversationsremoved']
1334 type: types_.PLATFORM_OBJECT,
1336 tizen.AttributeFilter,
1337 tizen.AttributeRangeFilter,
1338 tizen.CompositeFilter
1348 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1349 serviceId: self.service.id
1351 var result = native.callSync(
1352 'MessageStorage_addConversationsChangeListener',
1355 if (native.isFailure(result)) {
1356 throw native.getErrorObject(result);
1358 var opId = native.getResultObject(result);
1359 ConversationsChangeListeners[opId] = args.conversationsChangeCallback;
1364 MessageStorage.prototype.addFoldersChangeListener = function() {
1365 var args = validator_.validateArgs(arguments, [
1367 name: 'foldersChangeCallback',
1368 type: types_.LISTENER,
1369 values: ['foldersadded', 'foldersupdated', 'foldersremoved']
1373 type: types_.PLATFORM_OBJECT,
1375 tizen.AttributeFilter,
1376 tizen.AttributeRangeFilter,
1377 tizen.CompositeFilter
1387 filter: args.filter ? addTypeToFilter_(args.filter) : null,
1388 serviceId: self.service.id
1390 var result = native.callSync('MessageStorage_addFoldersChangeListener', callArgs);
1391 if (native.isFailure(result)) {
1392 throw native.getErrorObject(result);
1394 var opId = native.getResultObject(result);
1395 FoldersChangeListeners[opId] = args.foldersChangeCallback;
1400 MessageStorage.prototype.removeChangeListener = function() {
1401 var args = validator_.validateArgs(arguments, [
1402 { name: 'watchId', type: types_.LONG }
1408 watchId: args.watchId,
1409 serviceId: self.service.id
1411 var result = native.callSync('MessageStorage_removeChangeListener', callArgs);
1412 if (native.isFailure(result)) {
1413 throw native.getErrorObject(result);
1415 if (MessagesChangeListeners.hasOwnProperty(args.watchId)) {
1416 delete MessagesChangeListeners[args.watchId];
1417 } else if (ConversationsChangeListeners.hasOwnProperty(args.watchId)) {
1418 delete ConversationsChangeListeners[args.watchId];
1419 } else if (FoldersChangeListeners.hasOwnProperty(args.watchId)) {
1420 delete FoldersChangeListeners[args.watchId];
1425 function MessageConversation(data) {
1426 propertyFactory_(this, 'id', data.id || null, Property.E);
1427 propertyFactory_(this, 'type', data.type || '', Property.E);
1431 data.timestamp ? new Date(data.timestamp * 1000) : null,
1434 propertyFactory_(this, 'messageCount', data.messageCount || 0, Property.E);
1435 propertyFactory_(this, 'unreadMessages', data.unreadMessages || 0, Property.E);
1436 propertyFactory_(this, 'preview', data.preview || '', Property.E);
1437 propertyFactory_(this, 'subject', data.subject || '', Property.E);
1438 propertyFactory_(this, 'isRead', data.isRead || false, Property.E);
1439 propertyFactory_(this, 'from', data.from || null, Property.E);
1440 propertyFactory_(this, 'to', data.to || [], Property.E);
1441 propertyFactory_(this, 'cc', data.cc || [], Property.E);
1442 propertyFactory_(this, 'bcc', data.bcc || [], Property.E);
1443 propertyFactory_(this, 'lastMessageId', data.lastMessageId || null, Property.E);
1446 function MessageFolder(data) {
1448 id: data.id || null,
1449 parentId: data.parentId || null,
1450 serviceId: data.serviceId || '',
1451 contentType: data.contentType || '',
1452 name: data.name || '',
1453 path: data.path || '',
1454 type: data.type || '',
1455 synchronizable: data.synchronizable || false
1458 Object.defineProperty(this, 'id', {
1460 return _internal.id;
1465 Object.defineProperty(this, 'parentId', {
1467 return _internal.parentId;
1472 Object.defineProperty(this, 'serviceId', {
1474 return _internal.serviceId;
1479 Object.defineProperty(this, 'contentType', {
1481 return _internal.contentType;
1486 Object.defineProperty(this, 'name', {
1488 return _internal.name;
1490 set: function(value) {
1491 if (value) _internal.name = value;
1496 Object.defineProperty(this, 'path', {
1498 return _internal.path;
1503 Object.defineProperty(this, 'type', {
1505 return _internal.type;
1510 Object.defineProperty(this, 'synchronizable', {
1512 return _internal.synchronizable;
1514 set: function(value) {
1515 _internal.synchronizable = Boolean(value);
1521 tizen.Message = Message;
1523 tizen.MessageAttachment = MessageAttachment;
1525 exports = new Messaging();