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