1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "JniNotificationProvider.h"
22 #include "NSProviderService.h"
24 static JavaVM *g_jvm = NULL;
26 static jobject g_obj_subscriptionListener = NULL;
27 static jobject g_obj_syncListener = NULL;
30 jclass g_cls_Message_Type;
31 jclass g_cls_Consumer;
32 jclass g_cls_SyncInfo;
33 jclass g_cls_SyncType;
34 jclass g_cls_MediaContents;
36 static JNIEnv *GetJNIEnv(jint *ret)
40 *ret = g_jvm->GetEnv((void **) &env, JNI_CURRENT_VERSION);
46 if (g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
48 LOGE ("Failed to get the environment");
56 LOGE ("JNI version is not supported");
58 LOGE ("Failed to get the environment");
63 void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer)
65 LOGI("JNIProviderService_onSubscribeListenerCb - IN");
68 JNIEnv *env = GetJNIEnv(&envRet);
69 if (NULL == env) return ;
71 jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener);
72 if (!jSubscriptionListener)
74 LOGE ("Failed to Get jSubscriptionListener");
75 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
79 LOGI("consumer ID : %s\n", consumer->getConsumerId().c_str());
81 jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str());
83 jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer));
86 LOGE ("Failed to Get ObjectClass for Consumer");
87 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
91 jmethodID mid_consumer = env->GetMethodID(
94 "(JLjava/lang/String;Lorg/iotivity/service/ns/provider/Consumer)V");
97 LOGE ("Failed to Get MethodID for Consumer<init>");
98 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
101 jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId);
103 jclass cls = env->GetObjectClass( jSubscriptionListener);
106 LOGE("Failed to Get ObjectClass of jSubscriptionListener");
107 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
110 jmethodID mid = env->GetMethodID(
112 "onConsumerSubscribed",
113 "(Lorg/iotivity/service/ns/provider/Consumer;)V");
116 LOGE("Failed to Get MethodID of onConsumerSubscribed");
117 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
121 env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer);
122 env->DeleteLocalRef(jSubscriptionListener);
123 env->DeleteLocalRef(cls_consumer);
124 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
125 LOGI("JNIProviderService_onSubscribeListenerCb - OUT");
129 void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync)
131 LOGI("JNIProviderService_onSyncInfoListenerCb - IN");
134 JNIEnv *env = GetJNIEnv(&envRet);
135 if (NULL == env) return ;
137 jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);
140 LOGE ("Failed to Get jSyncListener");
141 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
145 LOGI("Sync ID : %ld\n", (long) sync->getMessageId());
146 LOGI("Sync STATE : %d\n", (int) sync->getState());
148 jlong jMessageId = (long) sync->getMessageId();
149 jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());
152 jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType));
155 LOGE ("Failed to Get ObjectClass for SyncType");
156 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
159 switch (sync->getState())
161 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD:
163 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
164 "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
165 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
167 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ :
169 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
170 "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
171 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
173 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED :
175 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
176 "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
177 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
182 jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo));
185 LOGE ("Failed to Get ObjectClass for SyncInfo");
186 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
189 jmethodID mid_syncInfo = env->GetMethodID(
192 "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType)V");
195 LOGE ("Failed to Get MethodID for SyncInfo");
196 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
200 jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo, jMessageId, jProviderId,
203 jclass cls = env->GetObjectClass( jSyncListener);
206 LOGE("Failed to Get ObjectClass");
207 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
210 jmethodID mid = env->GetMethodID( cls, "onMessageSynchronized",
211 "(Lorg/iotivity/service/ns/common/SyncInfo)V");
214 LOGE("Failed to Get MethodID");
215 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
218 env->CallVoidMethod( jSyncListener, mid, obj_syncInfo);
220 env->DeleteLocalRef(jSyncListener);
221 env->DeleteLocalRef(cls_SyncInfo);
222 env->DeleteLocalRef(cls_SyncType);
223 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
225 LOGI("JNIProviderService: OnSyncInfoListenerCb - OUT");
230 OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg)
232 LOGI("JNIProviderService: getMessage - IN");
234 jclass cls = env->GetObjectClass( jMsg);
237 jclass cls_messageType = (jclass) (env->NewLocalRef(g_cls_Message_Type));
238 if (!cls_messageType)
240 LOGE ("Failed to Get ObjectClass for Message Type");
243 jmethodID mid = env->GetMethodID(cls_messageType, "ordinal", "()I");
244 jfieldID fid_type = env->GetFieldID( cls, "mType",
245 "Lorg/iotivity/service/ns/common/Message$MessageType;");
246 if (fid_type == NULL)
248 LOGE("Error: jfieldID for message type is null");
251 jobject jobj = env->GetObjectField( jMsg, fid_type);
254 LOGE("Error: object of field Message Type is null");
257 jint jtype = env->CallIntMethod(jobj, mid);
258 OIC::Service::NSMessage::NSMessageType type = (OIC::Service::NSMessage::NSMessageType) jtype;
260 LOGI("Message Type: %ld\n", (long )type);
263 jfieldID fid_tm = env->GetFieldID( cls, "mTime", "Ljava/lang/String;");
266 LOGE("Error: jfieldID for message time is null");
269 jstring jtime = (jstring)env->GetObjectField( jMsg, fid_tm);
270 const char *time = "";
273 time = env->GetStringUTFChars( jtime, NULL);
277 LOGI("Info: messageTitle is null");
279 LOGI("Message Time: %s\n", time);
282 jfieldID fid_ttl = env->GetFieldID( cls, "mTTL", "J");
285 LOGE("Error: jfieldID for message ttl is null");
288 jlong jttl = (jlong) env->GetObjectField( jMsg, fid_ttl);
291 LOGI("Message ID: %lld\n", ttl);
294 jfieldID fid_title = env->GetFieldID( cls, "mTitle", "Ljava/lang/String;");
295 if (fid_title == NULL)
297 LOGE("Error: jfieldID for message title is null");
300 jstring jmsgTitle = (jstring)env->GetObjectField( jMsg, fid_title);
301 const char *messageTitle = "";
304 messageTitle = env->GetStringUTFChars( jmsgTitle, NULL);
308 LOGI("Info: messageTitle is null");
310 LOGI("Message Title: %s\n", messageTitle);
312 // Message Content Text
313 jfieldID fid_body = env->GetFieldID( cls, "mContentText", "Ljava/lang/String;");
314 if (fid_body == NULL)
316 LOGE("Error: jfieldID for message context Text is null");
319 jstring jmsgBody = (jstring)env->GetObjectField( jMsg, fid_body);
320 const char *messageBody = "";
323 messageBody = env->GetStringUTFChars( jmsgBody, NULL);
327 LOGI("Info: messageBody is null");
329 LOGI("Message Body: %s\n", messageBody);
332 jfieldID fid_source = env->GetFieldID( cls, "mSourceName", "Ljava/lang/String;");
333 if (fid_source == NULL)
335 LOGE("Error: jfieldID for message source is null");
338 jstring jmsgSource = (jstring)env->GetObjectField( jMsg, fid_source);
339 const char *messageSource = "";
342 messageSource = env->GetStringUTFChars( jmsgSource, NULL);
346 LOGI("Info: messageSource is null");
348 LOGI("Message Source: %s\n", messageSource);
350 // Message MediaContents
351 jfieldID fid_media = env->GetFieldID( cls, "mMediaContents",
352 "Lorg/iotivity/service/ns/common/MediaContents;");
353 if (fid_media == NULL)
355 LOGE("Error: jfieldID for MediaContents is null");
358 jobject jmedia = env->GetObjectField( jMsg, fid_media);
361 LOGE("Error: jmedia object of MediaContents inside Message is null");
364 jclass cls_MediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
365 if (!cls_MediaContents)
367 LOGE ("Failed to Get ObjectClass for class MediaContents");
370 jfieldID fid_icon = env->GetFieldID( cls_MediaContents, "mIconImage", "Ljava/lang/String;");
371 if (fid_icon == NULL)
373 LOGE("Error: jfieldID for iconImage is null");
376 jstring jiconImage = (jstring)env->GetObjectField( jmedia, fid_icon);
377 const char *iconImage = "";
380 iconImage = env->GetStringUTFChars( jiconImage, NULL);
384 LOGI("Info: iconImage is null");
387 LOGI("iconImage: %s\n", iconImage);
389 OIC::Service::NSMediaContents *media = new OIC::Service::NSMediaContents(std::string(iconImage));
390 OIC::Service::NSMessage *nsMsg = OIC::Service::NSProviderService::getInstance()->CreateMessage();
392 nsMsg->setType(type);
393 nsMsg->setTime(std::string(time));
395 nsMsg->setTitle(std::string(messageTitle));
396 nsMsg->setContentText(std::string(messageBody));
397 nsMsg->setSourceName(std::string(messageSource));
398 nsMsg->setMediaContents(media);
400 env->DeleteLocalRef(cls_messageType);
401 env->DeleteLocalRef(cls_MediaContents);
405 env->ReleaseStringUTFChars(jtime, time);
409 env->ReleaseStringUTFChars(jmsgTitle, messageTitle);
413 env->ReleaseStringUTFChars(jmsgBody, messageBody);
417 env->ReleaseStringUTFChars(jmsgSource, messageSource);
421 env->ReleaseStringUTFChars(jiconImage, iconImage);
424 LOGI("JNIProviderService: getMessage - OUT");
429 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStart(
430 JNIEnv *env, jobject jObj, jboolean jPolicy, jobject jSubscriptionListener,
431 jobject jSyncListener)
433 LOGI("JNIProviderService: nativeStart - IN");
434 if (!jSubscriptionListener || !jSyncListener)
436 LOGE("Fail to set listeners");
437 ThrowNSException(NS_ERROR, "Listener cannot be null");
438 return (jint) OIC::Service::NSResult::ERROR;
441 if (g_obj_subscriptionListener != NULL)
443 env->DeleteGlobalRef(g_obj_subscriptionListener);
445 if (g_obj_syncListener != NULL)
447 env->DeleteGlobalRef(g_obj_syncListener);
450 g_obj_subscriptionListener = (jobject) env->NewGlobalRef(jSubscriptionListener);
451 g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);
453 // check access policy
455 OIC::Service::NSProviderService::ProviderConfig cfg;
456 cfg.m_subscribeRequestCb = onSubscribeListenerCb;
457 cfg.m_syncInfoCb = onSyncInfoListenerCb;
458 cfg.policy = (bool) jPolicy;
460 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->Start(cfg);
461 if (result != OIC::Service::NSResult::OK)
463 LOGE("Fail to start NSProviderService");
467 LOGI("JNIProviderService: nativeStart - OUT");
468 return (jint) result;
471 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStop(
472 JNIEnv *env, jobject jObj)
474 LOGI("JNIProviderService: nativeStop - IN");
476 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->Stop();
477 if (result != OIC::Service::NSResult::OK)
479 LOGI("Fail to stop NSProvider service");
480 return (jint) result;
483 env->DeleteGlobalRef( g_obj_subscriptionListener);
484 env->DeleteGlobalRef( g_obj_syncListener);
485 g_obj_subscriptionListener = NULL;
486 g_obj_syncListener = NULL;
488 LOGI("JNIProviderService: nativeStop - OUT");
489 return (jint) result;
492 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendMessage(
493 JNIEnv *env, jobject jObj, jobject jMsg)
495 LOGI("JNIProviderService: nativeSendMessage - IN");
498 LOGI("Fail to send notification - Message is null");
499 ThrowNSException(NS_ERROR, "Message cannot be null");
500 return (jint) OIC::Service::NSResult::ERROR;
502 OIC::Service::NSMessage *nsMsg = getMessage(env, jMsg);
503 if (nsMsg == nullptr)
505 ThrowNSException(NS_ERROR, "Message didn't have a field ID ");
506 return (jint) OIC::Service::NSResult::ERROR;
509 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->SendMessage(nsMsg);
510 if (result != OIC::Service::NSResult::OK)
512 LOGI("Fail to send NSProvider Message");
514 LOGI("JNIProviderService: nativeSendMessage - OUT");
515 return (jint) result;
518 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendSyncInfo(
519 JNIEnv *env, jobject jObj, jlong messageId , jint syncState)
521 LOGI("JNIProviderService: nativeSendSyncInfo - IN");
522 OIC::Service::NSProviderService::getInstance()->SendSyncInfo( messageId,
523 (OIC::Service::NSSyncInfo::NSSyncType) syncState);
524 LOGI("JNIProviderService: nativeSendSyncInfo - OUT");
528 JNIEXPORT jint JNICALL
529 Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService(JNIEnv *env,
530 jobject jObj, jstring jstr)
532 LOGI("JNIProviderService: nativeEnableRemoteService - IN");
535 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
536 return (jint) OIC::Service::NSResult::ERROR;
539 const char *address = env->GetStringUTFChars( jstr, NULL);
540 std::string servAddress(address);
541 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->EnableRemoteService(
543 if (result != OIC::Service::NSResult::OK)
545 LOGE("Fail to Enable Remote Service");
547 env->ReleaseStringUTFChars(jstr, address);
548 LOGI("JNIProviderService: nativeEnableRemoteService - OUT");
549 return (jint) result;
552 JNIEXPORT jint JNICALL
553 Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService(JNIEnv *env,
554 jobject jObj, jstring jstr)
556 LOGI("JNIProviderService: nativeDisableRemoteService - IN");
559 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
560 return (jint) OIC::Service::NSResult::ERROR;
563 const char *address = env->GetStringUTFChars( jstr, NULL);
564 std::string servAddress(address);
565 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->DisableRemoteService(
567 if (result != OIC::Service::NSResult::OK)
569 LOGE("Fail to Disable Remote Service");
571 env->ReleaseStringUTFChars(jstr, address);
572 LOGI("JNIProviderService: nativeDisableRemoteService - OUT");
573 return (jint) result;
576 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription(
578 jobject jObj, jobject jConsumer, jboolean jAccepted)
580 LOGD("JNIProviderService: nativeAcceptSubscription - IN");
582 jclass consumerClass = env->GetObjectClass( jConsumer);
585 ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Consumer");
586 return (jint) OIC::Service::NSResult::ERROR;
590 jfieldID fid_id = env->GetFieldID(consumerClass, "mConsumerId", "Ljava/lang/String;");
593 LOGE("Error: jfieldID for mConsumerId is null");
594 ThrowNSException(NS_ERROR, "ConsumerId not found");
595 return (jint) OIC::Service::NSResult::ERROR;
598 jstring jconId = (jstring)env->GetObjectField( jConsumer, fid_id);
599 const char *conId = "";
602 conId = env->GetStringUTFChars( jconId, NULL);
606 LOGI("Info: Consumer Id is null");
608 std::string consumerId(conId);
609 env->ReleaseStringUTFChars(jconId, conId);
611 LOGI("Consumer ID: %s\n", consumerId.c_str());
613 OIC::Service::NSConsumer *consumer = new OIC::Service::NSConsumer(consumerId);
614 int result = consumer->acceptSubscription(consumer, (bool)jAccepted);
617 LOGI("Subscription Accepted");
621 LOGI("Subscription Denied");
624 LOGD("JNIProviderService: nativeAcceptSubscription - OUT");
629 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
631 LOGD("ProviderService_JNI_OnLoad");
635 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
637 LOGE("Failed to get the environment using GetEnv()");
641 jclass localMessage = env->FindClass(
642 "org/iotivity/service/ns/common/Message");
645 LOGE("Failed to get local Message class");
648 g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));
651 LOGE("Failed to set Global Message reference");
655 jclass localMessageType = env->FindClass(
656 "org/iotivity/service/ns/common/Message$MessageType");
657 if (!localMessageType)
659 LOGE("Failed to get local Message Type class");
662 g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));
663 if (!g_cls_Message_Type)
665 LOGE("Failed to set Global Message Type reference");
669 jclass localConsumer = env->FindClass(
670 "org/iotivity/service/ns/provider/Consumer");
673 LOGE("Failed to get local Provider class");
676 g_cls_Consumer = (jclass) (env->NewGlobalRef(localConsumer));
679 LOGE("Failed to set Global Provider reference");
683 jclass localSyncInfo = env->FindClass(
684 "org/iotivity/service/ns/common/SyncInfo");
687 LOGE("Failed to get local SyncInfo class");
690 g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));
693 LOGE("Failed to set Global SyncInfo reference");
697 jclass localSyncType = env->FindClass(
698 "org/iotivity/service/ns/common/SyncInfo$SyncType");
701 LOGE("Failed to get local SyncType enum");
704 g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType));
707 LOGE("Failed to set Global SyncType reference");
711 jclass localMediaContents = env->FindClass(
712 "org/iotivity/service/ns/common/MediaContents");
713 if (!localMediaContents)
715 LOGE("Failed to get local MediaContents class");
718 g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));
719 if (!g_cls_MediaContents)
721 LOGE("Failed to set Global MediaContents reference");
725 env->DeleteLocalRef(localMessage);
726 env->DeleteLocalRef(localMessageType);
727 env->DeleteLocalRef(localConsumer);
728 env->DeleteLocalRef(localSyncInfo);
729 env->DeleteLocalRef(localSyncType);
730 env->DeleteLocalRef(localMediaContents);
732 return NSExceptionInit(env);
735 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
737 LOGI("ProviderService_JNI_OnUnload");
740 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
742 LOGE("Failed to get the environment using GetEnv()");
746 env->DeleteGlobalRef(g_cls_Message);
747 env->DeleteGlobalRef(g_cls_Consumer);
748 env->DeleteGlobalRef(g_cls_SyncInfo);
749 env->DeleteGlobalRef(g_cls_SyncType);
750 env->DeleteGlobalRef(g_cls_MediaContents);
751 env->DeleteGlobalRef(g_cls_Message_Type);