|
42 | 42 | from . import event |
43 | 43 |
|
44 | 44 | if PY3: |
45 | | - def buffer(object, offset=None, size=None): |
46 | | - if offset is None: |
47 | | - offset = 0 |
| 45 | + |
| 46 | + class bytesview(object): |
| 47 | + |
| 48 | + def __init__(self, data, offset=0, size=None): |
| 49 | + if size is None: |
| 50 | + size = len(data)-offset |
| 51 | + if isinstance(data, bytes): |
| 52 | + view = memoryview(data) |
| 53 | + elif isinstance(data, bytesview): |
| 54 | + view = data.view |
| 55 | + else: |
| 56 | + raise TypeError('unsupported type: {}'.format(type(data))) |
| 57 | + self.view = view[offset:offset+size] |
| 58 | + |
| 59 | + def __len__(self): |
| 60 | + return len(self.view) |
| 61 | + |
| 62 | + def __getitem__(self, key): |
| 63 | + if isinstance(key, slice): |
| 64 | + return bytes(self.view[key]) |
| 65 | + return self.view[key] |
| 66 | + |
| 67 | +else: |
| 68 | + |
| 69 | + def bytesview(data, offset=0, size=None): |
| 70 | + if not isinstance(data, (bytes, buffer)): |
| 71 | + raise TypeError('unsupported type: {}'.format(type(data))) |
48 | 72 | if size is None: |
49 | | - size = len(object)-offset |
50 | | - return memoryview(object)[offset:offset+size] |
| 73 | + size = len(data)-offset |
| 74 | + return buffer(data, offset, size) |
51 | 75 |
|
52 | 76 |
|
53 | 77 | class Display(object): |
@@ -706,7 +730,7 @@ def parse_error_response(self, request): |
706 | 730 | estruct = self.error_classes.get(code, error.XError) |
707 | 731 |
|
708 | 732 | e = estruct(self, self.data_recv[:32]) |
709 | | - self.data_recv = buffer(self.data_recv, 32) |
| 733 | + self.data_recv = bytesview(self.data_recv, 32) |
710 | 734 |
|
711 | 735 | # print 'recv Error:', e |
712 | 736 |
|
@@ -760,7 +784,7 @@ def parse_request_response(self, request): |
760 | 784 | req._parse_response(self.data_recv[:self.recv_packet_len]) |
761 | 785 | # print 'recv Request:', req |
762 | 786 |
|
763 | | - self.data_recv = buffer(self.data_recv, self.recv_packet_len) |
| 787 | + self.data_recv = bytesview(self.data_recv, self.recv_packet_len) |
764 | 788 | self.recv_packet_len = 0 |
765 | 789 |
|
766 | 790 |
|
@@ -797,7 +821,7 @@ def parse_event_response(self, etype): |
797 | 821 | if etype == ge.GenericEventCode: |
798 | 822 | self.recv_packet_len = 0 |
799 | 823 |
|
800 | | - self.data_recv = buffer(self.data_recv, length) |
| 824 | + self.data_recv = bytesview(self.data_recv, length) |
801 | 825 |
|
802 | 826 | # Drop all requests having an error handler, |
803 | 827 | # but which obviously succeded. |
|
0 commit comments