serviceproviders/jsapi/platformservices/src/framework.js
changeset 38 02682e02e51f
child 55 eaf3908907b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/jsapi/platformservices/src/framework.js	Mon Jan 18 21:02:57 2010 +0200
@@ -0,0 +1,556 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Defination of class CCalendarInterface
+*
+*/
+
+
+var __device_debug_on__ = true;
+
+var event_completed = 2;
+var event_cancelled = 3;
+
+var __Service_Interface_Ver=1.0;
+
+
+var MapErrorCode = {1016:100,1012:101,1010:102,1009:103,1005:104,1000:105,1011:106,1007:107,1003:1,1002:2, 1004:3};
+
+function __device_debug(text){
+  //if(__device_debug_on__) alert(text);
+}
+
+function __device_handle_exception(e, text){
+	__device_debug(text);
+	throw(e);
+}
+
+function __device_typeof(value)
+{
+	// First check to see if the value is undefined.
+	if (value == undefined) {
+        return "undefined";
+    }
+	// Check for objects created with the "new" keyword.
+	if (value instanceof Object) {
+		// Check whether it's a string object.
+		if (value instanceof String) {
+			return "String";
+		}
+		// Check whether it's an array object/array literal.
+		else 
+			if (value instanceof Array) {
+				return "Array";
+			}
+	}
+	// dealing with a literal.
+		if (typeof value) {
+			if (typeof value == "object") {
+				if (typeof value == "object" && !value) {
+					return "null";
+				}
+			}
+           // if not null check for other types
+			
+				// Check if it's a string literal.
+			else if (typeof value == "string") {
+					return "string";
+				}
+		}	 
+}
+
+if ((typeof nokia) == 'undefined') {
+	nokia = {};
+	nokia.device = {};
+}
+else {
+    if ((typeof nokia.device) != 'undefined') {
+		nokia.device = {};
+    }
+	else{
+		throw ("nokia.device already defined");
+	} 
+}
+
+nokia.device = {
+    load: __device_service_load,
+    listInterfaces: __device_service_interfaces,
+	getSystemProperties: __device_getSystemProperties,
+	getLibraryVersion: __device_getLibraryVersion,
+    version: 2.0
+};
+
+function __device_getLibraryVersion(){
+	return 2.0;
+}
+
+function __device_getSystemProperties(){
+	return {
+		uriPath:{
+			// maximum limitation is 255 charectors
+			max:255
+		}
+	};
+}
+// Configure the services offered.
+
+var __device_services_inited = false;
+
+var __device_services = [
+
+  // For now, the only service is the base "device"" service
+  {
+    "name":"device",
+    "version": 2.0, 
+    "interfaces": []
+  }
+];
+
+// Initialize the configured services.
+
+function __device_services_init(){
+  if(__device_services_inited){
+    return;
+  }
+  __device_services_inited = true;
+  
+  try {
+  	var so_SrvReg = device.getServiceObject("Service.ServiceRegistry", "IService");
+	var filter = {ServiceName:"Service.Calendar", InterfaceName:"IDataSource"};  
+	
+	var returnVal = so_SrvReg.IService.GetList(filter);
+		if (returnVal.ErrorCode == 0)	{
+			var intf_iterator = returnVal.ReturnValue;
+			if(intf_iterator)	{
+				var intf = intf_iterator.getNext();
+				if(intf){
+					var versionList = intf.VersionList;
+					var index;
+					for(index in versionList){
+						if(versionList[index] > __Service_Interface_Ver){						
+							__Service_Interface_Ver = versionList[index];
+						}
+					}
+				}
+			}
+			intf_iterator.close();
+		}
+	so_SrvReg.close();
+  }catch(e){
+  	// service registry not available default version to 1.0
+//	alert('in catch'+e);
+	__Service_Interface_Ver = 1.0;
+  }
+	
+ 
+
+  // Get the service-specific service entries. Note that these
+  // need to be individually wrapped by try/catch blocks so that the
+  // interpreter gracefully handles missing services. 
+
+  try {
+    __device_services[0].interfaces.push(__device_geolocation_service_entry);
+  }catch (e){
+    __device_debug("Missing library implementation: " + e);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_camera_service_entry);
+  }catch (e1){
+    __device_debug("Missing library implementation: " + e1);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_media_service_entry);
+  }catch (e2){
+//    __device_debug("Missing library implementation: " + e2);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_contacts_service_entry);
+  }catch (e3){
+//    __device_debug("Missing library implementation: " + e3);
+  }
+ try {
+    __device_services[0].interfaces.push(__device_messaging_service_entry);
+  }catch (e4){
+      __device_debug("Missing library implementation: " + e4);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_calendar_service_entry);
+  }catch (e5){
+      __device_debug("Missing library implementation: " + e5);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_landmarks_service_entry);
+  }catch (e6){
+      __device_debug("Missing library implementation: " + e6);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_commlog_service_entry);
+  }catch (e7){
+      __device_debug("Missing library implementation: " + e7);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_sysinfo_service_entry);
+  }catch (e8){
+      __device_debug("Missing library implementation: " + e8);
+  }
+  try {
+    __device_services[0].interfaces.push(__device_sensors_service_entry);
+  }catch (e9){
+      __device_debug("Missing library implementation: " + e9);
+  }
+
+}
+
+function __device_get_implementation(i){
+  //__device_debug("get_implementation: " + i);
+  return  new i.proto(new(i.providers[0].instance));
+}
+
+function __device_get_descriptor(i){
+  //__device_debug("get_descriptor: " + i);
+  return new i.descriptor(new(i.providers[0].descriptor));
+}
+
+function __device_get_interface(s, interfaceName, version){
+
+    // Find first match of name and version
+    var i = s.interfaces;
+	for (var d in i){
+		if(i[d].name == null){
+		  __device_update_descriptor(i[d]);
+		}
+		
+		if(i[d].name == undefined){
+		  continue;
+		}
+		
+		if (i[d].name == interfaceName){
+		// Match version if specified
+			if (version) {
+				if (i[d].version >= version) {
+					return __device_get_implementation(i[d]);
+				}
+			}else{
+				return __device_get_implementation(i[d]);
+			}
+	    }
+	}
+	return null;
+}
+
+// Implemention of the load method
+
+function __device_service_load(interfaceName, version){
+    var error = new DeviceException('dummy',0);
+	if(interfaceName){
+        if(typeof interfaceName != 'string'){
+            throw new DeviceException(error.INVALID_ARG_ERR, 'nokia.device.load:Invalid type interfaceName');
+        }
+    }else{
+        throw new DeviceException(error.MISSING_ARG_ERR, 'nokia.device.load:interfaceName param expected');
+    }
+    if(version){
+        if(typeof version != 'number'){
+            throw new DeviceException(error.INVALID_ARG_ERR, 'nokia.device.load:Invalid type version');
+        }
+    }
+
+    __device_services_init();
+  
+	for(var s in __device_services){
+	  //__device_debug("service_load: " + s + ":" +  __device_services[s].name + ": " + interfaceName);
+	  var i = __device_get_interface(__device_services[s], interfaceName, version);
+	  if (i != null){
+	    return i;
+	  }
+	}
+    return null;
+}
+
+// Lazily fill in the descriptor table
+
+function __device_update_descriptor(i){
+  var d = __device_get_descriptor(i);
+  i.name = d.interfaceName;
+  i.version = d.version;  
+}
+// Get an array of interface descriptors for a service
+
+function __device_interface_list(s){
+  var retval = new Array();
+  for(var i in s.interfaces){
+    if(s.interfaces[i].name == null){
+      __device_update_descriptor(s.interfaces[i]);
+    }
+    if(s.interfaces[i].name == undefined){
+      continue;
+    }
+    retval[i] = new Object();
+    retval[i].name = s.interfaces[i].name;
+    retval[i].version = s.interfaces[i].version;
+  }  
+  return retval;
+}
+
+// Get a service description
+
+function __device_service_descriptor(s){
+  this.name = s.name;
+  this.version = s.version;
+  this.interfaces = __device_interface_list(s);
+  this.toString = __device_service_descriptor_to_string;
+}
+
+function __device_service_descriptor_to_string(){
+  var is = "\nInterfaces(s): ";
+
+  for (i in this.interfaces){
+    is += "\n" + this.interfaces[i].name + " " + this.interfaces[0].version;
+  }
+  return ("Service: " + this.name + is);
+}
+
+// Implement the listInterfaces method
+    
+function __device_service_interfaces(){
+  __device_services_init();
+
+  for (var s in __device_services){
+      var intfs = __device_interface_list(__device_services[s]);
+	  // create interator
+	  return new __FWIter(intfs);
+  }
+  return null;
+}
+
+
+function __FWIter(arr)
+{
+    this._arr = arr;
+	this._pos = 0;
+	this._valid = true;
+}
+
+__FWIter.prototype.hasNext = function() {
+    return (this._valid && this._pos < this._arr.length);
+}
+
+__FWIter.prototype.next = function() {
+    if(this._valid && (this._pos < this._arr.length)){
+		return this._arr[this._pos++];
+	}
+	else{
+		return null;
+	}
+}
+
+__FWIter.prototype.close = function(){
+    delete this._arr;
+	this._valid = false;
+}
+
+function modifyObjectBaseProp(obj){
+  for (pro in obj) {
+    if(typeof obj[pro] == "function" )
+      obj[pro] = 0;
+    }
+}
+
+//TBD: Get rid of this global, use closures instead
+//Functions for  Handling Async API's use this variable
+var glob_obj = null;
+var temp_scb = null;
+var temp_ecb = null;
+ 
+glob_obj = new Object();
+
+glob_obj.glob_cb_arr = new Array();
+glob_obj.addToGlobalArray = addToGlobalArray;
+glob_obj.removeFromArray = removeFromArray;
+glob_obj.getFromArray = getFromArray;
+     
+DeviceAPIError.prototype = new Error(); //inheritance occurs here
+DeviceAPIError.prototype.constructor = DeviceAPIError; //If this not present then, it uses default constructor of Error
+
+//constructor for DeviceAPIError.
+function DeviceAPIError(code,message) 
+{
+	this.toString = concatenate;
+	this.code = code;
+	this.name = "DeviceError";//we can even overwrite default name "Error"
+	this.message=message; 
+	
+        this.MISSING_ARG_ERR            = 1;
+        this.INVALID_ARG_ERR            = 2;
+        this.NOT_SUPPORTED_ERR          = 3;
+        this.TIMEOUT_ERR                = 100;
+        this.DATA_NOT_FOUND_ERR         = 101;
+        this.DATA_ALREADY_EXISTS_ERR    = 102;
+        this.SERVICE_BUSY_ERR           = 103;
+        this.SERVICE_IN_USE_ERR         = 104;
+        this.DATA_OUT_OF_RANGE_ERR      = 105;
+        this.NOT_ALLOWED_ERR            = 106;
+        this.SIZE_EXCEEDED_ERR          = 107;
+        this.INVALID_URI_ERR            = 108;
+        this.URI_NOT_FOUND_ERR          = 109;
+        this.URI_ALREADY_EXISTS_ERR     = 110;
+        this.NO_MEMORY_ERR              = 111;  
+}
+
+DeviceException.prototype = new Error(); //inheritance occurs here
+DeviceException.prototype.constructor = DeviceException; //If this not present then, it uses default constructor of Error
+
+//constructor for DeviceException.
+function DeviceException(code,message) 
+{
+    this.toString = concatenate;
+    this.code = code;
+    this.name = "DeviceException";//we can even overwrite default name "Error"
+    this.message=message; 
+    
+        this.MISSING_ARG_ERR            = 1;
+        this.INVALID_ARG_ERR            = 2;
+        this.NOT_SUPPORTED_ERR          = 3;
+        this.TIMEOUT_ERR                = 100;
+        this.DATA_NOT_FOUND_ERR         = 101;
+        this.DATA_ALREADY_EXISTS_ERR    = 102;
+        this.SERVICE_BUSY_ERR           = 103;
+        this.SERVICE_IN_USE_ERR         = 104;
+        this.DATA_OUT_OF_RANGE_ERR      = 105;
+        this.NOT_ALLOWED_ERR            = 106;
+        this.SIZE_EXCEEDED_ERR          = 107;
+        this.INVALID_URI_ERR            = 108;
+        this.URI_NOT_FOUND_ERR          = 109;
+        this.URI_ALREADY_EXISTS_ERR     = 110;
+        this.NO_MEMORY_ERR              = 111;  
+}
+
+
+function concatenate()
+{
+    return (this.name+': errcode: '+this.code+'\nline: '+this.lineNumber+'\nfileName: '+this.fileName+'\nerrmsg: '+this.message);
+}
+
+function splitErrorMessage(errmessage)
+{
+	if(errmessage.search(/:/)!=-1)
+	{
+		if((errmessage.split(":").length)==2)
+		{
+			return errmessage.split(":")[1];
+		}
+		if((errmessage.split(":").length)>2)
+		{
+			return errmessage.split(":")[2];
+		}
+	}
+	return errmessage;
+}
+
+
+var __s60_start_and_wait_cb;
+
+function __s60_on_app_exit(){
+  widget.onshow = null;
+  if(__s60_start_and_wait_cb !== null){
+    __s60_start_and_wait_cb();
+  }
+}
+
+function __s60_on_app_start(){
+  widget.onhide = null;
+  widget.onshow = __s60_on_app_exit;
+}
+
+// This function cannot actually force JS to wait,
+// but it does supply a callback the apps can use
+// to continue processing on return from the app.
+// Apps should take care not to reinvoke this and
+// should be careful about any other processing
+// that might happen while the app is running.
+
+function __s60_start_and_wait(id, args, app_exit_cb){
+  __s60_start_and_wait_cb = app_exit_cb;
+  widget.onhide = __s60_on_app_start;
+  widget.openApplication(id, args);
+}
+
+function __s60_api_not_supported(){
+  throw(err_ServiceNotSupported);
+}
+
+function __s60_enumerate_object(object, namespace, func, param){
+   var key;
+   for (key in object) {
+   		var propname;
+   		if (namespace) {
+   			propname = namespace + "." + key;
+   		}
+   		else {
+   			propname = key;
+   		}
+   		var value = object[key];
+   		if (typeof value == "object") {
+   			__s60_enumerate_object(value, propname, func, param);
+   		}
+   		else {
+   			func(propname, value, param);
+   		}
+   }
+}
+
+
+/*
+ * Handling Async calls
+ */
+function removeFromArray(transId){
+    for (i = 0; i < (glob_obj.glob_cb_arr.length); i++) {
+        if (glob_obj.glob_cb_arr[i].transactionId == transId) {
+            glob_obj.glob_cb_arr.splice(i, 1);
+        }
+    }
+}
+
+function addToGlobalArray(transId, sCb, errCb){
+
+    var obj = new Object();
+    
+    obj.success_cb = sCb;
+    obj.transactionId = transId;
+    obj.error_cb = errCb;
+    
+    glob_obj.glob_cb_arr.push(obj);
+    
+}
+
+function getFromArray(tid){
+    var i;
+    
+    for (i = 0; i < (glob_obj.glob_cb_arr.length); i++) {
+        if (glob_obj.glob_cb_arr[i].transactionId == tid) {
+            return glob_obj.glob_cb_arr[i];
+        }
+    }
+	
+	if(temp_scb)
+	{
+		var obj = new Object();
+    
+	    obj.success_cb = temp_scb;
+	    obj.error_cb = temp_ecb;
+		
+		temp_ecb = temp_scb = null;
+		return obj;		
+	}
+    return null;
+}