Possible errors
Brought to you by:
vikramrc
Sorry for my english !
I have method:
RequestData (
[in] long count,
[in, out] DataRow* data,
[out] long* time,
[out] short* msec);
DataRow {
unsigned short index;
unsigned char attr;
unsigned char node;
single val;
unsigned long status;
char* list;
};
I think I found two errors that can life reproduced with the above method:
1. Objects of JIPointer from array listOfDefferedPointers do not need aligning (in method JICallBuilder.readPacket)
2. HResult value must be aligned to 4 byte in JICallBuilder.readResult.
The same changes must be made when serializing request.
In an attachment, files with changes that I suggest to add to the project.
I call this method so:
public RequestDataResult requestData(DataRow[] dataRows) throws Exception {
callBuilder.reInit();
//RequestData(
callBuilder.setOpnum(4);
//[in] long count,
callBuilder.addInParamAsInt(dataRows.length, JIFlags.FLAG_NULL);
JIStruct[] dra = new JIStruct[dataRows.length];
for(int i = 0; i < dataRows.length; i++) {
dra[i] = dataRows[i].toJIStruct();
}
//[in, out] DATAROW* data,
callBuilder.addInParamAsArray(new JIArray(dra, true), JIFlags.FLAG_NULL);
callBuilder.addOutParamAsObject(new JIArray(DataRow.toJIStructTemplate(), null, 1, true), JIFlags.FLAG_NULL);
//[out] long* time,
callBuilder.addOutParamAsType(Integer.class, JIFlags.FLAG_NULL);
//[out] short* msec);
callBuilder.addOutParamAsType(Short.class, JIFlags.FLAG_NULL);
Object[] result = iTmRtm.call(callBuilder);
if (result.length > 0) {
JIStruct[] structDataRows = (JIStruct[]) ((JIArray)result[0]).getArrayInstance();
for(int i = 0; i < dataRows.length; i++) {
dataRows[i] = DataRow.parse(structDataRows[i]);
}
return new RequestDataResult(dataRows, (int)result[1], (short) result[2]);
}
throw new Exception("Сервер TraceMode вернул некорректное значение");
}
public JIStruct toJIStruct() {
JIStruct struct = null;
try {
struct = new JIStruct();
//unsigned short index
struct.addMember(JIUnsignedFactory.getUnsigned(index, JIFlags.FLAG_REPRESENTATION_UNSIGNED_SHORT));
//unsigned char attr
struct.addMember(JIUnsignedFactory.getUnsigned(attribute, JIFlags.FLAG_REPRESENTATION_UNSIGNED_BYTE));
//unsigned char node;
struct.addMember(JIUnsignedFactory.getUnsigned(node, JIFlags.FLAG_REPRESENTATION_UNSIGNED_BYTE));
//single val
struct.addMember(value);
//unsigned long status
struct.addMember(JIUnsignedFactory.getUnsigned(status, JIFlags.FLAG_REPRESENTATION_UNSIGNED_INT));
//char* list
struct.addMember(new JIPointer(list));
} catch (JIException ex) {
logger.error(ex.getMessage());
}
return struct;
}
public static JIStruct toJIStructTemplate() {
JIStruct struct = null;
try {
struct = new JIStruct();
//unsigned short index
struct.addMember(JIUnsignedShort.class);
//unsigned char attr
struct.addMember(JIUnsignedByte.class);
//unsigned char node;
struct.addMember(JIUnsignedByte.class);
//single val
struct.addMember(Float.class);
//unsigned long status
struct.addMember(JIUnsignedInteger.class);
//char* list
struct.addMember(new JIPointer(Byte.class));
} catch (JIException ex) {
logger.error(ex.getMessage());
}
return struct;
}