示例#1
0
    def populate(self, packet, proto_inst):
        """
        Populate the store with the fields of Protocol
        @param packet a Packet that cointains the proto_inst
               or None if not parent is setted
        @param proto_inst a Protocol object instance
        """

        if not proto_inst:
            return

        self.packet = packet
        root_iter = self.store.append(None, [proto_inst])

        # We have to use the get_fields method
        for field in backend.get_proto_fields(proto_inst):

            if not backend.is_showable_field(field, packet):
                continue

            tfield = TField(field, proto_inst)
            flag_iter = self.store.append(root_iter, [tfield])

            if backend.is_flags(field):
                for flag in backend.get_flag_keys(field):
                    self.store.append(flag_iter, [TFlag(flag, tfield)])

        self.tree.expand_row((0, ), False)
示例#2
0
    def get_requested_size(self):
        # Get the requested size of the hex view part
        layout = self.create_pango_layout('FF')
        layout.set_font_description(pango.FontDescription(self.hex_font))

        atom_w, atom_h = layout.get_pixel_size()

        req_w = (atom_w + 4) * (16 + 1)
        req_h = (atom_h + 4) * (16 + 1)

        layout.set_font_description(pango.FontDescription(self.attr_font))
        layout.set_text('A')

        atom_w, atom_h = layout.get_pixel_size()

        fields = 0
        protos = [proto for proto in self.packet.get_protocols()]

        for proto in protos:
            for field in backend.get_proto_fields(proto):
                fields += 1

        protos = len(protos)

        req_w += 10 + (atom_w * 35) # 35 characters for attributes
        req_h = max(req_h, (fields + protos) * (atom_h + 4))

        return int(req_w), int(req_h)
示例#3
0
    def get_requested_size(self):
        # Get the requested size of the hex view part
        layout = self.create_pango_layout('FF')
        layout.set_font_description(pango.FontDescription(self.hex_font))

        atom_w, atom_h = layout.get_pixel_size()

        req_w = (atom_w + 4) * (16 + 1)
        req_h = (atom_h + 4) * (16 + 1)

        layout.set_font_description(pango.FontDescription(self.attr_font))
        layout.set_text('A')

        atom_w, atom_h = layout.get_pixel_size()

        fields = 0
        protos = [proto for proto in self.packet.get_protocols()]

        for proto in protos:
            for field in backend.get_proto_fields(proto):
                fields += 1

        protos = len(protos)

        req_w += 10 + (atom_w * 35)  # 35 characters for attributes
        req_h = max(req_h, (fields + protos) * (atom_h + 4))

        return int(req_w), int(req_h)
示例#4
0
    def draw_left(self, cr):
        layout = self.create_pango_layout('')
        layout.set_font_description(pango.FontDescription(self.title_font))

        attr_layout = self.create_pango_layout('')
        attr_layout.set_font_description(pango.FontDescription(self.attr_font))

        cr.move_to(4, 4)

        for protocol, color in self.protocols:
            name = backend.get_proto_name(protocol)
            layout.set_text(name)

            w, h = self.draw_box(cr, layout, fill=color)

            cr.rel_move_to(0, h + 4)

            x, y = cr.get_current_point()
            cr.move_to(x + 10, y)

            for field in backend.get_proto_fields(protocol):

                if not backend.is_showable_field(field, self.packet):
                    continue

                name = backend.get_field_name(field)
                value = str(backend.get_field_value_repr(protocol, field))

                text = '%s: %s' % (name, value)

                if len(text) > 35:
                    text = text[0:32] + "..."

                attr_layout.set_text(text)

                f_w, f_h = self.draw_text(cr, attr_layout)

                # Start point
                x, y = cr.get_current_point()
                self.fields[(protocol, name)] = [(x + f_w + 4, y + (f_h / 2.0))
                                                 ]

                cr.rel_move_to(0, f_h)

            cr.rel_move_to(-10, 10)
示例#5
0
    def draw_left(self, cr):
        layout = self.create_pango_layout('')
        layout.set_font_description(pango.FontDescription(self.title_font))

        attr_layout = self.create_pango_layout('')
        attr_layout.set_font_description(pango.FontDescription(self.attr_font))

        cr.move_to(4, 4)

        for protocol, color in self.protocols:
            name = backend.get_proto_name(protocol)
            layout.set_text(name)

            w, h = self.draw_box(cr, layout, fill=color)

            cr.rel_move_to(0, h + 4)

            x, y = cr.get_current_point()
            cr.move_to(x + 10, y)

            for field in backend.get_proto_fields(protocol):

                if not backend.is_showable_field(field, self.packet):
                    continue

                name = backend.get_field_name(field)
                value = str(backend.get_field_value_repr(protocol, field))

                text = '%s: %s' % (name, value)

                if len(text) > 35:
                    text = text[0:32] + "..."

                attr_layout.set_text(text)

                f_w, f_h = self.draw_text(cr, attr_layout)

                # Start point
                x, y = cr.get_current_point()
                self.fields[(protocol, name)] = [(x + f_w + 4, y + (f_h / 2.0))]

                cr.rel_move_to(0, f_h)

            cr.rel_move_to(-10, 10)
示例#6
0
    def draw_payload(self, cr):
        payload = self.packet.get_raw()

        layout = self.create_pango_layout('')
        layout.set_font_description(pango.FontDescription(self.hex_font))

        layout.set_text("FF")
        atom_x, atom_y = layout.get_pixel_size()

        atom_x += atom_x / 2.0
        atom_y += atom_y / 2.0

        start_x = self.allocation.width - (atom_x * 16) - 10

        cr.move_to(start_x, 4)

        # We should have space to place 16 bytes in hex

        dct = defaultdict(list)

        protocol_idx = 0

        for protocol, color in self.protocols:

            for field in backend.get_proto_fields(protocol):

                if not backend.is_showable_field(field, self.packet):
                    continue

                start = backend.get_field_offset(self.packet, protocol, field)
                end = backend.get_field_size(protocol, field)

                start /= 8

                dct[start].append((end, field))

            # Now we have the dict so we have to transform to
            # a sorted list

            lst = dct.items()
            lst.sort()

            tot_w = 0
            tot_h = 0

            for offset, child_list in lst:

                # We have also a child list to iterate
                size = 0

                if len(child_list) == 1 and child_list[0][0] == 0:
                    continue
                else:
                    for end, field in child_list:
                        size += end

                    size /= 8

                current_field = child_list[-1][1]
                field_name = backend.get_field_name(current_field)
                fill_color = self.__get_color(field_name)
                border_color = color

                line_x = offset % 16
                line_y = offset / 16

                txt = payload[offset:offset + size]

                if size + line_x > 16:
                    start = 16 - line_x

                    top_right = txt[0:start]

                    top_right = " ".join(["%02X" % ord(x) for x in top_right])
                    layout.set_text(top_right)

                    cr.move_to(start_x + (line_x * atom_x),
                               (line_y + protocol_idx) * atom_y + 4)

                    # Here we should write <==
                    self.draw_box(cr, layout, fill=fill_color,
                                  border=border_color, right=False)

                    w, h = 0, 0
                    txt = txt[start:]
                    lines = (len(txt) / 16) + 1

                    for i in xrange(lines):
                        right, left = False, False

                        if len(txt) > 16:
                            # here ===
                            part = txt[i * 16:(i * 16) + 16]
                        else:
                            right = True
                            part = txt[i * 16:]

                        if i == lines - 1:
                            right = True

                        cr.move_to(start_x,
                                   (line_y + protocol_idx + i + 1) * atom_y + 4)

                        part = " ".join(["%02X" % ord(x) for x in part])
                        layout.set_text(part)


                        w, h = self.draw_box(cr, layout, fill=fill_color,
                                             border=border_color,
                                             right=right, left=left)

                    # End point
                    self.fields[(protocol, field_name)].append(
                            (start_x + (w / 2.0),
                            (line_y + protocol_idx + lines + 1) * atom_y + 8))
                else:
                    txt = " ".join(["%02X" % ord(x) for x in txt])
                    layout.set_text(txt)

                    cr.move_to(start_x + (line_x * atom_x),
                               (line_y + protocol_idx) * atom_y + 4)

                    w, h = self.draw_box(cr, layout, fill=fill_color,
                                         border=border_color)

                    tot_w += w + 4
                    tot_h = max(tot_h, h)

                    # End point
                    self.fields[(protocol, field_name)].append(
                                (start_x + (line_x * atom_x) + (w / 2.0),
                                (tot_h + (protocol_idx + line_y) * atom_y + 8)))

                self.draw_line(cr, protocol, field_name)

            cr.rel_move_to(0, tot_h + 4)

            dct = defaultdict(list)

            protocol_idx += 1
示例#7
0
    def draw_payload(self, cr):
        payload = self.packet.get_raw()

        layout = self.create_pango_layout('')
        layout.set_font_description(pango.FontDescription(self.hex_font))

        layout.set_text("FF")
        atom_x, atom_y = layout.get_pixel_size()

        atom_x += atom_x / 2.0
        atom_y += atom_y / 2.0

        start_x = self.allocation.width - (atom_x * 16) - 10

        cr.move_to(start_x, 4)

        # We should have space to place 16 bytes in hex

        dct = defaultdict(list)

        protocol_idx = 0

        for protocol, color in self.protocols:

            for field in backend.get_proto_fields(protocol):

                if not backend.is_showable_field(field, self.packet):
                    continue

                start = backend.get_field_offset(self.packet, protocol, field)
                end = backend.get_field_size(protocol, field)

                start /= 8

                dct[start].append((end, field))

            # Now we have the dict so we have to transform to
            # a sorted list

            lst = dct.items()
            lst.sort()

            tot_w = 0
            tot_h = 0

            for offset, child_list in lst:

                # We have also a child list to iterate
                size = 0

                if len(child_list) == 1 and child_list[0][0] == 0:
                    continue
                else:
                    for end, field in child_list:
                        size += end

                    size /= 8

                current_field = child_list[-1][1]
                field_name = backend.get_field_name(current_field)
                fill_color = self.__get_color(field_name)
                border_color = color

                line_x = offset % 16
                line_y = offset / 16

                txt = payload[offset:offset + size]

                if size + line_x > 16:
                    start = 16 - line_x

                    top_right = txt[0:start]

                    top_right = " ".join(["%02X" % ord(x) for x in top_right])
                    layout.set_text(top_right)

                    cr.move_to(start_x + (line_x * atom_x),
                               (line_y + protocol_idx) * atom_y + 4)

                    # Here we should write <==
                    self.draw_box(cr,
                                  layout,
                                  fill=fill_color,
                                  border=border_color,
                                  right=False)

                    w, h = 0, 0
                    txt = txt[start:]
                    lines = (len(txt) / 16) + 1

                    for i in xrange(lines):
                        right, left = False, False

                        if len(txt) > 16:
                            # here ===
                            part = txt[i * 16:(i * 16) + 16]
                        else:
                            right = True
                            part = txt[i * 16:]

                        if i == lines - 1:
                            right = True

                        cr.move_to(start_x,
                                   (line_y + protocol_idx + i + 1) * atom_y +
                                   4)

                        part = " ".join(["%02X" % ord(x) for x in part])
                        layout.set_text(part)

                        w, h = self.draw_box(cr,
                                             layout,
                                             fill=fill_color,
                                             border=border_color,
                                             right=right,
                                             left=left)

                    # End point
                    self.fields[(protocol, field_name)].append(
                        (start_x + (w / 2.0),
                         (line_y + protocol_idx + lines + 1) * atom_y + 8))
                else:
                    txt = " ".join(["%02X" % ord(x) for x in txt])
                    layout.set_text(txt)

                    cr.move_to(start_x + (line_x * atom_x),
                               (line_y + protocol_idx) * atom_y + 4)

                    w, h = self.draw_box(cr,
                                         layout,
                                         fill=fill_color,
                                         border=border_color)

                    tot_w += w + 4
                    tot_h = max(tot_h, h)

                    # End point
                    self.fields[(protocol, field_name)].append(
                        (start_x + (line_x * atom_x) + (w / 2.0),
                         (tot_h + (protocol_idx + line_y) * atom_y + 8)))

                self.draw_line(cr, protocol, field_name)

            cr.rel_move_to(0, tot_h + 4)

            dct = defaultdict(list)

            protocol_idx += 1