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 jclass g_cls_TopicsList;
37 jclass g_cls_TopicState;
39 static JNIEnv *GetJNIEnv(jint *ret)
43 *ret = g_jvm->GetEnv((void **) &env, JNI_CURRENT_VERSION);
49 if (g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
51 LOGE ("Failed to get the environment");
59 LOGE ("JNI version is not supported");
61 LOGE ("Failed to get the environment");
66 OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg)
68 LOGD("JNIProviderService: getMessage - IN");
70 jclass cls = env->GetObjectClass( jMsg);
73 jclass cls_messageType = (jclass) (env->NewLocalRef(g_cls_Message_Type));
76 LOGE ("Failed to Get ObjectClass for Message Type");
79 jmethodID mid = env->GetMethodID(cls_messageType, "ordinal", "()I");
80 jfieldID fid_type = env->GetFieldID( cls, "mType",
81 "Lorg/iotivity/service/ns/common/Message$MessageType;");
84 LOGE("Error: jfieldID for message type is null");
87 jobject jobj = env->GetObjectField( jMsg, fid_type);
90 LOGE("Error: object of field Message Type is null");
93 jint jtype = env->CallIntMethod(jobj, mid);
94 OIC::Service::NSMessage::NSMessageType type = (OIC::Service::NSMessage::NSMessageType) jtype;
96 LOGD("Message Type: %ld\n", (long )type);
99 jfieldID fid_tm = env->GetFieldID( cls, "mTime", "Ljava/lang/String;");
102 LOGE("Error: jfieldID for message time is null");
105 jstring jtime = (jstring)env->GetObjectField( jMsg, fid_tm);
106 const char *time = "";
109 time = env->GetStringUTFChars( jtime, NULL);
113 LOGD("Info: messageTitle is null");
115 LOGD("Message Time: %s\n", time);
118 jfieldID fid_ttl = env->GetFieldID( cls, "mTTL", "J");
121 LOGE("Error: jfieldID for message ttl is null");
124 jlong jttl = (jlong) env->GetObjectField( jMsg, fid_ttl);
127 LOGD("Message ID: %lld\n", ttl);
130 jfieldID fid_title = env->GetFieldID( cls, "mTitle", "Ljava/lang/String;");
131 if (fid_title == NULL)
133 LOGE("Error: jfieldID for message title is null");
136 jstring jmsgTitle = (jstring)env->GetObjectField( jMsg, fid_title);
137 const char *messageTitle = "";
140 messageTitle = env->GetStringUTFChars( jmsgTitle, NULL);
144 LOGD("Info: messageTitle is null");
146 LOGD("Message Title: %s\n", messageTitle);
148 // Message Content Text
149 jfieldID fid_body = env->GetFieldID( cls, "mContentText", "Ljava/lang/String;");
150 if (fid_body == NULL)
152 LOGE("Error: jfieldID for message context Text is null");
155 jstring jmsgBody = (jstring)env->GetObjectField( jMsg, fid_body);
156 const char *messageBody = "";
159 messageBody = env->GetStringUTFChars( jmsgBody, NULL);
163 LOGD("Info: messageBody is null");
165 LOGD("Message Body: %s\n", messageBody);
168 jfieldID fid_source = env->GetFieldID( cls, "mSourceName", "Ljava/lang/String;");
169 if (fid_source == NULL)
171 LOGE("Error: jfieldID for message source is null");
174 jstring jmsgSource = (jstring)env->GetObjectField( jMsg, fid_source);
175 const char *messageSource = "";
178 messageSource = env->GetStringUTFChars( jmsgSource, NULL);
182 LOGD("Info: messageSource is null");
184 LOGD("Message Source: %s\n", messageSource);
187 jfieldID fid_topic = env->GetFieldID( cls, "mTopic", "Ljava/lang/String;");
188 if (fid_topic == NULL)
190 LOGE("Error: jfieldID for topic is null");
193 jstring jtopic = (jstring)env->GetObjectField( jMsg, fid_topic);
194 const char *topic = "";
197 topic = env->GetStringUTFChars( jtopic, NULL);
201 LOGD("Info: topic is null");
203 LOGD("Topic : %s\n", topic);
205 // Message MediaContents
206 jfieldID fid_media = env->GetFieldID( cls, "mMediaContents",
207 "Lorg/iotivity/service/ns/common/MediaContents;");
208 if (fid_media == NULL)
210 LOGE("Error: jfieldID for MediaContents is null");
213 jobject jmedia = env->GetObjectField( jMsg, fid_media);
216 LOGE("Error: jmedia object of MediaContents inside Message is null");
219 jclass cls_MediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
220 if (!cls_MediaContents)
222 LOGE ("Failed to Get ObjectClass for class MediaContents");
225 jfieldID fid_icon = env->GetFieldID( cls_MediaContents, "mIconImage", "Ljava/lang/String;");
226 if (fid_icon == NULL)
228 LOGE("Error: jfieldID for iconImage is null");
231 jstring jiconImage = (jstring)env->GetObjectField( jmedia, fid_icon);
232 const char *iconImage = "";
235 iconImage = env->GetStringUTFChars( jiconImage, NULL);
239 LOGD("Info: iconImage is null");
242 LOGD("iconImage: %s\n", iconImage);
244 OIC::Service::NSMediaContents *media = new OIC::Service::NSMediaContents(std::string(iconImage));
245 OIC::Service::NSMessage *nsMsg = OIC::Service::NSProviderService::getInstance()->CreateMessage();
247 nsMsg->setType(type);
248 nsMsg->setTime(std::string(time));
250 nsMsg->setTitle(std::string(messageTitle));
251 nsMsg->setContentText(std::string(messageBody));
252 nsMsg->setSourceName(std::string(messageSource));
253 nsMsg->setMediaContents(media);
254 nsMsg->setTopic(std::string(topic));
256 env->DeleteLocalRef(cls_messageType);
257 env->DeleteLocalRef(cls_MediaContents);
261 env->ReleaseStringUTFChars(jtime, time);
265 env->ReleaseStringUTFChars(jmsgTitle, messageTitle);
269 env->ReleaseStringUTFChars(jmsgBody, messageBody);
273 env->ReleaseStringUTFChars(jmsgSource, messageSource);
277 env->ReleaseStringUTFChars(jtopic, topic);
281 env->ReleaseStringUTFChars(jiconImage, iconImage);
284 LOGD("JNIProviderService: getMessage - OUT");
289 jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)
291 LOGD("JNIProviderService: getJavaTopicState - IN");
294 jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));
297 LOGE ("Failed to Get ObjectClass for TopicState Type");
301 jobject obj_topicState;
304 case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED:
306 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
307 "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
308 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);
310 case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:
312 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
313 "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
314 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);
318 if (obj_topicState == NULL)
320 LOGE("Error: object of field TopicState is null");
322 env->DeleteLocalRef(cls_topicState);
323 LOGD("JNIProviderService: getJavaTopicState - OUT");
324 return obj_topicState;
327 jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
329 LOGD("JNIProviderService: getJavaTopicsList - IN");
330 jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));
333 LOGE ("Failed to Get ObjectClass for TopicsList");
336 jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");
339 LOGE ("Failed to Get MethodID for TopicsList<init>");
342 jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);
345 LOGE ("Failed to Get object for TopicsList");
348 jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic",
349 "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V");
352 LOGE ("Failed to Get MethodID for addTopic");
355 for (auto it : topicList->getTopicsList())
357 jobject jState = getJavaTopicState(env, it->getState());
358 std::string topicName = it->getTopicName();
359 jstring jTopicName = env->NewStringUTF(topicName.c_str());
360 env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);
362 env->DeleteLocalRef(cls_topicList);
363 LOGD("JNIProviderService: getJavaTopicsList - OUT");
364 return obj_topicList;
367 jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType)
369 LOGD ("JNIProviderService: getJavaSyncType - IN");
372 jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType));
375 LOGE ("Failed to Get ObjectClass for SyncType");
381 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD:
383 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
384 "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
385 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
387 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ :
389 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
390 "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
391 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
393 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED :
395 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
396 "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
397 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
402 if (syncType == NULL)
404 LOGE("Error: object of field Synctype is null");
407 env->DeleteLocalRef(cls_SyncType);
408 LOGD ("JNIProviderService: getJavaSyncType - OUT");
413 void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer)
415 LOGD("JNIProviderService_onSubscribeListenerCb - IN");
418 JNIEnv *env = GetJNIEnv(&envRet);
419 if (NULL == env) return ;
421 jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener);
422 if (!jSubscriptionListener)
424 LOGE ("Failed to Get jSubscriptionListener");
425 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
429 LOGD("consumer ID : %s\n", consumer->getConsumerId().c_str());
431 jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str());
433 jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer));
436 LOGE ("Failed to Get ObjectClass for Consumer");
437 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
441 jmethodID mid_consumer = env->GetMethodID(
444 "(Ljava/lang/String;)V");
447 LOGE ("Failed to Get MethodID for Consumer<init>");
448 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
451 jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId);
453 jclass cls = env->GetObjectClass( jSubscriptionListener);
456 LOGE("Failed to Get ObjectClass of jSubscriptionListener");
457 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
460 jmethodID mid = env->GetMethodID(
462 "onConsumerSubscribed",
463 "(Lorg/iotivity/service/ns/provider/Consumer;)V");
466 LOGE("Failed to Get MethodID of onConsumerSubscribed");
467 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
471 env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer);
472 env->DeleteLocalRef(jSubscriptionListener);
473 env->DeleteLocalRef(cls_consumer);
474 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
475 LOGD("JNIProviderService_onSubscribeListenerCb - OUT");
479 void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync)
481 LOGD("JNIProviderService_onSyncInfoListenerCb - IN");
484 JNIEnv *env = GetJNIEnv(&envRet);
485 if (NULL == env) return ;
487 jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);
490 LOGE ("Failed to Get jSyncListener");
491 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
495 LOGD("Sync ID : %ld\n", (long) sync->getMessageId());
496 LOGD("Sync STATE : %d\n", (int) sync->getState());
498 jlong jMessageId = (long) sync->getMessageId();
499 jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());
500 jobject syncType = getJavaSyncType(env, sync->getState());
503 LOGE ("Failed to Get syncType for SyncInfo");
504 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
507 jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo));
510 LOGE ("Failed to Get ObjectClass for SyncInfo");
511 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
514 jmethodID mid_syncInfo = env->GetMethodID(
517 "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V");
520 LOGE ("Failed to Get MethodID for SyncInfo");
521 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
525 jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo,
526 jMessageId, jProviderId, syncType);
529 LOGE ("Failed to Get Object for SyncInfo");
530 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
534 jclass cls = env->GetObjectClass( jSyncListener);
537 LOGE("Failed to Get ObjectClass");
538 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
541 jmethodID mid = env->GetMethodID(
543 "onSyncInfoReceived",
544 "(Lorg/iotivity/service/ns/common/SyncInfo;)V");
547 LOGE("Failed to Get MethodID");
548 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
551 env->CallVoidMethod( jSyncListener, mid, obj_syncInfo);
553 env->DeleteLocalRef(jSyncListener);
554 env->DeleteLocalRef(cls_SyncInfo);
555 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
557 LOGD("JNIProviderService: OnSyncInfoListenerCb - OUT");
562 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStart(
563 JNIEnv *env, jobject jObj, jboolean jPolicy, jobject jSubscriptionListener,
564 jobject jSyncListener)
566 LOGD("JNIProviderService: nativeStart - IN");
567 if (!jSubscriptionListener || !jSyncListener)
569 LOGE("Fail to set listeners");
570 ThrowNSException(NS_ERROR, "Listener cannot be null");
571 return (jint) OIC::Service::NSResult::ERROR;
574 if (g_obj_subscriptionListener != NULL)
576 env->DeleteGlobalRef(g_obj_subscriptionListener);
578 if (g_obj_syncListener != NULL)
580 env->DeleteGlobalRef(g_obj_syncListener);
583 g_obj_subscriptionListener = (jobject) env->NewGlobalRef(jSubscriptionListener);
584 g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);
586 // check access policy
588 OIC::Service::NSProviderService::ProviderConfig cfg;
589 cfg.m_subscribeRequestCb = onSubscribeListenerCb;
590 cfg.m_syncInfoCb = onSyncInfoListenerCb;
591 cfg.policy = (bool) jPolicy;
593 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->Start(cfg);
594 if (result != OIC::Service::NSResult::OK)
596 LOGE("Fail to start NSProviderService");
600 LOGD("JNIProviderService: nativeStart - OUT");
601 return (jint) result;
604 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStop(
605 JNIEnv *env, jobject jObj)
607 LOGD("JNIProviderService: nativeStop - IN");
609 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->Stop();
610 if (result != OIC::Service::NSResult::OK)
612 LOGD("Fail to stop NSProvider service");
613 return (jint) result;
616 env->DeleteGlobalRef( g_obj_subscriptionListener);
617 env->DeleteGlobalRef( g_obj_syncListener);
618 g_obj_subscriptionListener = NULL;
619 g_obj_syncListener = NULL;
621 LOGD("JNIProviderService: nativeStop - OUT");
622 return (jint) result;
625 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendMessage(
626 JNIEnv *env, jobject jObj, jobject jMsg)
628 LOGD("JNIProviderService: nativeSendMessage - IN");
631 LOGD("Fail to send notification - Message is null");
632 ThrowNSException(NS_ERROR, "Message cannot be null");
633 return (jint) OIC::Service::NSResult::ERROR;
635 OIC::Service::NSMessage *nsMsg = getNativeMessage(env, jMsg);
636 if (nsMsg == nullptr)
638 ThrowNSException(NS_ERROR, "Message didn't have a field ID ");
639 return (jint) OIC::Service::NSResult::ERROR;
642 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->SendMessage(nsMsg);
643 if (result != OIC::Service::NSResult::OK)
645 LOGD("Fail to send NSProvider Message");
647 LOGD("JNIProviderService: nativeSendMessage - OUT");
648 return (jint) result;
651 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendSyncInfo(
652 JNIEnv *env, jobject jObj, jlong messageId , jint syncState)
654 LOGD("JNIProviderService: nativeSendSyncInfo - IN");
655 OIC::Service::NSProviderService::getInstance()->SendSyncInfo( messageId,
656 (OIC::Service::NSSyncInfo::NSSyncType) syncState);
657 LOGD("JNIProviderService: nativeSendSyncInfo - OUT");
661 JNIEXPORT jint JNICALL
662 Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService(JNIEnv *env,
663 jobject jObj, jstring jstr)
665 LOGD("JNIProviderService: nativeEnableRemoteService - IN");
668 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
669 return (jint) OIC::Service::NSResult::ERROR;
672 const char *address = env->GetStringUTFChars( jstr, NULL);
673 std::string servAddress(address);
674 OIC::Service::NSResult result =
675 OIC::Service::NSProviderService::getInstance()->EnableRemoteService(
677 if (result != OIC::Service::NSResult::OK)
679 LOGE("Fail to Enable Remote Service");
681 env->ReleaseStringUTFChars(jstr, address);
682 LOGD("JNIProviderService: nativeEnableRemoteService - OUT");
683 return (jint) result;
686 JNIEXPORT jint JNICALL
687 Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService(JNIEnv *env,
688 jobject jObj, jstring jstr)
690 LOGD("JNIProviderService: nativeDisableRemoteService - IN");
693 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
694 return (jint) OIC::Service::NSResult::ERROR;
697 const char *address = env->GetStringUTFChars( jstr, NULL);
698 std::string servAddress(address);
699 OIC::Service::NSResult result =
700 OIC::Service::NSProviderService::getInstance()->DisableRemoteService(
702 if (result != OIC::Service::NSResult::OK)
704 LOGE("Fail to Disable Remote Service");
706 env->ReleaseStringUTFChars(jstr, address);
707 LOGD("JNIProviderService: nativeDisableRemoteService - OUT");
708 return (jint) result;
711 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeAddTopic
712 (JNIEnv *env, jobject jObj, jstring jTopicName)
714 LOGD("JNIProviderService: nativeAddTopic - IN");
717 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
718 return (jint) OIC::Service::NSResult::ERROR;
720 const char *name = env->GetStringUTFChars( jTopicName, NULL);
721 std::string topicName(name);
722 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->AddTopic(
724 if (result != OIC::Service::NSResult::OK)
726 LOGE("Fail to Add Topic");
728 env->ReleaseStringUTFChars(jTopicName, name);
729 LOGD("JNIProviderService: nativeAddTopic - OUT");
730 return (jint) result;
732 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeDeleteTopic
733 (JNIEnv *env, jobject jObj, jstring jTopicName)
735 LOGD("JNIProviderService: nativeDeleteTopic - IN");
738 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
739 return (jint) OIC::Service::NSResult::ERROR;
741 const char *name = env->GetStringUTFChars( jTopicName, NULL);
742 std::string topicName(name);
743 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->DeleteTopic(
745 if (result != OIC::Service::NSResult::OK)
747 LOGE("Fail to Add Topic");
749 env->ReleaseStringUTFChars(jTopicName, name);
750 LOGD("JNIProviderService: nativeDeleteTopic - OUT");
751 return (jint) result;
754 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeGetTopics
755 (JNIEnv *env, jobject jObj)
757 LOGD("JNIProviderService: nativeGetTopics - IN");
759 OIC::Service::NSTopicsList *topicList =
760 OIC::Service::NSProviderService::getInstance()->GetTopics();
761 if (topicList == nullptr)
763 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
767 jobject obj_topicList = getJavaTopicsList(env, topicList);
769 LOGD("JNIProviderService: nativeGetTopics - OUT");
770 return obj_topicList;
773 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription(
774 JNIEnv *env, jobject jObj, jobject jConsumer, jboolean jAccepted)
776 LOGD("JNIProviderService: nativeAcceptSubscription - IN");
778 jclass consumerClass = env->GetObjectClass( jConsumer);
781 ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Consumer");
782 return (jint) OIC::Service::NSResult::ERROR;
786 jfieldID fid_id = env->GetFieldID(consumerClass, "mConsumerId", "Ljava/lang/String;");
789 LOGE("Error: jfieldID for mConsumerId is null");
790 ThrowNSException(NS_ERROR, "ConsumerId not found");
791 return (jint) OIC::Service::NSResult::ERROR;
794 jstring jconId = (jstring)env->GetObjectField( jConsumer, fid_id);
797 ThrowNSException(NS_ERROR, "ProviderId cannot be null");
798 return (jint) OIC::Service::NSResult::ERROR;
800 const char *conId = env->GetStringUTFChars( jconId, NULL);
801 std::string consumerId(conId);
802 env->ReleaseStringUTFChars(jconId, conId);
804 LOGD("Consumer ID: %s\n", consumerId.c_str());
806 OIC::Service::NSConsumer *consumer =
807 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
809 return (jint) consumer->acceptSubscription(consumer, (bool)jAccepted);
811 LOGE("Couldn't find consumer");
812 LOGD("JNIProviderService: nativeAcceptSubscription - OUT");
813 return (jint) OIC::Service::NSResult::ERROR;
815 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSelectTopic
816 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
818 LOGD("JNIProviderService: nativeSelectTopic - IN");
819 if (!jConsumerId || !jTopicName)
821 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
822 return (jint) OIC::Service::NSResult::ERROR;
824 const char *name = env->GetStringUTFChars( jTopicName, NULL);
825 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
826 std::string topicName(name);
827 std::string consumerId(id);
828 OIC::Service::NSConsumer *nsConsumer =
829 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
832 ThrowNSException(NS_ERROR, "Consumer does exists");
833 return (jint) OIC::Service::NSResult::ERROR;
835 OIC::Service::NSResult result = nsConsumer->selectTopic(topicName);
837 if (result != OIC::Service::NSResult::OK)
839 LOGD("Fail to Select Topic");
841 env->ReleaseStringUTFChars(jTopicName, name);
842 env->ReleaseStringUTFChars(jConsumerId, id);
843 LOGD("JNIProviderService: nativeSelectTopic - OUT");
844 return (jint) result;
846 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeUnselectTopic
847 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
849 LOGD("JNIProviderService: nativeUnselectTopic - IN");
850 if (!jConsumerId || !jTopicName)
852 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
853 return (jint) OIC::Service::NSResult::ERROR;
855 const char *name = env->GetStringUTFChars( jTopicName, NULL);
856 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
857 std::string topicName(name);
858 std::string consumerId(id);
859 OIC::Service::NSConsumer *nsConsumer =
860 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
863 ThrowNSException(NS_ERROR, "Consumer does exists");
864 return (jint) OIC::Service::NSResult::ERROR;
866 OIC::Service::NSResult result = nsConsumer->unselectTopic(topicName);
868 if (result != OIC::Service::NSResult::OK)
870 LOGE("Fail to Unselect Topic");
872 env->ReleaseStringUTFChars(jTopicName, name);
873 env->ReleaseStringUTFChars(jConsumerId, id);
874 LOGD("JNIProviderService: nativeUnselectTopic - OUT");
875 return (jint) result;
878 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeGetConsumerTopics
879 (JNIEnv *env, jobject jObj, jstring jConsumerId)
881 LOGD("JNIProviderService: nativeGetConsumerTopics - IN");
884 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
887 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
888 std::string consumerId(id);
889 OIC::Service::NSConsumer *nsConsumer =
890 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
893 ThrowNSException(NS_ERROR, "Consumer does exists");
896 env->ReleaseStringUTFChars(jConsumerId, id);
897 OIC::Service::NSTopicsList *topicList = nsConsumer->getConsumerTopics();
898 if (topicList == nullptr)
900 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
903 jobject obj_topicList = getJavaTopicsList(env, topicList);
904 LOGD("JNIProviderService: nativeGetConsumerTopics - OUT");
905 return obj_topicList;
909 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
911 LOGD("ProviderService_JNI_OnLoad");
915 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
917 LOGE("Failed to get the environment using GetEnv()");
921 jclass localMessage = env->FindClass(
922 "org/iotivity/service/ns/common/Message");
925 LOGE("Failed to get local Message class");
928 g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));
931 LOGE("Failed to set Global Message reference");
935 jclass localMessageType = env->FindClass(
936 "org/iotivity/service/ns/common/Message$MessageType");
937 if (!localMessageType)
939 LOGE("Failed to get local Message Type class");
942 g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));
943 if (!g_cls_Message_Type)
945 LOGE("Failed to set Global Message Type reference");
949 jclass localConsumer = env->FindClass(
950 "org/iotivity/service/ns/provider/Consumer");
953 LOGE("Failed to get local Provider class");
956 g_cls_Consumer = (jclass) (env->NewGlobalRef(localConsumer));
959 LOGE("Failed to set Global Provider reference");
963 jclass localSyncInfo = env->FindClass(
964 "org/iotivity/service/ns/common/SyncInfo");
967 LOGE("Failed to get local SyncInfo class");
970 g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));
973 LOGE("Failed to set Global SyncInfo reference");
977 jclass localSyncType = env->FindClass(
978 "org/iotivity/service/ns/common/SyncInfo$SyncType");
981 LOGE("Failed to get local SyncType enum");
984 g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType));
987 LOGE("Failed to set Global SyncType reference");
991 jclass localMediaContents = env->FindClass(
992 "org/iotivity/service/ns/common/MediaContents");
993 if (!localMediaContents)
995 LOGE("Failed to get local MediaContents class");
998 g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));
999 if (!g_cls_MediaContents)
1001 LOGE("Failed to set Global MediaContents reference");
1005 jclass localTopic = env->FindClass(
1006 "org/iotivity/service/ns/common/Topic");
1009 LOGE("Failed to get local Topic class");
1012 g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));
1015 LOGE("Failed to set Global Topic reference");
1019 jclass localTopicsList = env->FindClass(
1020 "org/iotivity/service/ns/common/TopicsList");
1021 if (!localTopicsList)
1023 LOGE("Failed to get local Topic class");
1026 g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));
1027 if (!g_cls_TopicsList)
1029 LOGE("Failed to set Global TopicsList reference");
1033 jclass localTopicState = env->FindClass(
1034 "org/iotivity/service/ns/common/Topic$TopicState");
1035 if (!localTopicState)
1037 LOGE("Failed to get local TopicState enum");
1040 g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));
1041 if (!g_cls_TopicState)
1043 LOGE("Failed to set Global TopicState reference");
1047 env->DeleteLocalRef(localMessage);
1048 env->DeleteLocalRef(localMessageType);
1049 env->DeleteLocalRef(localConsumer);
1050 env->DeleteLocalRef(localSyncInfo);
1051 env->DeleteLocalRef(localSyncType);
1052 env->DeleteLocalRef(localMediaContents);
1053 env->DeleteLocalRef(localTopic);
1054 env->DeleteLocalRef(localTopicsList);
1055 env->DeleteLocalRef(localTopicState);
1057 return NSExceptionInit(env);
1060 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
1062 LOGD("ProviderService_JNI_OnUnload");
1065 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1067 LOGE("Failed to get the environment using GetEnv()");
1071 env->DeleteGlobalRef(g_cls_Message);
1072 env->DeleteGlobalRef(g_cls_Consumer);
1073 env->DeleteGlobalRef(g_cls_SyncInfo);
1074 env->DeleteGlobalRef(g_cls_SyncType);
1075 env->DeleteGlobalRef(g_cls_MediaContents);
1076 env->DeleteGlobalRef(g_cls_Message_Type);
1077 env->DeleteGlobalRef(g_cls_Topic);
1078 env->DeleteGlobalRef(g_cls_TopicsList);
1079 env->DeleteGlobalRef(g_cls_TopicState);