def _productHook(dct): if "__bytes__" in dct: rvalue = base64.b64decode(dct["__bytes__"].encode()) elif "__ntp__" in dct: pack = base64.b64decode(dct["__ntp__"].encode()) ntptime = struct.unpack("d", pack)[0] rvalue = ntp.ntp2datetime(ntptime) else: rvalue = dct return rvalue
def _arg_decode(data, typetag): if typetag == "T": arg = None elif typetag == "F": arg = None elif typetag == "N": arg = None elif typetag == "I": arg = None elif typetag == "i": if len(data) < 4: raise ValueError("Wrong data size for an int") arg, data = struct.unpack("!i", data[:4])[0], data[4:] elif typetag == "f": if len(data) < 4: raise ValueError("Wrong data size for a float") arg, data = struct.unpack("!f", data[:4])[0], data[4:] elif typetag == "s": eos = data.find(b"\0") if eos == -1: raise ValueError("Not a string") size = _pad(eos + 1) arg, data = data[:eos].decode(), data[size:] elif typetag == "b": realsize = struct.unpack("!i", data[0:4])[0] size = _pad(realsize) if len(data) < size: raise ValueError("Wrong data size for a %d bytes blob" % realsize) arg, data = data[4 : 4 + realsize], data[size:] elif typetag == "t": if len(data) < 8: raise ValueError("Wrong data size for a time tag") argdata, data = data[:8], data[8:] if struct.unpack("!q", argdata)[0] == IMMEDIATELY: arg = None else: arg = ntp.ntp2datetime(ntp.ntpDecode(argdata)) else: raise TypeError("Unsupported type tag (%s)" % typetag) return (arg, data)