1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
from base64 import b64encode, b64decode
from irods.message.ordered import OrderedProperty
from html import escape
class MessageProperty(OrderedProperty):
def __get__(self, obj, cls):
return obj._values[self.name]
def __set__(self, obj, value):
obj._values[self.name] = value
def dub(self, name):
self.name = name
return self
def pack(self, value):
values = []
values.append("<%s>" % self.name)
my_value = self.format(value)
if isinstance(my_value, bytes):
my_value = my_value.decode("utf-8")
values.append(my_value)
values.append("</%s>" % self.name)
return "".join(values)
def unpack(self, els):
if len(els):
el = els[0]
return self.parse(el.text)
return None
class IntegerProperty(MessageProperty):
def format(self, value):
return str(value)
def parse(self, value):
return int(value)
class LongProperty(MessageProperty):
def format(self, value):
return str(value)
def parse(self, value):
return int(value)
class BinaryProperty(MessageProperty):
def __init__(self, length=None):
self.length = length
super(BinaryProperty, self).__init__()
def format(self, value):
if isinstance(value, bytes):
return b64encode(value)
else:
return b64encode(value.encode())
def parse(self, value):
val = b64decode(value)
return val
class StringProperty(MessageProperty):
def __init__(self, length=None):
self.length = length
super(StringProperty, self).__init__()
@staticmethod
def escape_xml_string(string):
return escape(string, quote=False)
def format(self, value):
if isinstance(value, str):
return self.escape_xml_string(value)
if isinstance(value, bytes):
return self.escape_xml_string(value.decode())
return self.escape_xml_string(str(value))
def parse(self, value):
return value
class ArrayProperty(MessageProperty):
def __init__(self, prop):
self.prop = prop
super(ArrayProperty, self).__init__()
def pack(self, values):
self.prop.dub(self.name)
return "".join([self.prop.pack(v) for v in values])
def unpack(self, els):
return [self.prop.unpack([el]) for el in els]
class SubmessageProperty(MessageProperty):
def __init__(self, message_cls=None):
self.message_cls = message_cls
super(SubmessageProperty, self).__init__()
def pack(self, value):
return value.pack()
def unpack(self, els):
if len(els):
el = els[0]
msg = self.message_cls()
msg.unpack(el)
return msg
return None
|