Changeset 3332

Show
Ignore:
Timestamp:
08/04/08 18:30:41 (5 years ago)
Author:
nopper
Message:

Backend independent

Location:
branch/PacketManipulator
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branch/PacketManipulator/Backend/UMPA.py

    r3330 r3332  
    116116    return str(ret) 
    117117 
     118def get_field_size(proto, field): 
     119    return field.bits 
     120 
     121def get_field_offset(proto, field): 
     122    return proto.get_offset(field) 
     123 
     124def get_field_enumeration_s2i(field): 
     125    return field.enumerable.items() 
     126 
     127def get_field_enumeration_i2s(field): 
     128    return [(v, k) for (k, v) in field.enumerable.items()] 
     129 
    118130def get_keyflag_value(proto, flag, key): 
    119131    return flag.get()[key].get() 
     
    151163def get_packet_raw(metapack): 
    152164    return metapack.root.get_raw() 
     165 
     166# Checking stuff 
     167 
     168def is_field(field): 
     169    return isinstance(field, Field) 
     170 
     171def is_flags(field): 
     172    return isinstance(field, Flags) 
     173 
     174def is_proto(proto): 
     175    return isinstance(proto, Protocol) 
     176 
     177def implements(obj, klass): 
     178    return isinstance(obj, klass) 
     179 
    153180 
    154181class MetaPacket: 
     
    174201        yield i 
    175202 
     203 
    176204gprotos = load_gprotocols() 
    177205 
    178206PMField = Field 
    179207PMFlagsField = Flags 
     208 
     209PMBitField          = BitField 
     210PMIPField           = IPv4AddrField 
     211PMByteField         = None 
     212PMShortField        = None 
     213PMLEShortField      = None 
     214PMIntField          = IntField 
     215PMSignedIntField    = None 
     216PMLEIntField        = None 
     217PMLESignedIntField  = None 
     218PMLongField         = None 
     219PMLELongField       = None 
     220PMStrField          = None 
     221PMLenField          = None 
     222PMRDLenField        = None 
     223PMFieldLenField     = None 
     224PMBCDFloatField     = None 
     225PMEnumField         = EnumField 
  • branch/PacketManipulator/Tabs/PropertyTab.py

    r3311 r3332  
    2020 
    2121import gtk 
     22import Backend 
     23 
    2224from views import UmitView 
    2325from widgets.PropertyGrid import PropertyGrid 
     
    6163             
    6264            proto = page.proto_hierarchy.get_active_protocol() 
    63             print proto 
    6465             
    6566            self.grid.populate(proto) 
     
    9192 
    9293        if page: 
    93             page.hexview.select_block(proto.get_offset(field) / 8, max(field.bits / 8, 1)) 
     94            start  = Backend.get_field_offset(proto, field) 
     95            length = Backend.get_field_size(proto, field) 
     96 
     97            page.hexview.select_block(start / 8, max(length / 8, 1)) 
  • branch/PacketManipulator/widgets/PropertyGrid.py

    r3331 r3332  
    8686    def create_widgets(self): 
    8787        # Manage the None type 
    88         if not self.value: 
    89             self.value = 0 
     88 
     89        value = self.value 
     90 
     91        if value is None: 
     92            value = 0 
    9093 
    9194        self.calc_bounds() 
    92         self.adj = gtk.Adjustment(self.value, self.min, self.max, 1, 2) 
     95        self.adj = gtk.Adjustment(value, self.min, self.max, 1, 2) 
    9396        self.spin = gtk.SpinButton(self.adj, digits=self.digits) 
    9497 
     
    103106    def calc_bounds(self): 
    104107        # Unsigned int / Int? :( 
    105         if self.field.bits: 
     108        if Backend.get_field_size(self.protocol, self.field) != None: 
    106109            self.min = 0 
    107             self.max = (2 ** self.field.bits) - 1 # (2 ^ n) - 1 
     110            self.max = (2 ** Backend.get_field_size(self.protocol, self.field)) - 1 # (2 ^ n) - 1 
    108111            self.digits = 0 
    109         elif isinstance(self.value, int): 
     112        else: 
    110113            import sys 
    111114            print "Hei man we are falling back to sys.maxint for", self.field 
     
    179182        self.combo.set_attributes(txt, text=1) 
    180183 
    181         self.odict = [(v, k) for k, v in self.field.enumerable.items()] 
     184        self.odict = Backend.get_field_enumeration_i2s(self.field) 
    182185        self.odict.sort() 
    183186 
     
    200203        self.store.append([self.icon, _("Set manually"), -1]) 
    201204 
    202         self.int_editor = IntEditor(self.field) 
     205        self.int_editor = IntEditor((self.protocol, self.field)) 
    203206         
    204207        self.undo_btn = MiniButton(stock=gtk.STOCK_UNDO) 
     
    267270    def __on_changed(self, entry): 
    268271        self.value = self.entry.get_text() 
     272 
     273def get_editor(field): 
     274    "@return the corresponding editor class for field or None" 
     275 
     276    assert Backend.is_field(field) 
     277 
     278    # MACField 
     279    # IPField 
     280 
     281    # We use a list because order is important here 
     282    table = [#(Backend.PMMACField, MACEditor), 
     283             (Backend.PMStrField, StrEditor), 
     284             (Backend.PMIPField, IPv4Editor), 
     285             (Backend.PMEnumField, EnumEditor), 
     286             (Backend.PMByteField, IntEditor), 
     287             (Backend.PMShortField, IntEditor), 
     288             (Backend.PMLEShortField, IntEditor), 
     289             (Backend.PMIntField, IntEditor), 
     290             (Backend.PMSignedIntField, IntEditor), 
     291             (Backend.PMLEIntField, IntEditor), 
     292             (Backend.PMLESignedIntField, IntEditor), 
     293             (Backend.PMLongField, IntEditor), 
     294             (Backend.PMLELongField, IntEditor), 
     295             (Backend.PMLenField, IntEditor), 
     296             (Backend.PMRDLenField, IntEditor), 
     297             (Backend.PMFieldLenField, IntEditor), 
     298             (Backend.PMBCDFloatField, IntEditor), 
     299             (Backend.PMBitField, IntEditor), 
     300    ] 
     301 
     302    for it in table: 
     303        if it[0] != None and Backend.implements(field, it[0]): 
     304            return it[1] 
    269305 
    270306class HackEntry(gtk.Entry): 
     
    530566 
    531567        proto, field = self.__get_parent_field(model, iter) 
     568 
     569        print proto, field 
    532570         
    533571        if not proto or not field or \ 
    534             not isinstance(field, Backend.PMField): 
    535             #or not isinstance(proto, base.Protocol): 
     572           not Backend.is_field(field) or \ 
     573           not Backend.is_proto(proto): 
     574 
    536575            return (None, None) 
    537576 
     
    539578 
    540579    def __on_selection_changed(self, selection): 
    541         return 
    542580        model, iter = selection.get_selected() 
    543581 
     
    568606        field = model.get_value(iter, 1) 
    569607 
    570         if not field or not isinstance(field, Backend.PMField): 
     608        if not Backend.is_field(field): 
    571609            return 
    572610 
     
    618656        obj = model.get_value(iter, 1) 
    619657 
    620         if isinstance(obj, Backend.PMFlagsField): 
     658        if Backend.is_flags(obj): 
    621659            cell.set_property('cell-background-gdk', 
    622660                              self.style.mid[gtk.STATE_NORMAL]) 
     
    631669 
    632670        # If we are a field or a string (a sub field of flags) 
    633         elif isinstance(obj, Backend.PMField) or \ 
    634              isinstance(obj, str): 
    635  
    636             cell.field = obj 
     671        elif Backend.is_field(obj) or isinstance(obj, str): 
     672 
     673            cell.field = None 
    637674            cell.set_property('editable', True) 
    638675            cell.set_property('cell-background-gdk', None) 
    639676 
     677            # We have a standard field 
     678 
    640679            protocol = self.__get_parent_protocol(model, iter) 
    641680 
     
    647686 
    648687                cell.set_property('markup', '<tt>%s</tt>' % value) 
     688                cell.editor = get_editor(obj) 
     689 
     690                if cell.editor: 
     691                    cell.field = (protocol, obj) 
    649692                 
    650693                return 
    651694 
     695            # We have a subkey of Flags 
    652696             
    653697            proto, flags = self.__get_parent_flags_field(model, iter) 
     
    658702                 
    659703                return 
    660  
    661             if obj.bits == 1: 
    662                 cell.editor = BitEditor 
    663             elif issubclass(obj.__class__, base.EnumField): 
    664                 cell.editor = EnumEditor 
    665             elif issubclass(obj.__class__, base.IPv4AddrField): 
    666                 cell.editor = IPv4Editor 
    667             elif issubclass(obj.__class__, base.IntField): 
    668                 cell.editor = IntEditor 
    669             else: 
    670                 cell.field = None 
    671704             
    672705        else: 
     
    684717            proto = model.get_value(model.iter_parent(iter), 0) 
    685718 
    686             if isinstance(obj, str) or \ 
    687                isinstance(obj, Backend.PMField): 
    688  
    689                 if isinstance(obj, Backend.PMFlagsField): 
     719            if Backend.is_field(obj): 
     720 
     721                if Backend.is_flags(obj): 
    690722                    color = self.style.mid[gtk.STATE_NORMAL] 
    691723                else: 
    692724                    color = None 
    693725                 
    694                 if isinstance(obj, Backend.PMField): 
    695                     if Backend.is_field_autofilled(obj): 
    696                         markup = '<i>%s</i>' % Backend.get_field_name(obj) 
    697                     else: 
    698                         markup = '<b>%s</b>' % Backend.get_field_name(obj) 
     726                if Backend.is_field_autofilled(obj): 
     727                    markup = '<i>%s</i>' % Backend.get_field_name(obj) 
    699728                else: 
    700                     markup = '<b>%s</b>' % obj 
     729                    markup = '<b>%s</b>' % Backend.get_field_name(obj) 
     730 
     731            elif isinstance(obj, str): 
     732                color = None 
     733                markup = '<b>%s</b>' % obj 
    701734        else: 
    702735            markup = '<b>%s</b>' % Backend.get_proto_name(obj) 
     
    711744        icon, color = None, self.style.mid[gtk.STATE_NORMAL] 
    712745         
    713         if isinstance(obj, str) or isinstance(obj, Backend.PMField): 
    714  
    715             if isinstance(obj, Backend.PMFlagsField): 
     746        if Backend.is_field(obj): 
     747 
     748            if Backend.is_flags(obj): 
    716749                color = self.style.mid[gtk.STATE_NORMAL] 
    717750            else: 
    718751                color = None 
    719752 
    720             if isinstance(obj, Backend.PMField): 
    721                 if Backend.is_field_autofilled(obj): 
    722                     icon = self.icon_locked 
     753            if Backend.is_field_autofilled(obj): 
     754                icon = self.icon_locked 
     755 
     756        elif isinstance(obj, str): 
     757            color = None 
    723758         
    724759        cell.set_property('cell-background-gdk', color) 
     
    740775            flag_iter = self.store.append(root_iter, [None, field]) 
    741776 
    742             if isinstance(field, Backend.PMFlagsField): 
     777            if Backend.is_flags(field): 
    743778                for flag in Backend.get_flag_keys(field): 
    744779                    self.store.append(flag_iter, [None, flag])