Helpviewer/UserAgent/UserAgentReader.py

changeset 1687
5efcb0cea376
child 2302
f29e9405c851
equal deleted inserted replaced
1686:bd756cb42d5b 1687:5efcb0cea376
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6
7 """
8 Module implementing a class to read user agent data files.
9 """
10
11 from PyQt4.QtCore import QXmlStreamReader, QIODevice, QFile, QCoreApplication
12
13
14 class UserAgentReader(QXmlStreamReader):
15 """
16 Class implementing a reader object for user agent data files.
17 """
18 def __init__(self):
19 """
20 Constructor
21 """
22 super().__init__()
23
24 def read(self, fileNameOrDevice):
25 """
26 Public method to read a user agent file.
27
28 @param fileNameOrDevice name of the file to read (string)
29 or reference to the device to read (QIODevice)
30 @return dictionary with user agent data (host as key, agent string as value)
31 """
32 self.__agents = {}
33
34 if isinstance(fileNameOrDevice, QIODevice):
35 self.setDevice(fileNameOrDevice)
36 else:
37 f = QFile(fileNameOrDevice)
38 if not f.exists():
39 return self.__agents
40 f.open(QFile.ReadOnly)
41 self.setDevice(f)
42
43 while not self.atEnd():
44 self.readNext()
45 if self.isStartElement():
46 version = self.attributes().value("version")
47 if self.name() == "UserAgents" and \
48 (not version or version == "1.0"):
49 self.__readUserAgents()
50 else:
51 self.raiseError(QCoreApplication.translate(
52 "UserAgentReader",
53 "The file is not a UserAgents version 1.0 file."))
54
55 return self.__agents
56
57 def __readUserAgents(self):
58 """
59 Private method to read the user agents data.
60 """
61 if not self.isStartElement() and self.name() != "UserAgents":
62 return
63
64 while not self.atEnd():
65 self.readNext()
66 if self.isEndElement():
67 if self.name() == "UserAgent":
68 continue
69 else:
70 break
71
72 if self.isStartElement():
73 if self.name() == "UserAgent":
74 attributes = self.attributes()
75 host = attributes.value("host")
76 agent = attributes.value("agent")
77 self.__agents[host] = agent
78 else:
79 self.__skipUnknownElement()
80
81 def __skipUnknownElement(self):
82 """
83 Private method to skip over all unknown elements.
84 """
85 if not self.isStartElement():
86 return
87
88 while not self.atEnd():
89 self.readNext()
90 if self.isEndElement():
91 break
92
93 if self.isStartElement():
94 self.__skipUnknownElement()

eric ide

mercurial