1
2 """
3 GUI widgets for use in vstruct enabled applications
4 """
5
6 import gtk
7 import inspect
8 import vstruct
9 import vstruct.builder as vs_builder
10 import vstruct.primitives as vs_prims
11
12 import vwidget.main as vw_main
13 import vwidget.util as vw_util
14 import vwidget.views as vw_views
15
16 target_entries = [('example', gtk.TARGET_SAME_APP, 0)]
17
21
25
27 - def __init__(self, vsbuilder, parent=None):
28 buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)
29 gtk.Dialog.__init__(self, "Select a structure...", buttons=buttons, parent=parent)
30 self.selector = VStructBuilderView(vsbuilder)
31 self.vbox.pack_start(self.selector, expand=True)
32 self.selector.treeview.connect("row_activated", self.nsActivated)
33 self.selector.treeview.connect("cursor_changed", self.nsSelected)
34 self.modinfo = None
35 self.resize(400, 600)
36
38 self.response(gtk.RESPONSE_OK)
39
42
44 self.show_all()
45 resp = self.run()
46 self.hide()
47 if resp == gtk.RESPONSE_OK:
48 return self.modinfo
49 return None
50
53 buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)
54 gtk.Dialog.__init__(self, "Select a structure namespace...", buttons=buttons, parent=parent)
55 self.selector = VStructNamespaceSelector()
56 self.vbox.pack_start(self.selector, expand=True)
57 self.selector.treeview.connect("row_activated", self.nsActivated)
58 self.selector.treeview.connect("cursor_changed", self.nsSelected)
59 self.modinfo = None
60 self.resize(400, 600)
61
63 self.response(gtk.RESPONSE_OK)
64
66 nspace = self.selector.vwGetSelected(2)
67 modname = self.selector.vwGetSelected(0)
68 if modname:
69 self.modinfo = (nspace, modname)
70
72 self.show_all()
73 resp = self.run()
74 self.hide()
75 if resp == gtk.RESPONSE_OK:
76 return self.modinfo
77 return None
78
80 __model_class__ = gtk.TreeStore
81 __cols__ = (
82 (None, 0, object),
83 ('Subsystem', 1, str),
84 ('Module Name', 2, str),
85 )
86
89
91 self.model.clear()
92
93 win = self.model.append(None, (None, 'windows', ''))
94 xp_i386_user = self.model.append(win, (None, 'Windows XP i386 Userland', ''))
95 self.model.append(xp_i386_user, ('vstruct.defs.windows.win_5_1_i386.ntdll','', 'ntdll'))
96
97 xp_i386_kern = self.model.append(win, (None, 'Windows XP i386 Kernel', ''))
98 self.model.append(xp_i386_kern, ('vstruct.defs.windows.win_5_1_i386.ntoskrnl','', 'nt'))
99 self.model.append(xp_i386_kern, ('vstruct.defs.windows.win_5_1_i386.win32k','', 'win32k'))
100
101 win7_amd64_user = self.model.append(win, (None, 'Windows 7 amd64 Userland', ''))
102 self.model.append(win7_amd64_user, ('vstruct.defs.windows.win_6_1_amd64.ntdll','', 'ntdll'))
103
104 pos = self.model.append(None, (None, 'posix', ''))
105 self.model.append(pos, ('vstruct.defs.elf', '', 'Elf'))
106
107 arm = self.model.append(None, (None, 'arm', ''))
108 self.model.append(arm, (None, '', 'arm7'))
109
111 x = self.vwGetSelected(0)
112 if x == None:
113 return
114
115 print 'WOOT',x
116
117 import sys
118 import gtk
119 __import__(x)
120 mod = sys.modules[x]
121
122 b = vs_builder.VStructBuilder()
123 b.addVStructNamespace(self.vwGetSelected(2), mod)
124
125 bv = VStructBuilderView(b)
126
127 w = gtk.Window()
128 w.add(bv)
129
130 w.show_all()
131
132
134 __model_class__ = gtk.TreeStore
135 __cols__ = (
136 (None, 0, object),
137 ('Namespace', 1, str),
138 ('Structure', 2, str),
139 )
140
144
146 for nsname in self.vsbuilder.getVStructNamespaceNames():
147 nm = self.model.append(None, (None, nsname, ''))
148 for sname in self.vsbuilder.getVStructNames(namespace=nsname):
149 self.model.append(nm, ('%s.%s' % (nsname, sname), '', sname))
150
151
152
154 __model_class__ = gtk.TreeStore
155 __cols__ = (
156 (None, 0, object),
157
158 ("Offset", 1, str),
159 ("Name", 2, str),
160 ("Type", 3, str),
161 )
162
163 - def __init__(self, vs, editable=False):
170
171 - def vwDragRecv(self, treeview, dcontext, x, y, sdata, info, etime):
172 print "DROP!",sdata.data
173 drow = treeview.get_dest_row_at_pos(x, y)
174 print repr(self.treeview),repr(treeview)
175 if drow == None:
176 titer = None
177 dpos = gtk.TREE_VIEW_DROP_AFTER
178 else:
179 tpath, dpos = drow
180 titer = self.model.get_iter(tpath)
181
182
183
184
185
186
187
188
189
190
191 dcontext.finish(success=False, del_=False, time=etime)
192
194 self.model.clear()
195 i = self.model.append(None, (self.mystruct, "00000000", self.mystruct._vs_name, self.mystruct.vsGetClassPath()))
196 todo = [(self.mystruct, i, 0),]
197 while len(todo):
198 d,iter,baseoff = todo.pop()
199 for name,field in d:
200 if isinstance(field, vstruct.VStruct):
201 off = d.vsGetOffset(name)
202 i = self.model.append(iter, (d, "%.8x" % (baseoff+off), name, ""))
203 todo.append((field, i, baseoff+off))
204
205 elif isinstance(field, vstruct.VArray):
206 pass
207
208 else:
209 off = d.vsGetOffset(name)
210 self.model.append(iter, (field, "%.8x" % (baseoff+off), name, field.vsGetTypeName()))
211
213 print "WOOT"
214 pass
215
217 __model_class__ = gtk.TreeStore
218 __cols__ = (
219 (None, 0, object),
220 ("Name", 1, str),
221 )
222
224 vw_views.VTreeView.__init__(self)
225 self.treeview.enable_model_drag_source(
226 gtk.gdk.BUTTON1_MASK,
227 target_entries,
228 gtk.gdk.ACTION_MOVE)
229 self.treeview.connect("drag-data-get", self.vwDragGet)
230
231 - def vwDragGet(self, treeview, dcontext, sdata, info, etime):
232 treesel = treeview.get_selection()
233 model, iter = treesel.get_selected()
234 text = model.get_value(iter, 1)
235 sdata.set('example', 8, text)
236 return
237
239 self.model.clear()
240
241 piter = self.model.append(None, (vs_prims, "primitives"))
242 for name in dir(vs_prims):
243 c = getattr(vs_prims, name)
244
245 if inspect.isclass(c):
246
247 if issubclass(c, vs_prims.v_prim):
248 self.model.append(piter, (c, c.__name__))
249
252