|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2012 - 2016 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a user agent manager. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 |
|
12 import os |
|
13 |
|
14 from PyQt5.QtCore import pyqtSignal, QObject, QXmlStreamReader |
|
15 |
|
16 from E5Gui import E5MessageBox |
|
17 |
|
18 from Utilities.AutoSaver import AutoSaver |
|
19 import Utilities |
|
20 |
|
21 |
|
22 class UserAgentManager(QObject): |
|
23 """ |
|
24 Class implementing a user agent manager. |
|
25 |
|
26 @signal changed() emitted to indicate a change |
|
27 @signal userAgentSettingsSaved() emitted after the user agent settings |
|
28 were saved |
|
29 """ |
|
30 changed = pyqtSignal() |
|
31 userAgentSettingsSaved = pyqtSignal() |
|
32 |
|
33 def __init__(self, parent=None): |
|
34 """ |
|
35 Constructor |
|
36 |
|
37 @param parent reference to the parent object (QObject) |
|
38 """ |
|
39 super(UserAgentManager, self).__init__(parent) |
|
40 |
|
41 self.__agents = {} |
|
42 # dictionary with agent strings indexed by host name |
|
43 self.__loaded = False |
|
44 self.__saveTimer = AutoSaver(self, self.save) |
|
45 |
|
46 self.changed.connect(self.__saveTimer.changeOccurred) |
|
47 |
|
48 def getFileName(self): |
|
49 """ |
|
50 Public method to get the file name of the user agents file. |
|
51 |
|
52 @return name of the user agents file (string) |
|
53 """ |
|
54 return os.path.join( |
|
55 Utilities.getConfigDir(), "web_browser", "userAgentSettings.xml") |
|
56 |
|
57 def save(self): |
|
58 """ |
|
59 Public slot to save the user agent entries to disk. |
|
60 """ |
|
61 if not self.__loaded: |
|
62 return |
|
63 |
|
64 from .UserAgentWriter import UserAgentWriter |
|
65 agentFile = self.getFileName() |
|
66 writer = UserAgentWriter() |
|
67 if not writer.write(agentFile, self.__agents): |
|
68 E5MessageBox.critical( |
|
69 None, |
|
70 self.tr("Saving user agent data"), |
|
71 self.tr( |
|
72 """<p>User agent data could not be saved to""" |
|
73 """ <b>{0}</b></p>""").format(agentFile)) |
|
74 else: |
|
75 self.userAgentSettingsSaved.emit() |
|
76 |
|
77 def __load(self): |
|
78 """ |
|
79 Private method to load the saved user agent settings. |
|
80 """ |
|
81 agentFile = self.getFileName() |
|
82 from .UserAgentReader import UserAgentReader |
|
83 reader = UserAgentReader() |
|
84 self.__agents = reader.read(agentFile) |
|
85 if reader.error() != QXmlStreamReader.NoError: |
|
86 E5MessageBox.warning( |
|
87 None, |
|
88 self.tr("Loading user agent data"), |
|
89 self.tr("""Error when loading user agent data on""" |
|
90 """ line {0}, column {1}:\n{2}""") |
|
91 .format(reader.lineNumber(), |
|
92 reader.columnNumber(), |
|
93 reader.errorString())) |
|
94 |
|
95 self.__loaded = True |
|
96 |
|
97 def reload(self): |
|
98 """ |
|
99 Public method to reload the user agent settings. |
|
100 """ |
|
101 if not self.__loaded: |
|
102 return |
|
103 |
|
104 self.__agents = {} |
|
105 self.__load() |
|
106 |
|
107 def close(self): |
|
108 """ |
|
109 Public method to close the user agents manager. |
|
110 """ |
|
111 self.__saveTimer.saveIfNeccessary() |
|
112 |
|
113 def removeUserAgent(self, host): |
|
114 """ |
|
115 Public method to remove a user agent entry. |
|
116 |
|
117 @param host host name (string) |
|
118 """ |
|
119 if host in self.__agents: |
|
120 del self.__agents[host] |
|
121 self.changed.emit() |
|
122 |
|
123 def allHostNames(self): |
|
124 """ |
|
125 Public method to get a list of all host names we a user agent setting |
|
126 for. |
|
127 |
|
128 @return sorted list of all host names (list of strings) |
|
129 """ |
|
130 if not self.__loaded: |
|
131 self.__load() |
|
132 |
|
133 return sorted(self.__agents.keys()) |
|
134 |
|
135 def hostsCount(self): |
|
136 """ |
|
137 Public method to get the number of available user agent settings. |
|
138 |
|
139 @return number of user agent settings (integer) |
|
140 """ |
|
141 if not self.__loaded: |
|
142 self.__load() |
|
143 |
|
144 return len(self.__agents) |
|
145 |
|
146 def userAgent(self, host): |
|
147 """ |
|
148 Public method to get the user agent setting for a host. |
|
149 |
|
150 @param host host name (string) |
|
151 @return user agent string (string) |
|
152 """ |
|
153 if not self.__loaded: |
|
154 self.__load() |
|
155 |
|
156 for agentHost in self.__agents: |
|
157 if host.endswith(agentHost): |
|
158 return self.__agents[agentHost] |
|
159 |
|
160 return "" |
|
161 |
|
162 def setUserAgent(self, host, agent): |
|
163 """ |
|
164 Public method to set the user agent string for a host. |
|
165 |
|
166 @param host host name (string) |
|
167 @param agent user agent string (string) |
|
168 """ |
|
169 if host != "" and agent != "": |
|
170 self.__agents[host] = agent |
|
171 self.changed.emit() |
|
172 |
|
173 def userAgentForUrl(self, url): |
|
174 """ |
|
175 Public method to determine the user agent for the given URL. |
|
176 |
|
177 @param url URL to determine user agent for (QUrl) |
|
178 @return user agent string (string) |
|
179 """ |
|
180 if url.isValid(): |
|
181 host = url.host() |
|
182 return self.userAgent(host) |
|
183 |
|
184 return "" |
|
185 |
|
186 def setUserAgentForUrl(self, url, agent): |
|
187 """ |
|
188 Public method to set the user agent string for an URL. |
|
189 |
|
190 @param url URL to register user agent setting for (QUrl) |
|
191 @param agent new current user agent string (string) |
|
192 """ |
|
193 if url.isValid(): |
|
194 host = url.host() |
|
195 self.setUserAgent(host, agent) |