PluginToolGenerateHash.py

changeset 20
9225431210c3
parent 16
091df4c07a8c
child 23
014dd5f63240
equal deleted inserted replaced
17:563beba48ca6 20:9225431210c3
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)
251 if act is None: 259 if act is None:
252 return 260 return
253 261
254 folder = E5FileDialog.getExistingDirectory( 262 folder = E5FileDialog.getExistingDirectory(
255 self.__ui, 263 self.__ui,
256 self.trUtf8("Generate Directory Hash"), 264 self.tr("Generate Directory Hash"),
257 "", 265 "",
258 E5FileDialog.Options(E5FileDialog.Option(0))) 266 E5FileDialog.Options(E5FileDialog.Option(0)))
259 if folder and os.path.isdir(folder): 267 if folder and os.path.isdir(folder):
260 fails = 0 268 fails = 0
261 hashes = [] 269 hashes = []
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"

eric ide

mercurial