Changed zouba directory heirarchy.
[ptas] / zouba / wrt / preview / script / lib / sapi / AppManager.js
1 /**\r
2  * AppManager.js\r
3  * \r
4  * Nokia Web Runtime Service API emulation \r
5  * WRT v1.1\r
6  * \r
7  * Copyright 2009 Nokia Corporation. All rights reserved.\r
8 */\r
9 \r
10  \r
11 (function(){\r
12         \r
13         var provider = 'Service.AppManager',\r
14                 Interface = 'IAppManager';\r
15 \r
16         /**\r
17          * AppManager service\r
18          */\r
19         var AppManagerService = function(){\r
20                 this.GetList    = __GetList;\r
21                 this.LaunchApp  = __LaunchApp;\r
22                 this.LaunchDoc  = __LaunchDoc;\r
23                 this.Cancel     = __Cancel;\r
24         }\r
25 \r
26         device.implementation.extend(provider, Interface, new AppManagerService() );\r
27 \r
28 \r
29         /******************************************************/        \r
30         /******************************************************/        \r
31         /******************************************************/        \r
32 \r
33         var     context = device.implementation.context,\r
34                 _t = context._t,\r
35                 method = '',\r
36                 result = false,\r
37                 DBase = null;\r
38         \r
39         /**\r
40          * AppManager: GetList\r
41          * @param {Object} criteria\r
42          */\r
43         function __GetList(criteria){\r
44                 if ((result = validator.apply('GetList', arguments)) !== false)\r
45                         return result; \r
46 \r
47                 if (typeof criteria.Type == 'undefined') \r
48                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
49 \r
50                 if (!/^(Application|UserInstalledPackage)$/i.test(criteria.Type)) \r
51                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);\r
52                 \r
53                 // check if a callback was provided\r
54                 if (arguments.length > 1)\r
55                         return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.badAsync);\r
56                 \r
57                 var returnValue,\r
58                         filter = criteria.Filter || null;\r
59  \r
60                 DBase = context.getData(provider);\r
61 \r
62                 if (criteria.Filter)\r
63                         context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));\r
64 \r
65                 // Type = UserInstalledPackage\r
66                 if (!/UserInstalledPackage/i.test(criteria.Type)){\r
67 \r
68                         returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
69 \r
70                 } else {\r
71                 // Type = Application\r
72                         // @todo: apply filter criteria\r
73                         \r
74                         returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
75                 }\r
76 \r
77                 return context.Result(returnValue);\r
78         }\r
79                         \r
80         /**\r
81          * AppManager: LaunchApp\r
82          * @param {Object} criteria\r
83          * @param {function} callback function for async call (optional)\r
84          */\r
85         function __LaunchApp(criteria, callback){\r
86 \r
87                 if ((result = validator.apply('LaunchApp', arguments)) !== false)\r
88                         return result; \r
89                 \r
90                 if (typeof criteria.ApplicationID == 'undefined')\r
91                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingAppID);\r
92 \r
93                 // app id must be in the form "s60uid://<appid>" where <appid> is \r
94                 // what is returned by GetList.\r
95                 var appId = criteria.ApplicationID;\r
96                 \r
97                 if (!/^s60uid:\/\/0x/i.test(appId))\r
98                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);\r
99         \r
100                 if (criteria.CmdLind)\r
101                         context.notify(_t('%s:: LaunchApp : CmdLine not implemented in preview').arg(provider));\r
102 \r
103                 if (criteria.Options)\r
104                         context.notify(_t('%s:: LaunchApp : Options not implemented in preview').arg(provider));\r
105 \r
106 \r
107                 if (typeof callback == 'function') {\r
108                         return context.callAsync(this, arguments.callee, criteria, callback);\r
109                 }\r
110 \r
111                 appId = appId.replace(/^s60uid:\/\//i, '');     \r
112                 DBase = context.getData(provider);\r
113 \r
114                 for(var type in DBase){\r
115                         for(var i in DBase[type]) {\r
116                                 var item = DBase[type][i];\r
117                                 if (item.Uid == appId) {\r
118                                         // found!\r
119                                         context.notify(_t('%s:: LaunchApp : application found & launched : id=%s').arg(provider, appId));\r
120                                         return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
121                                 }\r
122                         }\r
123                 }\r
124                 // if not found\r
125                 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);\r
126         }\r
127                         \r
128         /**\r
129          * AppManager: LaunchDoc\r
130          * @param {Object} criteria\r
131          * @param {function} callback function for async call (optional)\r
132          */\r
133         function __LaunchDoc(criteria, callback){\r
134 \r
135                 if ((result = validator.apply('LaunchDoc', arguments)) !== false)\r
136                         return result; \r
137 \r
138                 if (typeof criteria.Document == 'undefined' && typeof criteria.MimeType == 'undefined')\r
139                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDoc);\r
140 \r
141                 if (typeof criteria.Document != 'undefined' && !criteria.Document.DocumentPath)\r
142                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);\r
143 \r
144                 if (criteria.Options)\r
145                         context.notify(_t('%s:: LaunchDoc : Options not implemented in preview').arg(provider));\r
146 \r
147                 if (typeof callback == 'function') {\r
148                         return context.callAsync(this, arguments.callee, criteria, callback);\r
149                 }\r
150 \r
151                 // nothing to launch in emulation, just notify user\r
152                 context.notify(_t('%s:: LaunchDoc : document launched').arg(provider));\r
153                 \r
154                 if (criteria.Document)\r
155                         // return success\r
156                         return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
157                 else\r
158                         // for mimetype, return value name of document\r
159                         return context.Result('', device.implementation.ERR_SUCCESS);\r
160         }\r
161 \r
162         \r
163 \r
164         /**\r
165          * AppManager: Cancel\r
166          * @param {Object} criteria\r
167          */\r
168         function __Cancel(criteria){\r
169                 method = 'Cancel';\r
170                 if (!criteria || !criteria.TransactionID)\r
171                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);\r
172                 \r
173                 clearTimeout(criteria.TransactionID);\r
174                 return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
175         }\r
176 \r
177 \r
178         \r
179         /*******************************\r
180          * helper functions\r
181          *******************************/\r
182         \r
183         function error(code, msg /*, args...*/){\r
184 \r
185                 var args = ['AppManager',method].concat([].slice.call(arguments,2));\r
186                 msg = msg ? _t().arg.apply(msg,args) : undefined;\r
187                 return context.ErrorResult(code, msg);\r
188         }\r
189 \r
190         /**\r
191          * validate common input arguments\r
192          * 'this' is string (object) name of calling function\r
193          * \r
194          * @param {arguments} arguments of calling function\r
195          * @return {Result} Result object if error, false if no error.\r
196          */\r
197         function validator() {\r
198                 method = ''+this;\r
199                 var     failed = false,\r
200                         criteria = arguments[0] || false;\r
201                         \r
202                 if (!criteria || typeof criteria != 'object')\r
203                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);\r
204 \r
205                 return failed;\r
206         }\r
207 \r
208         /** \r
209          * error messages\r
210          * order of %s args: Service name, method name, parameter name \r
211          */\r
212         var msg = {\r
213                 missingType             : '%s:%s:Content Type Missing',\r
214                 badAsync                : 'AppManger:GetList:Asynchronous version of API is not supported',     // typo on device!\r
215                 missingAppID    : '%s:%s:Application ID  Missing',      // double space between ID & missing!!\r
216                 missingDoc              : '%s:%s:Document/MimeType Missing/value more than expected length ',\r
217                 missingTID              : '%s:Incorrect TransactionID',\r
218                 is_invalid              : '%s:%s:%s is invalid'\r
219         };\r
220                 \r
221 \r
222 }) ()\r
223 \r