A field that manages endianness of a nested field passed to the constructor
| 55 | |
| 56 | |
| 57 | class EField(_FieldContainer): |
| 58 | """ |
| 59 | A field that manages endianness of a nested field passed to the constructor |
| 60 | """ |
| 61 | |
| 62 | __slots__ = ["fld", "endianness", "endianness_from"] |
| 63 | |
| 64 | def __init__(self, fld, endianness=None, endianness_from=None): |
| 65 | self.fld = fld |
| 66 | self.endianness = endianness |
| 67 | self.endianness_from = endianness_from |
| 68 | |
| 69 | def set_endianness(self, pkt): |
| 70 | if getattr(pkt, "endianness", None) is not None: |
| 71 | self.endianness = pkt.endianness |
| 72 | elif self.endianness_from is not None: |
| 73 | self.endianness = self.endianness_from(pkt) |
| 74 | |
| 75 | if isinstance(self.endianness, str) and self.endianness: |
| 76 | if isinstance(self.fld, UUIDField): |
| 77 | self.fld.uuid_fmt = (UUIDField.FORMAT_LE if |
| 78 | self.endianness == '<' |
| 79 | else UUIDField.FORMAT_BE) |
| 80 | elif hasattr(self.fld, "fmt"): |
| 81 | if len(self.fld.fmt) == 1: # if it's only "I" |
| 82 | _end = self.fld.fmt[0] |
| 83 | else: # if it's "<I" |
| 84 | _end = self.fld.fmt[1:] |
| 85 | self.fld.fmt = self.endianness + _end |
| 86 | self.fld.struct = struct.Struct(self.fld.fmt) |
| 87 | |
| 88 | def getfield(self, pkt, buf): |
| 89 | self.set_endianness(pkt) |
| 90 | return self.fld.getfield(pkt, buf) |
| 91 | |
| 92 | def addfield(self, pkt, buf, val): |
| 93 | self.set_endianness(pkt) |
| 94 | return self.fld.addfield(pkt, buf, val) |
| 95 | |
| 96 | |
| 97 | class EPacket(Packet): |
no outgoing calls
no test coverage detected
searching dependent graphs…