4 * Nokia Web Runtime Service API emulation
\r
7 * Copyright 2009 Nokia Corporation. All rights reserved.
\r
13 var provider = 'Service.Logging',
\r
14 Interface = 'IDataSource';
\r
19 var LoggingService = function(){
\r
21 this.GetList = __GetList;
\r
22 this.Delete = __Delete;
\r
23 this.RequestNotification = __RequestNotification;
\r
24 this.Cancel = __Cancel;
\r
28 device.implementation.extend(provider, Interface, new LoggingService() );
\r
31 /******************************************************/
\r
32 /******************************************************/
\r
33 /******************************************************/
\r
35 var context = device.implementation.context,
\r
41 var transactionIds = new Array();
\r
42 var tTransactionId = -1;
\r
43 var isTraceInProgress = false;
\r
49 * @param {Object} criteria
\r
50 * @param (function) callback
\r
52 function __Add(criteria, callback, flag){
\r
55 flag = flag || false;
\r
58 var result = ValidateAdd(criteria, callback);
\r
59 if (result.ErrorCode != 0)
\r
64 if(typeof callback == 'function')
\r
66 return context.callAsync(this, arguments.callee, criteria, callback);
\r
68 DBase = context.getData(provider);
\r
69 var returnValue = DBase[criteria.Type];
\r
70 criteria.Item.id = GenerateRandomNumber()+'';
\r
71 criteria.Item["EventTime"] = GetCurrDate();
\r
72 returnValue.push(criteria.Item);
\r
73 return context.Result(criteria.Item.id,0);
\r
78 * @param {Object} criteria
\r
79 * @param (function) callback
\r
81 function __GetList(criteria, callback, flag){
\r
84 flag = flag || false;
\r
87 var result = ValidateGetList(criteria, callback);
\r
88 if (result.ErrorCode != 0)
\r
93 if(typeof callback == 'function')
\r
95 return context.callAsync(this, arguments.callee, criteria, callback);
\r
97 if(criteria.Filter){
\r
98 context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));
\r
101 DBase = context.getData(provider);
\r
103 // @todo: apply filter criteria
\r
104 returnValue = context.Iterator( DBase[criteria.Type] || [] );
\r
106 return context.Result(returnValue,0);
\r
111 * @param {Object} criteria
\r
112 * @param (function) callback
\r
114 function __Delete(criteria, callback, flag){
\r
117 flag = flag || false;
\r
119 if (!criteria || !criteria.Type)
\r
120 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTypeMissing);
\r
122 if (typeof criteria.Type != 'string')
\r
123 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
\r
125 if (criteria.Type != 'Log')
\r
126 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTypeInvalid);
\r
128 if (!criteria.Data)
\r
129 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDataMissing);
\r
131 if(typeof criteria.Data != 'object')
\r
132 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDataInvalid);
\r
134 if(typeof criteria.Data.id == 'undefined')
\r
135 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgid);
\r
137 if (typeof criteria.Data.id != "string")
\r
138 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgidInvalid);
\r
140 if(criteria.Data.id == '')
\r
141 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgidInvalid);
\r
143 DBase = context.getData(provider);
\r
144 var returnValue,found = false;
\r
145 returnValue = DBase[criteria.Type];
\r
146 for(var i=0; i<returnValue.length; i++){
\r
147 if(returnValue[i].id == criteria.Data.id)
\r
150 returnValue.splice(i,1);
\r
154 return error(device.implementation.ERR_NOT_FOUND, msg.msgidInvalid);
\r
156 return context.Result(undefined,0);
\r
160 * Logging: RequestNotification
\r
161 * @param {Object} criteria
\r
162 * @param (function) callback
\r
164 function __RequestNotification(criteria, callback, flag){
\r
165 method = "RequestNotification";
\r
168 flag = flag || false;
\r
170 if (!criteria || !criteria.Type)
\r
171 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTypeMissing);
\r
173 if (typeof criteria.Type != 'string')
\r
174 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
\r
176 if (criteria.Type != 'Log')
\r
177 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTypeInvalid);
\r
179 if (!criteria.Filter)
\r
180 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgFilterMissing);
\r
182 if(typeof criteria.Filter != 'object')
\r
183 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgFilterInvalid);
\r
185 if(typeof criteria.Filter.DelayTime == 'undefined')
\r
186 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDelayTimeMissing);
\r
188 if(typeof criteria.Filter.DelayTime != 'number')
\r
189 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDelayTimeInvalid);
\r
190 if(criteria.Filter.DelayTime <= 0)
\r
191 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDelayTimeInvalid);
\r
193 if(criteria.Filter.DelayTime < 1000000 )
\r
195 criteria.Filter.DelayTime = 1000000;
\r
196 context.notify(_t('%s:: RequestNotification : Using DelayTime = 1000000').arg(provider));
\r
199 if(typeof callback != 'function')
\r
200 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgMissingCallback);
\r
202 criteriaReq = criteria;
\r
203 callbackReq = callback;
\r
204 isTraceInProgress = true;
\r
206 return notificationCall(criteria,callback);
\r
211 * @param {Object} criteria
\r
212 * @param (function) callback
\r
214 function __Cancel(criteria){
\r
216 if (!criteria || typeof criteria.TransactionID == 'undefined')
\r
217 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTransactionIdMissing);
\r
219 if (typeof criteria.TransactionID != 'number')
\r
220 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTransactionIdInvalid);
\r
222 clearTimeout(criteria.TransactionID);
\r
223 if (criteria.TransactionID == tTransactionId) {
\r
224 isTraceInProgress = false;
\r
225 tTransactionId = -1;
\r
227 return context.ErrorResult(device.implementation.ERR_SUCCESS);
\r
234 * @param {number,string} ErrorCode and ErrorString
\r
235 * Replaces Error String with method name
\r
237 function error(code, msg /*, args...*/){
\r
239 var args = ['Logging',method].concat([].slice.call(arguments,2));
\r
240 msg = msg ? _t().arg.apply(msg,args) : undefined;
\r
241 return context.ErrorResult(code, msg);
\r
245 * Logging: notificationCall
\r
247 * This function Calls callback function after given delay
\r
249 function notificationCall(){
\r
250 var tid = setTimeout(function(){
\r
251 if(!isTraceInProgress)
\r
254 DBase = context.getData(provider);
\r
256 returnValue = context.Iterator( DBase[criteriaReq.Type] || [] );
\r
259 eventCode = {completed:2, error:4, progress:9},
\r
260 code = eventCode.completed;
\r
262 callbackReq(tTransactionId,code,context.Result(returnValue,0));
\r
263 //notificationCall();
\r
264 }, criteriaReq.Filter.DelayTime/1000);
\r
265 if(tTransactionId == -1)
\r
266 tTransactionId = tid;
\r
267 return context.AsyncResult(tTransactionId);
\r
275 * GenerateRandomNumber
\r
276 * @param {}array of log data for getting unique ID
\r
279 function GenerateRandomNumber(arr)
\r
281 var randomnumber = Math.floor(Math.random() * 10001);
\r
282 randomnumber +=200;
\r
283 return randomnumber;
\r
288 * @param {}Gets date in internet format
\r
291 function GetCurrDate()
\r
293 var d_names = new Array("Sunday", "Monday", "Tuesday",
\r
294 "Wednesday", "Thursday", "Friday", "Saturday");
\r
296 var m_names = new Array("January", "February", "March",
\r
297 "April", "May", "June", "July", "August", "September",
\r
298 "October", "November", "December");
\r
302 var d = new Date();
\r
303 var curr_day = d.getDay();
\r
304 var curr_date = d.getDate();
\r
306 curr_date = "0"+curr_date;
\r
307 var curr_month = d.getMonth();
\r
308 var curr_year = d.getFullYear();
\r
309 var curr_hour = d.getHours();
\r
314 else if(curr_hour <10)
\r
316 curr_hour = "0"+curr_hour;
\r
318 var curr_min = d.getMinutes();
\r
320 curr_min = "0"+curr_min;
\r
322 var curr_sec = d.getSeconds();
\r
324 curr_sec = "0"+curr_sec;
\r
326 var strDate = d_names[curr_day]+', '+curr_date+' '+m_names[curr_month]+', '+curr_year+' '+curr_hour+':'+curr_min+':'+curr_sec+' '+ampm;
\r
332 * @param {object,function}
\r
333 * Validates ADD arguments
\r
335 function ValidateAdd(criteria,callback)
\r
338 if(!criteria || !criteria.Type)
\r
339 return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgTypeMissing);
\r
341 if (typeof criteria.Type != 'string')
\r
342 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
\r
344 if(criteria.Type != 'Log')
\r
345 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgTypeInvalid);
\r
347 if (!criteria.Item)
\r
348 return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgItemMissing);
\r
350 if(typeof criteria.Item != 'object')
\r
351 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgItemInvalid);
\r
354 if(typeof criteria.Item.EventType == "undefined")
\r
355 return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgEventTypeMissing);
\r
357 if(typeof criteria.Item.EventType != "number" )
\r
358 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEventTypeInvalid);
\r
360 if(typeof criteria.Item.EventType == "number" && !(criteria.Item.EventType >=0 && criteria.Item.EventType <=4))
\r
361 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgEventTypeInvalid);
\r
363 type = typeof criteria.Item.RemoteParty;
\r
364 if(type != 'undefined' && type != "string")
\r
365 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgRemotePartyInvalid);
\r
367 type = typeof criteria.Item.Direction;
\r
368 if (type != 'undefined') {
\r
369 if (type != "number")
\r
370 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDirectionInvalid);
\r
372 if (type == "number" && (criteria.Item.Direction < 0 || criteria.Item.Direction > 6))
\r
373 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDirectionInvalid);
\r
376 type = typeof criteria.Item.EventDuration;
\r
377 if(type != 'undefined' && type != "number")
\r
378 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEventDurationInvalid);
\r
380 type = typeof criteria.Item.DeliveryStatus;
\r
381 if (type != 'undefined') {
\r
382 if (type != "number")
\r
383 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDeliveryStatusInvalid);
\r
385 if (type == "number" && (criteria.Item.DeliveryStatus < 0 || criteria.Item.DeliveryStatus > 6))
\r
386 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDeliveryStatusInvalid);
\r
389 type = typeof criteria.Item.Subject;
\r
390 if(type != 'undefined' && type != "string")
\r
391 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgSubjectInvalid);
\r
393 type = typeof criteria.Item.PhoneNumber;
\r
394 if(type != 'undefined' && type != "string")
\r
395 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgPhoneNumberInvalid);
\r
397 type = typeof criteria.Item.Link;
\r
398 if(type != 'undefined' && type != "number")
\r
399 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgLinkInvalid);
\r
401 type = typeof criteria.Item.LogFlags;
\r
402 if(type != 'undefined' && (type != "number" || (criteria.Item.LogFlags != 1 && criteria.Item.LogFlags != 0)))
\r
403 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgLogFlagsInvalid);
\r
405 return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
\r
410 * @param {object,function}
\r
411 * Validates GetList function
\r
413 function ValidateGetList(criteria,callback)
\r
416 if(!criteria || !criteria.Type)
\r
417 return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgTypeMissing);
\r
419 if (typeof criteria.Type != 'string')
\r
420 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
\r
422 if(criteria.Type != 'Log')
\r
423 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgTypeInvalid);
\r
425 type = typeof criteria.Filter;
\r
426 if(type != 'undefined' && type != "object")
\r
427 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgFilterInvalid);
\r
429 if(type == 'undefined')
\r
430 return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
\r
432 type = typeof criteria.Filter.id;
\r
433 if(type != 'undefined' && type != "string")
\r
434 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgid);
\r
436 if(type != 'undefined')
\r
437 return context.ErrorResult(device.implementation.ERR_SUCCESS, ""); // if id is given all other filters will be ignored
\r
439 type = typeof criteria.Filter.EventType;
\r
440 if (type != 'undefined') {
\r
441 if (type != "number")
\r
442 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgEventTypeInvalid);
\r
444 if (type != "number" || !(criteria.Filter.EventType >= 0 && criteria.Filter.EventType <= 4))
\r
445 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgEventTypeInvalid);
\r
447 type = typeof criteria.Filter.RecentList;
\r
448 if (type != 'undefined') {
\r
449 if (type != "number")
\r
450 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgRecentListInvalid);
\r
451 if (type == "number" && (criteria.Filter.RecentList < -1 || criteria.Filter.RecentList > 3))
\r
452 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgRecentListInvalid);
\r
455 type = typeof criteria.Filter.RemoteParty;
\r
456 if(type != 'undefined' && type != "string")
\r
457 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgRemotePartyInvalid);
\r
459 type = typeof criteria.Filter.Direction;
\r
460 if (type != 'undefined') {
\r
461 if (type != "number")
\r
462 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDirectionInvalid);
\r
463 if (type == "number" && (criteria.Filter.Direction < 0 || criteria.Filter.Direction > 6))
\r
464 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDirectionInvalid);
\r
467 type = typeof criteria.Filter.DeliveryStatus;
\r
468 if (type != 'undefined') {
\r
469 if (type != "number")
\r
470 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDeliveryStatusInvalid);
\r
471 if (type == "number" && (criteria.Filter.DeliveryStatus < 0 || criteria.Filter.DeliveryStatus > 6))
\r
472 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDeliveryStatusInvalid);
\r
475 type = typeof criteria.Filter.EndTime;
\r
476 if(type != 'undefined' && (type != "object" || typeof criteria.Filter.EndTime.getTime != "function"))
\r
477 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEndTimeInvalid);
\r
479 type = typeof criteria.Filter.PhoneNumber;
\r
480 if(type != 'undefined' && type != "string")
\r
481 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgPhoneNumberInvalid);
\r
484 type = typeof criteria.Filter.LogFlags;
\r
485 if (type != 'undefined') {
\r
486 if (type != "number")
\r
487 return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgLogFlagsInvalid);
\r
488 if (type == "number" && (criteria.Filter.LogFlags != 1 && criteria.Filter.LogFlags != 0))
\r
489 return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgLogFlagsInvalid);
\r
491 return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
\r
497 * order of %s args: Service name, method name, parameter name
\r
500 msgTypeInvalid : '%s:%s:TypeInvalid',
\r
501 msgTypeMissing : '%s:%s:Type Missing',
\r
502 msgFilterInvalid : '%s:%s:FilterInvalid',
\r
503 msgidInvalid : '%s:%s:idInvalid',
\r
504 msgRecentListInvalid : '%s:%s:RecentListInvalid',
\r
505 msgPhoneNumberInvalid : '%s:%s:PhoneNumberInvalid',
\r
506 msgDirectionInvalid : '%s:%s:DirectionInvalid',
\r
507 msgDeliveryStatusInvalid : '%s:%s:DeliveryStatusInvalid',
\r
508 msgLogFlagsInvalid : '%s:%s:LogFlagsInvalid',
\r
509 msgEndTimeInvalid : '%s:%s:EndTimeInvalid',
\r
510 msgRemotePartyInvalid : '%s:%s:RemotePartyInvalid',
\r
511 msgEventTypeInvalid : '%s:%s:EventTypeInvalid',
\r
512 msgItemInvalid : '%s:%s:ItemInvalid',
\r
513 msgItemMissing : '%s:%s:ItemMissing',
\r
514 msgEventTypeInvalid : '%s:%s:EventTypeInvalid',
\r
515 msgEventTypeMissing : '%s:%s:EventType Missing',
\r
516 msgEventDurationInvalid : '%s:%s:EventDurationInvalid',
\r
517 msgSubjectInvalid : '%s:%s:SubjectInvalid',
\r
518 msgEventDataInvalid : '%s:%s:EventDataInvalid',
\r
519 msgLinkInvalid : '%s:%s:LinkInvalid',
\r
520 msgDataInvalid : '%s:%s:DataInvalid',
\r
521 msgDataMissing : '%s:%s:Data Missing',
\r
522 msgid : '%s:%s:id',
\r
523 msgFilterInvalid : '%s:%s:FilterInvalid',
\r
524 msgFilterMissing : '%s:%s:Filter Missing',
\r
525 msgDelayTimeInvalid : '%s:%s:DelayTimeInvalid',
\r
526 msgDelayTimerMissing : '%s:%s:DelayTimerMissing',
\r
527 msgTransactionIdInvalid : '%s:%s:TransactionIdInvalid',
\r
528 msgTransactionIdMissing : '%s:%s:TransactionID Missing',
\r
529 msgMissingCallback : '%s:%s:Missing Callback',
\r
530 msgNoMsg : '%s:%s:'
\r