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 // check access policy
\r
58 if (NSStartProvider(policy, NSSubscribeRequestCb, NSSyncCb) != NS_OK)
\r
60 LOGE("Fail to start NSProvider service");
\r
61 return (jint) NS_ERROR;
\r
64 return (jint) NS_OK;
\r
67 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider(
\r
68 JNIEnv * env, jobject jObj)
\r
70 LOGI("NSStopProvider");
\r
72 (*env)->DeleteGlobalRef(env, g_obj_subscriptionListener);
\r
73 (*env)->DeleteGlobalRef(env, g_obj_syncListener);
\r
75 if (NSStopProvider() != NS_OK)
\r
77 LOGE("Fail to stop NSProvider service");
\r
78 return (jint) NS_ERROR;
\r
81 return (jint) NS_OK;
\r
84 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification(
\r
85 JNIEnv * env, jobject jObj, jobject jMsg)
\r
87 LOGI("NSSendNotification");
\r
91 LOGI("Fail to send notification - Message is null");
\r
92 return (jint) NS_ERROR;
\r
95 NSMessage * nsMsg = NSGetMessage(env, jMsg);
\r
97 LOGI("JNI TEST - NSSendNotification");
\r
98 NSSendNotification(nsMsg);
\r
100 return (jint) NS_OK;
\r
103 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck(
\r
104 JNIEnv * env, jobject jObj, jobject jMsg)
\r
106 LOGI("NSReasCheck");
\r
110 JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSAcceptSubscription(JNIEnv * env,
\r
111 jobject jObj, jobject jConsumer, jboolean jAccepted)
\r
116 //NSAccept(consumer, true);
\r
121 //NSAccept(consumer, false);
\r
127 void NSSubscribeRequestCb(NSConsumer *consumer)
\r
129 LOGI("Subscription requested by consumer");
\r
132 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
\r
135 if (res == JNI_EDETACHED)
\r
137 if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)
\r
139 LOGE("Failed to get the environment");
\r
144 LOGE("Success to get the environment");
\r
149 LOGE("Failed to get the environment using GetEnv()");
\r
154 LOGI("consumer ID : %s\n", consumer->consumerId);
\r
155 jstring consumerId = (*env)->NewStringUTF(env, consumer->consumerId);
\r
157 jclass cls = (*env)->GetObjectClass(env, g_obj_subscriptionListener);
\r
160 LOGE("Failed to Get ObjectClass");
\r
163 jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSubscribedEvent", "(Ljava/lang/String;)V");
\r
166 LOGE("Failed to Get MethodID");
\r
170 (*env)->CallVoidMethod(env, g_obj_subscriptionListener, mid, consumerId);
\r
172 (*g_jvm)->DetachCurrentThread(g_jvm);
\r
174 NSAcceptSubscription(consumer, true);
\r
179 void NSSyncCb(NSSyncInfo *sync)
\r
181 LOGI("Sync requested");
\r
184 jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
\r
189 if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) < 0)
\r
191 LOGE("Failed to get the environment");
\r
196 LOGE("Success to get the environment");
\r
201 LOGE("Failed to get the environment using GetEnv()");
\r
206 LOGI("Sync ID : %s\n", sync->messageId);
\r
207 LOGI("Sync STATE : %d\n", sync->state);
\r
209 jstring strMessageId = (*env)->NewStringUTF(env, sync->messageId);
\r
211 jclass cls = (*env)->GetObjectClass(env, g_obj_syncListener);
\r
214 LOGE("Failed to Get ObjectClass");
\r
217 jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSynchronizedEvent",
\r
218 "(Ljava/lang/String;I)V");
\r
221 LOGE("Failed to Get MethodID");
\r
225 (*env)->CallVoidMethod(env, g_obj_syncListener, mid, strMessageId, (jint) sync->state);
\r
227 (*g_jvm)->DetachCurrentThread(g_jvm);
\r
233 NSMessage * NSGetMessage(JNIEnv * env, jobject jMsg)
\r
235 LOGI("NSGetMessage");
\r
237 jclass cls = (*env)->GetObjectClass(env, jMsg);
\r
240 jfieldID fid_id = (*env)->GetFieldID(env, cls, "id", "Ljava/lang/String;");
\r
241 if (fid_id == NULL)
\r
243 LOGE("Error: jfieldID for message id is null");
\r
244 return (jint) NS_ERROR;
\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
250 LOGE("Error: messageId is null");
\r
251 return (jint) NS_ERROR;
\r
253 LOGI("Message ID: %s\n", messageId);
\r
256 jfieldID fid_title = (*env)->GetFieldID(env, cls, "title", "Ljava/lang/String;");
\r
257 if (fid_title == NULL)
\r
259 LOGE("Error: jfieldID for message id is null");
\r
260 return (jint) NS_ERROR;
\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
266 LOGE("Error: messageTitle is null");
\r
267 return (jint) NS_ERROR;
\r
269 LOGI("Message Title: %s\n", messageTitle);
\r
272 jfieldID fid_body = (*env)->GetFieldID(env, cls, "body", "Ljava/lang/String;");
\r
273 if (fid_body == NULL)
\r
275 LOGE("Error: jfieldID for message id is null");
\r
276 return (jint) NS_ERROR;
\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
282 LOGE("Error: messageBody is null");
\r
283 return (jint) NS_ERROR;
\r
285 LOGI("Message Body: %s\n", messageBody);
\r
288 jfieldID fid_source = (*env)->GetFieldID(env, cls, "source", "Ljava/lang/String;");
\r
289 if (fid_source == NULL)
\r
291 LOGE("Error: jfieldID for message source is null");
\r
292 return (jint) NS_ERROR;
\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
298 LOGE("Error: messageSource is null");
\r
299 return (jint) NS_ERROR;
\r
301 LOGI("Message Source: %s\n", messageSource);
\r
303 NSMessage * nsMsg = (NSMessage *) malloc(sizeof(NSMessage));
\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