configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_reader.py
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
equal deleted inserted replaced
2:87cfa131b535 3:e7e0ae78773e
    11 #
    11 #
    12 # Contributors:
    12 # Contributors:
    13 #
    13 #
    14 # Description:
    14 # Description:
    15 #
    15 #
    16 
    16 import pkg_resources
    17 from cone.public import exceptions, plugin
    17 from cone.public import exceptions, plugin, utils
    18 import crml_impl
    18 import crml_impl
    19 from crml_model import *
    19 from crml_model import *
    20 
    20 
    21 
    21 
    22 def get_required_attr(elem, attrname):
    22 def get_required_attr(elem, attrname):
    42     except ValueError:
    42     except ValueError:
    43         return long(string, 16)
    43         return long(string, 16)
    44 
    44 
    45 class CrmlReader(plugin.ReaderBase):
    45 class CrmlReader(plugin.ReaderBase):
    46     NAMESPACE = 'http://www.s60.com/xml/cenrep/1'
    46     NAMESPACE = 'http://www.s60.com/xml/cenrep/1'
       
    47     NAMESPACE_ID = 'crml'
       
    48     ROOT_ELEMENT_NAME = 'repository'
    47     FILE_EXTENSIONS = ['crml']
    49     FILE_EXTENSIONS = ['crml']
    48     
    50     
    49     @classmethod
    51     @classmethod
    50     def read_impl(cls, resource_ref, configuration, etree):
    52     def read_impl(cls, resource_ref, configuration, etree):
    51         reader = CrmlReader()
    53         reader = CrmlReader()
    52         repository = reader.read_repository(etree)
    54         repository = reader.read_repository(etree)
    53         return crml_impl.CrmlImpl(resource_ref, configuration, repository)
    55         return crml_impl.CrmlImpl(resource_ref, configuration, repository)
       
    56     
       
    57     @classmethod
       
    58     def get_schema_data(cls):
       
    59         return pkg_resources.resource_string('CRMLPlugin', 'xsd/crml.xsd')
    54     
    60     
    55     def read_repository(self, elem):
    61     def read_repository(self, elem):
    56         """
    62         """
    57         Read a CrmlRepository object from the given XML element.
    63         Read a CrmlRepository object from the given XML element.
    58         """
    64         """
    97         for access_elem in elem.findall('{%s}access' % self.NAMESPACE):
   103         for access_elem in elem.findall('{%s}access' % self.NAMESPACE):
    98             type = access_elem.get('type')
   104             type = access_elem.get('type')
    99             if type == 'R' and not read_cap_found:
   105             if type == 'R' and not read_cap_found:
   100                 access.cap_rd = access_elem.get('capabilities')
   106                 access.cap_rd = access_elem.get('capabilities')
   101                 access.sid_rd = access_elem.get('sid')
   107                 access.sid_rd = access_elem.get('sid')
       
   108                 access.line_rd = utils.etree.get_lineno(access_elem)
   102                 read_cap_found = True
   109                 read_cap_found = True
   103             elif type == 'W' and not write_cap_found:
   110             elif type == 'W' and not write_cap_found:
   104                 access.cap_wr = access_elem.get('capabilities')
   111                 access.cap_wr = access_elem.get('capabilities')
   105                 access.sid_wr = access_elem.get('sid')
   112                 access.sid_wr = access_elem.get('sid')
       
   113                 access.line_wr = utils.etree.get_lineno(access_elem)
   106                 write_cap_found = True
   114                 write_cap_found = True
   107         
   115         
   108         return access
   116         return access
   109     
   117     
   110     def read_common_key_attrs(self, key_elem, key_obj):
   118     def read_common_key_attrs(self, key_elem, key_obj):
   143             raise RuntimeError("Incorrect XML element passed to read_simple_key(): %s, expected %s" % (key_elem.tag, expected_tag))
   151             raise RuntimeError("Incorrect XML element passed to read_simple_key(): %s, expected %s" % (key_elem.tag, expected_tag))
   144         
   152         
   145         key = CrmlSimpleKey(
   153         key = CrmlSimpleKey(
   146             ref  = get_required_attr(key_elem, 'ref').replace('/', '.'),
   154             ref  = get_required_attr(key_elem, 'ref').replace('/', '.'),
   147             int  = get_required_attr(key_elem, 'int'),
   155             int  = get_required_attr(key_elem, 'int'),
   148             type = key_elem.get('type', 'int'))
   156             type = key_elem.get('type', 'int'),
       
   157             line = utils.etree.get_lineno(key_elem))
   149         self.read_common_key_attrs(key_elem, key)
   158         self.read_common_key_attrs(key_elem, key)
   150         
   159         
   151         return key
   160         return key
   152     
   161     
   153     def read_bitmask_key(self, key_elem):
   162     def read_bitmask_key(self, key_elem):
   159             raise RuntimeError("Incorrect XML element passed to read_bitmask_key(): %s, expected %s" % (key_elem.tag, expected_tag))
   168             raise RuntimeError("Incorrect XML element passed to read_bitmask_key(): %s, expected %s" % (key_elem.tag, expected_tag))
   160         
   169         
   161         # Read attributes
   170         # Read attributes
   162         key = CrmlBitmaskKey(
   171         key = CrmlBitmaskKey(
   163             int  = get_required_attr(key_elem, 'int'),
   172             int  = get_required_attr(key_elem, 'int'),
   164             type = key_elem.get('type', 'int'))
   173             type = key_elem.get('type', 'int'),
       
   174             line = utils.etree.get_lineno(key_elem))
   165         self.read_common_key_attrs(key_elem, key)
   175         self.read_common_key_attrs(key_elem, key)
   166         
   176         
   167         # Read bits
   177         # Read bits
   168         for bit_elem in key_elem.findall('{%s}bit' % self.NAMESPACE):
   178         for bit_elem in key_elem.findall('{%s}bit' % self.NAMESPACE):
   169             ref = get_required_attr(bit_elem, 'ref').replace('/', '.')
   179             ref = get_required_attr(bit_elem, 'ref').replace('/', '.')
   170             if bit_elem.get('value') == 'false':    invert = True
   180             if bit_elem.get('value') == 'false':    invert = True
   171             else:                                   invert = False
   181             else:                                   invert = False
   172             index = int(bit_elem.text.strip())
   182             index = int(bit_elem.text.strip())
   173             
   183             
   174             key.bits.append(CrmlBit(ref=ref, index=index, type=type, invert=invert))
   184             key.bits.append(CrmlBit(ref=ref, index=index, type=type, invert=invert,
       
   185                                     line=utils.etree.get_lineno(bit_elem)))
   175         
   186         
   176         return key
   187         return key
   177     
   188     
   178     def read_key_range(self, key_range_elem):
   189     def read_key_range(self, key_range_elem):
   179         """
   190         """
   190             ref         = ref,
   201             ref         = ref,
   191             first_int   = get_required_attr(key_range_elem, "firstInt"),
   202             first_int   = get_required_attr(key_range_elem, "firstInt"),
   192             last_int    = get_required_attr(key_range_elem, "lastInt"),
   203             last_int    = get_required_attr(key_range_elem, "lastInt"),
   193             count_int   = key_range_elem.get('countInt'),
   204             count_int   = key_range_elem.get('countInt'),
   194             first_index = convert_num(key_range_elem.get('firstIndex', '0')),
   205             first_index = convert_num(key_range_elem.get('firstIndex', '0')),
   195             index_bits  = convert_num(key_range_elem.get('indexBits')))
   206             index_bits  = convert_num(key_range_elem.get('indexBits')),
       
   207             line        = utils.etree.get_lineno(key_range_elem))
   196         self.read_common_key_attrs(key_range_elem, key_range)
   208         self.read_common_key_attrs(key_range_elem, key_range)
   197         
   209         
   198         # Read sub-keys
   210         # Read sub-keys
   199         for subkey_elem in key_range_elem.findall('{%s}key' % self.NAMESPACE):
   211         for subkey_elem in key_range_elem.findall('{%s}key' % self.NAMESPACE):
   200             ref = get_required_attr(subkey_elem, 'ref').replace('/', '.')
   212             ref = get_required_attr(subkey_elem, 'ref').replace('/', '.')
   201             int = get_required_attr(subkey_elem, 'int')
   213             int = get_required_attr(subkey_elem, 'int')
   202             name = subkey_elem.get('name')
   214             name = subkey_elem.get('name')
   203             type = subkey_elem.get('type', 'int')
   215             type = subkey_elem.get('type', 'int')
   204             key_range.subkeys.append(CrmlKeyRangeSubKey(ref=ref, int=int, name=name, type=type))
   216             key_range.subkeys.append(CrmlKeyRangeSubKey(ref=ref, int=int, name=name, type=type,
       
   217                                                         line=utils.etree.get_lineno(subkey_elem)))
   205         
   218         
   206         return key_range
   219         return key_range