--- /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