PUD: fix snprintf length confusion
[olsrd.git] / lib / pud / wireformat-java / src / main / c / org_olsr_plugin_pud_PositionUpdate.c
1 #include "org_olsr_plugin_pud_PositionUpdate.h"
2
3 #include "util.h"
4 #include <OlsrdPudWireFormat/nodeIdConversion.h>
5
6 /*
7  * OLSR header
8  */
9
10 /*
11  * Class:     org_olsr_plugin_pud_PositionUpdate
12  * Method:    getOlsrMessageOriginator
13  * Signature: ()Ljava/net/InetAddress;
14  */
15 JNIEXPORT jobject JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getOlsrMessageOriginator
16   (JNIEnv * env, jobject this) {
17         jobject dataObject;
18         jboolean isCopy;
19         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
20                         &isCopy);
21
22         jobject object;
23         bool ipv4 = !getUplinkMessageIPv6(&uplinkMessage->header);
24
25         union olsr_ip_addr * addr;
26         if (ipv4) {
27                 addr = (union olsr_ip_addr *) &uplinkMessage->msg.olsrMessage.v4.originator;
28         } else {
29                 addr = (union olsr_ip_addr *) &uplinkMessage->msg.olsrMessage.v6.originator;
30         }
31         constructIPAddress(env, ipv4, addr, &object);
32
33         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
34
35         return object;
36 }
37
38 /*
39  * PudOlsrPositionUpdate
40  */
41
42 /*
43  * Class:     org_olsr_plugin_pud_PositionUpdate
44  * Method:    getPositionUpdateVersion
45  * Signature: ()I
46  */
47 JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateVersion
48   (JNIEnv * env, jobject this) {
49         jobject dataObject;
50         jboolean isCopy;
51         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
52                         &isCopy);
53
54         uint8_t version = getPositionUpdateVersion(
55                         getPositionUpdateMessage(uplinkMessage));
56
57         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
58
59         return (jint) version;
60 }
61
62 /*
63  * Class:     org_olsr_plugin_pud_PositionUpdate
64  * Method:    getPositionUpdateValidityTime
65  * Signature: ()J
66  */
67 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateValidityTime
68   (JNIEnv * env, jobject this) {
69         jobject dataObject;
70         jboolean isCopy;
71         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
72                         &isCopy);
73
74         unsigned long validityTime = getValidityTime(
75                         &getPositionUpdateMessage(uplinkMessage)->validityTime);
76
77         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
78
79         return (jlong) validityTime;
80 }
81
82 /*
83  * Class:     org_olsr_plugin_pud_PositionUpdate
84  * Method:    getPositionUpdateSMask
85  * Signature: ()I
86  */
87 JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateSMask
88   (JNIEnv * env, jobject this) {
89         jobject dataObject;
90         jboolean isCopy;
91         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
92                         &isCopy);
93
94         uint8_t smask = getPositionUpdateSmask(
95                         getPositionUpdateMessage(uplinkMessage));
96
97         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
98
99         return (jint) smask;
100 }
101
102 /*
103  * Class:     org_olsr_plugin_pud_PositionUpdate
104  * Method:    getPositionUpdateFlags
105  * Signature: ()I
106  */
107 JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateFlags
108 (JNIEnv * env, jobject this) {
109         jobject dataObject;
110         jboolean isCopy;
111         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
112                         &isCopy);
113
114         uint8_t flags = getPositionUpdateFlags(
115                         getPositionUpdateMessage(uplinkMessage));
116
117         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
118
119         return (jint) flags;
120 }
121
122 /*
123  * GpsInfo
124  */
125
126 /*
127  * Class:     org_olsr_plugin_pud_PositionUpdate
128  * Method:    getPositionUpdateTime
129  * Signature: (JJ)J
130  */
131 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateTime
132   (JNIEnv * env, jobject this, jlong baseDate, jlong timezoneOffset) {
133         jobject dataObject;
134         jboolean isCopy;
135         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
136                         &isCopy);
137
138         jlong baseDateSeconds = baseDate / 1000LL;
139         jlong baseDateMilliSeconds = baseDate % 1000LL;
140
141         struct tm timeStruct;
142         time_t updateTimeSeconds;
143
144         getPositionUpdateTime(getPositionUpdateMessage(uplinkMessage),
145                         baseDateSeconds, &timeStruct);
146
147         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
148
149         updateTimeSeconds = mktime(&timeStruct);
150         return (updateTimeSeconds * 1000LL) + baseDateMilliSeconds - timezoneOffset;
151 }
152
153
154 /*
155  * Class:     org_olsr_plugin_pud_PositionUpdate
156  * Method:    getPositionUpdateLatitude
157  * Signature: ()D
158  */
159 JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateLatitude
160   (JNIEnv * env, jobject this) {
161         jobject dataObject;
162         jboolean isCopy;
163         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
164                         &isCopy);
165
166         double lat = getPositionUpdateLatitude(
167                         getPositionUpdateMessage(uplinkMessage));
168
169         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
170
171         return (jdouble) lat;
172 }
173
174 /*
175  * Class:     org_olsr_plugin_pud_PositionUpdate
176  * Method:    getPositionUpdateLongitude
177  * Signature: ()D
178  */
179 JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateLongitude
180   (JNIEnv * env, jobject this) {
181         jobject dataObject;
182         jboolean isCopy;
183         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
184                         &isCopy);
185
186         double lon = getPositionUpdateLongitude(
187                         getPositionUpdateMessage(uplinkMessage));
188
189         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
190
191         return (jdouble) lon;
192 }
193
194 /*
195  * Class:     org_olsr_plugin_pud_PositionUpdate
196  * Method:    getPositionUpdateAltitude
197  * Signature: ()J
198  */
199 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateAltitude
200   (JNIEnv * env, jobject this) {
201         jobject dataObject;
202         jboolean isCopy;
203         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
204                         &isCopy);
205
206         long alt = getPositionUpdateAltitude(
207                         getPositionUpdateMessage(uplinkMessage));
208
209         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
210
211         return (jlong) alt;
212 }
213
214 /*
215  * Class:     org_olsr_plugin_pud_PositionUpdate
216  * Method:    getPositionUpdateSpeed
217  * Signature: ()J
218  */
219 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateSpeed
220   (JNIEnv * env, jobject this) {
221         jobject dataObject;
222         jboolean isCopy;
223         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
224                         &isCopy);
225
226         unsigned long speed = getPositionUpdateSpeed(
227                         getPositionUpdateMessage(uplinkMessage));
228
229         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
230
231         return (jlong) speed;
232 }
233
234 /*
235  * Class:     org_olsr_plugin_pud_PositionUpdate
236  * Method:    getPositionUpdateTrack
237  * Signature: ()J
238  */
239 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateTrack
240   (JNIEnv * env, jobject this) {
241         jobject dataObject;
242         jboolean isCopy;
243         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
244                         &isCopy);
245
246         unsigned long track = getPositionUpdateTrack(
247                         getPositionUpdateMessage(uplinkMessage));
248
249         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
250
251         return (jlong) track;
252 }
253
254 /*
255  * Class:     org_olsr_plugin_pud_PositionUpdate
256  * Method:    getPositionUpdateHdop
257  * Signature: ()D
258  */
259 JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateHdop
260   (JNIEnv * env, jobject this) {
261         jobject dataObject;
262         jboolean isCopy;
263         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
264                         &isCopy);
265
266         double hdop = getPositionUpdateHdop(getPositionUpdateMessage(uplinkMessage));
267
268         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
269
270         return (jdouble) hdop;
271 }
272
273 /*
274  * NodeInfo
275  */
276
277 /*
278  * Class:     org_olsr_plugin_pud_PositionUpdate
279  * Method:    getPositionUpdateNodeIdType
280  * Signature: ()I
281  */
282 JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateNodeIdType
283   (JNIEnv * env, jobject this) {
284         jobject dataObject;
285         jboolean isCopy;
286         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
287                         &isCopy);
288
289         NodeIdType nodeIdType = getPositionUpdateNodeIdType(
290                         !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6,
291                         getPositionUpdateMessage(uplinkMessage));
292
293         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
294
295         return (jint) nodeIdType;
296 }
297
298 /*
299  * Class:     org_olsr_plugin_pud_PositionUpdate
300  * Method:    getPositionUpdateNodeId
301  * Signature: ()Ljava/lang/String;
302  */
303 JNIEXPORT jstring JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateNodeId
304   (JNIEnv * env, jobject this) {
305         jobject dataObject;
306         jboolean isCopy;
307         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
308                         &isCopy);
309
310     const char * nodeIdStr;
311     char nodeIdStrBuffer[PUD_TX_NODEID_BUFFERSIZE];
312
313         getNodeIdStringFromOlsr (
314                         !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6,
315                         &uplinkMessage->msg.olsrMessage, &nodeIdStr,
316                         &nodeIdStrBuffer[0], sizeof(nodeIdStrBuffer));
317
318         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
319
320         return (*env)->NewStringUTF(env, nodeIdStr);
321 }