4 * Nokia Web Runtime Service API emulation
7 * Copyright 2009 Nokia Corporation. All rights reserved.
13 var provider = 'Service.Contact' ,
14 Interface = 'IDataSource';
19 var ContactService = function(){
20 this.GetList = __GetList;
22 this.Delete = __Delete;
23 this.Import = __Import;
24 this.Export = __Export;
25 this.Organise = __Organise;
26 this.Cancel = __Cancel;
29 device.implementation.extend(provider, Interface, new ContactService() );
32 /******************************************************/
33 /******************************************************/
34 /******************************************************/
36 var context = device.implementation.context,
44 * @param {Object} criteria
45 * @param {Function} [callback] function for async call (optional)
47 function __GetList(criteria, callback){
49 if ((result = validator.apply('GetList', arguments)) !== false)
52 if (!/^(Contact|Group|Database)$/i.test(criteria.Type))
53 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
55 if (typeof callback == 'function') {
56 return context.callAsync(this, arguments.callee, criteria, callback);
61 filter = criteria.Filter || null;
63 DBase = context.getData(provider);
66 if (/Database/i.test(criteria.Type)){
67 returnValue = DBase.Database;
70 else if (/Group/i.test(criteria.Type)){
72 if (filter && filter.id) {
73 returnValue = findById(DBase.Group, filter.id);
74 if (returnValue.length == 0)
75 return error(device.implementation.ERR_NOT_FOUND);
79 returnValue = DBase.Group;
83 else if (/Contact/i.test(criteria.Type)){
86 if (filter && filter.id) {
87 returnValue = findById(DBase.Contact, filter.id);
88 if (returnValue.length == 0)
89 return error(device.implementation.ERR_NOT_FOUND);
91 // return all contacts
93 returnValue = DBase.Contact;
96 // unsupported filters
98 && (match = context.keys(filter).join().match(/SearchVal|DBUri/ig)) ) {
99 context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
103 context.notify(_t('%s:: GetList : sort not implemented in preview').arg(provider));
106 return context.Result(context.Iterator(returnValue));
111 * @param {Object} criteria
112 * @param {Function} [callback] function for async call (optional)
114 function __Add(criteria, callback){
116 if ((result = validator.apply('Add', arguments)) !== false)
119 if (!/^(Contact|Group)$/i.test(criteria.Type))
120 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
122 if (typeof callback == 'function') {
123 return context.callAsync(this, arguments.callee, criteria, callback);
126 DBase = context.getData(provider);
127 var Data = criteria.Data,
132 context.notify(_t('%s:: Add : Data.DBUri not implemented in preview').arg(provider));
136 if (/Group/i.test(criteria.Type)){
138 if (!Data.GroupLabel)
139 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingGroupLabel);
143 returnValue = findById(DBase.Group, Data.id);
144 if (returnValue.length == 0)
145 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
147 returnValue[0].GroupLabel = Data.GroupLabel;
148 //@todo: group contents!?
152 item = context.extend({}, Data);
153 item.id = String(context.getUniqueID());
154 DBase.Group.push(item);
161 returnValue = findById(DBase.Contact, Data.id);
162 if (returnValue.length == 0)
163 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
165 context.extend(returnValue[0], Data);
169 item = context.extend({}, Data);
170 item.id = String(context.getUniqueID());
171 DBase.Contact.push(item);
175 return error(device.implementation.ERR_SUCCESS);
181 * @param {Object} criteria
182 * @param {Function} [callback] function for async call (optional)
184 function __Delete(criteria, callback){
186 if ((result = validator.apply('Delete', arguments)) !== false)
189 if (!/^(Contact|Group)$/i.test(criteria.Type))
190 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
192 var Data = criteria.Data;
194 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
195 if (typeof Data.IdList != 'object')
196 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
198 DBase = context.getData(provider);
199 var type = criteria.Type;
203 context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));
206 if (typeof callback == 'function') {
207 return context.callAsync(this, arguments.callee, criteria, callback);
210 // for both Group & Contact:
212 for (j in Data.IdList) {
214 for (i in DBase[type]) {
215 item = DBase[type][i];
217 DBase[type].splice(i, 1);
222 return error(device.implementation.ERR_SUCCESS);
228 * @param {Object} criteria
229 * @param {Function} [callback] function for async call (optional)
231 function __Import(criteria, callback){
233 if ((result = validator.apply('Import', arguments)) !== false)
236 if (!/^(Contact)$/i.test(criteria.Type))
237 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType3);
239 var Data = criteria.Data;
240 if (!Data.SourceFile)
241 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);
243 if (typeof callback == 'function') {
244 return context.callAsync(this, arguments.callee, criteria, callback);
247 context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
248 return error(device.implementation.ERR_SUCCESS);
254 * @param {Object} criteria
255 * @param {Function} [callback] function for async call (optional)
257 function __Export(criteria, callback){
259 if ((result = validator.apply('Export', arguments)) !== false)
262 if (!/^(Contact)$/i.test(criteria.Type))
263 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType4);
265 var Data = criteria.Data;
266 if (!Data.DestinationFile)
267 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestinationFile);
270 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);
272 if (typeof callback == 'function') {
273 return context.callAsync(this, arguments.callee, criteria, callback);
276 context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
277 return error(device.implementation.ERR_SUCCESS);
283 * @param {Object} criteria
284 * @param {Function} [callback] function for async call (optional)
286 function __Organise(criteria, callback){
288 if ((result = validator.apply('Organise', arguments)) !== false)
291 if (!/^(Group)$/i.test(criteria.Type))
292 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badType5);
294 var Data = criteria.Data;
296 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId2);
299 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
301 if (typeof Data.IdList != 'object')
302 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
304 if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))
305 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badOperationType);
307 if (typeof callback == 'function') {
308 return context.callAsync(this, arguments.callee, criteria, callback);
311 context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));
312 return error(device.implementation.ERR_SUCCESS);
318 * @param {Object} criteria
320 function __Cancel(criteria){
322 if (!criteria || !criteria.TransactionID)
323 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingTID);
325 clearTimeout(criteria.TransactionID);
326 return context.ErrorResult(device.implementation.ERR_SUCCESS);
330 /*******************************
332 *******************************/
334 function error(code, msg /*, args...*/){
336 var args = ['Contacts',method].concat([].slice.call(arguments,2));
337 msg = msg ? _t().arg.apply(msg,args) : undefined;
338 return context.ErrorResult(code, msg);
342 * validate common input arguments
343 * 'this' is string (object) name of calling function
345 * @param {arguments} arguments of calling function
346 * @return {Result} Result object if error, false if no error.
348 function validator() {
351 criteria = arguments[0] || false;
353 if (!criteria || typeof criteria != 'object' || typeof criteria.Type == 'undefined')
354 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType, method);
356 if (method == 'GetList') return failed;
358 var Data = criteria.Data || false;
360 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData, method);
361 if (typeof Data != 'object')
362 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badData);
368 function findById(dbase, id){
370 for (var i in dbase) {
371 if (id == dbase[i]['id']) {
372 result.push(dbase[i]);
380 * order of %s args: Service name, method name, parameter name
383 missingType : '%s : %s : Type is Missing',
384 badType : '%s: %s : Invalid value for Type, Must be Contact/Group/Database',
385 badType2 : '%s : %s : Invalid Type, must be Contact/Group',
386 badType3 : '%s : %s : Invalid Type,it must be Contact',
387 badType4 : '%s : %s : Invalid Type, it must be Contact',
388 badType5 : '%s : %s : Invalid Content Type, It must be Group',
389 badOperationType: '%s : %s : Invalid Operation Type',
390 missingGroupLabel: '%s : %s : Group Label is Missing',
391 missingTID : 'Contact : Cancel : TransactionID is missing', // not 'Contacts'!!
392 badAsync : '%s : %s : Invalid async parameters',
393 missingData : '%s : %s : %s data Missing',
394 badData : '%s : %s : Invalid Type of Data , Map is required',
395 missingIdList : '%s : %s : List of Ids is missing',
396 badIdList : '%s : %s : Type of IdList is wrong, List is required',
397 missingSourceFile: '%s : %s : Import Source Filename is Missing',
398 missingDestinationFile: '%s : %s : Export Destination Filename is Missing',
399 missingId : '%s : %s : Contact Id to be exported is missing',
400 missingId2 : '%s : %s : GroupId is missing',
401 is_missing : '%s : %s : %s is missing',
402 is_invalid : '%s : %s : %s is invalid'