Helpviewer/GreaseMonkey/GreaseMonkeyDownloader.py

changeset 1953
26aa6fd94dc2
child 1954
5072605ad4dd
equal deleted inserted replaced
1952:af4103f0e93f 1953:26aa6fd94dc2
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the downloader for GreaseMonkey scripts.
8 """
9
10 import os
11
12 from PyQt4.QtCore import pyqtSignal, QObject, QSettings, QRegExp, QUrl
13 from PyQt4.QtGui import QDialog
14 from PyQt4.QtNetwork import QNetworkReply
15
16 from E5Gui import E5MessageBox
17
18 import Helpviewer.HelpWindow
19 from Helpviewer import HelpUtilities
20 from Helpviewer.Network.FollowRedirectReply import FollowRedirectReply
21
22 from .GreaseMonkeyScript import GreaseMonkeyScript
23 from .GreaseMonkeyAddScriptDialog import GreaseMonkeyAddScriptDialog
24
25
26 class GreaseMonkeyDownloader(QObject):
27 """
28 Class implementing the downloader for GreaseMonkey scripts.
29 """
30 finished = pyqtSignal()
31
32 def __init__(self, request, manager):
33 """
34 Constructor
35
36 @param request reference to the request object (QNetworkRequest)
37 @param manager reference to the GreaseMonkey manager (GreaseMonkeyManager)
38 """
39 super().__init__()
40
41 self.__manager = manager
42
43 self.__reply = FollowRedirectReply(request.url(),
44 Helpviewer.HelpWindow.HelpWindow.networkAccessManager())
45 self.__reply.finished.connect(self.__scriptDownloaded)
46
47 self.__fileName = ""
48 self.__requireUrls = []
49
50 def __scriptDownloaded(self):
51 """
52 Private slot to handle the finished download of a script.
53 """
54 if self.sender() != self.__reply:
55 self.finished.emit()
56 return
57
58 response = bytes(self.__reply.readAll()).decode()
59
60 if self.__reply.error() == QNetworkReply.NoError and \
61 "// ==UserScript==" in response:
62 filePath = os.path.join(self.__manager.scriptsDirectory(),
63 HelpUtilities.getFileNameFromUrl(self.__reply.url()))
64 self.__fileName = HelpUtilities.ensureUniqueFilename(filePath)
65
66 try:
67 f = open(self.__fileName, "w")
68 except (IOError, OSError) as err:
69 E5MessageBox.critical(None,
70 self.trUtf8("GreaseMonkey Download"),
71 self.trUtf8("""<p>The file <b>{0}</b> could not be opened"""
72 """ for writing.<br/>Reason: {1}</p>""").format(
73 self.__fileName, str(err)))
74 self.finished.emit()
75 return
76 f.write(response)
77 f.close()
78
79 settings = QSettings(os.path.join(self.__manager.requireScriptsDirectory(),
80 "requires.ini"),
81 QSettings.IniFormat)
82 settings.beginGroup("Files")
83
84 rx = QRegExp("@require(.*)\\n")
85 rx.setMinimal(True)
86 rx.indexIn(response)
87
88 for i in range(1, rx.captureCount() + 1):
89 url = rx.cap(i).strip()
90 if url and not settings.contains(url):
91 self.__requireUrls.append(QUrl(url))
92
93 self.__reply.deleteLater()
94 self.__reply = None
95
96 self.__downloadRequires()
97
98 def __requireDownloaded(self):
99 """
100 Private slot to handle the finished download of a required script.
101 """
102 if self.sender() != self.__reply:
103 self.finished.emit()
104 return
105
106 response = bytes(self.__reply.readAll()).decode()
107
108 if self.__reply.error() == QNetworkReply.NoError and response:
109 filePath = os.path.join(self.__manager.requireScriptsDirectory(),
110 "require.js")
111 fileName = HelpUtilities.ensureUniqueFilename(filePath, "{0}")
112
113 try:
114 f = open(fileName, "w")
115 except (IOError, OSError) as err:
116 E5MessageBox.critical(None,
117 self.trUtf8("GreaseMonkey Download"),
118 self.trUtf8("""<p>The file <b>{0}</b> could not be opened"""
119 """ for writing.<br/>Reason: {1}</p>""").format(
120 fileName, str(err)))
121 self.finished.emit()
122 return
123 f.write(response)
124 f.close()
125
126 settings = QSettings(os.path.join(self.__manager.requireScriptsDirectory(),
127 "requires.ini"),
128 QSettings.IniFormat)
129 settings.beginGroup("Files")
130 settings.setValue(self.__reply.originalUrl().toString(), fileName)
131
132 self.__reply.deleteLater()
133 self.__reply = None
134
135 self.__downloadRequires()
136
137 def __downloadRequires(self):
138 """
139 Private slot to initiate the download of required scripts.
140 """
141 if self.__requireUrls:
142 self.__reply = FollowRedirectReply(self.__requireUrls.pop(0),
143 Helpviewer.HelpWindow.HelpWindow.networkAccessManager())
144 self.__reply.finished.connect(self.__requireDownloaded)
145 else:
146 deleteScript = True
147 script = GreaseMonkeyScript(self.__manager, self.__fileName)
148
149 if script.isValid():
150 if not self.__manager.containsScript(script.fullName()):
151 dlg = GreaseMonkeyAddScriptDialog(self.__manager, script)
152 deleteScript = dlg.exec_() != QDialog.Accepted
153 else:
154 E5MessageBox.information(None,
155 self.trUtf8("GreaseMonkey Download"),
156 self.trUtf8("""<p><b>{0}</b> is already installed.</p>""")
157 .format(script.name()))
158
159 if deleteScript:
160 try:
161 os.remove(self.__fileName)
162 except (IOError, OSError):
163 # ignore
164 pass
165
166 self.finished.emit()

eric ide

mercurial