org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Contact.js
changeset 37 641b65b14318
child 210 0f7abfd6ae62
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Contact.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,407 @@
+/**
+ * Contact.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.Contact' ,
+		Interface = 'IDataSource';
+
+	/**
+	 * Contact service
+	 */
+	var ContactService = function(){
+		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 ContactService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * Contact: 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 (!/^(Contact|Group|Database)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+	
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		var returnValue = [], 
+			match = null,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+		// Type = Database
+		if (/Database/i.test(criteria.Type)){
+			returnValue = DBase.Database;
+		} 
+		// Type = Group
+		else if (/Group/i.test(criteria.Type)){
+			// filter by id
+			if (filter && filter.id) {
+				returnValue = findById(DBase.Group, filter.id);
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_NOT_FOUND);
+			}
+			// return all groups 
+			else {
+				returnValue = DBase.Group;
+			}
+		}				
+		// Type = Contact
+		else if (/Contact/i.test(criteria.Type)){
+
+			// filter by id
+			if (filter && filter.id) {
+				returnValue = findById(DBase.Contact, filter.id); 
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_NOT_FOUND);
+			}
+			// return all contacts 
+			else {
+				returnValue = DBase.Contact;
+			}
+
+			// unsupported filters 
+			if (filter 
+				&& (match = context.keys(filter).join().match(/SearchVal|DBUri/ig)) ) {
+				context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
+			}
+			// unsupported sort			
+			if (criteria.Sort) { 
+				context.notify(_t('%s:: GetList : sort not implemented in preview').arg(provider));
+			}
+		}
+		return context.Result(context.Iterator(returnValue));
+	}
+			
+	/**
+	 * Contact: Add
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Add(criteria, callback){
+
+		if ((result = validator.apply('Add', arguments)) !== false)
+			return result; 
+		
+		if (!/^(Contact|Group)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		DBase = context.getData(provider);
+		var Data = criteria.Data,
+			item;
+
+		// unsupported!			
+		if (Data.DBUri) {
+			context.notify(_t('%s:: Add : Data.DBUri not implemented in preview').arg(provider));
+		}
+
+		// Type = Group
+		if (/Group/i.test(criteria.Type)){
+
+			if (!Data.GroupLabel)
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingGroupLabel);
+
+			// update
+			if (Data.id) {
+				returnValue = findById(DBase.Group, Data.id); 
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+				
+				returnValue[0].GroupLabel = Data.GroupLabel;
+				//@todo: group contents!?
+			}
+			// new
+			else {
+				item = context.extend({}, Data); 
+				item.id = String(context.getUniqueID());
+				DBase.Group.push(item);
+			}
+		} 
+		// Type = Contact
+		else {
+			// update
+			if (Data.id) {
+				returnValue = findById(DBase.Contact, Data.id); 
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+				
+				context.extend(returnValue[0], Data); 
+			}
+			// new
+			else {
+				item = context.extend({}, Data); 
+				item.id = String(context.getUniqueID());
+				DBase.Contact.push(item);
+			}
+		} 
+		// return success
+		return error(device.implementation.ERR_SUCCESS);
+	}
+			
+
+	/**
+	 * Contact: Delete
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Delete(criteria, callback){
+		
+		if ((result = validator.apply('Delete', arguments)) !== false)
+			return result; 
+
+		if (!/^(Contact|Group)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
+
+		var Data = criteria.Data;
+		if (!Data.IdList)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+		if (typeof Data.IdList != 'object')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
+		
+		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));
+		}
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		// for both Group & Contact:
+		var i,j,id,item;
+		for (j in Data.IdList) {
+			id = Data.IdList[j];
+			for (i in DBase[type]) {
+				item = DBase[type][i];
+				if (id == item.id) {
+					DBase[type].splice(i, 1);
+				}
+			}
+		}
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+			
+
+	/**
+	 * Contact: Import
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Import(criteria, callback){
+
+		if ((result = validator.apply('Import', arguments)) !== false)
+			return result; 
+
+		if (!/^(Contact)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType3);
+
+		var Data = criteria.Data;
+		if (!Data.SourceFile)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Contact: Export
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Export(criteria, callback){
+
+		if ((result = validator.apply('Export', arguments)) !== false)
+			return result; 
+
+		if (!/^(Contact)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType4);
+
+		var Data = criteria.Data;
+		if (!Data.DestinationFile)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestinationFile);
+
+		if (!Data.id)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Contact: Organise
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Organise(criteria, callback){
+
+		if ((result = validator.apply('Organise', arguments)) !== false)
+			return result; 
+
+		if (!/^(Group)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badType5);
+
+		var Data = criteria.Data;
+		if (!Data.id)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId2);
+
+		if (!Data.IdList)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+
+		if (typeof Data.IdList != 'object')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
+
+		if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badOperationType);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Contact: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingTID);
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['Contacts',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' || typeof criteria.Type == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType, method);
+
+		if (method == 'GetList') return failed;
+
+		var Data = criteria.Data || false; 
+		if (!Data)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData, method);
+		if (typeof Data != 'object')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badData);
+		 
+		return failed;
+	}
+
+
+	function findById(dbase, id){
+		var result = [];
+		for (var i in dbase) {
+			if (id == dbase[i]['id']) {
+				result.push(dbase[i]);
+			}
+		}
+		return result;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		missingType		: '%s : %s : Type is Missing',
+		badType			: '%s: %s : Invalid value for Type, Must be Contact/Group/Database',
+		badType2		: '%s : %s : Invalid Type, must be Contact/Group',
+		badType3		: '%s : %s : Invalid Type,it must be Contact',
+		badType4		: '%s : %s : Invalid Type, it must be Contact',
+		badType5		: '%s : %s : Invalid Content Type, It must be Group',
+		badOperationType: '%s : %s : Invalid Operation Type',
+		missingGroupLabel: '%s : %s : Group Label is Missing',
+		missingTID 		: 'Contact : Cancel : TransactionID is missing',	// not 'Contacts'!!
+		badAsync		: '%s : %s : Invalid async parameters',
+		missingData		: '%s : %s : %s data Missing',
+		badData			: '%s : %s : Invalid Type of Data , Map is required',
+		missingIdList	: '%s : %s : List of Ids is missing',
+		badIdList		: '%s : %s : Type of IdList is wrong, List is required',
+		missingSourceFile: '%s : %s : Import Source Filename is Missing',
+		missingDestinationFile: '%s : %s : Export Destination Filename is Missing',
+		missingId		: '%s : %s : Contact Id to be exported is missing',
+		missingId2		: '%s : %s : GroupId is missing',
+		is_missing		: '%s : %s : %s is missing',
+		is_invalid		: '%s : %s : %s is invalid'
+	};
+		
+
+}) ()
+