1 import re
2 from collections import deque
3
4 from PyQt4 import QtCore, QtGui
5
6 import envi.memcanvas as e_memcanvas
7 import envi.qt.memcanvas as e_memcanvas_qt
8 import envi.memcanvas.renderers as e_render
9
10 import vqt.colors as vq_colors
11 import vqt.menubuilder as vqt_menu
12
13 from vqt.main import idlethread, idlethreadsync
16
17 __canvas_class__ = e_memcanvas_qt.VQMemoryCanvas
18
19 - def __init__(self, memobj, syms=None, parent=None):
20
21 QtGui.QWidget.__init__(self, parent=parent)
22 self._mem_obj = memobj
23
24 self.top_box = QtGui.QWidget(parent=self)
25 hbox = QtGui.QHBoxLayout(self.top_box)
26 hbox.setMargin(2)
27 hbox.setSpacing(4)
28
29 self.hist_button = QtGui.QPushButton('History', parent=self.top_box)
30 self.hist_button.clicked.connect(self._histButtonClicked)
31 self.addr_entry = QtGui.QLineEdit(parent=self.top_box)
32 self.size_entry = QtGui.QLineEdit(parent=self.top_box)
33 self.size_entry.setText('256')
34 self.rend_select = QtGui.QComboBox(parent=self.top_box)
35
36 self.mem_history = deque()
37 self.mem_canvas = self.__canvas_class__(memobj, syms=syms, parent=self)
38
39 self.mem_canvas.vqAddHotKey(e_memcanvas_qt.KEY_BACKSPACE, self._hotkey_BS)
40
41 self.loadDefaultRenderers()
42 self.loadRendSelect()
43
44 self.addr_entry.returnPressed.connect(self._renderMemory)
45 self.size_entry.returnPressed.connect(self._renderMemory)
46
47 self.connect(self.rend_select, QtCore.SIGNAL('currentIndexChanged(QString)'), self._renderMemory)
48
49 hbox.addWidget(self.hist_button)
50 hbox.addWidget(self.addr_entry)
51 hbox.addWidget(self.size_entry)
52 hbox.addWidget(self.rend_select)
53
54 vbox = QtGui.QVBoxLayout(self)
55 vbox.setMargin(4)
56 vbox.setSpacing(4)
57 vbox.addWidget(self.top_box)
58 vbox.addWidget(self.mem_canvas, stretch=100)
59
60 self.top_box.setLayout(hbox)
61
62 self.setLayout(vbox)
63 self.setWindowTitle('Mem: None')
64
66 if len(self.mem_history) >= 2:
67 hinfo = self.mem_history.popleft()
68 hinfo = self.mem_history.popleft()
69 self._histSelected( hinfo )
70
72 addrexpr, sizeexpr, rendname = hinfo
73 self.addr_entry.setText(addrexpr)
74 self.size_entry.setText(sizeexpr)
75 self.mem_canvas.setRenderer(rendname)
76 self._renderMemory()
77
92
94
95 self.addr_entry.setText(expr)
96 if sizeexpr != None:
97 self.size_entry.setText(sizeexpr)
98 self._renderMemory()
99
101 self.rend_select.clear()
102 for name in self.mem_canvas.getRendererNames():
103 self.rend_select.addItem(name)
104
110
112
113 expr = str(self.addr_entry.text())
114 sizeexpr = str(self.size_entry.text())
115
116 if not expr:
117 return None, None
118
119 if not sizeexpr:
120 return None, None
121
122 try:
123 addr = self._mem_obj.parseExpression(expr)
124 except Exception, e:
125 self.mem_canvas.addText('Invalid Address: %s (%s)' % (expr, e))
126 return None, None
127
128 try:
129 size = self._mem_obj.parseExpression(sizeexpr)
130 except Exception, e:
131 self.mem_canvas.addText('Invalid Size: %s (%s)' % (expr, e))
132 return None, None
133
134 self.setWindowTitle('Mem: %s' % expr)
135 return addr, size
136
137 @idlethread
139
140 self.clearText()
141
142 addr, size = self._getRenderVaSize()
143 if addr == None:
144 return
145
146 expr = str(self.addr_entry.text())
147 rname = str(self.rend_select.currentText())
148 sizeexpr = str(self.size_entry.text())
149
150 mhist = (expr, sizeexpr, rname)
151 if mhist not in self.mem_history:
152 self.mem_history.appendleft( mhist )
153 while len(self.mem_history) > 100:
154 self.mem_history.pop()
155
156 self.mem_canvas.setRenderer(rname)
157 self.mem_canvas.renderMemory(addr, size)
158
159 - def clearText(self):
160 self.mem_canvas.clearCanvas()
161