Skip to content

Commit 1316a7a

Browse files
committed
protocol/rq: add Bytes field (for binary strings)
1 parent 7a2dfb2 commit 1316a7a

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

Xlib/protocol/rq.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,39 @@ def __init__(self, name, size):
391391
self.structcode = '{0}s'.format(size)
392392

393393

394+
class Bytes(ValueField):
395+
structcode = None
396+
397+
def __init__(self, name, pad = 1):
398+
ValueField.__init__(self, name)
399+
self.pad = pad
400+
401+
def pack_value(self, val):
402+
if isinstance(val, bytes):
403+
val_bytes = val
404+
else:
405+
val_bytes = val.encode()
406+
slen = len(val_bytes)
407+
408+
if self.pad:
409+
return val_bytes + b'\0' * ((4 - slen % 4) % 4), slen, None
410+
else:
411+
return val_bytes, slen, None
412+
413+
def parse_binary_value(self, data, display, length, format):
414+
if length is None:
415+
return data, b''
416+
417+
if self.pad:
418+
slen = length + ((4 - length % 4) % 4)
419+
else:
420+
slen = length
421+
422+
data_bytes = data[:length]
423+
424+
return data_bytes, data[slen:]
425+
426+
394427
class String8(ValueField):
395428
structcode = None
396429

0 commit comments

Comments
 (0)