PUD: update a comment about UTC time
[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)J
116  */
117 JNIEXPORT jlong 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
127         struct tm timeStruct;
128         time_t updateTimeSeconds;
129
130         getPositionUpdateTime(getPositionUpdateMessage(uplinkMessage),
131                         baseDateSeconds, &timeStruct);
132
133         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
134
135         updateTimeSeconds = mktime(&timeStruct);
136         return (updateTimeSeconds * 1000) + baseDateMilliSeconds;
137 }
138
139 /*
140  * Class:     org_olsr_plugin_pud_PositionUpdate
141  * Method:    getPositionUpdateLatitude
142  * Signature: ()D
143  */
144 JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateLatitude
145   (JNIEnv * env, jobject this) {
146         jobject dataObject;
147         jboolean isCopy;
148         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
149                         &isCopy);
150
151         double lat = getPositionUpdateLatitude(
152                         getPositionUpdateMessage(uplinkMessage));
153
154         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
155
156         return (jdouble) lat;
157 }
158
159 /*
160  * Class:     org_olsr_plugin_pud_PositionUpdate
161  * Method:    getPositionUpdateLongitude
162  * Signature: ()D
163  */
164 JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateLongitude
165   (JNIEnv * env, jobject this) {
166         jobject dataObject;
167         jboolean isCopy;
168         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
169                         &isCopy);
170
171         double lon = getPositionUpdateLongitude(
172                         getPositionUpdateMessage(uplinkMessage));
173
174         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
175
176         return (jdouble) lon;
177 }
178
179 /*
180  * Class:     org_olsr_plugin_pud_PositionUpdate
181  * Method:    getPositionUpdateAltitude
182  * Signature: ()J
183  */
184 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateAltitude
185   (JNIEnv * env, jobject this) {
186         jobject dataObject;
187         jboolean isCopy;
188         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
189                         &isCopy);
190
191         long alt = getPositionUpdateAltitude(
192                         getPositionUpdateMessage(uplinkMessage));
193
194         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
195
196         return (jlong) alt;
197 }
198
199 /*
200  * Class:     org_olsr_plugin_pud_PositionUpdate
201  * Method:    getPositionUpdateSpeed
202  * Signature: ()J
203  */
204 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateSpeed
205   (JNIEnv * env, jobject this) {
206         jobject dataObject;
207         jboolean isCopy;
208         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
209                         &isCopy);
210
211         unsigned long speed = getPositionUpdateSpeed(
212                         getPositionUpdateMessage(uplinkMessage));
213
214         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
215
216         return (jlong) speed;
217 }
218
219 /*
220  * Class:     org_olsr_plugin_pud_PositionUpdate
221  * Method:    getPositionUpdateTrack
222  * Signature: ()J
223  */
224 JNIEXPORT jlong JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateTrack
225   (JNIEnv * env, jobject this) {
226         jobject dataObject;
227         jboolean isCopy;
228         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
229                         &isCopy);
230
231         unsigned long track = getPositionUpdateTrack(
232                         getPositionUpdateMessage(uplinkMessage));
233
234         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
235
236         return (jlong) track;
237 }
238
239 /*
240  * Class:     org_olsr_plugin_pud_PositionUpdate
241  * Method:    getPositionUpdateHdop
242  * Signature: ()D
243  */
244 JNIEXPORT jdouble JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateHdop
245   (JNIEnv * env, jobject this) {
246         jobject dataObject;
247         jboolean isCopy;
248         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
249                         &isCopy);
250
251         double hdop = getPositionUpdateHdop(getPositionUpdateMessage(uplinkMessage));
252
253         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
254
255         return (jdouble) hdop;
256 }
257
258 /*
259  * NodeInfo
260  */
261
262 /*
263  * Class:     org_olsr_plugin_pud_PositionUpdate
264  * Method:    getPositionUpdateNodeIdType
265  * Signature: ()I
266  */
267 JNIEXPORT jint JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateNodeIdType
268   (JNIEnv * env, jobject this) {
269         jobject dataObject;
270         jboolean isCopy;
271         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
272                         &isCopy);
273
274         NodeIdType nodeIdType = getPositionUpdateNodeIdType(
275                         !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6,
276                         getPositionUpdateMessage(uplinkMessage));
277
278         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
279
280         return (jint) nodeIdType;
281 }
282
283 /*
284  * Class:     org_olsr_plugin_pud_PositionUpdate
285  * Method:    getPositionUpdateNodeId
286  * Signature: ()Ljava/lang/String;
287  */
288 JNIEXPORT jstring JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpdateNodeId
289   (JNIEnv * env, jobject this) {
290         jobject dataObject;
291         jboolean isCopy;
292         UplinkMessage * uplinkMessage = getUplinkMessage(env, this, &dataObject,
293                         &isCopy);
294
295     const char * nodeIdStr;
296     char nodeIdStrBuffer[PUD_TX_NODEID_BUFFERSIZE + 1];
297
298         getNodeIdStringFromOlsr (
299                         !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6,
300                         &uplinkMessage->msg.olsrMessage, &nodeIdStr,
301                         &nodeIdStrBuffer[0], sizeof(nodeIdStrBuffer));
302
303         releaseUplinkMessage(env, uplinkMessage, dataObject, isCopy, JNI_ABORT);
304
305         return (*env)->NewStringUTF(env, nodeIdStr);
306 }