+++ /dev/null
-/**\r
- * Landmarks.js\r
- * \r
- * Nokia Web Runtime Service API emulation \r
- * WRT v1.1\r
- * \r
- * Copyright 2009 Nokia Corporation. All rights reserved.\r
-*/\r
-\r
- \r
-(function(){\r
- \r
- var provider = 'Service.Landmarks',\r
- Interface = 'IDataSource';\r
-\r
- /**\r
- * Landmark service\r
- */\r
- var LandmarkService = function(){\r
- this.New = __New;\r
- this.GetList = __GetList;\r
- this.Add = __Add;\r
- this.Delete = __Delete; \r
- this.Import = __Import;\r
- this.Export = __Export;\r
- this.Organise = __Organise;\r
- this.Cancel = __Cancel; \r
- }\r
-\r
- device.implementation.extend(provider, Interface, new LandmarkService() );\r
-\r
-\r
- /******************************************************/ \r
- /******************************************************/ \r
- /******************************************************/ \r
-\r
- var context = device.implementation.context,\r
- _t = context._t,\r
- method = '',\r
- result = false,\r
- DBase = null;\r
-\r
- /**\r
- * Landmarks: New\r
- * @param {Object} criteria\r
- */\r
- function __New(criteria){\r
- if ((result = validator.apply('New', arguments)) !== false)\r
- return result; \r
-\r
- if (typeof criteria.Type == 'undefined') \r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
-\r
- if (!/^(Landmark|Category)$/i.test(criteria.Type)) \r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType); \r
- \r
- var returnValue;\r
- \r
- if(criteria.Type == 'Landmark')\r
- {\r
- returnValue = {\r
- 'LandmarkName' : '',\r
- 'id' : '',\r
- 'CategoryInfo' : '',\r
- 'LandmarkDesc' : '',\r
- 'LandmarkPosition' : {\r
- 'Latitude' : '',\r
- 'Longitude' : '',\r
- 'Altitude' : '',\r
- 'HAccuracy' : '',\r
- 'VAccuracy' : '',\r
- 'VAccuracy' : ''\r
- },\r
- 'CoverageRadius' : '',\r
- 'IconFile' : '',\r
- 'IconIndex' : '',\r
- 'IconMaskIndex' : '',\r
- 'LandmarkFields' : {\r
- 'Street' : '',\r
- 'BuildingName' : '',\r
- 'District' : '',\r
- 'City' : '',\r
- 'AreaCode' : '',\r
- 'Telephone' : '',\r
- 'Country' : ''\r
- }\r
- };\r
- }\r
- else //Category\r
- {\r
- returnValue = {\r
- 'CategoryName' : '',\r
- 'id' : '',\r
- 'GlobalId' : '',\r
- 'IconFile' : '',\r
- 'IconIndex' : '',\r
- 'IconMaskIndex' : ''\r
- };\r
- }\r
-\r
- return context.Result(returnValue);\r
- }\r
- \r
- /**\r
- * Landmarks: GetList\r
- * @param {Object} criteria\r
- * @param {Function} [callback] function for async call (optional)\r
- */\r
- function __GetList(criteria, callback){\r
- \r
- if ((result = validator.apply('GetList', arguments)) !== false)\r
- return result; \r
-\r
- if (typeof criteria.Type == 'undefined') \r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
-\r
- if (!/^(Landmark|Category|Database)$/i.test(criteria.Type)) \r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
-\r
- if (criteria.Filter)\r
- context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));\r
-\r
- if(criteria.Sort)\r
- context.notify(_t('%s:: GetList : Sort is not implemented in preview').arg(provider));\r
-\r
- if (typeof callback == 'function') {\r
- return context.callAsync(this, arguments.callee, criteria, callback);\r
- }\r
- \r
- var returnValue = [], \r
- match = null,\r
- filter = criteria.Filter || null;\r
- \r
- DBase = context.getData(provider);\r
-\r
-\r
- if (/Database/i.test(criteria.Type)) { // Type = Database\r
- \r
- returnValue = context.Iterator( DBase.Database || [] );\r
- \r
- } else if (/Landmark/i.test(criteria.Type)){ // Type = Landmark\r
- \r
- returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
- \r
- } else { // Type = Category\r
- \r
- // @todo: apply filter criteria\r
- returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
- }\r
- return context.Result(returnValue);\r
- }\r
-\r
- /**\r
- * Landmarks: Add\r
- * @param {Object} criteria\r
- */\r
- function __Add(criteria){\r
- \r
- if ((result = validator.apply('Add', arguments)) !== false)\r
- return result; \r
-\r
- if (!/^(Landmark|Category)$/i.test(criteria.Type))\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
-\r
-\r
- var Data = criteria.Data || false; \r
- if(!Data){\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData);\r
- }\r
-\r
- DBase = context.getData(provider);\r
- \r
- // unsupported! \r
- if (Data.DatabaseURI) {\r
- context.notify(_t('%s:: Add : Data.DatabaseURI not implemented in preview').arg(provider));\r
- }\r
- \r
- var item;\r
- \r
- // Type = Landmark\r
- if (/Landmark/i.test(criteria.Type)){\r
-\r
- if (!Data.LandmarkName)\r
- Data.LandmarkName="";\r
- \r
- var landmarkPos = Data.LandmarkPosition;\r
- if (typeof landmarkPos != 'undefined') {\r
- if ((typeof landmarkPos.Latitude == 'undefined' || typeof landmarkPos.Latitude != 'number') &&\r
- (typeof landmarkPos.Longitude == 'undefined' || typeof landmarkPos.Longitude != 'number') &&\r
- (typeof landmarkPos.Altitude == 'undefined' || typeof landmarkPos.Altitude != 'number') &&\r
- (typeof landmarkPos.HAccuracy == 'undefined' || typeof landmarkPos.HAccuracy != 'number') &&\r
- (typeof landmarkPos.VAccuracy == 'undefined' || typeof landmarkPos.VAccuracy != 'number')) {\r
- \r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);\r
- }\r
- }\r
- // update\r
- if (typeof Data.id != 'undefined') {\r
- if(typeof Data.id != 'string')\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
- \r
- var retIndex = findById(DBase.Landmark, Data.id); \r
- if (retIndex == -1)\r
- return error(device.implementation.ERR_NOT_FOUND);\r
- DBase.Landmark[retIndex] = Data;\r
- item = Data;\r
- }\r
- // new\r
- else {\r
- item = context.extend({}, Data); \r
- item.id = String(context.getUniqueID());\r
- DBase.Landmark.push(item);\r
- }\r
- } else { // Type = Category\r
-// alert(typeof Data.CategoryName);\r
-\r
- //alert("Data.id : "+Data.id);\r
- // update\r
- if (typeof Data.id != 'undefined') {\r
- if(typeof Data.id != 'string')\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
- \r
- var retIndex = findById(DBase.Category, Data.id); \r
- if (retIndex == -1)\r
- return error(device.implementation.ERR_NOT_FOUND);\r
-\r
- DBase.Category[retIndex] = Data; \r
- item = Data;\r
- }\r
- // new\r
- else {\r
- if (typeof Data.CategoryName == 'undefined')\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingCategoryName); \r
- \r
- if(typeof Data.CategoryName != 'string' || Data.CategoryName.length <= 0)\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);\r
-\r
- var retIndex = findByName(DBase.Category, Data.CategoryName); \r
- if (retIndex != -1)\r
- return error(device.implementation.ERR_ENTRY_EXISTS);\r
- \r
- item = context.extend({}, Data); \r
- item.id = String(context.getUniqueID());\r
- DBase.Category.push(item);\r
- }\r
- } \r
- // return success\r
- return context.Result(item.id, device.implementation.ERR_SUCCESS);\r
- }\r
- \r
- /**\r
- * Landmarks: Delete\r
- * @param {Object} criteria\r
- */\r
- function __Delete(criteria){\r
-\r
- if ((result = validator.apply('Delete', arguments)) !== false)\r
- return result; \r
-\r
- if (!/^(Landmark|Category)$/i.test(criteria.Type))\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
-\r
- var Data = criteria.Data || false; \r
- if(!Data){\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
- }\r
-\r
- if (typeof Data.id == 'undefined') {\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);\r
- }\r
-\r
- if (typeof Data.id != 'undefined' && typeof Data.id != 'string') {\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
- }\r
- if(Data.id.length <= 0 )\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);\r
- \r
- DBase = context.getData(provider);\r
- \r
- var type = criteria.Type;\r
-\r
- // unsupported! \r
- if (Data.DBUri) {\r
- context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));\r
- }\r
-\r
- // for both Landmark & Category:\r
- var i,item;\r
-\r
- for (i in DBase[type]) {\r
- item = DBase[type][i];\r
- if (Data.id == item.id) {\r
- DBase[type].splice(i, 1);\r
- }\r
- }\r
-\r
- // return success\r
- return error(device.implementation.ERR_SUCCESS); \r
- }\r
- \r
- /**\r
- * Landmarks: Import\r
- * @param {Object} criteria\r
- */\r
- function __Import(criteria){\r
- \r
- if ((result = validator.apply('Import', arguments)) !== false)\r
- return result; \r
-\r
- if (!/^(Landmark)$/i.test(criteria.Type))\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
-\r
- context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));\r
-\r
- var Data = criteria.Data || false; \r
- if(!Data)\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
-\r
- if (!Data.SourceFile)\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);\r
-\r
- if (!Data.MimeType)\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);\r
-\r
- if (!/^(application\/vnd.nokia.landmarkcollection\+xml|application\/vnd.nokia.landmark\+wbxml)$/i.test(Data.MimeType))\r
- return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.invalidMime);\r
-\r
- return error(device.implementation.ERR_SUCCESS); \r
- }\r
- \r
-\r
- /**\r
- * Landmarks: Export\r
- * @param {Object} criteria\r
- */\r
- function __Export(criteria){\r
-\r
- if ((result = validator.apply('Export', arguments)) !== false)\r
- return result; \r
-\r
- context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));\r
- if (!/^(Landmark)$/i.test(criteria.Type))\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
-\r
- var Data = criteria.Data || false; \r
- if(!Data){\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
- }\r
-\r
- if (!Data.DestinationFile)\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestFile);\r
- \r
- if (!Data.MimeType)\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);\r
-\r
- if (!Data.IdList)\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);\r
-\r
- return error(device.implementation.ERR_SUCCESS); \r
- }\r
- \r
-\r
- /**\r
- * Landmarks: Organise\r
- * @param {Object} criteria\r
- */\r
- function __Organise(criteria){\r
-\r
- if ((result = validator.apply('Organise', arguments)) !== false)\r
- return result; \r
-\r
- if (!/^(Landmark)$/i.test(criteria.Type))\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);\r
-\r
- var Data = criteria.Data || false; \r
- if(!Data){\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);\r
- }\r
-\r
- if (!Data.id || Data.id == "")\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);\r
- \r
- DBase = context.getData(provider);\r
- var categories = DBase['Category'];\r
- var landmarks = DBase['Landmark'];\r
- var found = false;\r
- \r
- \r
- for(var i=0;i<categories.length;i++)\r
- {\r
- var category = categories[i];\r
- if (category.id == Data.id) {\r
- found = true;\r
- break;\r
- }\r
- }\r
- if(!found)\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
-\r
- try{\r
- if(!Data.IdList || Data.IdList.length <=0)\r
- {\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
- }\r
- }catch(e){\r
- return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);\r
- }\r
- \r
- if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))\r
- return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidOpType);\r
- \r
- context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));\r
- if(/^Associate$/i.test(criteria.OperationType))\r
- {\r
- for(var i=0;i<landmarks.length;i++)\r
- {\r
- for(var j=0;j<Data.IdList.length;j++)\r
- {\r
- if(landmarks[i] == Data.IdList[j])\r
- {\r
- if(!landmarks[i].CategoryInfo)\r
- {\r
- landmarks[i].CategoryInfo = new Array();\r
- landmarks[i].CategoryInfo.push(Data.id); \r
- }\r
- else{\r
- var landmark = landmarks[i];\r
- var found = false;\r
- for(var k=0;k<landmark.CategoryInfo.length;k++)\r
- {\r
- if(landmark.CategoryInfo[k] == Data.id)\r
- found = true;\r
- }\r
- if(!found)\r
- landmark.CategoryInfo.push(Data.id);\r
- }\r
- \r
- }\r
- }\r
- }\r
- }\r
- else\r
- {\r
- for(var i=0;i<landmarks.length;i++)\r
- {\r
- for(var j=0;j<Data.IdList.length;j++)\r
- {\r
- if(landmarks[i] == Data.IdList[j] && landmarks[i].CategoryInfo != undefined)\r
- {\r
- var landmark = landmarks[i];\r
- for(var k=0;k<landmark.CategoryInfo.length;k++)\r
- {\r
- if(landmark.CategoryInfo[k] == Data.id)\r
- landmark.CategoryInfo.splice(k,1);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- return error(device.implementation.ERR_SUCCESS); \r
- }\r
- \r
-\r
- /**\r
- * Landmarks: Cancel\r
- * @param {Object} criteria\r
- */\r
- function __Cancel(criteria){\r
- method = 'Cancel';\r
- \r
- if ((result = validator.apply('Cancel', arguments)) !== false)\r
- return result; \r
- \r
- if (!criteria.TransactionID)\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);\r
- \r
- clearTimeout(criteria.TransactionID);\r
- return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
- }\r
-\r
-\r
- \r
- /*******************************\r
- * helper functions\r
- *******************************/\r
- function error(code, msg /*, args...*/){\r
-\r
- var args = ['Landmarks',method].concat([].slice.call(arguments,2));\r
- msg = msg ? _t().arg.apply(msg,args) : undefined;\r
- return context.ErrorResult(code, msg);\r
- }\r
-\r
- /**\r
- * validate common input arguments\r
- * 'this' is string (object) name of calling function\r
- * \r
- * @param {arguments} arguments of calling function\r
- * @return {Result} Result object if error, false if no error.\r
- */\r
- function validator() {\r
- method = ''+this;\r
- var failed = false,\r
- criteria = arguments[0] || false;\r
- \r
- if (!criteria || typeof criteria != 'object')\r
- return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
-\r
- return failed;\r
- }\r
- \r
- function findById(dbase, id){\r
- for (var i in dbase) {\r
- if (id == dbase[i]['id']) {\r
- return i;\r
- }\r
- }\r
- return -1;\r
- } \r
-\r
- function findByName(dbase, name){\r
- for (var i in dbase) {\r
- if (name == dbase[i]['CategoryName']) {\r
- return i;\r
- }\r
- }\r
- return -1;\r
- } \r
-\r
-\r
- /** \r
- * error messages\r
- * order of %s args: Service name, method name, parameter name \r
- */\r
- var msg = {\r
- missingType : '%s%s : Type is missing',\r
- badType : '%s%s : Type is invalid', \r
- missingData : '%s%s : Type or Data is missing',\r
- missingId : '%s%s : Id is missing',\r
- invalidId : '%s%s : id is invalid',\r
- missingLandmarkName : '%s%s : Landmrak name Missing',\r
- missingCategoryName : '%s%s : CategoryName is missing',\r
- missingSourceFile : '%s%s : Import Source Filename is Missing',\r
- missingMimeType : '%s%s : MIME type for source file is Missing',\r
- missingDestFile : '%s%s : DestinationFile is missing',\r
- invalidOpType : '%s%s : OperationType is invalid',\r
- missingIdList : '%s%s : Id list is Missing',\r
- missingTID : '%s%s : TransactionID is missing',\r
- invalidMime : '%s%s : MimeType is missing',\r
- msgNoMsg : '',\r
- \r
- };\r
- \r
-\r
-}) ()\r
-\r