Wikipedia/preview/script/lib/sapi/SysInfo.js
changeset 20 918767a9c8d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wikipedia/preview/script/lib/sapi/SysInfo.js	Tue Mar 09 10:34:58 2010 +0000
@@ -0,0 +1,398 @@
+/**
+ * SysInfo.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.SysInfo' ,
+		Interface = 'ISysInfo';
+
+	var supportedEntitiesAndKeys = {
+		"battery":{
+			"batterystrength":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"chargingstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true}
+		},
+		"connectivity":{
+			"bluetooth":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"infrared":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"activeconnections":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":false},
+			"connectionstatus":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"wlanmacaddress":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"device":{
+			"firmwareversion":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"platformversion":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"producttype":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"manufacturer":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"machineid":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"phonemodel":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"imei":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"display":{
+			"brightness":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"screensavertimeout":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"userinactivity":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"keyguardtime":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"autolocktime":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"autolockstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"wallpaper":{"GetInfo":false,"SetInfo":true,"GetNotification":false,"GetInfoModeSync":false,"InputDataType":"string"},
+			"lighttimeout":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"displayresolution":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"displayorientation":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"features":{
+			"bluetooth":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"infrared":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"camera":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"memorycard":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"fmradio":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"qwerty":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"wlan":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"usb":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"pen":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"led":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"coverui":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"sidevolumekeys":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"vibra":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"general":{
+			"accessorystatus":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"connectedaccessories":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"inputlanguage":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
+			"supportedlanguages":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"predictivetext":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
+			"vibraactive":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
+			"availableusbmodes":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"activeusbmode":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"flipstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"gripstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			
+		},
+      	"memory":{
+			"driveinfo":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"listdrives":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"criticalmemory":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"memorycard":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true}
+		},
+      	"network":{
+			"signalstrength":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"registrationstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"networkmode":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"currentnetwork":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"locationarea":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"cellid":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false}
+		}
+	  };
+	  
+	/**
+	 * SysInfo service
+	 */
+	var SysInfoService = function(){
+		this.GetInfo 			= __GetInfo;
+		this.SetInfo 			= __SetInfo;
+		this.GetNotification 	= __GetNotification;
+		this.Cancel 			= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new SysInfoService() );
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null,
+		default_device = 'default';
+		
+	/**
+	 * SysInfo: GetInfo
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __GetInfo(criteria, callback){
+		var retVal = ValidateArguments("GetInfo",criteria,callback);
+		if(retVal.ErrorCode != 0)
+		{
+			return retVal;
+		}
+		//	Async call
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		DBase = context.getData(provider);
+		var returnValue = DBase;
+		returnValue = returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()];
+		returnValue.Key = criteria.Key;
+		returnValue.Entity = criteria.Entity;
+
+		if(/^Connectivity$/i.test(criteria.Entity)&& /^ActiveConnections$/i.test(criteria.Key))
+		{
+			var temp = returnValue.ConnectionList;
+			returnValue.ConnectionList = context.Iterator(temp);
+		}
+		else if(/^General$/i.test(criteria.Entity)&& /^ConnectedAccessories$/i.test(criteria.Key))
+		{
+			var temp = returnValue.AccessoryList;
+			returnValue.AccessoryList = context.Iterator(temp);			
+		}
+		else if(/^Memory$/i.test(criteria.Entity)&& /^DriveInfo$/i.test(criteria.Key))
+		{
+			try {
+				var temp = criteria.SystemData.Drive;
+				if(temp.length > 3)
+				{
+					temp = temp.substring(0,3);
+				}
+				temp= returnValue.Drive[temp.toUpperCase()];
+				if (!temp) {
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.no_msg);
+				}
+				var driveInfo = new Object();
+				driveInfo.Key = returnValue.Key;
+				driveInfo.Entity = returnValue.Entity;
+				driveInfo.DriveInfo = temp;
+				return context.Result(driveInfo);
+			}
+			catch(err)
+			{
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.no_msg);
+			}
+			
+		}
+		return context.Result(returnValue);
+	}
+			
+
+	/**
+	 * SysInfo: SetInfo
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __SetInfo(criteria, callback){
+		var retVal = ValidateArguments("SetInfo",criteria,callback);
+		if(retVal.ErrorCode != 0)
+		{
+			return retVal;
+		}
+
+		//	Current implementation support only for 'General' -> 'InputLanguage' || 'PredictiveText'
+		if (/^General$/i.test(criteria.Entity) && ( /^InputLanguage$/i.test(criteria.Key) || /^PredictiveText/i.test(criteria.Key) || /^VibraActive/i.test(criteria.Key))) {
+			//	get the DBase data
+			DBase = context.getData(provider);
+			var returnValue = DBase;
+			
+			//	Check the 'SupportedLanguages' entries for Setting the new Status
+			if (/^InputLanguage$/i.test(criteria.Key)) {
+				var found = false;
+				var languageList = returnValue['general']['supportedlanguages']['LanguageList'];
+				for (var key in languageList) {
+					if (languageList[key] == criteria.SystemData.Status) {
+						found = true;
+					}
+				}
+				//	Update the 'InputLanguage' if the value value found in the ['SupportedLanguages']
+				if (found) 
+					returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
+				else 
+					return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.not_supported);
+			}
+			else if (/^PredictiveText$/i.test(criteria.Key)) {
+				if (criteria.SystemData.Status == 0 || criteria.SystemData.Status == 1) 
+					returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
+				else 
+					return error(device.implementation.ERR_NOT_FOUND, msg.badType);
+			}
+			else if (/^VibraActive$/i.test(criteria.Key)) {
+				if (criteria.SystemData.Status == 0 || criteria.SystemData.Status == 1) 
+					returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
+			}
+			else {
+				return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.not_supported);
+			}
+		}
+		else if(/^Display/i.test(criteria.Entity) && /^Wallpaper/i.test(criteria.Key)) {
+			if(typeof criteria.SystemData.StringData == 'undefined')
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
+			returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['StringData'] = criteria.SystemData.StringData;
+			return context.ErrorResult(device.implementation.ERR_SUCCESS);
+		}
+		return context.Result(result);
+	}
+			
+
+	/**
+	 * SysInfo: GetNotification
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call
+	 */
+	function __GetNotification(criteria, callback){
+		var retVal = ValidateArguments("GetNotification",criteria,callback);
+		if(retVal.ErrorCode != 0)
+		{
+			return retVal;
+		}
+		
+		// unsupported
+		if (!/^(Battery|Memory)$/i.test(criteria.Entity) ||
+			!/^(BatteryStrength|ChargingStatus|MemoryCard)$/i.test(criteria.Key)) {
+			context.notify(_t('%s:: GetNotification : entity %s, key %s not implemented in preview.').arg(provider, criteria.Entity, criteria.Key));
+			// register callback anyway so Cancel works. 
+		}
+
+		// evenType = 'entity.key'
+		var eventType = criteria.Entity+'.'+criteria.Key;
+						
+		// 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);
+			var entity = criteria.Entity.toLowerCase(),
+				key = criteria.Key.toLowerCase();
+						
+			// make a copy of return value
+			var returnValue = context.extend({},DBase[entity][key]);
+			
+			// augment with data
+			context.extend(returnValue, data);
+
+			result = context.Result(returnValue);
+		} 
+		catch(e){
+			code = eventCode.error;
+		}
+		callback(transactionID, code, result);
+	}
+		
+			
+
+	/**
+	 * SysInfo: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
+
+		var found = context.removeListener(provider, null, criteria.TransactionID);
+		if (!found)
+			return error(device.implementation.ERR_NOT_FOUND);
+		else
+			return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['SysInfo',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	function cancelRegisteredNotify(result)
+	{
+		__Cancel({'TransactionID':result.TransactionID});
+		method = 'GetNotification';
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		badType				: '%s: %s: Type is invalid',
+		badSysInfo			: '%s: %s: SysInfoName is invalid',
+		missingSysInfo		: '%s: %s: SysInfoName is missing',
+		missingTID 			: '%s: %s: Transaction ID missing',
+		not_supported 		: '%s: %s: Not Supported',
+		is_invalid			: '%s: %s: Is invalid',
+		missingArgs			: '%s: %s: SystemData Argument Missing',
+		inSufficientArgs	: '%s: %s: Insufficient Arguments to process',
+		missingInputParam	: '%s: %s: Input Parameter Missing',
+		not_supportedSyncVer: '%s: %s: Sync Version Not Supported',
+		noEntity			: '%s: %s: Entity: Input Parameter Missing',
+		noKey				: '%s: %s: Key: Input Parameter Missing',
+		IncorrectSytemData	: '%s: %s: Incorrect SystemData Type, SystemData Must be a Map',
+		callbackNotFound	: '%s: %s: Callback object not found',
+		commandNotFound		: '%s: %s: Command Not Supported',
+		unsupInterface		: 'SysInfo:Requested interface not supported by the provider',
+		no_msg				: '%s: %s: '
+	};
+
+	/**
+	 * Common validator for all functions
+	 * 	 
+	 *  
+	 * @param {arguments} function name and arguments of calling function
+	 * @return {Result} Error object
+	 */		
+	  function ValidateArguments(funName,criteria,callback)
+	  {
+	  	method = funName;
+
+		try {
+			if (/^GetNotification$/i.test(funName) && typeof callback != "function") {
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.not_supportedSyncVer);
+			}
+			
+			if (typeof criteria == "undefined" || typeof criteria.Entity == "undefined" || typeof criteria.Key == "undefined") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.inSufficientArgs);
+			}
+			
+			if (criteria.Entity == "") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.noEntity);
+			}
+			
+			if (criteria.Key == "") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.noKey);
+			}
+			
+			if (/^SetInfo$/i.test(funName)) {
+				if (typeof criteria.SystemData == "undefined" || criteria.SystemData == '') {
+					return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
+				}
+				if (typeof criteria.SystemData.StringData == "undefined" && typeof criteria.SystemData.Status == "undefined") {
+					return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
+				}
+			}
+			
+			if (typeof supportedEntitiesAndKeys[criteria.Entity.toLowerCase()] == 'undefined' || typeof supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()] == 'undefined') {
+				return error(device.implementation.ERR_NOT_FOUND, msg.no_msg);
+			}
+			
+			if (!supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()][funName]) {
+				return error(device.implementation.ERR_NOT_FOUND, msg.no_msg);
+			}
+			
+			if (funName == "GetInfo" && !supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]["GetInfoModeSync"] && typeof callback != "function") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.not_supportedSyncVer);
+			}
+			
+			return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
+		}
+		catch(err){
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+		}
+		
+	  }
+
+}) ()
\ No newline at end of file