10 from __future__ import unicode_literals |
10 from __future__ import unicode_literals |
11 |
11 |
12 import os |
12 import os |
13 import hashlib |
13 import hashlib |
14 |
14 |
15 from PyQt4.QtCore import QObject, QTranslator |
15 from PyQt5.QtCore import QObject, QTranslator |
16 from PyQt4.QtGui import QMenu |
16 from PyQt5.QtWidgets import QMenu |
17 |
17 |
18 from E5Gui.E5Application import e5App |
18 from E5Gui.E5Application import e5App |
19 from E5Gui import E5FileDialog, E5MessageBox |
19 from E5Gui import E5FileDialog, E5MessageBox |
20 |
20 |
21 # Start-Of-Header |
21 # Start-Of-Header |
22 name = "Generate Hash Tool Plug-in" |
22 name = "Generate Hash Tool Plug-in" |
23 author = "Detlev Offenbach <detlev@die-offenbachs.de>" |
23 author = "Detlev Offenbach <detlev@die-offenbachs.de>" |
24 autoactivate = True |
24 autoactivate = True |
25 deactivateable = True |
25 deactivateable = True |
26 version = "1.0.0" |
26 version = "2.0.0" |
27 className = "ToolGenerateHashPlugin" |
27 className = "ToolGenerateHashPlugin" |
28 packageName = "ToolGenerateHash" |
28 packageName = "ToolGenerateHash" |
29 shortDescription = "Generate a hash for a selectable file or directory" |
29 shortDescription = "Generate a hash for a selectable file or directory" |
30 longDescription = \ |
30 longDescription = \ |
31 """Plug-in to generate a hash for a selectable file or directory. The"""\ |
31 """Plug-in to generate a hash for a selectable file or directory. The"""\ |
136 self.__fileMenu.addAction("SHA1", self.__hashFile).setData("SHA1") |
136 self.__fileMenu.addAction("SHA1", self.__hashFile).setData("SHA1") |
137 self.__fileMenu.addAction("SHA224", self.__hashFile).setData("SHA224") |
137 self.__fileMenu.addAction("SHA224", self.__hashFile).setData("SHA224") |
138 self.__fileMenu.addAction("SHA256", self.__hashFile).setData("SHA256") |
138 self.__fileMenu.addAction("SHA256", self.__hashFile).setData("SHA256") |
139 self.__fileMenu.addAction("SHA384", self.__hashFile).setData("SHA384") |
139 self.__fileMenu.addAction("SHA384", self.__hashFile).setData("SHA384") |
140 self.__fileMenu.addAction("SHA512", self.__hashFile).setData("SHA512") |
140 self.__fileMenu.addAction("SHA512", self.__hashFile).setData("SHA512") |
|
141 self.__fileMenu.setEnabled(False) |
141 |
142 |
142 self.__dirMenu = QMenu(self.tr("Generate Directory Hash")) |
143 self.__dirMenu = QMenu(self.tr("Generate Directory Hash")) |
143 self.__dirMenu.addAction( |
144 self.__dirMenu.addAction( |
144 "MD5", self.__hashDirectory).setData("MD5") |
145 "MD5", self.__hashDirectory).setData("MD5") |
145 self.__dirMenu.addAction( |
146 self.__dirMenu.addAction( |
150 "SHA256", self.__hashDirectory).setData("SHA256") |
151 "SHA256", self.__hashDirectory).setData("SHA256") |
151 self.__dirMenu.addAction( |
152 self.__dirMenu.addAction( |
152 "SHA384", self.__hashDirectory).setData("SHA384") |
153 "SHA384", self.__hashDirectory).setData("SHA384") |
153 self.__dirMenu.addAction( |
154 self.__dirMenu.addAction( |
154 "SHA512", self.__hashDirectory).setData("SHA512") |
155 "SHA512", self.__hashDirectory).setData("SHA512") |
|
156 self.__dirMenu.setEnabled(False) |
155 |
157 |
156 def __populateMenu(self, name, menu): |
158 def __populateMenu(self, name, menu): |
157 """ |
159 """ |
158 Private slot to populate the tools menu with our entries. |
160 Private slot to populate the tools menu with our entries. |
159 |
161 |
187 self.__editors[editor].append(act) |
189 self.__editors[editor].append(act) |
188 act = menu.addMenu(self.__fileMenu) |
190 act = menu.addMenu(self.__fileMenu) |
189 self.__editors[editor].append(act) |
191 self.__editors[editor].append(act) |
190 act = menu.addMenu(self.__dirMenu) |
192 act = menu.addMenu(self.__dirMenu) |
191 self.__editors[editor].append(act) |
193 self.__editors[editor].append(act) |
|
194 |
|
195 self.__fileMenu.setEnabled(True) |
|
196 self.__dirMenu.setEnabled(True) |
192 |
197 |
193 def __editorClosed(self, editor): |
198 def __editorClosed(self, editor): |
194 """ |
199 """ |
195 Private slot called, when an editor was closed. |
200 Private slot called, when an editor was closed. |
196 |
201 |
197 @param editor reference to the editor (QScintilla.Editor) |
202 @param editor reference to the editor (QScintilla.Editor) |
198 """ |
203 """ |
199 try: |
204 try: |
200 del self.__editors[editor] |
205 del self.__editors[editor] |
|
206 if not self.__editors: |
|
207 self.__fileMenu.setEnabled(False) |
|
208 self.__dirMenu.setEnabled(False) |
201 except KeyError: |
209 except KeyError: |
202 pass |
210 pass |
203 |
211 |
204 def __insertHash(self, hashStr): |
212 def __insertHash(self, hashStr): |
205 """ |
213 """ |
223 if act is None: |
231 if act is None: |
224 return |
232 return |
225 |
233 |
226 name = E5FileDialog.getOpenFileName( |
234 name = E5FileDialog.getOpenFileName( |
227 self.__ui, |
235 self.__ui, |
228 self.trUtf8("Generate File Hash")) |
236 self.tr("Generate File Hash")) |
229 if name: |
237 if name: |
230 try: |
238 try: |
231 f = open(name, "rb") |
239 f = open(name, "rb") |
232 hashStr = self.Hashes[act.data()](f.read()).hexdigest() |
240 hashStr = self.Hashes[act.data()](f.read()).hexdigest() |
233 f.close() |
241 f.close() |
234 except (IOError, OSError) as err: |
242 except (IOError, OSError) as err: |
235 E5MessageBox.critical( |
243 E5MessageBox.critical( |
236 self.__ui, |
244 self.__ui, |
237 self.trUtf8("Generate File Hash"), |
245 self.tr("Generate File Hash"), |
238 self.trUtf8("""<p>The hash for <b>{0}</b> could not""" |
246 self.tr("""<p>The hash for <b>{0}</b> could not""" |
239 """ be generated.</p><p>Reason: {1}</p>""") |
247 """ be generated.</p><p>Reason: {1}</p>""") |
240 .format(name, str(err)) |
248 .format(name, str(err)) |
241 ) |
249 ) |
242 return |
250 return |
243 |
251 |
244 self.__insertHash(hashStr) |
252 self.__insertHash(hashStr) |
270 except (IOError, OSError): |
278 except (IOError, OSError): |
271 fails += 1 |
279 fails += 1 |
272 if fails: |
280 if fails: |
273 E5MessageBox.critical( |
281 E5MessageBox.critical( |
274 self.__ui, |
282 self.__ui, |
275 self.trUtf8("Generate Directory Hash"), |
283 self.tr("Generate Directory Hash"), |
276 self.trUtf8("""<p>The hash for some files could not""" |
284 self.tr("""<p>The hash for some files could not""" |
277 """ be generated.</p>""") |
285 """ be generated.</p>""") |
278 ) |
286 ) |
279 else: |
287 else: |
280 editor = e5App().getObject("ViewManager").activeWindow() |
288 editor = e5App().getObject("ViewManager").activeWindow() |
281 if (editor.getLanguage() in ['Python', 'Python2'] and |
289 if (editor.getLanguage() in ['Python', 'Python2'] and |
282 "from __future__ import unicode_literals" |
290 "from __future__ import unicode_literals" |