Added wrt files, prior to converting into Qt/C++.
[ptas] / wrt / zouba / preview / script / lib / sapi / Sensor.js
1 /**\r
2  * Sensor.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 (function(){\r
11 \r
12         var provider = 'Service.Sensor',\r
13                 Interface = 'ISensor';\r
14         var transID = new Array();\r
15         /**\r
16          * Sensor service\r
17          */\r
18         var SensorService = function(){\r
19                 this.FindSensorChannel                  = __FindSensorChannel;\r
20                 this.RegisterForNotification    = __RegisterForNotification;\r
21                 this.Cancel                                             = __Cancel;\r
22                 this.GetChannelProperty                 = __GetChannelProperty;         \r
23         }\r
24 \r
25         device.implementation.extend(provider, Interface, new SensorService() );\r
26 \r
27         /******************************************************/        \r
28         /******************************************************/        \r
29         /******************************************************/        \r
30 \r
31         var     context = device.implementation.context,\r
32                 _t = context._t,\r
33                 method = '',\r
34                 result = false,\r
35                 DBase = null;\r
36 \r
37 \r
38         /**\r
39          * Sensor: FindSensorChannel\r
40          * @param {Object} criteria\r
41          */\r
42         function __FindSensorChannel(criteria){\r
43                 method = 'FindSensorChannel';\r
44                 if(!criteria)\r
45                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgCriteriaMissing);\r
46                         \r
47                 if(typeof criteria != 'object')\r
48                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);\r
49                                                 \r
50                 if(typeof criteria.SearchCriterion == 'undefined')\r
51                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDataMissing);\r
52 \r
53                 if(typeof criteria.SearchCriterion != 'string')\r
54                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgidInvalid);\r
55 \r
56                 if(!(criteria.SearchCriterion== "All" || criteria.SearchCriterion== "AccelerometerAxis" || criteria.SearchCriterion=="AccelerometerDoubleTapping" || criteria.SearchCriterion=="Orientation" || criteria.SearchCriterion=="Rotation"))\r
57                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgSearchParamInvalid);\r
58 \r
59                 if(arguments.length > 1)\r
60                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);                       \r
61 \r
62                 DBase = context.getData(provider);\r
63                 var returnValue;\r
64                 returnValue = DBase[criteria.SearchCriterion] || [] ;\r
65                 \r
66                 return context.Result(returnValue,0);                   \r
67         }\r
68 \r
69 \r
70 \r
71         /**\r
72          * Sensor: RegisterForNotification\r
73          * @param {Object} criteria, callback\r
74          */\r
75         function __RegisterForNotification(criteria, callback, flag){\r
76                 flag = flag || false;\r
77                 method = 'RegisterForNotification';\r
78                 context.notify(_t('%s:: RegisterForNotification not implemented in preview').arg(provider));\r
79                 \r
80                 if(arguments.length >2 && (typeof flag != "undefined" && typeof flag != "boolean"))\r
81                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);\r
82 \r
83                 if(typeof callback != 'function')\r
84                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgInsufficentArgument);\r
85                 \r
86                 \r
87                 if(!criteria)\r
88                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);\r
89                         \r
90                 if(typeof criteria != 'object')\r
91                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgIncompleteInput);\r
92                                                 \r
93                 if(typeof criteria.ListeningType == 'undefined' || typeof criteria.ChannelInfoMap == 'undefined')\r
94                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);\r
95 \r
96                 if(typeof criteria.ListeningType != 'string')\r
97                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgListenTypeInvalid);\r
98                         \r
99                 if(typeof criteria.ChannelInfoMap != 'object')\r
100                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);\r
101                 \r
102                 if(!(criteria.ListeningType== "ChannelData" ))\r
103                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgOutofRange);\r
104 \r
105                 if(typeof callback == 'function')\r
106                 {\r
107                         var result = context.callAsync(this, arguments.callee, criteria, callback);\r
108                         transID.push(result.TransactionID);\r
109                         return result;\r
110                 }\r
111                 if(flag)\r
112                         transID.shift();\r
113                                 \r
114                 return context.ErrorResult();\r
115         }\r
116 \r
117 \r
118         /**\r
119          * Sensor: Cancel\r
120          * @param {Object} criteria\r
121          */\r
122         function __Cancel(criteria){\r
123                 method = 'Cancel';\r
124 \r
125                 if(arguments.length > 1 && typeof criteria != "object" && typeof criteria.TransactionID != "number" && arguments[1])\r
126                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);\r
127 \r
128                 if (!criteria || typeof criteria.TransactionID == 'undefined') \r
129                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTransIDMissing);\r
130 \r
131                 if (criteria.TransactionID == Infinity || criteria.TransactionID == -Infinity) \r
132                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTransIDMissing);\r
133                 \r
134                 if (typeof criteria.TransactionID != 'number') \r
135                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgIncorrectTransID);             \r
136 \r
137                 for (var i=0; i<transID.length; i++) {
138                         if (criteria.TransactionID == transID[i]){\r
139                                 clearTimeout(criteria.TransactionID);\r
140                                 return context.ErrorResult();\r
141                         }
142                 };\r
143                 \r
144                 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgInvalidTransID);\r
145 \r
146         }\r
147 \r
148 \r
149         /**\r
150          * Sensor: GetChannelProperty\r
151          * @param {Object} criteria\r
152          */\r
153         function __GetChannelProperty(criteria){\r
154                 method = 'GetChannelProperty';\r
155 \r
156                 if(!criteria)\r
157                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);\r
158                         \r
159                 if(typeof criteria != 'object')\r
160                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgIncompleteInput);\r
161 \r
162                 if(typeof criteria.ChannelInfoMap == 'undefined' || typeof criteria.PropertyId == 'undefined')\r
163                         return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);\r
164                 \r
165                 if(typeof criteria.ChannelInfoMap != 'object')\r
166                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);\r
167                 \r
168                 if(typeof criteria.PropertyId != 'string')\r
169                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgInvalidPropertyID);\r
170                 \r
171                 if(criteria.PropertyId != 'Availability' && criteria.PropertyId != "ChannelAccuracy" && criteria.PropertyId != "ChannelDataFormat" && criteria.PropertyId != "ChannelScale" && criteria.PropertyId != "ChannelUnit" && criteria.PropertyId != "ConnectionType" && criteria.PropertyId != "DataRate" && criteria.PropertyId != "Description" && criteria.PropertyId != "MeasureRange" && criteria.PropertyId != "ScaledRange" && criteria.PropertyId != "SensorModel")\r
172                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgInvalidPropertyID);\r
173 \r
174                 if(arguments.length > 1)\r
175                         return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);                       \r
176 \r
177                 DBase = context.getData(provider);\r
178                 var property = DBase['SensorProperty'];\r
179                 if(typeof criteria.ChannelInfoMap['ChannelId'] == 'undefined' || typeof criteria.ChannelInfoMap['ChannelId'] != 'number')\r
180                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);\r
181 \r
182                 var channel = null;\r
183                 if(criteria.ChannelInfoMap['ChannelId'] == 7)\r
184                 {\r
185                         channel = 'AccelerometerAxis';\r
186                 }\r
187                 else if(criteria.ChannelInfoMap['ChannelId'] == 8)\r
188                 {\r
189                         channel = 'AccelerometerDoubleTapping';\r
190                 }\r
191                 else if(criteria.ChannelInfoMap['ChannelId'] == 10)\r
192                 {\r
193                         channel = 'Orientation';\r
194                 }\r
195                 else if(criteria.ChannelInfoMap['ChannelId'] == 11)\r
196                 {\r
197                         channel = 'Rotation';\r
198                 }\r
199         \r
200                 if(channel == null)\r
201                         return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);\r
202                 \r
203                 var returnValue = property[channel][criteria.PropertyId];\r
204                 if(typeof returnValue == 'undefined')\r
205                         return context.ErrorResult(device.implementation.ERR_NOT_FOUND);\r
206                 return context.Result(returnValue,0)\r
207         }\r
208 \r
209         /**\r
210          * Sensor: error\r
211          * @param {number,string} ErrorCode and ErrorString\r
212          * Replaces Error String with method name\r
213          */\r
214         function error(code, msg /*, args...*/){\r
215 \r
216                 var args = ['Sensors',method].concat([].slice.call(arguments,2));\r
217                 msg = msg ? _t().arg.apply(msg,args) : undefined;\r
218                 return context.ErrorResult(code, msg);\r
219         }\r
220 \r
221 \r
222         /** \r
223          * error messages\r
224          * order of %s args: Service name, method name, parameter name \r
225          */\r
226         var msg = {     \r
227                 msgInterfaceNotSupported        : '%s:Requested interface not supported by the provider',\r
228                 msgInterfaceMissing             : '%s:Interface name missing',\r
229                 msgInsufficentArgument          : '%s:%s:Insufficent argument for asynchronous request',\r
230                 msgListenTypeMissing            : '%s:%s:Listening type missing',\r
231                 msgListenTypeInvalid            : '%s:%s:Listening type is invalid',\r
232                 msgChannelInfoMissing           : '%s:%s:ChannelInfoMap missing',\r
233                 msgIncompleteInput                      : '%s:%s:Incomplete input param list',\r
234                 msgOutofRange                           : '%s:%s:Listening type is out of allowed range',\r
235                 msgCallbackMissing                      : '%s:%s:Callback missing',\r
236                 msgAlreadyRegistered            : '%s:%s:Notification is already registered on this channel',\r
237                 msgCriteriaMissing                      : '%s:%s:Search criterion is missing',\r
238                 msgInvalidSearchCriteria        : '%s:%s:Invalid Search Criterion',\r
239                 msgChannelSearchInvalid         : '%s:%s:Channel search param type invalid',\r
240                 msgSearchParamInvalid           : '%s:%s:Invalid channel search param',\r
241                 msgTransIDMissing                       : '%s:%s:Transaction id is missing',\r
242                 msgIncorrectTransID                     : '%s:%s:Incorrect TransactionID',\r
243                 msgInvalidTransID                       : '%s:%s:Invalid TransactionID',\r
244                 msgPropertyIDMissing            : '%s:%s:Property id missing',\r
245                 msgInvalidPropertyID            : '%s:%s:Property id is invalid',\r
246                 msgChannelNotSupported          : '%s:%s:Channel property not supported',\r
247                 msgChannelInfoMapInvalid        : '%s:%s:ChannelInfoMap Type Invalid'\r
248         };\r
249 \r
250 }) ()