17 |
17 |
18 class XMLStreamReaderBase(QXmlStreamReader): |
18 class XMLStreamReaderBase(QXmlStreamReader): |
19 """ |
19 """ |
20 Class implementing a base class for all of eric7s XML stream readers. |
20 Class implementing a base class for all of eric7s XML stream readers. |
21 """ |
21 """ |
|
22 |
22 def __init__(self, device): |
23 def __init__(self, device): |
23 """ |
24 """ |
24 Constructor |
25 Constructor |
25 |
26 |
26 @param device reference to the I/O device to read from (QIODevice) |
27 @param device reference to the I/O device to read from (QIODevice) |
27 """ |
28 """ |
28 super().__init__(device) |
29 super().__init__(device) |
29 |
30 |
30 def toBool(self, value): |
31 def toBool(self, value): |
31 """ |
32 """ |
32 Public method to convert the given value to bool. |
33 Public method to convert the given value to bool. |
33 |
34 |
34 @param value value to be converted ("True", "False", "1", "0") |
35 @param value value to be converted ("True", "False", "1", "0") |
35 @return converted value (boolean) or None in case of an error |
36 @return converted value (boolean) or None in case of an error |
36 """ |
37 """ |
37 if value.lower() in ["true", "false"]: |
38 if value.lower() in ["true", "false"]: |
38 return value.lower() == "true" |
39 return value.lower() == "true" |
39 |
40 |
40 if value in ["1", "0"]: |
41 if value in ["1", "0"]: |
41 return bool(int(value)) |
42 return bool(int(value)) |
42 |
43 |
43 self.raiseBadValue(value) |
44 self.raiseBadValue(value) |
44 return None |
45 return None |
45 |
46 |
46 def showErrorMessage(self): |
47 def showErrorMessage(self): |
47 """ |
48 """ |
48 Public method to show an error message. |
49 Public method to show an error message. |
49 """ |
50 """ |
50 if self.hasError(): |
51 if self.hasError(): |
51 if self.device() is not None: |
52 if self.device() is not None: |
52 msg = QCoreApplication.translate( |
53 msg = QCoreApplication.translate( |
53 "XMLStreamReaderBase", |
54 "XMLStreamReaderBase", |
54 "<p>XML parse error in file <b>{0}</b>, line {1}," |
55 "<p>XML parse error in file <b>{0}</b>, line {1}," |
55 " column {2}</p><p>Error: {3}</p>").format( |
56 " column {2}</p><p>Error: {3}</p>", |
|
57 ).format( |
56 self.device().fileName(), |
58 self.device().fileName(), |
57 self.lineNumber(), self.columnNumber(), |
59 self.lineNumber(), |
58 self.errorString()) |
60 self.columnNumber(), |
|
61 self.errorString(), |
|
62 ) |
59 else: |
63 else: |
60 msg = QCoreApplication.translate( |
64 msg = QCoreApplication.translate( |
61 "XMLStreamReaderBase", |
65 "XMLStreamReaderBase", |
62 "<p>XML parse error (line {0}," |
66 "<p>XML parse error (line {0}," " column {1})</p><p>Error: {2}</p>", |
63 " column {1})</p><p>Error: {2}</p>").format( |
67 ).format(self.lineNumber(), self.columnNumber(), self.errorString()) |
64 self.lineNumber(), self.columnNumber(), |
|
65 self.errorString()) |
|
66 EricMessageBox.warning( |
68 EricMessageBox.warning( |
67 None, |
69 None, |
68 QCoreApplication.translate( |
70 QCoreApplication.translate("XMLStreamReaderBase", "XML parse error"), |
69 "XMLStreamReaderBase", "XML parse error"), |
71 msg, |
70 msg) |
72 ) |
71 |
73 |
72 def raiseUnexpectedStartTag(self, tag): |
74 def raiseUnexpectedStartTag(self, tag): |
73 """ |
75 """ |
74 Public method to raise an error for an unexpected start tag. |
76 Public method to raise an error for an unexpected start tag. |
75 |
77 |
76 @param tag name of the unexpected tag (string) |
78 @param tag name of the unexpected tag (string) |
77 """ |
79 """ |
78 self.raiseError(QCoreApplication.translate( |
80 self.raiseError( |
79 "XMLStreamReaderBase", "Unexpected start tag '{0}'.".format(tag))) |
81 QCoreApplication.translate( |
80 |
82 "XMLStreamReaderBase", "Unexpected start tag '{0}'.".format(tag) |
|
83 ) |
|
84 ) |
|
85 |
81 def raiseUnsupportedFormatVersion(self, version): |
86 def raiseUnsupportedFormatVersion(self, version): |
82 """ |
87 """ |
83 Public method to raise an error for an unsupported file format version. |
88 Public method to raise an error for an unsupported file format version. |
84 |
89 |
85 @param version unsupported version (string) |
90 @param version unsupported version (string) |
86 """ |
91 """ |
87 self.raiseError(QCoreApplication.translate( |
92 self.raiseError( |
88 "XMLStreamReaderBase", |
93 QCoreApplication.translate( |
89 "File format version '{0}' is not supported.").format(version)) |
94 "XMLStreamReaderBase", "File format version '{0}' is not supported." |
90 |
95 ).format(version) |
|
96 ) |
|
97 |
91 def raiseBadValue(self, value): |
98 def raiseBadValue(self, value): |
92 """ |
99 """ |
93 Public method to raise an error for a bad value. |
100 Public method to raise an error for a bad value. |
94 |
101 |
95 @param value bad value (string) |
102 @param value bad value (string) |
96 """ |
103 """ |
97 self.raiseError(QCoreApplication.translate( |
104 self.raiseError( |
98 "XMLStreamReaderBase", "Bad value: {0}").format(value)) |
105 QCoreApplication.translate("XMLStreamReaderBase", "Bad value: {0}").format( |
99 |
106 value |
|
107 ) |
|
108 ) |
|
109 |
100 def readXML(self): |
110 def readXML(self): |
101 """ |
111 """ |
102 Public method to read and parse the XML document. |
112 Public method to read and parse the XML document. |
103 """ |
113 """ |
104 pass |
114 pass |
105 |
115 |
106 def attribute(self, name, default=""): |
116 def attribute(self, name, default=""): |
107 """ |
117 """ |
108 Public method to read the given attribute of the current tag. |
118 Public method to read the given attribute of the current tag. |
109 |
119 |
110 @param name name of the attribute (string) |
120 @param name name of the attribute (string) |
111 @param default default value (string) |
121 @param default default value (string) |
112 @return value of the requested tag attribute (string) |
122 @return value of the requested tag attribute (string) |
113 """ |
123 """ |
114 try: |
124 try: |
170 real, imag = self.readElementText().split() |
180 real, imag = self.readElementText().split() |
171 val = float(real) + float(imag) * 1j |
181 val = float(real) + float(imag) * 1j |
172 elif self.name() == "string": |
182 elif self.name() == "string": |
173 val = self.readElementText() |
183 val = self.readElementText() |
174 elif self.name() == "bytes": |
184 elif self.name() == "bytes": |
175 by = bytes([int(b) for b in |
185 by = bytes([int(b) for b in self.readElementText().split(",")]) |
176 self.readElementText().split(",")]) |
|
177 val = by |
186 val = by |
178 elif self.name() == "bytearray": |
187 elif self.name() == "bytearray": |
179 by = bytearray([int(b) for b in |
188 by = bytearray( |
180 self.readElementText().split(",")]) |
189 [int(b) for b in self.readElementText().split(",")] |
|
190 ) |
181 val = by |
191 val = by |
182 elif self.name() == "tuple": |
192 elif self.name() == "tuple": |
183 val = self.__readTuple() |
193 val = self.__readTuple() |
184 return val |
194 return val |
185 elif self.name() == "list": |
195 elif self.name() == "list": |
195 val = self.__readFrozenset() |
205 val = self.__readFrozenset() |
196 return val |
206 return val |
197 elif self.name() == "pickle": |
207 elif self.name() == "pickle": |
198 encoding = self.attribute("encoding") |
208 encoding = self.attribute("encoding") |
199 if encoding != "base64": |
209 if encoding != "base64": |
200 self.raiseError(QCoreApplication.translate( |
210 self.raiseError( |
201 "XMLStreamReaderBase", |
211 QCoreApplication.translate( |
202 "Pickle data encoding '{0}' is not" |
212 "XMLStreamReaderBase", |
203 " supported.").format(encoding)) |
213 "Pickle data encoding '{0}' is not" " supported.", |
|
214 ).format(encoding) |
|
215 ) |
204 continue |
216 continue |
205 b64 = self.readElementText() |
217 b64 = self.readElementText() |
206 pic = base64.b64decode(b64.encode("ASCII")) |
218 pic = base64.b64decode(b64.encode("ASCII")) |
207 val = pickle.loads(pic) # secok |
219 val = pickle.loads(pic) # secok |
208 else: |
220 else: |
209 self._skipUnknownElement() |
221 self._skipUnknownElement() |
210 except ValueError as err: |
222 except ValueError as err: |
211 self.raiseError(str(err)) |
223 self.raiseError(str(err)) |
212 continue |
224 continue |
213 |
225 |
214 if self.isEndElement(): |
226 if self.isEndElement(): |
215 if self.name() in [ |
227 if self.name() in ["tuple", "list", "dict", "set", "frozenset"]: |
216 "tuple", "list", "dict", "set", "frozenset"]: |
|
217 return None |
228 return None |
218 else: |
229 else: |
219 return val |
230 return val |
220 |
231 |
221 def __readTuple(self): |
232 def __readTuple(self): |
222 """ |
233 """ |
223 Private method to read a Python tuple. |
234 Private method to read a Python tuple. |
224 |
235 |
225 @return Python tuple |
236 @return Python tuple |
226 """ |
237 """ |
227 li = [] |
238 li = [] |
228 while not self.atEnd(): |
239 while not self.atEnd(): |
229 val = self._readBasics() |
240 val = self._readBasics() |
230 if self.isEndElement() and self.name() == "tuple" and val is None: |
241 if self.isEndElement() and self.name() == "tuple" and val is None: |
231 return tuple(li) |
242 return tuple(li) |
232 else: |
243 else: |
233 li.append(val) |
244 li.append(val) |
234 |
245 |
235 def __readList(self): |
246 def __readList(self): |
236 """ |
247 """ |
237 Private method to read a Python list. |
248 Private method to read a Python list. |
238 |
249 |
239 @return Python list |
250 @return Python list |
240 """ |
251 """ |
241 li = [] |
252 li = [] |
242 while not self.atEnd(): |
253 while not self.atEnd(): |
243 val = self._readBasics() |
254 val = self._readBasics() |
244 if self.isEndElement() and self.name() == "list" and val is None: |
255 if self.isEndElement() and self.name() == "list" and val is None: |
245 return li |
256 return li |
246 else: |
257 else: |
247 li.append(val) |
258 li.append(val) |
248 |
259 |
249 def __readDict(self): |
260 def __readDict(self): |
250 """ |
261 """ |
251 Private method to read a Python dictionary. |
262 Private method to read a Python dictionary. |
252 |
263 |
253 @return Python dictionary |
264 @return Python dictionary |
254 """ |
265 """ |
255 d = {} |
266 d = {} |
256 while not self.atEnd(): |
267 while not self.atEnd(): |
257 self.readNext() |
268 self.readNext() |
260 key = self._readBasics() |
271 key = self._readBasics() |
261 elif self.name() == "value": |
272 elif self.name() == "value": |
262 d[key] = self._readBasics() |
273 d[key] = self._readBasics() |
263 if self.isEndElement() and self.name() == "dict": |
274 if self.isEndElement() and self.name() == "dict": |
264 self.readNext() |
275 self.readNext() |
265 |
276 |
266 if self.isEndElement() and self.name() == "dict": |
277 if self.isEndElement() and self.name() == "dict": |
267 return d |
278 return d |
268 |
279 |
269 def __readSet(self): |
280 def __readSet(self): |
270 """ |
281 """ |
271 Private method to read a Python set. |
282 Private method to read a Python set. |
272 |
283 |
273 @return Python set |
284 @return Python set |
274 """ |
285 """ |
275 li = [] |
286 li = [] |
276 while not self.atEnd(): |
287 while not self.atEnd(): |
277 val = self._readBasics() |
288 val = self._readBasics() |
278 if self.isEndElement() and self.name() == "set" and val is None: |
289 if self.isEndElement() and self.name() == "set" and val is None: |
279 return set(li) |
290 return set(li) |
280 else: |
291 else: |
281 li.append(val) |
292 li.append(val) |
282 |
293 |
283 def __readFrozenset(self): |
294 def __readFrozenset(self): |
284 """ |
295 """ |
285 Private method to read a Python set. |
296 Private method to read a Python set. |
286 |
297 |
287 @return Python set |
298 @return Python set |
288 """ |
299 """ |
289 li = [] |
300 li = [] |
290 while not self.atEnd(): |
301 while not self.atEnd(): |
291 val = self._readBasics() |
302 val = self._readBasics() |
292 if ( |
303 if self.isEndElement() and self.name() == "frozenset" and val is None: |
293 self.isEndElement() and |
|
294 self.name() == "frozenset" and |
|
295 val is None |
|
296 ): |
|
297 return frozenset(li) |
304 return frozenset(li) |
298 else: |
305 else: |
299 li.append(val) |
306 li.append(val) |