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 |