Menu

#23 Possible errors

v1.0_(example)
open
None
5
2015-02-07
2014-05-10
No

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

Discussion


Log in to post a comment.