13 |
13 |
14 class UserAgentReader(QXmlStreamReader): |
14 class UserAgentReader(QXmlStreamReader): |
15 """ |
15 """ |
16 Class implementing a reader object for user agent data files. |
16 Class implementing a reader object for user agent data files. |
17 """ |
17 """ |
|
18 |
18 def __init__(self): |
19 def __init__(self): |
19 """ |
20 """ |
20 Constructor |
21 Constructor |
21 """ |
22 """ |
22 super().__init__() |
23 super().__init__() |
23 |
24 |
24 def read(self, fileNameOrDevice): |
25 def read(self, fileNameOrDevice): |
25 """ |
26 """ |
26 Public method to read a user agent file. |
27 Public method to read a user agent file. |
27 |
28 |
28 @param fileNameOrDevice name of the file to read (string) |
29 @param fileNameOrDevice name of the file to read (string) |
29 or reference to the device to read (QIODevice) |
30 or reference to the device to read (QIODevice) |
30 @return dictionary with user agent data (host as key, agent string as |
31 @return dictionary with user agent data (host as key, agent string as |
31 value) |
32 value) |
32 """ |
33 """ |
33 self.__agents = {} |
34 self.__agents = {} |
34 |
35 |
35 if isinstance(fileNameOrDevice, QIODevice): |
36 if isinstance(fileNameOrDevice, QIODevice): |
36 self.setDevice(fileNameOrDevice) |
37 self.setDevice(fileNameOrDevice) |
37 else: |
38 else: |
38 f = QFile(fileNameOrDevice) |
39 f = QFile(fileNameOrDevice) |
39 if not f.exists(): |
40 if not f.exists(): |
40 return self.__agents |
41 return self.__agents |
41 f.open(QIODevice.OpenModeFlag.ReadOnly) |
42 f.open(QIODevice.OpenModeFlag.ReadOnly) |
42 self.setDevice(f) |
43 self.setDevice(f) |
43 |
44 |
44 while not self.atEnd(): |
45 while not self.atEnd(): |
45 self.readNext() |
46 self.readNext() |
46 if self.isStartElement(): |
47 if self.isStartElement(): |
47 version = self.attributes().value("version") |
48 version = self.attributes().value("version") |
48 if ( |
49 if self.name() == "UserAgents" and (not version or version == "1.0"): |
49 self.name() == "UserAgents" and |
|
50 (not version or version == "1.0") |
|
51 ): |
|
52 self.__readUserAgents() |
50 self.__readUserAgents() |
53 else: |
51 else: |
54 self.raiseError(QCoreApplication.translate( |
52 self.raiseError( |
55 "UserAgentReader", |
53 QCoreApplication.translate( |
56 "The file is not a UserAgents version 1.0 file.")) |
54 "UserAgentReader", |
57 |
55 "The file is not a UserAgents version 1.0 file.", |
|
56 ) |
|
57 ) |
|
58 |
58 return self.__agents |
59 return self.__agents |
59 |
60 |
60 def __readUserAgents(self): |
61 def __readUserAgents(self): |
61 """ |
62 """ |
62 Private method to read the user agents data. |
63 Private method to read the user agents data. |
63 """ |
64 """ |
64 if not self.isStartElement() and self.name() != "UserAgents": |
65 if not self.isStartElement() and self.name() != "UserAgents": |
65 return |
66 return |
66 |
67 |
67 while not self.atEnd(): |
68 while not self.atEnd(): |
68 self.readNext() |
69 self.readNext() |
69 if self.isEndElement(): |
70 if self.isEndElement(): |
70 if self.name() == "UserAgent": |
71 if self.name() == "UserAgent": |
71 continue |
72 continue |
72 else: |
73 else: |
73 break |
74 break |
74 |
75 |
75 if self.isStartElement(): |
76 if self.isStartElement(): |
76 if self.name() == "UserAgent": |
77 if self.name() == "UserAgent": |
77 attributes = self.attributes() |
78 attributes = self.attributes() |
78 host = attributes.value("host") |
79 host = attributes.value("host") |
79 agent = attributes.value("agent") |
80 agent = attributes.value("agent") |
80 self.__agents[host] = agent |
81 self.__agents[host] = agent |
81 else: |
82 else: |
82 self.__skipUnknownElement() |
83 self.__skipUnknownElement() |
83 |
84 |
84 def __skipUnknownElement(self): |
85 def __skipUnknownElement(self): |
85 """ |
86 """ |
86 Private method to skip over all unknown elements. |
87 Private method to skip over all unknown elements. |
87 """ |
88 """ |
88 if not self.isStartElement(): |
89 if not self.isStartElement(): |
89 return |
90 return |
90 |
91 |
91 while not self.atEnd(): |
92 while not self.atEnd(): |
92 self.readNext() |
93 self.readNext() |
93 if self.isEndElement(): |
94 if self.isEndElement(): |
94 break |
95 break |
95 |
96 |
96 if self.isStartElement(): |
97 if self.isStartElement(): |
97 self.__skipUnknownElement() |
98 self.__skipUnknownElement() |