Ejemplo n.º 1
0
 def __init__(self, file):
     self.file = file
     dict.__init__(self)
     try:
         xml = ET.parse(file)
     except SyntaxError, msg:
         raise SyntaxError, msg
Ejemplo n.º 2
0
 def __init__(self, file):
     self.file = file
     dict.__init__(self)
     try:
         xml = ET.parse(file)
     except SyntaxError, msg:
         raise SyntaxError, msg
Ejemplo n.º 3
0
 def __init__(self, file):
     self.file = file
     dict.__init__(self)
     try:
         xml = ET.parse(file)
     except (SyntaxError, IOError):
         raise
     except Exception, msg:
         raise SyntaxError(msg)
Ejemplo n.º 4
0
 def __init__(self, file):
     self.file = file
     dict.__init__(self)
     try:
         xml = ET.parse(file)
     except (SyntaxError, IOError):
         raise
     except Exception, msg:
         raise SyntaxError(msg)
Ejemplo n.º 5
0
    def init_var_and_actions(self):
        desc_file = util.sibpath(
            __file__,
            os.path.join('xml-service-descriptions',
                         '%s%d.xml' % (self.id, int(self.version))))
        tree = ET.parse(desc_file)

        for action_node in tree.findall('.//action'):
            name = action_node.findtext('name')
            implementation = 'required'
            needs_callback = False
            if action_node.attrib.get(
                    '{urn:schemas-beebits-net:service-1-0}X_needs_backend',
                    None) != None:
                needs_callback = True
            if action_node.find('Optional') != None:
                implementation = 'optional'
                if (action_node.find('Optional').attrib.get(
                        '{urn:schemas-beebits-net:service-1-0}X_needs_backend',
                        None
                ) != None or action_node.attrib.get(
                        '{urn:schemas-beebits-net:service-1-0}X_needs_backend',
                        None) != None):
                    needs_callback = True

            arguments = []
            for argument in action_node.findall('.//argument'):
                arg_name = argument.findtext('name')
                arg_direction = argument.findtext('direction')
                arg_state_var = argument.findtext('relatedStateVariable')
                arguments.append(
                    action.Argument(arg_name, arg_direction, arg_state_var))
                if (arg_state_var[0:11] == 'A_ARG_TYPE_'
                        and arg_direction == 'out'):
                    needs_callback = True
                #print arg_name, arg_direction, needs_callback
            """ check for action in backend """
            callback = getattr(self.backend, "upnp_%s" % name, None)

            if callback == None:
                """ check for action in ServiceServer """
                callback = getattr(self, "upnp_%s" % name, None)

            if (needs_callback == True and callback == None):
                """ we have one or more 'A_ARG_TYPE_' variables
                    issue a warning for now
                """
                if implementation == 'optional':
                    self.info(
                        '%s has a missing callback for %s action %s, action disabled'
                        % (self.id, implementation, name))
                    continue
                else:
                    if ((hasattr(self, 'implementation')
                         and self.implementation == 'required')
                            or not hasattr(self, 'implementation')):
                        self.warning(
                            '%s has a missing callback for %s action %s, service disabled'
                            % (self.id, implementation, name))
                    raise LookupError, "missing callback"

            new_action = action.Action(self, name, implementation, arguments)
            self._actions[name] = new_action
            if callback != None:
                new_action.set_callback(callback)
                self.info('Add callback %s for %s/%s' %
                          (callback, self.id, name))

        backend_vendor_value_defaults = getattr(self.backend,
                                                "vendor_value_defaults", None)
        service_value_defaults = None
        if backend_vendor_value_defaults:
            service_value_defaults = backend_vendor_value_defaults.get(
                self.id, None)

        backend_vendor_range_defaults = getattr(self.backend,
                                                "vendor_range_defaults", None)
        service_range_defaults = None
        if backend_vendor_range_defaults:
            service_range_defaults = backend_vendor_range_defaults.get(self.id)

        for var_node in tree.findall('.//stateVariable'):
            instance = 0
            name = var_node.findtext('name')
            implementation = 'required'
            if action_node.find('Optional') != None:
                implementation = 'optional'

            #if implementation == 'optional':
            #    for action_object in self._actions.values():
            #        if name in [a.get_state_variable() for a in action_object.arguments_list]:
            #            break
            #    else:
            #        continue

            send_events = var_node.findtext('sendEventsAttribute')
            data_type = var_node.findtext('dataType')
            values = []
            for allowed in var_node.findall('.//allowedValue'):
                values.append(allowed.text)
            self._variables.get(instance)[name] = variable.StateVariable(
                self, name, implementation, instance, send_events, data_type,
                values)

            dependant_variable = var_node.findtext(
                '{urn:schemas-beebits-net:service-1-0}X_dependantVariable')
            if dependant_variable:
                self._variables.get(
                    instance)[name].dependant_variable = dependant_variable
            default_value = var_node.findtext('defaultValue')
            if default_value:
                self._variables.get(instance)[name].set_default_value(
                    default_value)
            if var_node.find('sendEventsAttribute') != None:
                never_evented = var_node.find(
                    'sendEventsAttribute'
                ).attrib.get(
                    '{urn:schemas-beebits-net:service-1-0}X_no_means_never',
                    None)
                if never_evented is not None:
                    self._variables.get(instance)[name].set_never_evented(
                        never_evented)

            allowed_value_list = var_node.find('allowedValueList')
            if allowed_value_list != None:
                vendor_values = allowed_value_list.attrib.get(
                    '{urn:schemas-beebits-net:service-1-0}X_withVendorDefines',
                    None)
                if service_value_defaults:
                    variable_value_defaults = service_value_defaults.get(
                        name, None)
                    if variable_value_defaults:
                        self.info("overwriting %s default value with %s" %
                                  (name, variable_value_defaults))
                        self._variables.get(instance)[name].set_allowed_values(
                            variable_value_defaults)

                if vendor_values != None:
                    self._variables.get(
                        instance)[name].has_vendor_values = True

            allowed_value_range = var_node.find('allowedValueRange')
            if allowed_value_range:
                vendor_values = allowed_value_range.attrib.get(
                    '{urn:schemas-beebits-net:service-1-0}X_withVendorDefines',
                    None)
                range = {}
                for e in list(allowed_value_range):
                    range[e.tag] = e.text
                    if (vendor_values != None):
                        if service_range_defaults:
                            variable_range_defaults = service_range_defaults.get(
                                name)
                            if (variable_range_defaults != None
                                    and variable_range_defaults.get(
                                        e.tag) != None):
                                self.info(
                                    "overwriting %s attribute %s with %s" %
                                    (name, e.tag,
                                     str(variable_range_defaults[e.tag])))
                                range[e.tag] = variable_range_defaults[e.tag]
                            elif e.text == None:
                                self.info(
                                    "missing vendor definition for %s, attribute %s"
                                    % (name, e.tag))
                self._variables.get(instance)[name].set_allowed_value_range(
                    **range)
                if vendor_values != None:
                    self._variables.get(
                        instance)[name].has_vendor_values = True
            elif service_range_defaults:
                variable_range_defaults = service_range_defaults.get(name)
                if variable_range_defaults != None:
                    self._variables.get(
                        instance)[name].set_allowed_value_range(
                            **variable_range_defaults)
                    self._variables.get(
                        instance)[name].has_vendor_values = True

        for v in self._variables.get(0).values():
            if isinstance(v.dependant_variable, str):
                v.dependant_variable = self._variables.get(instance).get(
                    v.dependant_variable)
Ejemplo n.º 6
0
    def init_var_and_actions(self):
        desc_file = util.sibpath(__file__, os.path.join('xml-service-descriptions', '%s%d.xml' % (self.id, int(self.version))))
        tree = ET.parse(desc_file)

        for action_node in tree.findall('.//action'):
            name = action_node.findtext('name')
            implementation = 'required'
            if action_node.find('Optional') != None:
                implementation = 'optional'
            arguments = []
            needs_callback = False
            for argument in action_node.findall('.//argument'):
                arg_name = argument.findtext('name')
                arg_direction = argument.findtext('direction')
                arg_state_var = argument.findtext('relatedStateVariable')
                arguments.append(action.Argument(arg_name, arg_direction,
                                                 arg_state_var))
                if( arg_state_var[0:11] == 'A_ARG_TYPE_' and
                    arg_direction == 'out'):
                    needs_callback = True
                #print arg_name, arg_direction, needs_callback

            """ check for action in backend """
            callback = getattr(self.backend, "upnp_%s" % name, None)

            if callback == None:
                """ check for action in ServiceServer """
                callback = getattr(self, "upnp_%s" % name, None)

            if( needs_callback == True and
                callback == None):
                """ we have one or more 'A_ARG_TYPE_' variables
                    issue a warning for now
                """
                if implementation == 'optional':
                    self.info('%s has a missing callback for %s action %s, action disabled' % (self.id,implementation,name))
                    continue
                else:
                    self.warning('%s has a missing callback for %s action %s, service disabled' % (self.id,implementation,name))
                    raise LookupError,"missing callback"

            new_action = action.Action(self, name, implementation, arguments)
            self._actions[name] = new_action
            if callback != None:
                new_action.set_callback(callback)
                self.info('Add callback %s for %s/%s' % (callback, self.id, name))


        backend_vendor_value_defaults = getattr(self.backend, "vendor_value_defaults", None)
        service_value_defaults = None
        if backend_vendor_value_defaults:
            service_value_defaults = backend_vendor_value_defaults.get(self.id,None)

        backend_vendor_range_defaults = getattr(self.backend, "vendor_range_defaults", None)
        service_range_defaults = None
        if backend_vendor_range_defaults:
            service_range_defaults = backend_vendor_range_defaults.get(self.id)

        for var_node in tree.findall('.//stateVariable'):
            instance = 0
            name = var_node.findtext('name')
            implementation = 'required'
            if action_node.find('Optional') != None:
                implementation = 'optional'
            send_events = var_node.findtext('sendEventsAttribute')
            data_type = var_node.findtext('dataType')
            values = []
            for allowed in var_node.findall('.//allowedValue'):
                values.append(allowed.text)
            self._variables.get(instance)[name] = variable.StateVariable(self, name,
                                                           implementation,
                                                           instance, send_events,
                                                           data_type, values)
            default_value = var_node.findtext('defaultValue')
            if default_value:
                self._variables.get(instance)[name].set_default_value(default_value)
            if var_node.find('sendEventsAttribute') != None:
                never_evented = var_node.find('sendEventsAttribute').attrib.get(
                                        '{urn:schemas-beebits-net:service-1-0}X_no_means_never',
                                        None)
                if never_evented is not None:
                    self._variables.get(instance)[name].set_never_evented(never_evented)
            dependant_variable = var_node.findtext('{urn:schemas-beebits-net:service-1-0}X_dependantVariable')
            if dependant_variable:
                self._variables.get(instance)[name].dependant_variable = dependant_variable
            allowed_value_list = var_node.find('allowedValueList')
            if allowed_value_list != None:
                vendor_values = allowed_value_list.attrib.get(
                                    '{urn:schemas-beebits-net:service-1-0}X_withVendorDefines',
                                    None)
                if service_value_defaults:
                    variable_value_defaults = service_value_defaults.get(name, None)
                    if variable_value_defaults:
                        self.info("overwriting %s default value with %s" % (name,
                                                               variable_value_defaults))
                        self._variables.get(instance)[name].set_allowed_values(variable_value_defaults)

                if vendor_values != None:
                    self._variables.get(instance)[name].has_vendor_values = True

            allowed_value_range = var_node.find('allowedValueRange')
            if allowed_value_range:
                vendor_values = allowed_value_range.attrib.get(
                                    '{urn:schemas-beebits-net:service-1-0}X_withVendorDefines',
                                    None)
                range = {}
                for e in list(allowed_value_range):
                    range[e.tag] = e.text
                    if( vendor_values != None):
                        if service_range_defaults:
                            variable_range_defaults = service_range_defaults.get(name)
                            if( variable_range_defaults != None and
                                variable_range_defaults.get(e.tag) != None):
                                self.info("overwriting %s attribute %s with %s" % (name,
                                                               e.tag, str(variable_range_defaults[e.tag])))
                                range[e.tag] = variable_range_defaults[e.tag]
                            elif e.text == None:
                                self.info("missing vendor definition for %s, attribute %s" % (name, e.tag))
                self._variables.get(instance)[name].set_allowed_value_range(**range)
                if vendor_values != None:
                    self._variables.get(instance)[name].has_vendor_values = True

        for v in self._variables.get(0).values():
            if isinstance( v.dependant_variable, str):
                v.dependant_variable = self._variables.get(instance).get(v.dependant_variable)