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