From 754b2d784f75f0e42223f4aa87e0d1003ff44ac1 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Sun, 21 Jul 2013 10:25:56 +0300 Subject: [PATCH] AddObject and DeleteObject tasks no longer require a trailing dot at the end of the path. Added new task type 'refreshObject'. --- presets.coffee | 11 ++++++---- tasks.coffee | 58 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/presets.coffee b/presets.coffee index 6fa438d..61a7fc7 100644 --- a/presets.coffee +++ b/presets.coffee @@ -112,7 +112,10 @@ exports.assertPresets = (deviceId, presetsHash, callback) -> timeDiff = (now - param._timestamp) / 1000 if (c.age - timeDiff < config.PRESETS_TIME_PADDING) expiry = Math.min(expiry, c.age) - getParameterValues.push(c.name) + if param._object or param._instance + taskList.push({device : deviceId, name : 'refreshObject', objectName : c.name}) + else + getParameterValues.push(c.name) else expiry = Math.min(expiry, c.age - timeDiff) when 'add_tag' @@ -143,15 +146,15 @@ exports.assertPresets = (deviceId, presetsHash, callback) -> vals = [] for k2,j of objects[c.object] vals.push([k2, j]) if k2[0] != '_' - taskList.push({device : deviceId, name : 'addObject', objectName : "#{c.name}.", parameterValues : vals, instanceName : c.object}) + taskList.push({device : deviceId, name : 'addObject', objectName : c.name, parameterValues : vals, instanceName : c.object}) when 'delete_object' for k,p of param continue if k[0] == '_' if p._name? if p._name == c.object - taskList.push({device : deviceId, name : 'deleteObject', objectName : "#{c.name}.#{k}."}) + taskList.push({device : deviceId, name : 'deleteObject', objectName : "#{c.name}.#{k}"}) else if matchObject(objects[c.object], p) - taskList.push({device : deviceId, name : 'deleteObject', objectName : "#{c.name}.#{k}."}) + taskList.push({device : deviceId, name : 'deleteObject', objectName : "#{c.name}.#{k}"}) else throw new Error('Unknown configuration type') diff --git a/tasks.coffee b/tasks.coffee index ab2e5c4..a1a0b13 100644 --- a/tasks.coffee +++ b/tasks.coffee @@ -15,6 +15,53 @@ this.init = (task, methodResponse, callback) -> if not task.subtask? task.subtask = {name : 'getParameterNames', parameterPath : '', nextLevel : false} + if task.subtask.name == 'getParameterNames' + if methodResponse.faultcode? + task.fault = methodResponse + callback(null, STATUS_FAULT) + return + + this.getParameterNames(task.subtask, methodResponse, (err, status, cwmpResponse, deviceUpdates) => + if status is STATUS_FINISHED + parameterNames = [] + for p in deviceUpdates.parameterNames + if not common.endsWith(p[0], '.') + parameterNames.push(p[0]) + task.subtask = {name : 'getParameterValues', parameterNames : parameterNames} + this.getParameterValues(task.subtask, {}, (err, status, cwmpResponse) -> + # ignore deviceUpdates returned by firt call to getParameterValues + callback(err, status, cwmpResponse, deviceUpdates) + ) + else if status is STATUS_STARTED + callback(err, STATUS_STARTED, cwmpResponse, deviceUpdates) + else + throw Error('Unexpected subtask status') + ) + else if task.subtask.name == 'getParameterValues' + if methodResponse.faultcode? + # Ignore GetParameterValues errors. A workaround for the crappy Seewon devices. + methodResponse = {parameterList : {}} + this.getParameterValues(task.subtask, methodResponse, (err, status, cwmpResponse, deviceUpdates) -> + callback(err, status, cwmpResponse, deviceUpdates) + ) + else + throw Error('Unexpected subtask name') + + +this.refreshObject = (task, methodResponse, callback) -> + allDeviceUpdates = {} + if not methodResponse.type? + # task just run, delete old parameter + allDeviceUpdates.deletedObjects = [task.objectName] + + if not task.subtask? + task.subtask = {name : 'getParameterNames', parameterPath : "#{task.objectName}.", nextLevel : false} + + if methodResponse.faultcode? + task.fault = methodResponse + callback(null, STATUS_FAULT) + return + if task.subtask.name == 'getParameterNames' if methodResponse.faultcode? task.fault = methodResponse @@ -127,12 +174,12 @@ this.addObject = (task, methodResponse, callback) -> if not task.instanceNumber? if methodResponse.type is 'AddObjectResponse' task.instanceNumber = methodResponse.instanceNumber - task.subtask = {name : 'getParameterNames', parameterPath : "#{task.objectName}#{task.instanceNumber}.", nextLevel : false} + task.subtask = {name : 'getParameterNames', parameterPath : "#{task.objectName}.#{task.instanceNumber}.", nextLevel : false} task.appliedParameterValues = [] task.parameterNames = [] - allDeviceUpdates.instanceName = [["#{task.objectName}#{task.instanceNumber}", task.instanceName]] if task.instanceName? + allDeviceUpdates.instanceName = [["#{task.objectName}.#{task.instanceNumber}", task.instanceName]] if task.instanceName? else - callback(null, STATUS_STARTED, {methodRequest : {type : 'AddObject', objectName : task.objectName}}) + callback(null, STATUS_STARTED, {methodRequest : {type : 'AddObject', objectName : "#{task.objectName}."}}) return if task.subtask.name is 'getParameterNames' @@ -185,12 +232,11 @@ this.deleteObject = (task, methodResponse, callback) -> return if methodResponse.type is 'DeleteObjectResponse' - # trim the last dot (.) - callback(null, STATUS_FINISHED, null, {deletedObjects : [task.objectName.slice(0, -1)]}) + callback(null, STATUS_FINISHED, null, {deletedObjects : [task.objectName]}) else methodRequest = { type : 'DeleteObject', - objectName : task.objectName + objectName : "#{task.objectName}." } callback(null, STATUS_STARTED, {methodRequest : methodRequest})