eric7/WebBrowser/UserAgent/UserAgentManager.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
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)

eric ide

mercurial