def marshall(formatter, object, varcontent): if (not checkMarshallStatus(formatter)): return _IPC.IPC_Error else: varcontent.length = bufferSize(formatter, object, True) varcontent.content = None if (varcontent.length > 0): varcontent.content = createByteArray(varcontent.length) buffer = createBuffer(varcontent.content) encodeData(formatter, object, buffer) if (bufferLength(buffer) != varcontent.length): IPC.Raise("Mismatch between buffer size (%d) and encoded data (%d)" % \ (varcontent.length, bufferLength(buffer))) freeBuffer(buffer) return _IPC.IPC_OK
def unmarshall(formatter, byteArray, object=None, oclass=None): if (not checkMarshallStatus(formatter)): return _IPC.IPC_Error elif (validFormatter(formatter)): buffer = createBuffer(byteArray) needEnclosingObject = not _IPC.formatType(formatter) in \ (StructFMT, FixedArrayFMT, VarArrayFMT) if (needEnclosingObject or object is None): needEnclosingObject = (_IPC.formatType(formatter) != StructFMT) if (oclass is None or needEnclosingObject): theObject = IPCdata() else: theObject = oclass() else: if (not oclass is None and not isinstance(object, oclass)): IPC.Raise("unmarshall: Object %s and class %s do not match" % \ (object, oclass)) theObject = object decodeData(formatter, buffer, theObject, oclass) if (needEnclosingObject): theObject = theObject._f0 _IPC.freeBuffer(buffer) return (theObject, _IPC.IPC_OK) else: return (None, _IPC.IPC_OK)
def transferToDataStructure(format, dataStruct, dStart, buffer, parentFormat, isTopLevelStruct, oclass=None): ftype = _IPC.formatType(format) if (ftype == LengthFMT): IPC.Raise("Python version of IPC can only use explicit formats") elif (ftype == PrimitiveFMT): try: dataStruct.__dict__ # Is this a settable object except AttributeError: IPC.Raise( invalidStructFormat( type(dataStruct), primFmttrs.PrimType(_IPC.formatPrimitiveProc(format)))) primFmttrs.Decode(_IPC.formatPrimitiveProc(format), dataStruct, dStart, buffer) elif (ftype == PointerFMT): theChar = _IPC.formatGetChar(buffer) if (theChar == '\0'): primFmttrs.setObjectField(dataStruct, dStart, None) else: transferToDataStructure( _IPC.formatChoosePtrFormat(format, parentFormat), dataStruct, dStart, buffer, 0, isTopLevelStruct, oclass) elif (ftype == StructFMT): formatArray = _IPC.formatFormatArray(format) structStart = 0 n = _IPC.formatFormatArrayMax(formatArray) if (isTopLevelStruct): struct = dataStruct else: struct1 = primFmttrs.getObjectField(dataStruct, dStart) struct = validateObject(struct1, dataStruct, dStart) if (not struct == struct1): primFmttrs.setObjectField(dataStruct, dStart, struct) for i in range(1, n): transferToDataStructure( _IPC.formatFormatArrayItemPtr(formatArray, i), struct, structStart, buffer, format, False) structStart = structStart + 1 elif (ftype == FixedArrayFMT): formatArray = _IPC.formatFormatArray(format) nextFormat = _IPC.formatFormatArrayItemPtr(formatArray, 1) size = _IPC.formatFormatArrayItemInt(formatArray, 2) if (isTopLevelStruct and isinstance(dataStruct, (tuple, list))): arrayObject = dataStruct else: arrayObject = primFmttrs.getObjectField(dataStruct, dStart) arrayObject = validateArrayObject(arrayObject, size, dataStruct, dStart) primFmttrs.setObjectField(dataStruct, dStart, arrayObject) arrayTransferToDataStructure( arrayObject, buffer, 2, _IPC.formatFormatArrayMax(formatArray) - 1, size, isSimpleType(nextFormat), formatArray, nextFormat, dataStruct, dStart, False, oclass) elif (ftype == VarArrayFMT): formatArray = _IPC.formatFormatArray(format) nextFormat = _IPC.formatFormatArrayItemPtr(formatArray, 1) # The total size of the array is the stored first size = _IPC.formatGetInt(buffer) numDims = _IPC.formatFormatArrayMax(formatArray) - 2 if (numDims > 1): size = varArrayDimSize(2, formatArray, dataStruct) if (not feasibleToDecodeVarArray(size, formatArray, dStart)): IPC.Raise("Python version of IPC cannot decode " + \ "multi-dimensional variable length arrays unless " + \ "the size variables appear BEFORE the array " + \ "in the enclosing structure") elif (isTopLevelStruct): arrayObject = dataStruct else: arrayObject = primFmttrs.getObjectField(dataStruct, dStart) arrayObject = validateArrayObject(arrayObject, size, dataStruct, dStart) primFmttrs.setObjectField(dataStruct, dStart, arrayObject) arrayTransferToDataStructure(arrayObject, buffer, 2, numDims + 1, size, isSimpleType(nextFormat), formatArray, nextFormat, dataStruct, dStart, True, oclass) elif (ftype == NamedFMT): transferToDataStructure(_IPC.findNamedFormat(format), dataStruct, dStart, buffer, parentFormat, isTopLevelStruct) elif (ftype == EnumFMT): primFmttrs.Decode(primFmttrs.INT_FMT, dataStruct, dStart, buffer) else: IPC.Raise("Unhandled format: %s" % ftype)
def transferToBuffer(format, dataStruct, dStart, buffer, parentFormat, isTopLevelStruct): ftype = _IPC.formatType(format) if (ftype == LengthFMT): IPC.Raise("Python version of IPC can only use explicit formats") elif (ftype == PrimitiveFMT): if (isTopLevelStruct): object = IPCdata() object._f0 = dataStruct dataStruct = object primFmttrs.Encode(_IPC.formatPrimitiveProc(format), dataStruct, dStart, buffer) elif (ftype == PointerFMT): object = primFmttrs.getObjectField(dataStruct, dStart) # 'Z' means data, 0 means NIL if (object is None): theChar = '\0' else: theChar = 'Z' _IPC.formatPutChar(buffer, theChar) if (not object is None): transferToBuffer(_IPC.formatChoosePtrFormat(format, parentFormat), dataStruct, dStart, buffer, 0, isTopLevelStruct) elif (ftype == StructFMT): formatArray = _IPC.formatFormatArray(format) structStart = 0 n = _IPC.formatFormatArrayMax(formatArray) if (isTopLevelStruct): struct = dataStruct else: struct = primFmttrs.getObjectField(dataStruct, dStart) for i in range(1, n): transferToBuffer(_IPC.formatFormatArrayItemPtr(formatArray, i), struct, structStart, buffer, format, False) structStart = structStart + 1 elif (ftype == FixedArrayFMT): formatArray = _IPC.formatFormatArray(format) nextFormat = _IPC.formatFormatArrayItemPtr(formatArray, 1) if (isTopLevelStruct): arrayObject = dataStruct else: arrayObject = primFmttrs.getObjectField(dataStruct, dStart) if (not isinstance(arrayObject, (tuple, list))): IPC.Raise(invalidArrayFormat(dataStruct, dStart)) else: arrayTransferToBuffer(arrayObject, buffer, 2, _IPC.formatFormatArrayMax(formatArray) - 1, isSimpleType(nextFormat), formatArray, nextFormat, dataStruct, False) elif (ftype == VarArrayFMT): formatArray = _IPC.formatFormatArray(format) nextFormat = _IPC.formatFormatArrayItemPtr(formatArray, 1) if (isTopLevelStruct): arrayObject = dataStruct else: arrayObject = primFmttrs.getObjectField(dataStruct, dStart) # For the size of the array _IPC.formatPutInt(buffer, varArrayNumElements(formatArray, dataStruct)) if (not isinstance(arrayObject, (tuple, list))): IPC.Raise(invalidArrayFormat(dataStruct, dStart)) else: arrayTransferToBuffer(arrayObject, buffer, 2, _IPC.formatFormatArrayMax(formatArray) - 1, isSimpleType(nextFormat), formatArray, nextFormat, dataStruct, True) elif (ftype == NamedFMT): transferToBuffer(_IPC.findNamedFormat(format), dataStruct, dStart, buffer, parentFormat, isTopLevelStruct) elif (ftype == EnumFMT): primFmttrs.Encode(primFmttrs.INT_FMT, dataStruct, dStart, buffer) else: IPC.Raise("Unhandled format: %s" % ftype)
def bufferSize1(format, dataStruct, dStart, parentFormat, isTopLevelStruct): bufSize = 0 ftype = _IPC.formatType(format) if (ftype == LengthFMT): IPC.Raise("Python version of IPC can only use explicit formats") elif (ftype == PrimitiveFMT): primType = _IPC.formatPrimitiveProc(format) bufSize = bufSize + primFmttrs.ELength(primType, dataStruct, dStart) elif (ftype == PointerFMT): bufSize = bufSize + 1 if (not primFmttrs.getObjectField(dataStruct, dStart) is None): bufSize = bufSize + \ bufferSize1(_IPC.formatChoosePtrFormat(format, parentFormat), dataStruct, dStart, 0, isTopLevelStruct) elif (ftype == StructFMT): formatArray = _IPC.formatFormatArray(format) structStart = 0 n = _IPC.formatFormatArrayMax(formatArray) if (isTopLevelStruct): struct = dataStruct else: struct = primFmttrs.getObjectField(dataStruct, dStart) for i in range(1, n): bufSize = bufSize + \ bufferSize1(_IPC.formatFormatArrayItemPtr(formatArray, i), struct, structStart, format, False) structStart = structStart + 1 elif (ftype == FixedArrayFMT): formatArray = _IPC.formatFormatArray(format) nextFormat = _IPC.formatFormatArrayItemPtr(formatArray, 1) if (isTopLevelStruct): arrayObject = dataStruct else: arrayObject = primFmttrs.getObjectField(dataStruct, dStart) if (not isinstance(arrayObject, (tuple, list))): IPC.Raise(invalidArrayFormat(dataStruct, dStart)) elif (isSimpleType(nextFormat)): bufSize = bufSize + ( bufferSize1(nextFormat, arrayObject, 0, 0, False) * fixedArrayNumElements(formatArray)) else: bufSize = bufSize + \ arrayBufferSize(arrayObject, 2, _IPC.formatFormatArrayMax(formatArray)-1, formatArray, nextFormat, None) elif (ftype == VarArrayFMT): formatArray = _IPC.formatFormatArray(format) nextFormat = _IPC.formatFormatArrayItemPtr(formatArray, 1) if (isTopLevelStruct): arrayObject = dataStruct else: arrayObject = primFmttrs.getObjectField(dataStruct, dStart) # For the size of the array bufSize = bufSize + primFmttrs.ELength(primFmttrs.INT_FMT, None, 0) if (not isinstance(arrayObject, (tuple, list))): IPC.Raise(invalidArrayFormat(dataStruct, dStart)) elif (isSimpleType(nextFormat)): bufSize = bufSize + ( bufferSize1(nextFormat, arrayObject, 0, 0, False) * varArrayNumElements(formatArray, dataStruct)) else: bufSize = bufSize + \ arrayBufferSize(arrayObject, 2, _IPC.formatFormatArrayMax(formatArray)-1, formatArray, nextFormat, dataStruct) elif (ftype == NamedFMT): bufSize = bufSize + \ bufferSize1(_IPC.findNamedFormat(format), dataStruct, dStart, parentFormat, isTopLevelStruct) elif (ftype == EnumFMT): bufSize = bufSize + primFmttrs.ELength(primFmttrs.INT_FMT, None, 0) else: IPC.Raise("Unhandled format: %s" % ftype) return bufSize
def validateArrayObject(arrayObject, dim, object, index): if (not (arrayObject is None or isinstance(arrayObject, (list, tuple)))): IPC.Raise(invalidArrayFormat(object, index)) elif (arrayObject is None or len(arrayObject) != dim): arrayObject = [None] * dim return arrayObject