4 * Nokia Web Runtime Service API emulation
\r
7 * Copyright 2009 Nokia Corporation. All rights reserved.
\r
13 var provider = 'Service.Landmarks',
\r
14 Interface = 'IDataSource';
\r
19 var LandmarkService = function(){
\r
21 this.GetList = __GetList;
\r
23 this.Delete = __Delete;
\r
24 this.Import = __Import;
\r
25 this.Export = __Export;
\r
26 this.Organise = __Organise;
\r
27 this.Cancel = __Cancel;
\r
30 device.implementation.extend(provider, Interface, new LandmarkService() );
\r
33 /******************************************************/
\r
34 /******************************************************/
\r
35 /******************************************************/
\r
37 var context = device.implementation.context,
\r
45 * @param {Object} criteria
\r
47 function __New(criteria){
\r
48 if ((result = validator.apply('New', arguments)) !== false)
\r
51 if (typeof criteria.Type == 'undefined')
\r
52 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
\r
54 if (!/^(Landmark|Category)$/i.test(criteria.Type))
\r
55 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
59 if(criteria.Type == 'Landmark')
\r
62 'LandmarkName' : '',
\r
64 'CategoryInfo' : '',
\r
65 'LandmarkDesc' : '',
\r
66 'LandmarkPosition' : {
\r
74 'CoverageRadius' : '',
\r
77 'IconMaskIndex' : '',
\r
78 'LandmarkFields' : {
\r
80 'BuildingName' : '',
\r
92 'CategoryName' : '',
\r
97 'IconMaskIndex' : ''
\r
101 return context.Result(returnValue);
\r
105 * Landmarks: GetList
\r
106 * @param {Object} criteria
\r
107 * @param {Function} [callback] function for async call (optional)
\r
109 function __GetList(criteria, callback){
\r
111 if ((result = validator.apply('GetList', arguments)) !== false)
\r
114 if (typeof criteria.Type == 'undefined')
\r
115 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
\r
117 if (!/^(Landmark|Category|Database)$/i.test(criteria.Type))
\r
118 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
120 if (criteria.Filter)
\r
121 context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));
\r
124 context.notify(_t('%s:: GetList : Sort is not implemented in preview').arg(provider));
\r
126 if (typeof callback == 'function') {
\r
127 return context.callAsync(this, arguments.callee, criteria, callback);
\r
130 var returnValue = [],
\r
132 filter = criteria.Filter || null;
\r
134 DBase = context.getData(provider);
\r
137 if (/Database/i.test(criteria.Type)) { // Type = Database
\r
139 returnValue = context.Iterator( DBase.Database || [] );
\r
141 } else if (/Landmark/i.test(criteria.Type)){ // Type = Landmark
\r
143 returnValue = context.Iterator( DBase[criteria.Type] || [] );
\r
145 } else { // Type = Category
\r
147 // @todo: apply filter criteria
\r
148 returnValue = context.Iterator( DBase[criteria.Type] || [] );
\r
150 return context.Result(returnValue);
\r
155 * @param {Object} criteria
\r
157 function __Add(criteria){
\r
159 if ((result = validator.apply('Add', arguments)) !== false)
\r
162 if (!/^(Landmark|Category)$/i.test(criteria.Type))
\r
163 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
166 var Data = criteria.Data || false;
\r
168 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData);
\r
171 DBase = context.getData(provider);
\r
174 if (Data.DatabaseURI) {
\r
175 context.notify(_t('%s:: Add : Data.DatabaseURI not implemented in preview').arg(provider));
\r
181 if (/Landmark/i.test(criteria.Type)){
\r
183 if (!Data.LandmarkName)
\r
184 Data.LandmarkName="";
\r
186 var landmarkPos = Data.LandmarkPosition;
\r
187 if (typeof landmarkPos != 'undefined') {
\r
188 if ((typeof landmarkPos.Latitude == 'undefined' || typeof landmarkPos.Latitude != 'number') &&
\r
189 (typeof landmarkPos.Longitude == 'undefined' || typeof landmarkPos.Longitude != 'number') &&
\r
190 (typeof landmarkPos.Altitude == 'undefined' || typeof landmarkPos.Altitude != 'number') &&
\r
191 (typeof landmarkPos.HAccuracy == 'undefined' || typeof landmarkPos.HAccuracy != 'number') &&
\r
192 (typeof landmarkPos.VAccuracy == 'undefined' || typeof landmarkPos.VAccuracy != 'number')) {
\r
194 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
\r
198 if (typeof Data.id != 'undefined') {
\r
199 if(typeof Data.id != 'string')
\r
200 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
\r
202 var retIndex = findById(DBase.Landmark, Data.id);
\r
203 if (retIndex == -1)
\r
204 return error(device.implementation.ERR_NOT_FOUND);
\r
205 DBase.Landmark[retIndex] = Data;
\r
210 item = context.extend({}, Data);
\r
211 item.id = String(context.getUniqueID());
\r
212 DBase.Landmark.push(item);
\r
214 } else { // Type = Category
\r
215 // alert(typeof Data.CategoryName);
\r
217 //alert("Data.id : "+Data.id);
\r
219 if (typeof Data.id != 'undefined') {
\r
220 if(typeof Data.id != 'string')
\r
221 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
\r
223 var retIndex = findById(DBase.Category, Data.id);
\r
224 if (retIndex == -1)
\r
225 return error(device.implementation.ERR_NOT_FOUND);
\r
227 DBase.Category[retIndex] = Data;
\r
232 if (typeof Data.CategoryName == 'undefined')
\r
233 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingCategoryName);
\r
235 if(typeof Data.CategoryName != 'string' || Data.CategoryName.length <= 0)
\r
236 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
\r
238 var retIndex = findByName(DBase.Category, Data.CategoryName);
\r
239 if (retIndex != -1)
\r
240 return error(device.implementation.ERR_ENTRY_EXISTS);
\r
242 item = context.extend({}, Data);
\r
243 item.id = String(context.getUniqueID());
\r
244 DBase.Category.push(item);
\r
248 return context.Result(item.id, device.implementation.ERR_SUCCESS);
\r
252 * Landmarks: Delete
\r
253 * @param {Object} criteria
\r
255 function __Delete(criteria){
\r
257 if ((result = validator.apply('Delete', arguments)) !== false)
\r
260 if (!/^(Landmark|Category)$/i.test(criteria.Type))
\r
261 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
263 var Data = criteria.Data || false;
\r
265 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
\r
268 if (typeof Data.id == 'undefined') {
\r
269 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);
\r
272 if (typeof Data.id != 'undefined' && typeof Data.id != 'string') {
\r
273 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
\r
275 if(Data.id.length <= 0 )
\r
276 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);
\r
278 DBase = context.getData(provider);
\r
280 var type = criteria.Type;
\r
284 context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));
\r
287 // for both Landmark & Category:
\r
290 for (i in DBase[type]) {
\r
291 item = DBase[type][i];
\r
292 if (Data.id == item.id) {
\r
293 DBase[type].splice(i, 1);
\r
298 return error(device.implementation.ERR_SUCCESS);
\r
302 * Landmarks: Import
\r
303 * @param {Object} criteria
\r
305 function __Import(criteria){
\r
307 if ((result = validator.apply('Import', arguments)) !== false)
\r
310 if (!/^(Landmark)$/i.test(criteria.Type))
\r
311 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
313 context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
\r
315 var Data = criteria.Data || false;
\r
317 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
\r
319 if (!Data.SourceFile)
\r
320 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);
\r
322 if (!Data.MimeType)
\r
323 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);
\r
325 if (!/^(application\/vnd.nokia.landmarkcollection\+xml|application\/vnd.nokia.landmark\+wbxml)$/i.test(Data.MimeType))
\r
326 return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.invalidMime);
\r
328 return error(device.implementation.ERR_SUCCESS);
\r
333 * Landmarks: Export
\r
334 * @param {Object} criteria
\r
336 function __Export(criteria){
\r
338 if ((result = validator.apply('Export', arguments)) !== false)
\r
341 context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
\r
342 if (!/^(Landmark)$/i.test(criteria.Type))
\r
343 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
345 var Data = criteria.Data || false;
\r
347 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
\r
350 if (!Data.DestinationFile)
\r
351 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestFile);
\r
353 if (!Data.MimeType)
\r
354 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);
\r
357 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
\r
359 return error(device.implementation.ERR_SUCCESS);
\r
364 * Landmarks: Organise
\r
365 * @param {Object} criteria
\r
367 function __Organise(criteria){
\r
369 if ((result = validator.apply('Organise', arguments)) !== false)
\r
372 if (!/^(Landmark)$/i.test(criteria.Type))
\r
373 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
\r
375 var Data = criteria.Data || false;
\r
377 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
\r
380 if (!Data.id || Data.id == "")
\r
381 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);
\r
383 DBase = context.getData(provider);
\r
384 var categories = DBase['Category'];
\r
385 var landmarks = DBase['Landmark'];
\r
389 for(var i=0;i<categories.length;i++)
\r
391 var category = categories[i];
\r
392 if (category.id == Data.id) {
\r
398 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
\r
401 if(!Data.IdList || Data.IdList.length <=0)
\r
403 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
\r
406 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
\r
409 if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))
\r
410 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidOpType);
\r
412 context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));
\r
413 if(/^Associate$/i.test(criteria.OperationType))
\r
415 for(var i=0;i<landmarks.length;i++)
\r
417 for(var j=0;j<Data.IdList.length;j++)
\r
419 if(landmarks[i] == Data.IdList[j])
\r
421 if(!landmarks[i].CategoryInfo)
\r
423 landmarks[i].CategoryInfo = new Array();
\r
424 landmarks[i].CategoryInfo.push(Data.id);
\r
427 var landmark = landmarks[i];
\r
429 for(var k=0;k<landmark.CategoryInfo.length;k++)
\r
431 if(landmark.CategoryInfo[k] == Data.id)
\r
435 landmark.CategoryInfo.push(Data.id);
\r
444 for(var i=0;i<landmarks.length;i++)
\r
446 for(var j=0;j<Data.IdList.length;j++)
\r
448 if(landmarks[i] == Data.IdList[j] && landmarks[i].CategoryInfo != undefined)
\r
450 var landmark = landmarks[i];
\r
451 for(var k=0;k<landmark.CategoryInfo.length;k++)
\r
453 if(landmark.CategoryInfo[k] == Data.id)
\r
454 landmark.CategoryInfo.splice(k,1);
\r
461 return error(device.implementation.ERR_SUCCESS);
\r
466 * Landmarks: Cancel
\r
467 * @param {Object} criteria
\r
469 function __Cancel(criteria){
\r
472 if ((result = validator.apply('Cancel', arguments)) !== false)
\r
475 if (!criteria.TransactionID)
\r
476 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
\r
478 clearTimeout(criteria.TransactionID);
\r
479 return context.ErrorResult(device.implementation.ERR_SUCCESS);
\r
484 /*******************************
\r
486 *******************************/
\r
487 function error(code, msg /*, args...*/){
\r
489 var args = ['Landmarks',method].concat([].slice.call(arguments,2));
\r
490 msg = msg ? _t().arg.apply(msg,args) : undefined;
\r
491 return context.ErrorResult(code, msg);
\r
495 * validate common input arguments
\r
496 * 'this' is string (object) name of calling function
\r
498 * @param {arguments} arguments of calling function
\r
499 * @return {Result} Result object if error, false if no error.
\r
501 function validator() {
\r
503 var failed = false,
\r
504 criteria = arguments[0] || false;
\r
506 if (!criteria || typeof criteria != 'object')
\r
507 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
\r
512 function findById(dbase, id){
\r
513 for (var i in dbase) {
\r
514 if (id == dbase[i]['id']) {
\r
521 function findByName(dbase, name){
\r
522 for (var i in dbase) {
\r
523 if (name == dbase[i]['CategoryName']) {
\r
533 * order of %s args: Service name, method name, parameter name
\r
536 missingType : '%s%s : Type is missing',
\r
537 badType : '%s%s : Type is invalid',
\r
538 missingData : '%s%s : Type or Data is missing',
\r
539 missingId : '%s%s : Id is missing',
\r
540 invalidId : '%s%s : id is invalid',
\r
541 missingLandmarkName : '%s%s : Landmrak name Missing',
\r
542 missingCategoryName : '%s%s : CategoryName is missing',
\r
543 missingSourceFile : '%s%s : Import Source Filename is Missing',
\r
544 missingMimeType : '%s%s : MIME type for source file is Missing',
\r
545 missingDestFile : '%s%s : DestinationFile is missing',
\r
546 invalidOpType : '%s%s : OperationType is invalid',
\r
547 missingIdList : '%s%s : Id list is Missing',
\r
548 missingTID : '%s%s : TransactionID is missing',
\r
549 invalidMime : '%s%s : MimeType is missing',
\r