Changeset 3311

Show
Ignore:
Timestamp:
08/02/08 17:37:41 (5 years ago)
Author:
nopper
Message:

Implemented the block selection in the hexview

Location:
branch/PacketManipulator
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • branch/PacketManipulator/Tabs/MainTab.py

    r3310 r3311  
    129129        self.hexview = HexView() 
    130130 
    131         self.hexview.payload = self.packet.get_raw() 
     131        self.redraw_hexview() 
    132132 
    133133    def __pack_widgets(self): 
     
    141141        pass 
    142142 
     143    def redraw_hexview(self): 
     144        """ 
     145        Redraws the hexview 
     146        """ 
     147        if self.packet: 
     148            self.hexview.payload = self.packet.get_raw() 
     149        else: 
     150            print "redraw_hexview(): no packet!!!" 
     151            self.hexview.payload = "" 
     152 
    143153    def get_label(self): 
    144154        return self._label 
     
    157167        self.append_page(session, session.label) 
    158168        self.set_tab_reorderable(session, True) 
     169 
     170    def get_current_session(self): 
     171        """ 
     172        Get the current SessionPage 
     173 
     174        @return a SessionPage instance or None 
     175        """ 
     176 
     177        idx = self.get_current_page() 
     178        obj = self.get_nth_page(idx) 
     179 
     180        if obj and isinstance(obj, SessionPage): 
     181            return obj 
     182 
     183        return None 
    159184 
    160185class MainTab(UmitView): 
  • branch/PacketManipulator/Tabs/PropertyTab.py

    r3310 r3311  
    3131    def create_ui(self): 
    3232        self.grid = PropertyGrid() 
     33        self.grid.tree.connect('finish-edit', self.__redraw_hex_view) 
     34        self.grid.tree.connect('field-selected', self.__on_field_selected) 
     35 
    3336        self._main_widget.add(self.grid) 
    3437        self._main_widget.show_all() 
     
    6265            self.grid.populate(proto) 
    6366            self._main_widget.set_sensitive(True) 
     67 
     68    def __redraw_hex_view(self, tree, entry_destroyed): 
     69        # This is called when the user end the edit action on the PropertyGrid 
     70        # and we could redraw the entire hexview to show changes 
     71        # The tree argument is the PropertyGridTree object 
     72 
     73        from App import PMApp 
     74        tab = PMApp().main_window.get_tab("MainTab") 
     75        page = tab.session_notebook.get_current_session() 
     76 
     77        if page: 
     78            page.redraw_hexview() 
     79 
     80            # Now reselect the blocks 
     81            self.__on_field_selected(self.grid.tree, *self.grid.tree.get_selected_field()) 
     82 
     83    def __on_field_selected(self, tree, proto=None, field=None): 
     84        if not proto or not field: 
     85            return 
     86 
     87        # We should select also the bounds in HexView 
     88        from App import PMApp 
     89        tab = PMApp().main_window.get_tab("MainTab") 
     90        page = tab.session_notebook.get_current_session() 
     91 
     92        if page: 
     93            page.hexview.select_block(proto.get_offset(field) / 8, max(field.bits / 8, 1)) 
  • branch/PacketManipulator/widgets/HexView.py

    r3310 r3311  
    142142 
    143143    def select_blocks(self, start=None, end=None): 
    144         if self.prev_start and self.prev_end: 
     144        if self.prev_start and self.prev_end and self.prev_start != self.prev_end: 
    145145            self.buffer.remove_tag(self._parent.tag_sec_sel, self.prev_start, self.prev_end) 
    146146 
     
    214214 
    215215    def select_blocks(self, start=None, end=None): 
    216         if self.prev_start and self.prev_end: 
     216        if self.prev_start and self.prev_end and self.prev_start != self.prev_end: 
    217217            self.buffer.remove_tag(self._parent.tag_sec_sel, self.prev_start, self.prev_end) 
    218218 
     
    398398        ) 
    399399 
     400    def select_block(self, offset, len, ascii=True): 
     401        """ 
     402        Select a block of data in the HexView 
     403 
     404        @param offset the offset byte 
     405        @param len the lenght of selection 
     406        @param ascii True to set primary selection on ASCII otherwise on HEX 
     407        """ 
     408 
     409        start = offset 
     410        end = offset + len 
     411 
     412        if start > end: 
     413            start, end = end, start 
     414 
     415        if ascii: 
     416            # We need to get a fucking iter! 
     417            buffer = self.ascii_text.get_buffer() 
     418            start_iter = buffer.get_iter_at_offset(start) 
     419            end_iter   = buffer.get_iter_at_offset(end) 
     420 
     421            buffer.select_range(end_iter, start_iter) 
     422 
    400423    def get_payload(self): 
    401424        return self._payload 
     
    404427 
    405428        for view in (self.offset_text, self.hex_text, self.ascii_text): 
     429             
     430            # Invalidate previous iters 
     431            if hasattr(view, 'prev_start'): 
     432                view.prev_start = None 
     433            if hasattr(view, 'prev_end'): 
     434                view.prev_end = None 
     435 
    406436            view.render(self._payload) 
    407437 
  • branch/PacketManipulator/widgets/PropertyGrid.py

    r3299 r3311  
    378378class PropertyGridTree(gtk.ScrolledWindow): 
    379379    __gsignals__ = { 
    380         'finish-edit' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT, )), 
    381         'desc-changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING, )), 
     380        'finish-edit'    : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT, )), 
     381        'field-selected' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)), 
     382        'desc-changed'   : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING, )), 
    382383    } 
    383384 
     
    435436        self.tree.get_selection().connect('changed', self.__on_selection_changed) 
    436437        self.tree.connect('button-release-event', self.__on_button_release) 
     438     
     439    def get_selected_field(self): 
     440        """ 
     441        Get the selected field 
     442 
     443        @return a tuple (proto, field) containing the parent 
     444                protocol for field and the field or None, None 
     445        """ 
     446 
     447        model, iter = self.tree.get_selection().get_selected() 
     448 
     449        if not iter: 
     450            return (None, None) 
     451         
     452        # If there's a object than it's a parent so return None, None 
     453        if model.get_value(iter, 0): 
     454            return (None, None) 
     455 
     456        proto = model.get_value(model.iter_parent(iter), 0) 
     457        field = model.get_value(iter, 1) 
     458 
     459        if not isinstance(field, base.Field) or \ 
     460           not isinstance(proto, base.Protocol): 
     461            return (None, None) 
     462 
     463        return (proto, field) 
    437464 
    438465    def __on_selection_changed(self, selection): 
     
    448475            self.emit('desc-changed', "%s protocol." % Backend.get_proto_name(proto)) 
    449476        else: 
    450             proto = model.get_value(model.iter_parent(iter), 0) 
    451             field = model.get_value(iter, 1) 
    452  
    453             if not isinstance(field, base.Field) or \ 
    454                not isinstance(proto, base.Protocol): 
    455                 return 
    456              
     477            proto, field = self.get_selected_field() 
     478 
     479            self.emit('field-selected', proto, field) 
    457480            self.emit('desc-changed', Backend.get_field_desc(field)) 
    458481 
    459             # We should select also the bounds in HexView 
    460             nb = App.PMApp().main_window.get_tab("MainTab").session_notebook 
    461             page = nb.get_nth_page(nb.get_current_page()) 
    462  
    463             # The page *MUST* be a SessionPage otherwise the signal 
    464             # we cannot be here becouse this widget is insentive 
    465             # so no worry about it. 
    466  
    467             print page.hexview, proto.get_offset(field), field.bits 
    468      
    469482    def __on_button_release(self, widget, event): 
    470483        # We should get the selection and show the popup