X-Git-Url: https://rtime.felk.cvut.cz/gitweb/orte.git/blobdiff_plain/4d5ff5f99c785686d214d4a4b1a80a654dbfdc1d..123c8c321489e0d0528603d397ca552641dec89b:/orte/java/src/org/ocera/orte/types/RecvInfo.java diff --git a/orte/java/src/org/ocera/orte/types/RecvInfo.java b/orte/java/src/org/ocera/orte/types/RecvInfo.java index b711730..07db207 100644 --- a/orte/java/src/org/ocera/orte/types/RecvInfo.java +++ b/orte/java/src/org/ocera/orte/types/RecvInfo.java @@ -23,56 +23,116 @@ package org.ocera.orte.types; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; public class RecvInfo { - private byte status; - private String topic; - private String typeName; - private GUID_RTPS senderGUID; - private NtpTime localTimeRecv; - private NtpTime remoteTimePub; - private SequenceNumber sn; + + private ByteBuffer info_buffer; + + /* Helper buffer structure (all 32-bit integers): + * [0] sizeof(ORTERecvInfo), + * [1] sizeof(ORTERecvStatus), + * [2] sizeof(char*), + * [3] offsetof(ORTERecvInfo,status), + * [4] offsetof(ORTERecvInfo,topic), + * [5] offsetof(ORTERecvInfo,type), + * [6] offsetof(ORTERecvInfo,senderGUID), + * [7] offsetof(ORTERecvInfo,localTimeReceived), + * [8] offsetof(ORTERecvInfo,remoteTimePublished), + * [9] offsetof(ORTERecvInfo,sn), + * [10] offsetof(GUID_RTPS,hid), + * [11] offsetof(GUID_RTPS,aid), + * [12] offsetof(GUID_RTPS,oid), + * [13] offsetof(NtpTime,seconds), + * [14] offsetof(NtpTime,fraction), + * [15] offsetof(SequenceNumber,high), + * [16] offsetof(SequenceNumber,low) + */ + static ByteBuffer helper_buffer; + + static { + helper_buffer = ByteBuffer.allocateDirect(17*Integer.SIZE/8); + helper_buffer.order(ByteOrder.nativeOrder()); + c_helper(helper_buffer); + } public RecvInfo() { //System.out.println(":j: instance of RecvInfo created.."); + this.info_buffer = ByteBuffer.allocateDirect(helper_buffer.getInt(0)); + this.info_buffer.order(ByteOrder.nativeOrder()); } public byte getRecvStatus() { - return this.status; + byte ret_val; + + switch(helper_buffer.getInt(Integer.SIZE/8)) { + case 4: + ret_val = (byte) info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*3/8)); + break; + case 1: + ret_val = info_buffer.get(helper_buffer.getInt(Integer.SIZE*3/8)); + break; + case 2: + ret_val = (byte) info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*3/8)); + break; + case 8: + ret_val = (byte) info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*3/8)); + break; + default: + System.out.println("j: ORTERecvStatus of unknown size!"); + return -1; + } + + return ret_val; } public String getTopic() { - return this.topic; + return getString(Integer.SIZE*4/8); } public String getTypeName() { - return this.typeName; + return getString(Integer.SIZE*5/8); } public GUID_RTPS getSenderGuid() { - return this.senderGUID.get(); + long hostId = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*10/8)) & 0xffffffffL; + long appId = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*11/8)) & 0xffffffffL; + long objectId = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*12/8)) & 0xffffffffL; + + + return new GUID_RTPS(hostId, appId, objectId); } public NtpTime getLocalTimeRecv() { - return this.localTimeRecv.get(); + int seconds = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*7/8)+helper_buffer.getInt(Integer.SIZE*13/8)); + long fraction = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*7/8)+helper_buffer.getInt(Integer.SIZE*14/8)) & 0xffffffffL; + + return new NtpTime(seconds, fraction); } public NtpTime getRemoteTimePub() { - return this.remoteTimePub.get(); + int seconds = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*8/8)+helper_buffer.getInt(Integer.SIZE*13/8)); + long fraction = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*8/8)+helper_buffer.getInt(Integer.SIZE*14/8)) & 0xffffffffL; + + return new NtpTime(seconds, fraction); } public SequenceNumber getSeqNumber() { - return this.sn.get(); + int high = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*9/8)+helper_buffer.getInt(Integer.SIZE*15/8)); + long low = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*9/8)+helper_buffer.getInt(Integer.SIZE*16/8)); + + return new SequenceNumber(high, low); } /** only for test purposes */ @@ -85,8 +145,38 @@ public class RecvInfo System.out.println(":j: senderGuid: " + this.getSenderGuid()); System.out.println(":j: localTimerecv: " + this.getLocalTimeRecv()); System.out.println(":j: remoteTimePub: " + this.getRemoteTimePub()); - sn = this.getSeqNumber(); - System.out.println(":j: seqNr: " + sn.getDecimal()); + System.out.println(":j: seqNr: " + this.getSeqNumber().getDecimal()); } + public ByteBuffer getBuffer() + { + return this.info_buffer; + } + + private String getString(int offset) { + long string_pointer = -1; + + switch(helper_buffer.getInt(Integer.SIZE*2/8)) { + case 4: + string_pointer = info_buffer.getInt(helper_buffer.getInt(offset)); + break; + case 8: + string_pointer = info_buffer.getLong(helper_buffer.getInt(offset)); + break; + case 1: + string_pointer = info_buffer.get(helper_buffer.getInt(offset)); + break; + case 2: + string_pointer = info_buffer.getShort(helper_buffer.getInt(offset)); + break; + } + + return get_string(string_pointer); + } + + /* NATIVE FUNCTIONS */ + + static native String get_string(long string_pointer); + static native void c_helper(ByteBuffer buffer); + }