Modified the Provider Configuration.
[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     NSProviderConfig config;\r
56     config.subRequestCallback = NSSubscribeRequestCb;\r
57     config.syncInfoCallback = NSSyncCb;\r
58     config.policy = true;\r
59     if (NSStartProvider(config) != NS_OK)\r
60     {\r
61         LOGE("Fail to start NSProvider service");\r
62         return (jint) NS_ERROR;\r
63     }\r
64 \r
65     return (jint) NS_OK;\r
66 }\r
67 \r
68 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider(\r
69         JNIEnv * env, jobject jObj)\r
70 {\r
71     LOGI("NSStopProvider");\r
72 \r
73     (*env)->DeleteGlobalRef(env, g_obj_subscriptionListener);\r
74     (*env)->DeleteGlobalRef(env, g_obj_syncListener);\r
75 \r
76     if (NSStopProvider() != NS_OK)\r
77     {\r
78         LOGE("Fail to stop NSProvider service");\r
79         return (jint) NS_ERROR;\r
80     }\r
81 \r
82     return (jint) NS_OK;\r
83 }\r
84 \r
85 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification(\r
86         JNIEnv * env, jobject jObj, jobject jMsg)\r
87 {\r
88     LOGI("NSSendNotification");\r
89 \r
90     if (!jMsg)\r
91     {\r
92         LOGI("Fail to send notification - Message is null");\r
93         return (jint) NS_ERROR;\r
94     }\r
95 \r
96     NSMessage * nsMsg = NSGetMessage(env, jMsg);\r
97 \r
98     LOGI("JNI TEST - NSSendNotification");\r
99     NSSendNotification(nsMsg);\r
100 \r
101     return (jint) NS_OK;\r
102 }\r
103 \r
104 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck(\r
105         JNIEnv * env, jobject jObj, jobject jMsg)\r
106 {\r
107     LOGI("NSReasCheck");\r
108     return 0;\r
109 }\r
110 \r
111 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSAcceptSubscription(JNIEnv * env,\r
112         jobject jObj, jobject jConsumer, jboolean jAccepted)\r
113 {\r
114     if (jAccepted)\r
115     {\r
116         LOGI("Accepted");\r
117         //NSAccept(consumer, true);\r
118     }\r
119     else\r
120     {\r
121         LOGI("Denied");\r
122         //NSAccept(consumer, false);\r
123     }\r
124 \r
125     return 0;\r
126 }\r
127 \r
128 void NSSubscribeRequestCb(NSConsumer *consumer)\r
129 {\r
130     LOGI("Subscription requested by consumer");\r
131 \r
132     JNIEnv * env;\r
133     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
134     if (JNI_OK != res)\r
135     {\r
136         if (res == JNI_EDETACHED)\r
137         {\r
138             if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)\r
139             {\r
140                 LOGE("Failed to get the environment");\r
141                 return;\r
142             }\r
143             else\r
144             {\r
145                 LOGE("Success to get the environment");\r
146             }\r
147         }\r
148         else\r
149         {\r
150             LOGE("Failed to get the environment using GetEnv()");\r
151             return;\r
152         }\r
153     }\r
154 \r
155     LOGI("consumer ID : %s\n", consumer->consumerId);\r
156     jstring consumerId = (*env)->NewStringUTF(env, consumer->consumerId);\r
157 \r
158     jclass cls = (*env)->GetObjectClass(env, g_obj_subscriptionListener);\r
159     if (!cls)\r
160     {\r
161         LOGE("Failed to Get ObjectClass");\r
162         return;\r
163     }\r
164     jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSubscribedEvent", "(Ljava/lang/String;)V");\r
165     if (!mid)\r
166     {\r
167         LOGE("Failed to Get MethodID");\r
168         return;\r
169     }\r
170 \r
171     (*env)->CallVoidMethod(env, g_obj_subscriptionListener, mid, consumerId);\r
172 \r
173     (*g_jvm)->DetachCurrentThread(g_jvm);\r
174 \r
175     NSAcceptSubscription(consumer, true);\r
176 \r
177     return;\r
178 }\r
179 \r
180 void NSSyncCb(NSSyncInfo *sync)\r
181 {\r
182     LOGI("Sync requested");\r
183 \r
184     JNIEnv * env;\r
185     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
186     if (JNI_OK != res)\r
187     {\r
188         if (JNI_EDETACHED)\r
189         {\r
190             if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) < 0)\r
191             {\r
192                 LOGE("Failed to get the environment");\r
193                 return;\r
194             }\r
195             else\r
196             {\r
197                 LOGE("Success to get the environment");\r
198             }\r
199         }\r
200         else\r
201         {\r
202             LOGE("Failed to get the environment using GetEnv()");\r
203             return;\r
204         }\r
205     }\r
206 \r
207     LOGI("Sync ID : %s\n", sync->messageId);\r
208     LOGI("Sync STATE : %d\n", sync->state);\r
209 \r
210     jstring strMessageId = (*env)->NewStringUTF(env, sync->messageId);\r
211 \r
212     jclass cls = (*env)->GetObjectClass(env, g_obj_syncListener);\r
213     if (!cls)\r
214     {\r
215         LOGE("Failed to Get ObjectClass");\r
216         return;\r
217     }\r
218     jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSynchronizedEvent",\r
219             "(Ljava/lang/String;I)V");\r
220     if (!mid)\r
221     {\r
222         LOGE("Failed to Get MethodID");\r
223         return;\r
224     }\r
225 \r
226     (*env)->CallVoidMethod(env, g_obj_syncListener, mid, strMessageId, (jint) sync->state);\r
227 \r
228     (*g_jvm)->DetachCurrentThread(g_jvm);\r
229 \r
230     return;\r
231 \r
232 }\r
233 \r
234 NSMessage * NSGetMessage(JNIEnv * env, jobject jMsg)\r
235 {\r
236     LOGI("NSGetMessage");\r
237 \r
238     jclass cls = (*env)->GetObjectClass(env, jMsg);\r
239 \r
240     // Message ID\r
241     jfieldID fid_id = (*env)->GetFieldID(env, cls, "id", "Ljava/lang/String;");\r
242     if (fid_id == NULL)\r
243     {\r
244         LOGE("Error: jfieldID for message id is null");\r
245         return (jint) NS_ERROR;\r
246     }\r
247     jstring jmsgId = (*env)->GetObjectField(env, jMsg, fid_id);\r
248     const char * messageId = (*env)->GetStringUTFChars(env, jmsgId, NULL);\r
249     if (messageId == NULL)\r
250     {\r
251         LOGE("Error: messageId is null");\r
252         return (jint) NS_ERROR;\r
253     }\r
254     LOGI("Message ID: %s\n", messageId);\r
255 \r
256     // Message Title\r
257     jfieldID fid_title = (*env)->GetFieldID(env, cls, "title", "Ljava/lang/String;");\r
258     if (fid_title == NULL)\r
259     {\r
260         LOGE("Error: jfieldID for message id is null");\r
261         return (jint) NS_ERROR;\r
262     }\r
263     jstring jmsgTitle = (*env)->GetObjectField(env, jMsg, fid_title);\r
264     const char * messageTitle = (*env)->GetStringUTFChars(env, jmsgTitle, NULL);\r
265     if (messageTitle == NULL)\r
266     {\r
267         LOGE("Error: messageTitle is null");\r
268         return (jint) NS_ERROR;\r
269     }\r
270     LOGI("Message Title: %s\n", messageTitle);\r
271 \r
272     // Message Body\r
273     jfieldID fid_body = (*env)->GetFieldID(env, cls, "body", "Ljava/lang/String;");\r
274     if (fid_body == NULL)\r
275     {\r
276         LOGE("Error: jfieldID for message id is null");\r
277         return (jint) NS_ERROR;\r
278     }\r
279     jstring jmsgBody = (*env)->GetObjectField(env, jMsg, fid_body);\r
280     const char * messageBody = (*env)->GetStringUTFChars(env, jmsgBody, NULL);\r
281     if (messageBody == NULL)\r
282     {\r
283         LOGE("Error: messageBody is null");\r
284         return (jint) NS_ERROR;\r
285     }\r
286     LOGI("Message Body: %s\n", messageBody);\r
287 \r
288     // Message Source\r
289     jfieldID fid_source = (*env)->GetFieldID(env, cls, "source", "Ljava/lang/String;");\r
290     if (fid_source == NULL)\r
291     {\r
292         LOGE("Error: jfieldID for message source is null");\r
293         return (jint) NS_ERROR;\r
294     }\r
295     jstring jmsgSource = (*env)->GetObjectField(env, jMsg, fid_source);\r
296     const char * messageSource = (*env)->GetStringUTFChars(env, jmsgSource, NULL);\r
297     if (messageSource == NULL)\r
298     {\r
299         LOGE("Error: messageSource is null");\r
300         return (jint) NS_ERROR;\r
301     }\r
302     LOGI("Message Source: %s\n", messageSource);\r
303 \r
304     NSMessage * nsMsg = (NSMessage *) malloc(sizeof(NSMessage));\r
305 \r
306     nsMsg->messageId = strdup(messageId);\r
307     nsMsg->title = strdup(messageTitle);\r
308     nsMsg->contentText = strdup(messageBody);\r
309     nsMsg->sourceName = strdup(messageSource);\r
310 \r
311     return nsMsg;\r
312 \r
313 }\r