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; }