--- /dev/null
+/**\r
+ * Logging.js\r
+ * \r
+ * Nokia Web Runtime Service API emulation \r
+ * WRT v1.1\r
+ * \r
+ * Copyright 2009 Nokia Corporation. All rights reserved.\r
+*/\r
+\r
+ \r
+(function(){\r
+ \r
+ var provider = 'Service.Logging',\r
+ Interface = 'IDataSource';\r
+\r
+ /**\r
+ * Landmark service\r
+ */\r
+ var LoggingService = function(){\r
+ this.Add = __Add;\r
+ this.GetList = __GetList;\r
+ this.Delete = __Delete;\r
+ this.RequestNotification = __RequestNotification; \r
+ this.Cancel = __Cancel; \r
+\r
+ }\r
+\r
+ device.implementation.extend(provider, Interface, new LoggingService() );\r
+\r
+\r
+ /******************************************************/ \r
+ /******************************************************/ \r
+ /******************************************************/ \r
+\r
+ var context = device.implementation.context,\r
+ _t = context._t,\r
+ method = '',\r
+ result = false,\r
+ DBase = null;\r
+\r
+ var transactionIds = new Array();\r
+ var tTransactionId = -1;\r
+ var isTraceInProgress = false;\r
+ var criteriaReq;\r
+ var callbackReq;\r
+\r
+ /**\r
+ * Logging: Add\r
+ * @param {Object} criteria\r
+ * @param (function) callback\r
+ */\r
+ function __Add(criteria, callback, flag){\r
+ method = "Add";\r
+ // Async call\r
+ flag = flag || false;\r
+\r
+ if (!flag) {\r
+ var result = ValidateAdd(criteria, callback);\r
+ if (result.ErrorCode != 0) \r
+ return result;\r
+ } \r
+ \r
+ \r
+ if(typeof callback == 'function')\r
+ {\r
+ return context.callAsync(this, arguments.callee, criteria, callback);\r
+ }\r
+ DBase = context.getData(provider);\r
+ var returnValue = DBase[criteria.Type];\r
+ criteria.Item.id = GenerateRandomNumber()+'';\r
+ criteria.Item["EventTime"] = GetCurrDate();\r
+ returnValue.push(criteria.Item);\r
+ return context.Result(criteria.Item.id,0);\r
+ }\r
+\r
+ /**\r
+ * Logging: GetList\r
+ * @param {Object} criteria\r
+ * @param (function) callback\r
+ */\r
+ function __GetList(criteria, callback, flag){ \r
+ method = "GetList";\r
+ // Async call\r
+ flag = flag || false;\r
+\r
+ if (!flag) {\r
+ var result = ValidateGetList(criteria, callback);\r
+ if (result.ErrorCode != 0) \r
+ return result;\r
+ } \r
+ \r
+ \r
+ if(typeof callback == 'function')\r
+ {\r
+ return context.callAsync(this, arguments.callee, criteria, callback);\r
+ }\r
+ if(criteria.Filter){\r
+ context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));\r
+ }\r
+ \r
+ DBase = context.getData(provider);\r
+ var returnValue;\r
+ // @todo: apply filter criteria\r
+ returnValue = context.Iterator( DBase[criteria.Type] || [] );\r
+ \r
+ return context.Result(returnValue,0);\r
+ }\r
+\r
+ /**\r
+ * Logging: Delete\r
+ * @param {Object} criteria\r
+ * @param (function) callback\r
+ */\r
+ function __Delete(criteria, callback, flag){\r
+ method = "Delete";\r
+ // Async call\r
+ flag = flag || false; \r
+ if (!flag) {\r
+ if (!criteria || !criteria.Type) \r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTypeMissing);\r
+\r
+ if (typeof criteria.Type != 'string') \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);\r
+ \r
+ if (criteria.Type != 'Log') \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTypeInvalid);\r
+ \r
+ if (!criteria.Data) \r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDataMissing);\r
+ \r
+ if(typeof criteria.Data != 'object')\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDataInvalid);\r
+\r
+ if(typeof criteria.Data.id == 'undefined')\r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgid);\r
+ \r
+ if (typeof criteria.Data.id != "string") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgidInvalid);\r
+ \r
+ if(criteria.Data.id == '')\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgidInvalid);\r
+ }\r
+ DBase = context.getData(provider);\r
+ var returnValue,found = false;\r
+ returnValue = DBase[criteria.Type];\r
+ for(var i=0; i<returnValue.length; i++){\r
+ if(returnValue[i].id == criteria.Data.id)\r
+ {\r
+ found = true;\r
+ returnValue.splice(i,1);\r
+ } \r
+ }\r
+ if(!found)\r
+ return error(device.implementation.ERR_NOT_FOUND, msg.msgidInvalid);\r
+ \r
+ return context.Result(undefined,0);\r
+ }\r
+\r
+ /**\r
+ * Logging: RequestNotification\r
+ * @param {Object} criteria\r
+ * @param (function) callback\r
+ */\r
+ function __RequestNotification(criteria, callback, flag){\r
+ method = "RequestNotification";\r
+ \r
+ // Async call\r
+ flag = flag || false; \r
+ if (!flag) {\r
+ if (!criteria || !criteria.Type) \r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTypeMissing);\r
+\r
+ if (typeof criteria.Type != 'string') \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);\r
+ \r
+ if (criteria.Type != 'Log') \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTypeInvalid);\r
+ \r
+ if (!criteria.Filter)\r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgFilterMissing);\r
+\r
+ if(typeof criteria.Filter != 'object') \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgFilterInvalid);\r
+ \r
+ if(typeof criteria.Filter.DelayTime == 'undefined') \r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDelayTimeMissing);\r
+ \r
+ if(typeof criteria.Filter.DelayTime != 'number')\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDelayTimeInvalid);\r
+ if(criteria.Filter.DelayTime <= 0)\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDelayTimeInvalid);\r
+ \r
+ if(criteria.Filter.DelayTime < 1000000 )\r
+ {\r
+ criteria.Filter.DelayTime = 1000000;\r
+ context.notify(_t('%s:: RequestNotification : Using DelayTime = 1000000').arg(provider));\r
+ }\r
+ }\r
+ if(typeof callback != 'function')\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgMissingCallback);\r
+\r
+ criteriaReq = criteria;\r
+ callbackReq = callback;\r
+ isTraceInProgress = true;\r
+\r
+ return notificationCall(criteria,callback);\r
+ }\r
+\r
+ /**\r
+ * Logging: Cancel\r
+ * @param {Object} criteria\r
+ * @param (function) callback\r
+ */\r
+ function __Cancel(criteria){\r
+ method = "Cancel";\r
+ if (!criteria || typeof criteria.TransactionID == 'undefined') \r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTransactionIdMissing);\r
+ \r
+ if (typeof criteria.TransactionID != 'number') \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTransactionIdInvalid);\r
+ \r
+ clearTimeout(criteria.TransactionID);\r
+ if (criteria.TransactionID == tTransactionId) {\r
+ isTraceInProgress = false;\r
+ tTransactionId = -1;\r
+ }\r
+ return context.ErrorResult(device.implementation.ERR_SUCCESS);\r
+\r
+ }\r
+ \r
+\r
+ /**\r
+ * Location: error\r
+ * @param {number,string} ErrorCode and ErrorString\r
+ * Replaces Error String with method name\r
+ */\r
+ function error(code, msg /*, args...*/){\r
+\r
+ var args = ['Logging',method].concat([].slice.call(arguments,2));\r
+ msg = msg ? _t().arg.apply(msg,args) : undefined;\r
+ return context.ErrorResult(code, msg);\r
+ }\r
+ \r
+ /**\r
+ * Logging: notificationCall\r
+ * @param {} \r
+ * This function Calls callback function after given delay\r
+ */\r
+ function notificationCall(){\r
+ var tid = setTimeout(function(){\r
+ if(!isTraceInProgress)\r
+ return;\r
+ \r
+ DBase = context.getData(provider);\r
+ var returnValue;\r
+ returnValue = context.Iterator( DBase[criteriaReq.Type] || [] );\r
+\r
+ var result,\r
+ eventCode = {completed:2, error:4, progress:9},\r
+ code = eventCode.completed;\r
+\r
+ callbackReq(tTransactionId,code,context.Result(returnValue,0));\r
+ //notificationCall();\r
+ }, criteriaReq.Filter.DelayTime/1000);\r
+ if(tTransactionId == -1)\r
+ tTransactionId = tid;\r
+ return context.AsyncResult(tTransactionId);\r
+ }\r
+ \r
+ /**\r
+ * Helper functions\r
+ */\r
+\r
+ /**\r
+ * GenerateRandomNumber\r
+ * @param {}array of log data for getting unique ID \r
+ * \r
+ */\r
+ function GenerateRandomNumber(arr)\r
+ {\r
+ var randomnumber = Math.floor(Math.random() * 10001);\r
+ randomnumber +=200;\r
+ return randomnumber;\r
+ }\r
+\r
+ /**\r
+ * GetCurrDate\r
+ * @param {}Gets date in internet format\r
+ * \r
+ */\r
+ function GetCurrDate()\r
+ {\r
+ var d_names = new Array("Sunday", "Monday", "Tuesday",\r
+ "Wednesday", "Thursday", "Friday", "Saturday");\r
+ \r
+ var m_names = new Array("January", "February", "March", \r
+ "April", "May", "June", "July", "August", "September", \r
+ "October", "November", "December");\r
+ \r
+ var ampm = "am";\r
+ \r
+ var d = new Date();\r
+ var curr_day = d.getDay();\r
+ var curr_date = d.getDate();\r
+ if(curr_date <10)\r
+ curr_date = "0"+curr_date;\r
+ var curr_month = d.getMonth();\r
+ var curr_year = d.getFullYear();\r
+ var curr_hour = d.getHours();\r
+ if(curr_hour > 11)\r
+ {\r
+ ampm = "pm";\r
+ }\r
+ else if(curr_hour <10)\r
+ {\r
+ curr_hour = "0"+curr_hour;\r
+ } \r
+ var curr_min = d.getMinutes();\r
+ if(curr_min <10)\r
+ curr_min = "0"+curr_min;\r
+ \r
+ var curr_sec = d.getSeconds();\r
+ if(curr_sec <10)\r
+ curr_sec = "0"+curr_sec;\r
+ \r
+ var strDate = d_names[curr_day]+', '+curr_date+' '+m_names[curr_month]+', '+curr_year+' '+curr_hour+':'+curr_min+':'+curr_sec+' '+ampm;\r
+ return strDate;\r
+ } \r
+\r
+ /**\r
+ * ValidateAdd\r
+ * @param {object,function}\r
+ * Validates ADD arguments\r
+ */ \r
+ function ValidateAdd(criteria,callback)\r
+ {\r
+ var type;\r
+ if(!criteria || !criteria.Type)\r
+ return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgTypeMissing);\r
+\r
+ if (typeof criteria.Type != 'string') \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);\r
+ \r
+ if(criteria.Type != 'Log')\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgTypeInvalid);\r
+ \r
+ if (!criteria.Item)\r
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgItemMissing);\r
+\r
+ if(typeof criteria.Item != 'object') \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgItemInvalid);\r
+ \r
+ \r
+ if(typeof criteria.Item.EventType == "undefined")\r
+ return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgEventTypeMissing);\r
+\r
+ if(typeof criteria.Item.EventType != "number" )\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEventTypeInvalid);\r
+ \r
+ if(typeof criteria.Item.EventType == "number" && !(criteria.Item.EventType >=0 && criteria.Item.EventType <=4))\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgEventTypeInvalid);\r
+ \r
+ type = typeof criteria.Item.RemoteParty;\r
+ if(type != 'undefined' && type != "string")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgRemotePartyInvalid);\r
+ \r
+ type = typeof criteria.Item.Direction;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDirectionInvalid);\r
+ \r
+ if (type == "number" && (criteria.Item.Direction < 0 || criteria.Item.Direction > 6)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDirectionInvalid);\r
+ }\r
+\r
+ type = typeof criteria.Item.EventDuration;\r
+ if(type != 'undefined' && type != "number")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEventDurationInvalid);\r
+ \r
+ type = typeof criteria.Item.DeliveryStatus;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDeliveryStatusInvalid);\r
+ \r
+ if (type == "number" && (criteria.Item.DeliveryStatus < 0 || criteria.Item.DeliveryStatus > 6)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDeliveryStatusInvalid);\r
+ }\r
+ \r
+ type = typeof criteria.Item.Subject;\r
+ if(type != 'undefined' && type != "string")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgSubjectInvalid);\r
+\r
+ type = typeof criteria.Item.PhoneNumber;\r
+ if(type != 'undefined' && type != "string")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgPhoneNumberInvalid);\r
+\r
+ type = typeof criteria.Item.Link;\r
+ if(type != 'undefined' && type != "number")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgLinkInvalid);\r
+\r
+ type = typeof criteria.Item.LogFlags;\r
+ if(type != 'undefined' && (type != "number" || (criteria.Item.LogFlags != 1 && criteria.Item.LogFlags != 0)))\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgLogFlagsInvalid);\r
+\r
+ return context.ErrorResult(device.implementation.ERR_SUCCESS, "");\r
+ } \r
+\r
+ /**\r
+ * ValidateGetList\r
+ * @param {object,function}\r
+ * Validates GetList function\r
+ */ \r
+ function ValidateGetList(criteria,callback)\r
+ {\r
+ var type;\r
+ if(!criteria || !criteria.Type)\r
+ return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgTypeMissing);\r
+\r
+ if (typeof criteria.Type != 'string') \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);\r
+ \r
+ if(criteria.Type != 'Log')\r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgTypeInvalid);\r
+\r
+ type = typeof criteria.Filter;\r
+ if(type != 'undefined' && type != "object")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgFilterInvalid);\r
+ \r
+ if(type == 'undefined')\r
+ return context.ErrorResult(device.implementation.ERR_SUCCESS, ""); \r
+ \r
+ type = typeof criteria.Filter.id;\r
+ if(type != 'undefined' && type != "string")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgid);\r
+ \r
+ if(type != 'undefined')\r
+ return context.ErrorResult(device.implementation.ERR_SUCCESS, ""); // if id is given all other filters will be ignored\r
+\r
+ type = typeof criteria.Filter.EventType;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgEventTypeInvalid);\r
+ \r
+ if (type != "number" || !(criteria.Filter.EventType >= 0 && criteria.Filter.EventType <= 4)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgEventTypeInvalid);\r
+ } \r
+ type = typeof criteria.Filter.RecentList;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgRecentListInvalid);\r
+ if (type == "number" && (criteria.Filter.RecentList < -1 || criteria.Filter.RecentList > 3)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgRecentListInvalid);\r
+ }\r
+ \r
+ type = typeof criteria.Filter.RemoteParty;\r
+ if(type != 'undefined' && type != "string")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgRemotePartyInvalid);\r
+ \r
+ type = typeof criteria.Filter.Direction;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDirectionInvalid);\r
+ if (type == "number" && (criteria.Filter.Direction < 0 || criteria.Filter.Direction > 6)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDirectionInvalid);\r
+ }\r
+ \r
+ type = typeof criteria.Filter.DeliveryStatus;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDeliveryStatusInvalid);\r
+ if (type == "number" && (criteria.Filter.DeliveryStatus < 0 || criteria.Filter.DeliveryStatus > 6)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDeliveryStatusInvalid);\r
+ }\r
+\r
+ type = typeof criteria.Filter.EndTime;\r
+ if(type != 'undefined' && (type != "object" || typeof criteria.Filter.EndTime.getTime != "function"))\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEndTimeInvalid);\r
+\r
+ type = typeof criteria.Filter.PhoneNumber;\r
+ if(type != 'undefined' && type != "string")\r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgPhoneNumberInvalid);\r
+\r
+\r
+ type = typeof criteria.Filter.LogFlags;\r
+ if (type != 'undefined') {\r
+ if (type != "number") \r
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgLogFlagsInvalid);\r
+ if (type == "number" && (criteria.Filter.LogFlags != 1 && criteria.Filter.LogFlags != 0)) \r
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgLogFlagsInvalid);\r
+ }\r
+ return context.ErrorResult(device.implementation.ERR_SUCCESS, "");\r
+ } \r
+\r
+\r
+ /** \r
+ * error messages\r
+ * order of %s args: Service name, method name, parameter name \r
+ */\r
+ var msg = {\r
+ msgTypeInvalid : '%s:%s:TypeInvalid',\r
+ msgTypeMissing : '%s:%s:Type Missing',\r
+ msgFilterInvalid : '%s:%s:FilterInvalid',\r
+ msgidInvalid : '%s:%s:idInvalid',\r
+ msgRecentListInvalid : '%s:%s:RecentListInvalid',\r
+ msgPhoneNumberInvalid : '%s:%s:PhoneNumberInvalid',\r
+ msgDirectionInvalid : '%s:%s:DirectionInvalid',\r
+ msgDeliveryStatusInvalid : '%s:%s:DeliveryStatusInvalid',\r
+ msgLogFlagsInvalid : '%s:%s:LogFlagsInvalid',\r
+ msgEndTimeInvalid : '%s:%s:EndTimeInvalid',\r
+ msgRemotePartyInvalid : '%s:%s:RemotePartyInvalid',\r
+ msgEventTypeInvalid : '%s:%s:EventTypeInvalid',\r
+ msgItemInvalid : '%s:%s:ItemInvalid',\r
+ msgItemMissing : '%s:%s:ItemMissing',\r
+ msgEventTypeInvalid : '%s:%s:EventTypeInvalid',\r
+ msgEventTypeMissing : '%s:%s:EventType Missing',\r
+ msgEventDurationInvalid : '%s:%s:EventDurationInvalid',\r
+ msgSubjectInvalid : '%s:%s:SubjectInvalid',\r
+ msgEventDataInvalid : '%s:%s:EventDataInvalid',\r
+ msgLinkInvalid : '%s:%s:LinkInvalid',\r
+ msgDataInvalid : '%s:%s:DataInvalid',\r
+ msgDataMissing : '%s:%s:Data Missing',\r
+ msgid : '%s:%s:id',\r
+ msgFilterInvalid : '%s:%s:FilterInvalid',\r
+ msgFilterMissing : '%s:%s:Filter Missing',\r
+ msgDelayTimeInvalid : '%s:%s:DelayTimeInvalid',\r
+ msgDelayTimerMissing : '%s:%s:DelayTimerMissing',\r
+ msgTransactionIdInvalid : '%s:%s:TransactionIdInvalid',\r
+ msgTransactionIdMissing : '%s:%s:TransactionID Missing',\r
+ msgMissingCallback : '%s:%s:Missing Callback',\r
+ msgNoMsg : '%s:%s:'\r
+ };\r
+ \r
+\r
+}) ()\r
+\r