PUD: add wireformat libraries
[olsrd.git] / lib / pud / wireformat-java / src / main / java / org / olsr / plugin / pud / UplinkMessage.java
1 package org.olsr.plugin.pud;
2
3 /**
4  * This class represents an uplink message.
5  * 
6  * It stores the received uplink message in a byte array and provides access
7  * methods for all uplink header fields.
8  */
9 public abstract class UplinkMessage {
10         static {
11                 LibraryLoader.load();
12         }
13
14         /*
15          * Uplink Message Store
16          */
17
18         /** the uplink message */
19         protected byte[] data = null;
20
21         /** the number of bytes in the received message */
22         protected int dataSize = 0;
23
24         /**
25          * Default constructor
26          */
27         public UplinkMessage() {
28                 super();
29         }
30
31         /**
32          * Constructor
33          * 
34          * @param data
35          *            the received message
36          * @param dataSize
37          *            the number of bytes in the received message
38          */
39         public UplinkMessage(byte[] data, int dataSize) {
40                 super();
41                 this.data = data;
42                 this.dataSize = dataSize;
43         }
44
45         /*
46          * Getters
47          */
48
49         /**
50          * @return the received message
51          */
52         public final byte[] getData() {
53                 return data;
54         }
55
56         /**
57          * @return the number of bytes in the received message
58          */
59         public final int getDataSize() {
60                 return dataSize;
61         }
62
63         /*
64          * Uplink Message Types
65          */
66
67         /**
68          * @return the uplink message type for a position update
69          */
70         public static native int getUplinkMessageTypePosition();
71
72         /**
73          * @return the uplink message type for a cluster leader message
74          */
75         public static native int getUplinkMessageTypeClusterLeader();
76
77         /*
78          * UplinkHeader
79          */
80
81         /**
82          * @return the length of the uplink message header
83          */
84         public static native int getUplinkMessageHeaderLength();
85
86         /**
87          * @param data
88          *            the uplink message
89          * @param offset
90          *            the offset in the data where the uplink message begins
91          *
92          * @return the uplink message type
93          */
94         public static int getUplinkMessageType(byte[] data, int offset) {
95                 return data[offset];
96         }
97
98         /**
99          * @param data
100          *            the uplink message
101          * @param offset
102          *            the offset in the data where the uplink message begins
103          *
104          * @return the number of bytes in the payload of the uplink message
105          */
106         public static int getUplinkMessageLength(byte[] data, int offset) {
107                 return ((data[offset + 1] << 8) | data[offset + 2]);
108         }
109
110         /**
111          * @param data
112          *            the uplink message
113          * @param offset
114          *            the offset in the data where the uplink message begins
115          *
116          * @return true when the contained message is an IPv6 message, false
117          *         otherwise (IPv4)
118          */
119         public static boolean isUplinkMessageIPv6(byte[] data, int offset) {
120                 return ((data[offset + 3] & 0x01) != 0);
121         }
122
123         /**
124          * @return the uplink message type
125          */
126         public int getUplinkMessageType() {
127                 return UplinkMessage.getUplinkMessageType(data, 0);
128         }
129
130         /**
131          * @return the number of bytes in the payload of the uplink message
132          */
133         public int getUplinkMessageLength() {
134                 return UplinkMessage.getUplinkMessageLength(data, 0);
135         }
136
137         /**
138          * @return true when the contained message is an IPv6 message, false
139          *         otherwise (IPv4)
140          */
141         public boolean isUplinkMessageIPv6() {
142                 return UplinkMessage.isUplinkMessageIPv6(data, 0);
143         }
144 }