Wikipedia/preview/script/lib/sapi/Messaging.js
changeset 20 918767a9c8d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wikipedia/preview/script/lib/sapi/Messaging.js	Tue Mar 09 10:34:58 2010 +0000
@@ -0,0 +1,366 @@
+/**
+ * Messaging.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+  
+(function(){
+	
+	var provider = 'Service.Messaging' ,
+		Interface = 'IMessaging';
+		
+	/**
+	 * Messaging service
+	 */
+	var MessagingService = function(){
+		this.GetList			 	= __GetList;
+		this.Send 					= __Send;
+		this.RegisterNotification	= __RegisterNotification;
+		this.CancelNotification 	= __CancelNotification;
+		this.ChangeStatus 			= __ChangeStatus;
+		this.Delete					= __Delete;
+		this.Cancel 				= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new MessagingService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * Messaging: GetList
+	 * @param {Object} criteria
+	 */
+	function __GetList(criteria){
+
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+	
+		if (!criteria.Type)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^Inbox$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+	
+		var returnValue = [], 
+			match = null,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+		// filter by MessageId
+		if (filter && filter.MessageId) {
+			returnValue = findByKey(DBase.Inbox, filter.MessageId, 'MessageId'); 
+			if (returnValue.length == 0)
+				return error(device.implementation.ERR_NOT_FOUND);
+		}
+		// return all messages
+		else {
+			returnValue = DBase.Inbox;
+		}
+
+		// unsupported filters 
+		if (filter 
+			&& (match = context.keys(filter).join().match(/MessageTypeList|SenderList|Subject|StartDate|EndDate/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));
+	}
+			
+	/**
+	 * Messaging: Send
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Send(criteria, callback){
+
+		if ((result = validator.apply('Send', arguments)) !== false)
+			return result; 
+
+		if (!criteria.MessageType)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingMessageType);
+			
+		if (!/^(SMS|MMS)$/i.test(criteria.MessageType))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badMessageType);
+
+		if (!criteria.To)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTo);
+		
+		// async call?
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Send : message sent!').arg(provider));
+
+		// return success
+		return error(device.implementation.ERR_SUCCESS);
+	}
+			
+
+	/**
+	 * Messaging: RegisterNotification
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (mandatory)
+	 */
+	function __RegisterNotification(criteria, callback){
+
+		if ((result = validator.apply('RegisterNotification', arguments)) !== false)
+			return result; 
+
+		// callback is mandatory
+		if (typeof callback != 'function')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badAsync);
+		
+		// continue validation after callback check		
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+		
+		if (!/^NewMessage$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var eventType =  'NewMessage';
+
+		// check for multiple registration
+		if (context.hasListener(provider, eventType))
+			return error(device.implementation.ERR_ENTRY_EXISTS);
+				
+		// process notify
+		return context.addListener(provider, eventType, criteria, callback, notifyHandler);
+	}
+			
+	function notifyHandler(transactionID, criteria, callback, data){
+		
+		var result,
+			eventCode = {completed:2, error:4, progress:9},
+			code = eventCode.progress;
+		try{
+			DBase = context.getData(provider);
+			
+			// make new message
+			var now = new Date();
+			var message = {
+			 	"MessageType": "SMS",
+				"Sender": "0435445454",
+				"Subject": "new message",
+				"Time": _t("%s, %s").arg(now.toString().substr(0,3), now.toLocaleString()),
+				"Priority": "Medium",
+				"Attachment": false,
+				"Unread": true,
+				"MessageId": context.getUniqueID(),
+				"BodyText": "My hovercraft is full of eels!"
+			};
+			
+			// extend with optional data
+			data = typeof data=='object' && !(data instanceof Array) ? data : {};
+			var returnValue = context.extend(message, data);
+
+			result = context.Result(returnValue);
+			
+			/// add to top of inbox
+			DBase.Inbox.unshift(message);
+		} 
+		catch(e){
+			code = eventCode.error;
+		}
+		callback(transactionID, code, result);
+	}
+	
+	/**
+	 * Messaging: CancelNotification
+	 * @param {Object} criteria
+	 */
+	function __CancelNotification(criteria){
+
+		if ((result = validator.apply('CancelNotification', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^NewMessage$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var eventType = 'NewMessage';
+		context.removeListener(provider, eventType);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+			
+			
+	/**
+	 * Messaging: ChangeStatus
+	 * @param {Object} criteria
+	 */
+	function __ChangeStatus(criteria){
+
+		if ((result = validator.apply('ChangeStatus', arguments)) !== false)
+			return result; 
+
+		if (!criteria.MessageId)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing ,'MessageId');
+			
+		if (typeof criteria.MessageId != 'number')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badMessageIdType);
+			
+		if (!criteria.Status)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing ,'Status');
+
+		if (!/^(Read|Unread|Replied|Forwarded)$/i.test(criteria.Status))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badStatus);
+	
+		// check if a callback was provided
+		if (arguments.length > 1)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badAsync2);
+			
+		DBase = context.getData(provider);
+
+		var i,item, found = false;
+		for (i in DBase.Inbox) {
+			item = DBase.Inbox[i];
+			if (criteria.MessageId == item.MessageId) {
+				item.Unread = /Unread/i.test(criteria.Status);
+				found = true;
+			}
+		}
+		if (!found)
+			return error(device.implementation.ERR_NOT_FOUND);
+
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+						
+	/**
+	 * Messaging: Delete
+	 * @param {Object} criteria
+	 */
+	function __Delete(criteria){
+		
+		if ((result = validator.apply('Delete', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.MessageId == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMessageId);
+
+		if (typeof criteria.MessageId != 'number')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badMessageIdType);
+					
+		if (criteria.MessageId < 0)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badMessageId);
+			
+		DBase = context.getData(provider);
+
+		var i,item, found = false;
+		for (i in DBase.Inbox) {
+			item = DBase.Inbox[i];
+			if (criteria.MessageId == item.MessageId) {
+				DBase.Inbox.splice(i, 1);
+				found = true;
+			}
+		}
+		if (!found)
+			return error(device.implementation.ERR_NOT_FOUND);
+			
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+			
+
+	/**
+	 * Messaging: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'TransactionID');
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['Messaging',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, 
+				method == 'Send' 
+				? msg.missingMessageType 
+				: (/ChangeStatus|Delete/.test(method) 
+					? msg.missingMessageId 
+					: msg.missingType) );
+			
+		return failed;
+	}
+
+
+	function findByKey(dbase, value, key){
+		var result = [];
+		for (var i in dbase) {
+			if (value == dbase[i][key]) {
+				result.push(dbase[i]);
+			}
+		}
+		return result;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		missingType		: '%s:%s:Type Missing',
+		badType			: '%s:%s:Type Value Incorrect',
+		missingTo		: '%s:%s:To Missing',
+		badTo			: '%s:%s:To Value Incorrect',
+		missingMessageType	: '%s:%s:MessageType Missing',
+		badMessageType	: '%s:%s:MessageType Value Incorrect',
+		badAsync		: '%s:%s:Synchronous Operation not supported',
+		badAsync2		: '%s:%s:Asynchronous Operation not supported',
+		missingMessageId	: '%s:%s:MessageId Missing',
+		badMessageIdType: '%s:%s:MessageId Type Invalid',
+		badMessageId	: '%s:%s:MessageId Value Incorrect',
+		badStatus		: '%s:%s:Status Value Incorrect',
+
+		is_missing		: '%s:%s:%s Missing',
+		is_invalid		: '%s:%s:%s Value Incorrect'
+	};
+		
+
+}) ()
+