modules/ims_qos: added patch for flow-description bug when request originates from...
[sip-router] / modules / app_java / java_msgobj.c
1 /*
2  * Copyright (C) 2013 Konstantin Mosesov
3  *
4  * This file is part of Kamailio, a free SIP server.
5  *
6  * This file is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  *
12  * This file is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  *
21  */
22
23
24 #include "../../action.h"
25 #include "../../mem/mem.h"
26 #include "../../sr_module.h"
27 #include "../../dset.h"
28 #include "../../parser/msg_parser.h"
29
30 #include <jni.h>
31
32 #include "global.h"
33 #include "utils.h"
34 #include "app_java_mod.h"
35 #include "java_iface.h"
36 #include "java_support.h"
37 #include "java_native_methods.h"
38 #include "java_msgobj.h"
39
40 jobject *fill_sipmsg_object(JNIEnv *env, struct sip_msg *msg)
41 {
42     jobject *SipMsgInstance;
43     jclass SipMsgClass;
44     jmethodID SipMsgClassID;
45     jfieldID fid;
46     jstring jStrParam;
47
48     SipMsgInstance = (jobject *)pkg_malloc(sizeof(jobject));
49     if (!SipMsgInstance)
50     {
51         LM_ERR("%s: pkg_malloc() has failed. Not enough memory!\n", APP_NAME);
52         return NULL;
53     }
54     memset(SipMsgInstance, 0, sizeof(jobject));
55
56     SipMsgClass = (*env)->FindClass(env, "org/siprouter/SipMsg");
57     if (!SipMsgClass || (*env)->ExceptionCheck(env))
58     {
59         handle_exception();
60         pkg_free(SipMsgInstance);
61         return NULL;
62     }
63
64     SipMsgClassID = (*env)->GetMethodID(env, SipMsgClass, "<init>", "()V");
65     if (!SipMsgClassID || (*env)->ExceptionCheck(env))
66     {
67         handle_exception();
68         return NULL;
69     }
70
71     // calling constructor
72     (*SipMsgInstance) = (*env)->NewObject(env, SipMsgClass, SipMsgClassID);
73     if ((*env)->ExceptionCheck(env))
74     {
75         handle_exception();
76         return NULL;
77     }
78
79     // msg->id => SipMsg.id 
80     fid = (*env)->GetFieldID(env, SipMsgClass, "id", "I");
81     if (!fid)
82     {
83         (*env)->ExceptionClear(env);
84         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.id\n", APP_NAME);
85
86         return NULL;
87     }
88     (*env)->SetIntField(env, SipMsgInstance, fid, msg->id);
89     if ((*env)->ExceptionCheck(env))
90     {
91         handle_exception();
92         return NULL;
93     }
94
95     // msg->pid => SipMsg.pid
96     fid = (*env)->GetFieldID(env, SipMsgClass, "pid", "I");
97     if (!fid)
98     {
99         (*env)->ExceptionClear(env);
100         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.pid\n", APP_NAME);
101         return NULL;
102     }
103     (*env)->SetIntField(env, SipMsgInstance, fid, msg->pid);
104     if ((*env)->ExceptionCheck(env))
105     {
106         handle_exception();
107         return NULL;
108     }
109
110     // msg->eoh => SipMsg.eoh
111     fid = (*env)->GetFieldID(env, SipMsgClass, "eoh", "Ljava/lang/String;");
112     if (!fid)
113     {
114         (*env)->ExceptionClear(env);
115         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.eoh\n", APP_NAME);
116         return NULL;
117     }
118     jStrParam = (*env)->NewStringUTF(env, msg->eoh);
119     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
120     if ((*env)->ExceptionCheck(env))
121     {
122         handle_exception();
123         return NULL;
124     }
125     (*env)->DeleteLocalRef(env, jStrParam);
126
127     // msg->unparsed => SipMsg.unparsed
128     fid = (*env)->GetFieldID(env, SipMsgClass, "unparsed", "Ljava/lang/String;");
129     if (!fid)
130     {
131         (*env)->ExceptionClear(env);
132         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.unparsed\n", APP_NAME);
133         return NULL;
134     }
135     jStrParam = (*env)->NewStringUTF(env, msg->unparsed);
136     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
137     if ((*env)->ExceptionCheck(env))
138     {
139         handle_exception();
140         return NULL;
141     }
142     (*env)->DeleteLocalRef(env, jStrParam);
143
144     // msg->buf => SipMsg.buf
145     fid = (*env)->GetFieldID(env, SipMsgClass, "buf", "Ljava/lang/String;");
146     if (!fid)
147     {
148         (*env)->ExceptionClear(env);
149         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.buf\n", APP_NAME);
150         return NULL;
151     }
152     jStrParam = (*env)->NewStringUTF(env, msg->buf);
153     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
154     if ((*env)->ExceptionCheck(env))
155     {
156         handle_exception();
157         return NULL;
158     }
159     (*env)->DeleteLocalRef(env, jStrParam);
160
161     // msg->len => SipMsg.len
162     fid = (*env)->GetFieldID(env, SipMsgClass, "len", "I");
163     if (!fid)
164     {
165         (*env)->ExceptionClear(env);
166         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.len\n", APP_NAME);
167         return NULL;
168     }
169     (*env)->SetIntField(env, SipMsgInstance, fid, msg->len);
170     if ((*env)->ExceptionCheck(env))
171     {
172         handle_exception();
173         return NULL;
174     }
175
176     // msg->new_uri => SipMsg.new_uri
177     fid = (*env)->GetFieldID(env, SipMsgClass, "new_uri", "Ljava/lang/String;");
178     if (!fid)
179     {
180         (*env)->ExceptionClear(env);
181         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.new_uri\n", APP_NAME);
182         return NULL;
183     }
184     jStrParam = (*env)->NewStringUTF(env, msg->new_uri.len <= 0 ? "" : msg->new_uri.s);
185     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
186     if ((*env)->ExceptionCheck(env))
187     {
188         handle_exception();
189         return NULL;
190     }
191     (*env)->DeleteLocalRef(env, jStrParam);
192
193     // msg->dst_uri => SipMsg.dst_uri
194     fid = (*env)->GetFieldID(env, SipMsgClass, "dst_uri", "Ljava/lang/String;");
195     if (!fid)
196     {
197         (*env)->ExceptionClear(env);
198         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.dst_uri\n", APP_NAME);
199         return NULL;
200     }
201     jStrParam = (*env)->NewStringUTF(env, msg->dst_uri.len <= 0 ? "" : msg->dst_uri.s);
202     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
203     if ((*env)->ExceptionCheck(env))
204     {
205         handle_exception();
206         return NULL;
207     }
208     (*env)->DeleteLocalRef(env, jStrParam);
209
210     // msg->parsed_orig_ruri_ok => SipMsg.parsed_orig_ruri_ok
211     fid = (*env)->GetFieldID(env, SipMsgClass, "parsed_orig_ruri_ok", "I");
212     if (!fid)
213     {
214         (*env)->ExceptionClear(env);
215         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.parsed_orig_ruri_ok\n", APP_NAME);
216         return NULL;
217     }
218     (*env)->SetIntField(env, SipMsgInstance, fid, msg->parsed_orig_ruri_ok);
219     if ((*env)->ExceptionCheck(env))
220     {
221         handle_exception();
222         return NULL;
223     }
224
225     // msg->add_to_branch_s => SipMsg.add_to_branch_s
226     fid = (*env)->GetFieldID(env, SipMsgClass, "add_to_branch_s", "Ljava/lang/String;");
227     if (!fid)
228     {
229         (*env)->ExceptionClear(env);
230         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.add_to_branch_s\n", APP_NAME);
231         return NULL;
232     }
233     jStrParam = (*env)->NewStringUTF(env, (msg->add_to_branch_len <= 0) ? "" : strdup(msg->add_to_branch_s));
234     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
235     if ((*env)->ExceptionCheck(env))
236     {
237         handle_exception();
238         return NULL;
239     }
240     (*env)->DeleteLocalRef(env, jStrParam);
241
242     // msg->add_to_branch_len => SipMsg.add_to_branch_len
243     fid = (*env)->GetFieldID(env, SipMsgClass, "add_to_branch_len", "I");
244     if (!fid)
245     {
246         (*env)->ExceptionClear(env);
247         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.add_to_branch_len\n", APP_NAME);
248         return NULL;
249     }
250     (*env)->SetIntField(env, SipMsgInstance, fid, msg->add_to_branch_len);
251     if ((*env)->ExceptionCheck(env))
252     {
253         handle_exception();
254         return NULL;
255     }
256
257     // msg->hash_index => SipMsg.hash_index
258     fid = (*env)->GetFieldID(env, SipMsgClass, "hash_index", "I");
259     if (!fid)
260     {
261         (*env)->ExceptionClear(env);
262         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.hash_index\n", APP_NAME);
263         return NULL;
264     }
265     (*env)->SetIntField(env, SipMsgInstance, fid, msg->hash_index);
266     if ((*env)->ExceptionCheck(env))
267     {
268         handle_exception();
269         return NULL;
270     }
271
272     // msg->msg_flags => SipMsg.msg_flags
273     fid = (*env)->GetFieldID(env, SipMsgClass, "msg_flags", "I");
274     if (!fid)
275     {
276         (*env)->ExceptionClear(env);
277         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.msg_flags\n", APP_NAME);
278         return NULL;
279     }
280     (*env)->SetIntField(env, SipMsgInstance, fid, msg->msg_flags);
281     if ((*env)->ExceptionCheck(env))
282     {
283         handle_exception();
284         return NULL;
285     }
286
287     // msg->set_global_address => SipMsg.set_global_address
288     fid = (*env)->GetFieldID(env, SipMsgClass, "set_global_address", "Ljava/lang/String;");
289     if (!fid)
290     {
291         (*env)->ExceptionClear(env);
292         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.set_global_address\n", APP_NAME);
293         return NULL;
294     }
295     jStrParam = (*env)->NewStringUTF(env, (msg->set_global_address.len <= 0 || msg->set_global_address.s == NULL) ? "" : msg->set_global_address.s);
296     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
297     if ((*env)->ExceptionCheck(env))
298     {
299         handle_exception();
300         return NULL;
301     }
302     (*env)->DeleteLocalRef(env, jStrParam);
303
304     // msg->set_global_port => SipMsg.set_global_port
305     fid = (*env)->GetFieldID(env, SipMsgClass, "set_global_port", "Ljava/lang/String;");
306     if (!fid)
307     {
308         (*env)->ExceptionClear(env);
309         LM_ERR("%s: Can't find symbol org.siprouter.SipMsg.set_global_port\n", APP_NAME);
310         return NULL;
311     }
312     jStrParam = (*env)->NewStringUTF(env, (msg->set_global_port.len <= 0 || msg->set_global_port.s == NULL) ? "" : msg->set_global_port.s);
313     (*env)->SetObjectField(env, SipMsgInstance, fid, jStrParam);
314     if ((*env)->ExceptionCheck(env))
315     {
316         handle_exception();
317         return NULL;
318     }
319     (*env)->DeleteLocalRef(env, jStrParam);
320
321     return SipMsgInstance;
322 }