1 //******************************************************************
\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\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
11 // http://www.apache.org/licenses/LICENSE-2.0
\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
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
21 #include <android/log.h>
\r
23 #include "notificationProvider.h"
\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
29 static JavaVM *g_jvm = NULL;
\r
30 static jobject g_obj_subscriptionListener = NULL;
\r
31 static jobject g_obj_syncListener = NULL;
\r
33 JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)
\r
35 LOGI("Initialize NSInterface");
\r
38 return JNI_VERSION_1_6;
\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
45 LOGI("NSStartProvider...");
\r
47 if (!jSubscriptionListener || !jSyncListener)
\r
49 LOGI("Fail to set listeners");
\r
52 g_obj_subscriptionListener = (jobject) (*env)->NewGlobalRef(env, jSubscriptionListener);
\r
53 g_obj_syncListener = (jobject) (*env)->NewGlobalRef(env, jSyncListener);
\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
61 LOGE("Fail to start NSProvider service");
\r
62 return (jint) NS_ERROR;
\r
65 return (jint) NS_OK;
\r
68 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider(
\r
69 JNIEnv * env, jobject jObj)
\r
71 LOGI("NSStopProvider");
\r
73 (*env)->DeleteGlobalRef(env, g_obj_subscriptionListener);
\r
74 (*env)->DeleteGlobalRef(env, g_obj_syncListener);
\r
76 if (NSStopProvider() != NS_OK)
\r
78 LOGE("Fail to stop NSProvider service");
\r
79 return (jint) NS_ERROR;
\r
82 return (jint) NS_OK;
\r
85 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification(
\r
86 JNIEnv * env, jobject jObj, jobject jMsg)
\r
88 LOGI("NSSendNotification");
\r
92 LOGI("Fail to send notification - Message is null");
\r
93 return (jint) NS_ERROR;
\r
96 NSMessage * nsMsg = NSGetMessage(env, jMsg);
\r
98 LOGI("JNI TEST - NSSendNotification");
\r
99 NSSendNotification(nsMsg);
\r
101 return (jint) NS_OK;
\r
104 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck(
\r
105 JNIEnv * env, jobject jObj, jobject jMsg)
\r
107 LOGI("NSReasCheck");
\r
111 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSAcceptSubscription(JNIEnv * env,
\r
112 jobject jObj, jobject jConsumer, jboolean jAccepted)
\r
117 //NSAccept(consumer, true);
\r
122 //NSAccept(consumer, false);
\r
128 void NSSubscribeRequestCb(NSConsumer *consumer)
\r
130 LOGI("Subscription requested by consumer");
\r
133 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
\r
136 if (res == JNI_EDETACHED)
\r
138 if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)
\r
140 LOGE("Failed to get the environment");
\r
145 LOGE("Success to get the environment");
\r
150 LOGE("Failed to get the environment using GetEnv()");
\r
155 LOGI("consumer ID : %s\n", consumer->consumerId);
\r
156 jstring consumerId = (*env)->NewStringUTF(env, consumer->consumerId);
\r
158 jclass cls = (*env)->GetObjectClass(env, g_obj_subscriptionListener);
\r
161 LOGE("Failed to Get ObjectClass");
\r
164 jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSubscribedEvent", "(Ljava/lang/String;)V");
\r
167 LOGE("Failed to Get MethodID");
\r
171 (*env)->CallVoidMethod(env, g_obj_subscriptionListener, mid, consumerId);
\r
173 (*g_jvm)->DetachCurrentThread(g_jvm);
\r
175 NSAcceptSubscription(consumer, true);
\r
180 void NSSyncCb(NSSyncInfo *sync)
\r
182 LOGI("Sync requested");
\r
185 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
\r
190 if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) < 0)
\r
192 LOGE("Failed to get the environment");
\r
197 LOGE("Success to get the environment");
\r
202 LOGE("Failed to get the environment using GetEnv()");
\r
207 LOGI("Sync ID : %s\n", sync->messageId);
\r
208 LOGI("Sync STATE : %d\n", sync->state);
\r
210 jstring strMessageId = (*env)->NewStringUTF(env, sync->messageId);
\r
212 jclass cls = (*env)->GetObjectClass(env, g_obj_syncListener);
\r
215 LOGE("Failed to Get ObjectClass");
\r
218 jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSynchronizedEvent",
\r
219 "(Ljava/lang/String;I)V");
\r
222 LOGE("Failed to Get MethodID");
\r
226 (*env)->CallVoidMethod(env, g_obj_syncListener, mid, strMessageId, (jint) sync->state);
\r
228 (*g_jvm)->DetachCurrentThread(g_jvm);
\r
234 NSMessage * NSGetMessage(JNIEnv * env, jobject jMsg)
\r
236 LOGI("NSGetMessage");
\r
238 jclass cls = (*env)->GetObjectClass(env, jMsg);
\r
241 jfieldID fid_id = (*env)->GetFieldID(env, cls, "id", "Ljava/lang/String;");
\r
242 if (fid_id == NULL)
\r
244 LOGE("Error: jfieldID for message id is null");
\r
245 return (jint) NS_ERROR;
\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
251 LOGE("Error: messageId is null");
\r
252 return (jint) NS_ERROR;
\r
254 LOGI("Message ID: %s\n", messageId);
\r
257 jfieldID fid_title = (*env)->GetFieldID(env, cls, "title", "Ljava/lang/String;");
\r
258 if (fid_title == NULL)
\r
260 LOGE("Error: jfieldID for message id is null");
\r
261 return (jint) NS_ERROR;
\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
267 LOGE("Error: messageTitle is null");
\r
268 return (jint) NS_ERROR;
\r
270 LOGI("Message Title: %s\n", messageTitle);
\r
273 jfieldID fid_body = (*env)->GetFieldID(env, cls, "body", "Ljava/lang/String;");
\r
274 if (fid_body == NULL)
\r
276 LOGE("Error: jfieldID for message id is null");
\r
277 return (jint) NS_ERROR;
\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
283 LOGE("Error: messageBody is null");
\r
284 return (jint) NS_ERROR;
\r
286 LOGI("Message Body: %s\n", messageBody);
\r
289 jfieldID fid_source = (*env)->GetFieldID(env, cls, "source", "Ljava/lang/String;");
\r
290 if (fid_source == NULL)
\r
292 LOGE("Error: jfieldID for message source is null");
\r
293 return (jint) NS_ERROR;
\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
299 LOGE("Error: messageSource is null");
\r
300 return (jint) NS_ERROR;
\r
302 LOGI("Message Source: %s\n", messageSource);
\r
304 NSMessage * nsMsg = (NSMessage *) malloc(sizeof(NSMessage));
\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