Changed zouba directory heirarchy.
[ptas] / zouba / wrt / preview / script / lib / sapi / SysInfo.js
1 /**
2  * SysInfo.js
3  * 
4  * Nokia Web Runtime Service API emulation 
5  * WRT v1.1
6  * 
7  * Copyright 2009 Nokia Corporation. All rights reserved.
8 */
9
10  
11 (function(){
12         
13         var provider = 'Service.SysInfo' ,
14                 Interface = 'ISysInfo';
15
16         var supportedEntitiesAndKeys = {
17                 "battery":{
18                         "batterystrength":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
19                         "chargingstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true}
20                 },
21                 "connectivity":{
22                         "bluetooth":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
23                         "infrared":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
24                         "activeconnections":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":false},
25                         "connectionstatus":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
26                         "wlanmacaddress":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
27                 },
28         "device":{
29                         "firmwareversion":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
30                         "platformversion":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
31                         "producttype":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
32                         "manufacturer":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
33                         "machineid":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
34                         "phonemodel":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
35                         "imei":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
36                 },
37         "display":{
38                         "brightness":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
39                         "screensavertimeout":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
40                         "userinactivity":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
41                         "keyguardtime":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
42                         "autolocktime":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
43                         "autolockstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
44                         "wallpaper":{"GetInfo":false,"SetInfo":true,"GetNotification":false,"GetInfoModeSync":false,"InputDataType":"string"},
45                         "lighttimeout":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
46                         "displayresolution":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
47                         "displayorientation":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
48                 },
49         "features":{
50                         "bluetooth":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
51                         "infrared":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
52                         "camera":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
53                         "memorycard":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
54                         "fmradio":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
55                         "qwerty":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
56                         "wlan":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
57                         "usb":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
58                         "pen":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
59                         "led":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
60                         "coverui":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
61                         "sidevolumekeys":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
62                         "vibra":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
63                 },
64         "general":{
65                         "accessorystatus":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
66                         "connectedaccessories":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
67                         "inputlanguage":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
68                         "supportedlanguages":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
69                         "predictivetext":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
70                         "vibraactive":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
71                         "availableusbmodes":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
72                         "activeusbmode":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
73                         "flipstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
74                         "gripstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
75                         
76                 },
77         "memory":{
78                         "driveinfo":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
79                         "listdrives":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
80                         "criticalmemory":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
81                         "memorycard":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true}
82                 },
83         "network":{
84                         "signalstrength":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
85                         "registrationstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
86                         "networkmode":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
87                         "currentnetwork":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
88                         "locationarea":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
89                         "cellid":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false}
90                 }
91           };
92           
93         /**
94          * SysInfo service
95          */
96         var SysInfoService = function(){
97                 this.GetInfo                    = __GetInfo;
98                 this.SetInfo                    = __SetInfo;
99                 this.GetNotification    = __GetNotification;
100                 this.Cancel                     = __Cancel;
101         }
102
103         device.implementation.extend(provider, Interface, new SysInfoService() );
104
105         var     context = device.implementation.context,
106                 _t = context._t,
107                 method = '',
108                 result = false,
109                 DBase = null,
110                 default_device = 'default';
111                 
112         /**
113          * SysInfo: GetInfo
114          * @param {Object} criteria
115          * @param {function} callback function for async call (optional)
116          */
117         function __GetInfo(criteria, callback){
118                 var retVal = ValidateArguments("GetInfo",criteria,callback);
119                 if(retVal.ErrorCode != 0)
120                 {
121                         return retVal;
122                 }
123                 //      Async call
124                 if (typeof callback == 'function') {
125                         return context.callAsync(this, arguments.callee, criteria, callback);
126                 }
127
128                 DBase = context.getData(provider);
129                 var returnValue = DBase;
130                 returnValue = returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()];
131                 returnValue.Key = criteria.Key;
132                 returnValue.Entity = criteria.Entity;
133
134                 if(/^Connectivity$/i.test(criteria.Entity)&& /^ActiveConnections$/i.test(criteria.Key))
135                 {
136                         var temp = returnValue.ConnectionList;
137                         returnValue.ConnectionList = context.Iterator(temp);
138                 }
139                 else if(/^General$/i.test(criteria.Entity)&& /^ConnectedAccessories$/i.test(criteria.Key))
140                 {
141                         var temp = returnValue.AccessoryList;
142                         returnValue.AccessoryList = context.Iterator(temp);                     
143                 }
144                 else if(/^Memory$/i.test(criteria.Entity)&& /^DriveInfo$/i.test(criteria.Key))
145                 {
146                         try {
147                                 var temp = criteria.SystemData.Drive;
148                                 if(temp.length > 3)
149                                 {
150                                         temp = temp.substring(0,3);
151                                 }
152                                 temp= returnValue.Drive[temp.toUpperCase()];
153                                 if (!temp) {
154                                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.no_msg);
155                                 }
156                                 var driveInfo = new Object();
157                                 driveInfo.Key = returnValue.Key;
158                                 driveInfo.Entity = returnValue.Entity;
159                                 driveInfo.DriveInfo = temp;
160                                 return context.Result(driveInfo);
161                         }
162                         catch(err)
163                         {
164                                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.no_msg);
165                         }
166                         
167                 }
168                 return context.Result(returnValue);
169         }
170                         
171
172         /**
173          * SysInfo: SetInfo
174          * @param {Object} criteria
175          * @param {function} callback function for async call (optional)
176          */
177         function __SetInfo(criteria, callback){
178                 var retVal = ValidateArguments("SetInfo",criteria,callback);
179                 if(retVal.ErrorCode != 0)
180                 {
181                         return retVal;
182                 }
183
184                 //      Current implementation support only for 'General' -> 'InputLanguage' || 'PredictiveText'
185                 if (/^General$/i.test(criteria.Entity) && ( /^InputLanguage$/i.test(criteria.Key) || /^PredictiveText/i.test(criteria.Key) || /^VibraActive/i.test(criteria.Key))) {
186                         //      get the DBase data
187                         DBase = context.getData(provider);
188                         var returnValue = DBase;
189                         
190                         //      Check the 'SupportedLanguages' entries for Setting the new Status
191                         if (/^InputLanguage$/i.test(criteria.Key)) {
192                                 var found = false;
193                                 var languageList = returnValue['general']['supportedlanguages']['LanguageList'];
194                                 for (var key in languageList) {
195                                         if (languageList[key] == criteria.SystemData.Status) {
196                                                 found = true;
197                                         }
198                                 }
199                                 //      Update the 'InputLanguage' if the value value found in the ['SupportedLanguages']
200                                 if (found) 
201                                         returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
202                                 else 
203                                         return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.not_supported);
204                         }
205                         else if (/^PredictiveText$/i.test(criteria.Key)) {
206                                 if (criteria.SystemData.Status == 0 || criteria.SystemData.Status == 1) 
207                                         returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
208                                 else 
209                                         return error(device.implementation.ERR_NOT_FOUND, msg.badType);
210                         }
211                         else if (/^VibraActive$/i.test(criteria.Key)) {
212                                 if (criteria.SystemData.Status == 0 || criteria.SystemData.Status == 1) 
213                                         returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
214                         }
215                         else {
216                                 return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.not_supported);
217                         }
218                 }
219                 else if(/^Display/i.test(criteria.Entity) && /^Wallpaper/i.test(criteria.Key)) {
220                         if(typeof criteria.SystemData.StringData == 'undefined')
221                                 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
222                         returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['StringData'] = criteria.SystemData.StringData;
223                         return context.ErrorResult(device.implementation.ERR_SUCCESS);
224                 }
225                 return context.Result(result);
226         }
227                         
228
229         /**
230          * SysInfo: GetNotification
231          * @param {Object} criteria
232          * @param {function} callback function for async call
233          */
234         function __GetNotification(criteria, callback){
235                 var retVal = ValidateArguments("GetNotification",criteria,callback);
236                 if(retVal.ErrorCode != 0)
237                 {
238                         return retVal;
239                 }
240                 
241                 // unsupported
242                 if (!/^(Battery|Memory)$/i.test(criteria.Entity) ||
243                         !/^(BatteryStrength|ChargingStatus|MemoryCard)$/i.test(criteria.Key)) {
244                         context.notify(_t('%s:: GetNotification : entity %s, key %s not implemented in preview.').arg(provider, criteria.Entity, criteria.Key));
245                         // register callback anyway so Cancel works. 
246                 }
247
248                 // evenType = 'entity.key'
249                 var eventType = criteria.Entity+'.'+criteria.Key;
250                                                 
251                 // process notify
252                 return context.addListener(provider, eventType, criteria, callback, notifyHandler);
253         }
254                         
255         function notifyHandler(transactionID, criteria, callback, data){
256                 
257                 var result,
258                         eventCode = {completed:2, error:4, progress:9},
259                         code = eventCode.progress;
260                 try{
261                         DBase = context.getData(provider);
262                         var entity = criteria.Entity.toLowerCase(),
263                                 key = criteria.Key.toLowerCase();
264                                                 
265                         // make a copy of return value
266                         var returnValue = context.extend({},DBase[entity][key]);
267                         
268                         // augment with data
269                         context.extend(returnValue, data);
270
271                         result = context.Result(returnValue);
272                 } 
273                 catch(e){
274                         code = eventCode.error;
275                 }
276                 callback(transactionID, code, result);
277         }
278                 
279                         
280
281         /**
282          * SysInfo: Cancel
283          * @param {Object} criteria
284          */
285         function __Cancel(criteria){
286                 method = 'Cancel';
287
288                 if (!criteria || !criteria.TransactionID)
289                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
290
291                 var found = context.removeListener(provider, null, criteria.TransactionID);
292                 if (!found)
293                         return error(device.implementation.ERR_NOT_FOUND);
294                 else
295                         return context.ErrorResult(device.implementation.ERR_SUCCESS);
296         }
297
298
299         
300         /*******************************
301          * helper functions
302          *******************************/
303         
304         function error(code, msg /*, args...*/){
305
306                 var args = ['SysInfo',method].concat([].slice.call(arguments,2));
307                 msg = msg ? _t().arg.apply(msg,args) : undefined;
308                 return context.ErrorResult(code, msg);
309         }
310
311         function cancelRegisteredNotify(result)
312         {
313                 __Cancel({'TransactionID':result.TransactionID});
314                 method = 'GetNotification';
315         }
316
317         /** 
318          * error messages
319          * order of %s args: Service name, method name, parameter name 
320          */
321         var msg = {
322                 badType                         : '%s: %s: Type is invalid',
323                 badSysInfo                      : '%s: %s: SysInfoName is invalid',
324                 missingSysInfo          : '%s: %s: SysInfoName is missing',
325                 missingTID                      : '%s: %s: Transaction ID missing',
326                 not_supported           : '%s: %s: Not Supported',
327                 is_invalid                      : '%s: %s: Is invalid',
328                 missingArgs                     : '%s: %s: SystemData Argument Missing',
329                 inSufficientArgs        : '%s: %s: Insufficient Arguments to process',
330                 missingInputParam       : '%s: %s: Input Parameter Missing',
331                 not_supportedSyncVer: '%s: %s: Sync Version Not Supported',
332                 noEntity                        : '%s: %s: Entity: Input Parameter Missing',
333                 noKey                           : '%s: %s: Key: Input Parameter Missing',
334                 IncorrectSytemData      : '%s: %s: Incorrect SystemData Type, SystemData Must be a Map',
335                 callbackNotFound        : '%s: %s: Callback object not found',
336                 commandNotFound         : '%s: %s: Command Not Supported',
337                 unsupInterface          : 'SysInfo:Requested interface not supported by the provider',
338                 no_msg                          : '%s: %s: '
339         };
340
341         /**
342          * Common validator for all functions
343          *       
344          *  
345          * @param {arguments} function name and arguments of calling function
346          * @return {Result} Error object
347          */             
348           function ValidateArguments(funName,criteria,callback)
349           {
350                 method = funName;
351
352                 try {
353                         if (/^GetNotification$/i.test(funName) && typeof callback != "function") {
354                                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.not_supportedSyncVer);
355                         }
356                         
357                         if (typeof criteria == "undefined" || typeof criteria.Entity == "undefined" || typeof criteria.Key == "undefined") {
358                                 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.inSufficientArgs);
359                         }
360                         
361                         if (criteria.Entity == "") {
362                                 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.noEntity);
363                         }
364                         
365                         if (criteria.Key == "") {
366                                 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.noKey);
367                         }
368                         
369                         if (/^SetInfo$/i.test(funName)) {
370                                 if (typeof criteria.SystemData == "undefined" || criteria.SystemData == '') {
371                                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
372                                 }
373                                 if (typeof criteria.SystemData.StringData == "undefined" && typeof criteria.SystemData.Status == "undefined") {
374                                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
375                                 }
376                         }
377                         
378                         if (typeof supportedEntitiesAndKeys[criteria.Entity.toLowerCase()] == 'undefined' || typeof supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()] == 'undefined') {
379                                 return error(device.implementation.ERR_NOT_FOUND, msg.no_msg);
380                         }
381                         
382                         if (!supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()][funName]) {
383                                 return error(device.implementation.ERR_NOT_FOUND, msg.no_msg);
384                         }
385                         
386                         if (funName == "GetInfo" && !supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]["GetInfoModeSync"] && typeof callback != "function") {
387                                 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.not_supportedSyncVer);
388                         }
389                         
390                         return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
391                 }
392                 catch(err){
393                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
394                 }
395                 
396           }
397
398 }) ()