Wikipedia/preview/script/lib/sapi/MediaManagement.js
changeset 20 918767a9c8d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wikipedia/preview/script/lib/sapi/MediaManagement.js	Tue Mar 09 10:34:58 2010 +0000
@@ -0,0 +1,157 @@
+/**
+ * MediaManagement.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.MediaManagement' ,
+		Interface = 'IDataSource';
+
+	/**
+	 * MediaManagement service
+	 */
+	var MediaManagementService = function(){
+		this.GetList 	= __GetList;
+		this.Cancel 	= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new MediaManagementService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * MediaManagement: GetList
+	 * @param {Object} criteria
+	 * @param {Function} callback function for async call (mandatory)
+	 */
+	function __GetList(criteria, callback, _flag){
+
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+
+		// _flag=true indicates re-called state
+		_flag = _flag || false;
+		if (!_flag) {
+
+			// callback is mandatory
+			if (typeof callback != 'function')
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badAsync);
+			
+			// continue validation after callback check		
+			if (!criteria.Filter) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'Filter');
+			
+			if (!criteria.Filter.FileType) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'FileType');
+			
+			if (!/^(Music|Sound|Image|Video|StreamingURL)$/i.test(criteria.Filter.FileType)) 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+			
+			// process callback
+			_flag = true;
+			return context.callAsync(this, arguments.callee, criteria, callback, _flag);
+		}
+		
+		var returnValue = [], 
+			match = null,
+			fileType = criteria.Filter.FileType,
+			filter = criteria.Filter;
+ 
+ 		// normalize filetype
+		fileType = fileType[0].toUpperCase() + fileType.substr(1).toLowerCase();
+		fileType = fileType.replace(/url/i, 'URL');
+		
+		DBase = context.getData(provider);
+
+		// unsupported filters 
+		if (filter 
+			&& (match = context.keys(filter).join().match(/Key|StartRange|EndRange/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));
+		}
+
+		returnValue = DBase[fileType];
+		return context.Result(context.Iterator(returnValue));
+	}
+			
+			
+	/**
+	 * MediaManagement: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !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 = ['MediaMgmt',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.is_missing, 'Type');
+		
+		if (!/^FileInfo$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.badType);
+
+		return failed;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		badType			: '%s : %s : Type not supported',
+		missingTID 		: '%s : %s : TransactionID is missing',
+		badAsync		: '%s : %s : Insufficient arguments for async request',
+		is_missing		: '%s : %s : %s is missing',
+		is_invalid		: '%s : %s : %s is invalid'
+	};
+		
+
+}) ()
+