Package vwidget :: Module vwvstruct
[hide private]
[frames] | no frames]

Source Code for Module vwidget.vwvstruct

  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   
18 -def selectStructure(vsbuilder, parent=None):
19 dia = SelectStructureDialog(vsbuilder, parent=parent) 20 return dia.selectStructure()
21
22 -def selectNamespace(parent=None):
23 dia = SelectNamespaceDialog(parent=parent) 24 return dia.selectNamespace()
25
26 -class SelectStructureDialog(gtk.Dialog):
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
37 - def nsActivated(self, *args):
38 self.response(gtk.RESPONSE_OK)
39
40 - def nsSelected(self, *args):
41 self.modinfo = self.selector.vwGetSelected(0)
42
43 - def selectStructure(self):
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
51 -class SelectNamespaceDialog(gtk.Dialog):
52 - def __init__(self, parent=None):
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
62 - def nsActivated(self, *args):
63 self.response(gtk.RESPONSE_OK)
64
65 - def nsSelected(self, *args):
66 nspace = self.selector.vwGetSelected(2) 67 modname = self.selector.vwGetSelected(0) 68 if modname: 69 self.modinfo = (nspace, modname)
70
71 - def selectNamespace(self):
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
79 -class VStructNamespaceSelector(vw_views.VTreeView):
80 __model_class__ = gtk.TreeStore 81 __cols__ = ( 82 (None, 0, object), 83 ('Subsystem', 1, str), 84 ('Module Name', 2, str), 85 ) 86
87 - def __init__(self):
88 vw_views.VTreeView.__init__(self)
89
90 - def vwLoad(self):
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
110 - def __vwActivated(self, tree, path, column):
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
133 -class VStructBuilderView(vw_views.VTreeView):
134 __model_class__ = gtk.TreeStore 135 __cols__ = ( 136 (None, 0, object), 137 ('Namespace', 1, str), 138 ('Structure', 2, str), 139 ) 140
141 - def __init__(self, vsbuilder):
142 self.vsbuilder = vsbuilder 143 vw_views.VTreeView.__init__(self)
144
145 - def vwLoad(self):
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 # FIXME make a structure selector for a builder namespace! 152
153 -class VStructView(vw_views.VTreeView):
154 __model_class__ = gtk.TreeStore 155 __cols__ = ( 156 (None, 0, object), 157 #FIXME offset and use vsGetPrintInfo 158 ("Offset", 1, str), 159 ("Name", 2, str), 160 ("Type", 3, str), 161 ) 162
163 - def __init__(self, vs, editable=False):
164 self.mystruct = vs 165 vw_views.VTreeView.__init__(self) 166 167 if editable: 168 self.treeview.enable_model_drag_dest(target_entries, gtk.gdk.ACTION_MOVE) 169 self.treeview.connect('drag-data-received', self.vwDragRecv)
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 #if dpos == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE: 183 #new = self.model.prepend(parent=target, row=source_row) 184 #elif dpos == gtk.TREE_VIEW_DROP_INTO_OR_AFTER: 185 #new = self.model.append(parent=target, row=source_row) 186 #elif dpos == gtk.TREE_VIEW_DROP_BEFORE: 187 #new = self.model.insert_before(parent=None, sibling=target, row=source_row) 188 #elif dpos == gtk.TREE_VIEW_DROP_AFTER: 189 #new = self.model.insert_after(parent=None, sibling=target, row=source_row) 190 191 dcontext.finish(success=False, del_=False, time=etime)
192
193 - def vwLoad(self):
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: # FIXME unify iter for vstruct w/o name? 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
212 - def vwActivated(self, tree, path, column):
213 print "WOOT" 214 pass
215
216 -class VStructBrowser(vw_views.VTreeView):
217 __model_class__ = gtk.TreeStore 218 __cols__ = ( 219 (None, 0, object), 220 ("Name", 1, str), 221 ) 222
223 - def __init__(self):
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
238 - def vwLoad(self):
239 self.model.clear() 240 # Start with just the primitives. 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
250 -class VStructAttrs(vw_views.VTreeView):
251 pass
252