Files
genieacs/tasks.coffee
T

143 lines
4.2 KiB
CoffeeScript

common = require './common'
BATCH_SIZE = 16
exports.STATUS_QUEUED = STATUS_QUEUED = 0
exports.STATUS_STARTED = STATUS_STARTED = 1
exports.STATUS_PENDING = STATUS_PENDING = 2
exports.STATUS_FAULT = STATUS_FAULT = 3
exports.STATUS_FINISHED = STATUS_FINISHED = 4
this.init = (task, methodResponse, cwmpResponse, deviceUpdates) ->
if methodResponse.faultcode?
task.fault = methodResponse
return STATUS_FAULT
if not task.subtask?
task.subtask = {'name' : 'getParameterNames', 'parameterPath' : '', 'nextLevel' : false}
if task.subtask.name == 'getParameterNames'
status = this.getParameterNames(task.subtask, methodResponse, 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}
else if status != STATUS_STARTED
throw Error('Unexpected subtask status')
if task.subtask.name == 'getParameterValues'
status = this.getParameterValues(task.subtask, methodResponse, cwmpResponse, deviceUpdates)
if status is STATUS_FINISHED
return STATUS_FINISHED
else if status is not STATUS_STARTED
throw Error('Unexpected subtask status')
return STATUS_STARTED
this.getParameterNames = (task, methodResponse, cwmpResponse, deviceUpdates) ->
if methodResponse.faultcode?
task.fault = methodResponse
return STATUS_FAULT
if methodResponse.type is 'GetParameterNamesResponse'
deviceUpdates.parameterNames = methodResponse.parameterList
return STATUS_FINISHED
cwmpResponse.methodRequest = {
type : 'GetParameterNames',
parameterPath : task.parameterPath,
nextLevel : if task.nextLevel? then task.nextLevel else false
}
return STATUS_STARTED
this.getParameterValues = (task, methodResponse, cwmpResponse, deviceUpdates) ->
if methodResponse.faultcode?
task.fault = methodResponse
return STATUS_FAULT
if not task.currentIndex?
task.currentIndex = 0
else if methodResponse.parameterList?
task.currentIndex = task.nextIndex
task.nextIndex = Math.min(task.currentIndex + BATCH_SIZE, task.parameterNames.length)
names = task.parameterNames.slice(task.currentIndex, task.nextIndex)
if methodResponse.type is 'GetParameterValuesResponse'
deviceUpdates.parameterValues = methodResponse.parameterList
if names.length == 0
return STATUS_FINISHED
cwmpResponse.methodRequest = {
type : 'GetParameterValues',
parameterNames : names
}
return STATUS_STARTED
this.setParameterValues = (task, methodResponse, cwmpResponse, deviceUpdates) ->
if methodResponse.faultcode?
task.fault = methodResponse
return STATUS_FAULT
if not task.currentIndex?
task.currentIndex = 0
else if methodResponse.type is 'SetParameterValuesResponse'
prevValues = task.parameterValues.slice(task.currentIndex, task.nextIndex)
task.currentIndex = task.nextIndex
task.nextIndex = Math.min(task.currentIndex + BATCH_SIZE, task.parameterValues.length)
values = task.parameterValues.slice(task.currentIndex, task.nextIndex)
if prevValues?
deviceUpdates.parameterValues = prevValues
if values.length == 0
return STATUS_FINISHED
cwmpResponse.methodRequest = {
type : 'SetParameterValues',
parameterList : values
}
return STATUS_STARTED
this.reboot = (task, methodResponse, cwmpResponse, deviceUpdates) ->
if methodResponse.faultcode?
task.fault = methodResponse
return STATUS_FAULT
if methodResponse.type isnt 'RebootResponse'
cwmpResponse.methodRequest = {
type : 'Reboot'
}
return STATUS_STARTED
return STATUS_FINISHED
this.download = (task, methodResponse, cwmpResponse, deviceUpdates) ->
if methodResponse.faultcode?
task.fault = methodResponse
return STATUS_FAULT
if methodResponse.type isnt 'DownloadResponse'
cwmpResponse.methodRequest = {
type : 'Download',
fileType : task.fileType,
url : task.url
}
return STATUS_STARTED
return STATUS_FINISHED
exports.task = (task, methodResponse, cwmpResponse, deviceUpdates) ->
return this[task.name](task, methodResponse, cwmpResponse, deviceUpdates)