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