c9063578d87498de4f9e621d92d3d48ce01677ee
[platform/upstream/iotivity.git] / service / notification / android / notification-service / src / main / jni / notificationProvider.c
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\r
7 // Licensed under the Apache License, Version 2.0 (the "License");\r
8 // you may not use this file except in compliance with the License.\r
9 // You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 // Unless required by applicable law or agreed to in writing, software\r
14 // distributed under the License is distributed on an "AS IS" BASIS,\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 // See the License for the specific language governing permissions and\r
17 // limitations under the License.\r
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include <android/log.h>\r
22 #include <stdio.h>\r
23 #include "notificationProvider.h"\r
24 \r
25 #define  LOG_TAG   "JNI_NS_INTERFACE"\r
26 #define  LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\r
27 #define  LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\r
28 \r
29 static JavaVM *g_jvm = NULL;\r
30 static jobject g_obj_subscriptionListener = NULL;\r
31 static jobject g_obj_syncListener = NULL;\r
32 \r
33 JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)\r
34 {\r
35     LOGI("Initialize NSInterface");\r
36     g_jvm = jvm;\r
37 \r
38     return JNI_VERSION_1_6;\r
39 }\r
40 \r
41 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStartProvider(\r
42         JNIEnv * env, jobject jObj, jboolean jAccess, jobject jSubscriptionListener,\r
43         jobject jSyncListener)\r
44 {\r
45     LOGI("NSStartProvider...");\r
46 \r
47     if (!jSubscriptionListener || !jSyncListener)\r
48     {\r
49         LOGI("Fail to set listeners");\r
50     }\r
51 \r
52     g_obj_subscriptionListener = (jobject) (*env)->NewGlobalRef(env, jSubscriptionListener);\r
53     g_obj_syncListener = (jobject) (*env)->NewGlobalRef(env, jSyncListener);\r
54 \r
55     // check access policy\r
56     bool policy = true;\r
57 \r
58     if (NSStartProvider(policy, NSSubscribeRequestCb, NSSyncCb) != NS_OK)\r
59     {\r
60         LOGE("Fail to start NSProvider service");\r
61         return (jint) NS_ERROR;\r
62     }\r
63 \r
64     return (jint) NS_OK;\r
65 }\r
66 \r
67 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider(\r
68         JNIEnv * env, jobject jObj)\r
69 {\r
70     LOGI("NSStopProvider");\r
71 \r
72     (*env)->DeleteGlobalRef(env, g_obj_subscriptionListener);\r
73     (*env)->DeleteGlobalRef(env, g_obj_syncListener);\r
74 \r
75     if (NSStopProvider() != NS_OK)\r
76     {\r
77         LOGE("Fail to stop NSProvider service");\r
78         return (jint) NS_ERROR;\r
79     }\r
80 \r
81     return (jint) NS_OK;\r
82 }\r
83 \r
84 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification(\r
85         JNIEnv * env, jobject jObj, jobject jMsg)\r
86 {\r
87     LOGI("NSSendNotification");\r
88 \r
89     if (!jMsg)\r
90     {\r
91         LOGI("Fail to send notification - Message is null");\r
92         return (jint) NS_ERROR;\r
93     }\r
94 \r
95     NSMessage * nsMsg = NSGetMessage(env, jMsg);\r
96 \r
97     LOGI("JNI TEST - NSSendNotification");\r
98     NSSendNotification(nsMsg);\r
99 \r
100     return (jint) NS_OK;\r
101 }\r
102 \r
103 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck(\r
104         JNIEnv * env, jobject jObj, jobject jMsg)\r
105 {\r
106     LOGI("NSReasCheck");\r
107     return 0;\r
108 }\r
109 \r
110 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSAcceptSubscription(JNIEnv * env,\r
111         jobject jObj, jobject jConsumer, jboolean jAccepted)\r
112 {\r
113     if (jAccepted)\r
114     {\r
115         LOGI("Accepted");\r
116         //NSAccept(consumer, true);\r
117     }\r
118     else\r
119     {\r
120         LOGI("Denied");\r
121         //NSAccept(consumer, false);\r
122     }\r
123 \r
124     return 0;\r
125 }\r
126 \r
127 void NSSubscribeRequestCb(NSConsumer *consumer)\r
128 {\r
129     LOGI("Subscription requested by consumer");\r
130 \r
131     JNIEnv * env;\r
132     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
133     if (JNI_OK != res)\r
134     {\r
135         if (res == JNI_EDETACHED)\r
136         {\r
137             if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)\r
138             {\r
139                 LOGE("Failed to get the environment");\r
140                 return;\r
141             }\r
142             else\r
143             {\r
144                 LOGE("Success to get the environment");\r
145             }\r
146         }\r
147         else\r
148         {\r
149             LOGE("Failed to get the environment using GetEnv()");\r
150             return;\r
151         }\r
152     }\r
153 \r
154     LOGI("consumer ID : %s\n", consumer->consumerId);\r
155     jstring consumerId = (*env)->NewStringUTF(env, consumer->consumerId);\r
156 \r
157     jclass cls = (*env)->GetObjectClass(env, g_obj_subscriptionListener);\r
158     if (!cls)\r
159     {\r
160         LOGE("Failed to Get ObjectClass");\r
161         return;\r
162     }\r
163     jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSubscribedEvent", "(Ljava/lang/String;)V");\r
164     if (!mid)\r
165     {\r
166         LOGE("Failed to Get MethodID");\r
167         return;\r
168     }\r
169 \r
170     (*env)->CallVoidMethod(env, g_obj_subscriptionListener, mid, consumerId);\r
171 \r
172     (*g_jvm)->DetachCurrentThread(g_jvm);\r
173 \r
174     NSAcceptSubscription(consumer, true);\r
175 \r
176     return;\r
177 }\r
178 \r
179 void NSSyncCb(NSSyncInfo *sync)\r
180 {\r
181     LOGI("Sync requested");\r
182 \r
183     JNIEnv * env;\r
184     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
185     if (JNI_OK != res)\r
186     {\r
187         if (JNI_EDETACHED)\r
188         {\r
189             if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) < 0)\r
190             {\r
191                 LOGE("Failed to get the environment");\r
192                 return;\r
193             }\r
194             else\r
195             {\r
196                 LOGE("Success to get the environment");\r
197             }\r
198         }\r
199         else\r
200         {\r
201             LOGE("Failed to get the environment using GetEnv()");\r
202             return;\r
203         }\r
204     }\r
205 \r
206     LOGI("Sync ID : %s\n", sync->messageId);\r
207     LOGI("Sync STATE : %d\n", sync->state);\r
208 \r
209     jstring strMessageId = (*env)->NewStringUTF(env, sync->messageId);\r
210 \r
211     jclass cls = (*env)->GetObjectClass(env, g_obj_syncListener);\r
212     if (!cls)\r
213     {\r
214         LOGE("Failed to Get ObjectClass");\r
215         return;\r
216     }\r
217     jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSynchronizedEvent",\r
218             "(Ljava/lang/String;I)V");\r
219     if (!mid)\r
220     {\r
221         LOGE("Failed to Get MethodID");\r
222         return;\r
223     }\r
224 \r
225     (*env)->CallVoidMethod(env, g_obj_syncListener, mid, strMessageId, (jint) sync->state);\r
226 \r
227     (*g_jvm)->DetachCurrentThread(g_jvm);\r
228 \r
229     return;\r
230 \r
231 }\r
232 \r
233 NSMessage * NSGetMessage(JNIEnv * env, jobject jMsg)\r
234 {\r
235     LOGI("NSGetMessage");\r
236 \r
237     jclass cls = (*env)->GetObjectClass(env, jMsg);\r
238 \r
239     // Message ID\r
240     jfieldID fid_id = (*env)->GetFieldID(env, cls, "id", "Ljava/lang/String;");\r
241     if (fid_id == NULL)\r
242     {\r
243         LOGE("Error: jfieldID for message id is null");\r
244         return (jint) NS_ERROR;\r
245     }\r
246     jstring jmsgId = (*env)->GetObjectField(env, jMsg, fid_id);\r
247     const char * messageId = (*env)->GetStringUTFChars(env, jmsgId, NULL);\r
248     if (messageId == NULL)\r
249     {\r
250         LOGE("Error: messageId is null");\r
251         return (jint) NS_ERROR;\r
252     }\r
253     LOGI("Message ID: %s\n", messageId);\r
254 \r
255     // Message Title\r
256     jfieldID fid_title = (*env)->GetFieldID(env, cls, "title", "Ljava/lang/String;");\r
257     if (fid_title == NULL)\r
258     {\r
259         LOGE("Error: jfieldID for message id is null");\r
260         return (jint) NS_ERROR;\r
261     }\r
262     jstring jmsgTitle = (*env)->GetObjectField(env, jMsg, fid_title);\r
263     const char * messageTitle = (*env)->GetStringUTFChars(env, jmsgTitle, NULL);\r
264     if (messageTitle == NULL)\r
265     {\r
266         LOGE("Error: messageTitle is null");\r
267         return (jint) NS_ERROR;\r
268     }\r
269     LOGI("Message Title: %s\n", messageTitle);\r
270 \r
271     // Message Body\r
272     jfieldID fid_body = (*env)->GetFieldID(env, cls, "body", "Ljava/lang/String;");\r
273     if (fid_body == NULL)\r
274     {\r
275         LOGE("Error: jfieldID for message id is null");\r
276         return (jint) NS_ERROR;\r
277     }\r
278     jstring jmsgBody = (*env)->GetObjectField(env, jMsg, fid_body);\r
279     const char * messageBody = (*env)->GetStringUTFChars(env, jmsgBody, NULL);\r
280     if (messageBody == NULL)\r
281     {\r
282         LOGE("Error: messageBody is null");\r
283         return (jint) NS_ERROR;\r
284     }\r
285     LOGI("Message Body: %s\n", messageBody);\r
286 \r
287     // Message Source\r
288     jfieldID fid_source = (*env)->GetFieldID(env, cls, "source", "Ljava/lang/String;");\r
289     if (fid_source == NULL)\r
290     {\r
291         LOGE("Error: jfieldID for message source is null");\r
292         return (jint) NS_ERROR;\r
293     }\r
294     jstring jmsgSource = (*env)->GetObjectField(env, jMsg, fid_source);\r
295     const char * messageSource = (*env)->GetStringUTFChars(env, jmsgSource, NULL);\r
296     if (messageSource == NULL)\r
297     {\r
298         LOGE("Error: messageSource is null");\r
299         return (jint) NS_ERROR;\r
300     }\r
301     LOGI("Message Source: %s\n", messageSource);\r
302 \r
303     NSMessage * nsMsg = (NSMessage *) malloc(sizeof(NSMessage));\r
304 \r
305     nsMsg->messageId = strdup(messageId);\r
306     nsMsg->title = strdup(messageTitle);\r
307     nsMsg->contentText = strdup(messageBody);\r
308     nsMsg->sourceName = strdup(messageSource);\r
309 \r
310     return nsMsg;\r
311 \r
312 }\r