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 getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)
291 LOGD ("JNIProviderService: getJavaMessageType - IN");
294 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:
296 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
297 "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");
298 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
300 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:
302 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
303 "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");
304 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
306 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:
308 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
309 "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");
310 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
312 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:
314 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
315 "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");
316 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
321 LOGD ("JNIProviderService: getJavaMessageType - OUT");
325 jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
327 LOGD ("JNIProviderService: getJavaMessage - IN");
329 LOGD ("id : %llu\n", message->getMessageId());
330 LOGD ("title : %s\n", message->getTitle().c_str());
331 LOGD ("content : %s\n", message->getContentText().c_str());
332 LOGD ("source : %s\n", message->getSourceName().c_str());
334 jlong jMessageId = (jlong) message->getMessageId();
335 jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());
336 jstring jTitle = env->NewStringUTF(message->getTitle().c_str());
337 jstring jContentText = env->NewStringUTF(message->getContentText().c_str());
338 jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());
339 jstring jTopic = env->NewStringUTF(message->getTopic().c_str());
341 jstring jTime = env->NewStringUTF(message->getTime().c_str());
342 jlong jTTL = (jlong) message->getTTL();
344 jlong pMessage = (long) message;
346 jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));
349 LOGE ("Failed to Get ObjectClass for Message");
352 jmethodID mid_message = env->GetMethodID(
353 cls_message, "<init>",
354 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
357 LOGE ("Failed to Get MethodID for Message<init>");
360 jobject obj_message = env->NewObject(cls_message, mid_message,
361 jTitle, jContentText, jSourceName);
364 LOGE ("Failed to Get Java Object for Message");
367 jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");
368 if (!fid_nativeHandle)
370 LOGE("Failed to get nativeHandle for Message");
373 env->SetLongField(obj_message, fid_nativeHandle, pMessage);
375 jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");
378 LOGE("Failed to get field MessageID for Message");
381 env->SetLongField(obj_message, fid_messageId, jMessageId);
383 jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");
386 LOGE("Failed to get field ProviderID for Message");
389 env->SetObjectField(obj_message, fid_providerId, jProviderId);
391 jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");
394 LOGE("Failed to get field Time for Message");
397 env->SetObjectField(obj_message, fid_time, jTime);
399 jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");
402 LOGE("Failed to get field TTL for Message");
405 env->SetLongField(obj_message, fid_ttl, jTTL);
407 jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;");
410 LOGE("Failed to get mTopic for Message");
413 env->SetObjectField(obj_message, fid_topic, jTopic);
415 OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();
416 if (mediaCont != nullptr)
418 jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());
419 jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
420 if (!cls_mediaContents)
422 LOGE ("Failed to Get ObjectClass for MediaContents");
425 jmethodID mid_mediaContents = env->GetMethodID(
426 cls_mediaContents, "<init>", "(Ljava/lang/String;)V");
427 if (!mid_mediaContents)
429 LOGE ("Failed to Get MethodID for MediaContents<init>");
432 jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,
435 jfieldID fid_mediaContents = env->GetFieldID(cls_message, "mMediaContents",
436 "Lorg/iotivity/service/ns/common/MediaContents;");
437 if (!fid_mediaContents)
439 LOGE("Failed to get field mediaContents for Message");
442 env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);
446 jobject jType = getJavaMessageType(env, message->getType());
449 jfieldID fid_type = env->GetFieldID(cls_message, "mType",
450 "Lorg/iotivity/service/ns/common/Message$MessageType;");
453 LOGE("Failed to get field Type for Message");
456 env->SetObjectField(obj_message, fid_type, jType);
459 env->DeleteLocalRef(cls_message);
460 LOGD ("JNIProviderService: getJavaMessage - OUT");
464 jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)
466 LOGD("JNIProviderService: getJavaTopicState - IN");
469 jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));
472 LOGE ("Failed to Get ObjectClass for TopicState Type");
476 jobject obj_topicState;
479 case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED:
481 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
482 "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
483 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);
485 case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:
487 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
488 "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
489 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);
493 if (obj_topicState == NULL)
495 LOGE("Error: object of field TopicState is null");
497 env->DeleteLocalRef(cls_topicState);
498 LOGD("JNIProviderService: getJavaTopicState - OUT");
499 return obj_topicState;
502 jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
504 LOGD("JNIProviderService: getJavaTopicsList - IN");
505 jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));
508 LOGE ("Failed to Get ObjectClass for TopicsList");
511 jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");
514 LOGE ("Failed to Get MethodID for TopicsList<init>");
517 jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);
520 LOGE ("Failed to Get object for TopicsList");
523 jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic",
524 "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V");
527 LOGE ("Failed to Get MethodID for addTopic");
530 for (auto it : topicList->getTopicsList())
532 jobject jState = getJavaTopicState(env, it->getState());
533 std::string topicName = it->getTopicName();
534 jstring jTopicName = env->NewStringUTF(topicName.c_str());
535 env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);
537 env->DeleteLocalRef(cls_topicList);
538 LOGD("JNIProviderService: getJavaTopicsList - OUT");
539 return obj_topicList;
542 jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType)
544 LOGD ("JNIProviderService: getJavaSyncType - IN");
547 jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType));
550 LOGE ("Failed to Get ObjectClass for SyncType");
556 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD:
558 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
559 "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
560 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
562 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ :
564 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
565 "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
566 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
568 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED :
570 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
571 "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
572 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
577 if (syncType == NULL)
579 LOGE("Error: object of field Synctype is null");
582 env->DeleteLocalRef(cls_SyncType);
583 LOGD ("JNIProviderService: getJavaSyncType - OUT");
588 void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer)
590 LOGD("JNIProviderService_onSubscribeListenerCb - IN");
593 JNIEnv *env = GetJNIEnv(&envRet);
594 if (NULL == env) return ;
596 jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener);
597 if (!jSubscriptionListener)
599 LOGE ("Failed to Get jSubscriptionListener");
600 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
604 LOGD("consumer ID : %s\n", consumer->getConsumerId().c_str());
606 jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str());
608 jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer));
611 LOGE ("Failed to Get ObjectClass for Consumer");
612 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
616 jmethodID mid_consumer = env->GetMethodID(
619 "(Ljava/lang/String;)V");
622 LOGE ("Failed to Get MethodID for Consumer<init>");
623 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
626 jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId);
628 jclass cls = env->GetObjectClass( jSubscriptionListener);
631 LOGE("Failed to Get ObjectClass of jSubscriptionListener");
632 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
635 jmethodID mid = env->GetMethodID(
637 "onConsumerSubscribed",
638 "(Lorg/iotivity/service/ns/provider/Consumer;)V");
641 LOGE("Failed to Get MethodID of onConsumerSubscribed");
642 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
646 env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer);
647 env->DeleteLocalRef(jSubscriptionListener);
648 env->DeleteLocalRef(cls_consumer);
649 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
650 LOGD("JNIProviderService_onSubscribeListenerCb - OUT");
654 void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync)
656 LOGD("JNIProviderService_onSyncInfoListenerCb - IN");
659 JNIEnv *env = GetJNIEnv(&envRet);
660 if (NULL == env) return ;
662 jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);
665 LOGE ("Failed to Get jSyncListener");
666 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
670 LOGD("Sync ID : %ld\n", (long) sync->getMessageId());
671 LOGD("Sync STATE : %d\n", (int) sync->getState());
673 jlong jMessageId = (long) sync->getMessageId();
674 jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());
675 jobject syncType = getJavaSyncType(env, sync->getState());
678 LOGE ("Failed to Get syncType for SyncInfo");
679 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
682 jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo));
685 LOGE ("Failed to Get ObjectClass for SyncInfo");
686 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
689 jmethodID mid_syncInfo = env->GetMethodID(
692 "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V");
695 LOGE ("Failed to Get MethodID for SyncInfo");
696 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
700 jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo,
701 jMessageId, jProviderId, syncType);
704 LOGE ("Failed to Get Object for SyncInfo");
705 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
709 jclass cls = env->GetObjectClass( jSyncListener);
712 LOGE("Failed to Get ObjectClass");
713 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
716 jmethodID mid = env->GetMethodID(
718 "onMessageSynchronized",
719 "(Lorg/iotivity/service/ns/common/SyncInfo;)V");
722 LOGE("Failed to Get MethodID");
723 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
726 env->CallVoidMethod( jSyncListener, mid, obj_syncInfo);
728 env->DeleteLocalRef(jSyncListener);
729 env->DeleteLocalRef(cls_SyncInfo);
730 if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
732 LOGD("JNIProviderService: OnSyncInfoListenerCb - OUT");
737 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStart
738 (JNIEnv *env, jobject jObj, jobject jSubscriptionListener, jobject jSyncListener, jboolean jPolicy, jstring jUserInfo)
740 LOGD("JNIProviderService: nativeStart - IN");
741 if (!jSubscriptionListener || !jSyncListener)
743 LOGE("Fail to set listeners");
744 ThrowNSException(NS_ERROR, "Listener cannot be null");
745 return (jint) OIC::Service::NSResult::ERROR;
748 if (g_obj_subscriptionListener != NULL)
750 env->DeleteGlobalRef(g_obj_subscriptionListener);
752 if (g_obj_syncListener != NULL)
754 env->DeleteGlobalRef(g_obj_syncListener);
757 g_obj_subscriptionListener = (jobject) env->NewGlobalRef(jSubscriptionListener);
758 g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);
760 // check access policy
762 OIC::Service::NSProviderService::ProviderConfig cfg;
763 cfg.m_subscribeRequestCb = onSubscribeListenerCb;
764 cfg.m_syncInfoCb = onSyncInfoListenerCb;
765 cfg.subControllability = (bool) jPolicy;
768 const char *info = env->GetStringUTFChars( jUserInfo, NULL);
769 std::string userInfo(info);
770 cfg.userInfo = userInfo;
773 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->start(cfg);
774 if (result != OIC::Service::NSResult::OK)
776 LOGE("Fail to start NSProviderService");
780 LOGD("JNIProviderService: nativeStart - OUT");
781 return (jint) result;
784 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStop
785 (JNIEnv *env, jobject jObj)
787 LOGD("JNIProviderService: nativeStop - IN");
789 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->stop();
790 if (result != OIC::Service::NSResult::OK)
792 LOGD("Fail to stop NSProvider service");
793 return (jint) result;
796 env->DeleteGlobalRef( g_obj_subscriptionListener);
797 env->DeleteGlobalRef( g_obj_syncListener);
798 g_obj_subscriptionListener = NULL;
799 g_obj_syncListener = NULL;
801 LOGD("JNIProviderService: nativeStop - OUT");
802 return (jint) result;
805 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendMessage
806 (JNIEnv *env, jobject jObj, jobject jMsg)
808 LOGD("JNIProviderService: nativeSendMessage - IN");
811 LOGD("Fail to send notification - Message is null");
812 ThrowNSException(NS_ERROR, "Message cannot be null");
813 return (jint) OIC::Service::NSResult::ERROR;
815 OIC::Service::NSMessage *nsMsg = getNativeMessage(env, jMsg);
816 if (nsMsg == nullptr)
818 ThrowNSException(NS_ERROR, "Message didn't have a field ID ");
819 return (jint) OIC::Service::NSResult::ERROR;
822 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->sendMessage(nsMsg);
823 if (result != OIC::Service::NSResult::OK)
825 LOGD("Fail to send NSProvider Message");
827 LOGD("JNIProviderService: nativeSendMessage - OUT");
828 return (jint) result;
831 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendSyncInfo
832 (JNIEnv *env, jobject jObj, jlong messageId , jint syncState)
834 LOGD("JNIProviderService: nativeSendSyncInfo - IN");
835 OIC::Service::NSProviderService::getInstance()->sendSyncInfo( messageId,
836 (OIC::Service::NSSyncInfo::NSSyncType) syncState);
837 LOGD("JNIProviderService: nativeSendSyncInfo - OUT");
841 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeCreateMessage
842 (JNIEnv *env, jobject jObj)
844 LOGD("JNIProviderService: nativeCreateMessage - IN");
845 OIC::Service::NSMessage* message =
846 OIC::Service::NSProviderService::getInstance()->createMessage();
847 if(message == nullptr)
849 ThrowNSException(NS_ERROR, "Couldn't get Native Message");
852 jobject jMsg = getJavaMessage(env, message);
855 ThrowNSException(NS_ERROR, "Couldn't create Java Message");
858 LOGD("JNIProviderService: nativeCreateMessage - OUT");
862 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService
863 (JNIEnv *env,jobject jObj, jstring jstr)
865 LOGD("JNIProviderService: nativeEnableRemoteService - IN");
868 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
869 return (jint) OIC::Service::NSResult::ERROR;
872 const char *address = env->GetStringUTFChars( jstr, NULL);
873 std::string servAddress(address);
874 OIC::Service::NSResult result =
875 OIC::Service::NSProviderService::getInstance()->enableRemoteService(
877 if (result != OIC::Service::NSResult::OK)
879 LOGE("Fail to Enable Remote Service");
881 env->ReleaseStringUTFChars(jstr, address);
882 LOGD("JNIProviderService: nativeEnableRemoteService - OUT");
883 return (jint) result;
886 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService
887 (JNIEnv *env,jobject jObj, jstring jstr)
889 LOGD("JNIProviderService: nativeDisableRemoteService - IN");
892 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
893 return (jint) OIC::Service::NSResult::ERROR;
896 const char *address = env->GetStringUTFChars( jstr, NULL);
897 std::string servAddress(address);
898 OIC::Service::NSResult result =
899 OIC::Service::NSProviderService::getInstance()->disableRemoteService(
901 if (result != OIC::Service::NSResult::OK)
903 LOGE("Fail to Disable Remote Service");
905 env->ReleaseStringUTFChars(jstr, address);
906 LOGD("JNIProviderService: nativeDisableRemoteService - OUT");
907 return (jint) result;
910 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeRegisterTopic
911 (JNIEnv *env, jobject jObj, jstring jTopicName)
913 LOGD("JNIProviderService: nativeRegisterTopic - IN");
916 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
917 return (jint) OIC::Service::NSResult::ERROR;
919 const char *name = env->GetStringUTFChars( jTopicName, NULL);
920 std::string topicName(name);
921 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->registerTopic(
923 if (result != OIC::Service::NSResult::OK)
925 LOGE("Fail to Register Topic");
927 env->ReleaseStringUTFChars(jTopicName, name);
928 LOGD("JNIProviderService: nativeRegisterTopic - OUT");
929 return (jint) result;
931 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeUnregisterTopic
932 (JNIEnv *env, jobject jObj, jstring jTopicName)
934 LOGD("JNIProviderService: nativeUnregisterTopic - IN");
937 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
938 return (jint) OIC::Service::NSResult::ERROR;
940 const char *name = env->GetStringUTFChars( jTopicName, NULL);
941 std::string topicName(name);
942 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->unregisterTopic(
944 if (result != OIC::Service::NSResult::OK)
946 LOGE("Fail to Unregister Topic");
948 env->ReleaseStringUTFChars(jTopicName, name);
949 LOGD("JNIProviderService: nativeUnregisterTopic - OUT");
950 return (jint) result;
953 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeGetRegisteredTopicList
954 (JNIEnv *env, jobject jObj)
956 LOGD("JNIProviderService: nativeGetRegisteredTopicList - IN");
958 OIC::Service::NSTopicsList *topicList =
959 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
960 if (topicList == nullptr)
962 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
966 jobject obj_topicList = getJavaTopicsList(env, topicList);
968 LOGD("JNIProviderService: nativeGetRegisteredTopicList - OUT");
969 return obj_topicList;
972 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription
973 (JNIEnv *env, jobject jObj, jstring jConsumerId, jboolean jAccepted)
975 LOGD("JNIProviderService: nativeAcceptSubscription - IN");
978 ThrowNSException(NS_ERROR, "ConsumerId Can't be NULL");
979 return (jint) OIC::Service::NSResult::ERROR;
981 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
982 std::string consumerId(id);
983 LOGD("Consumer ID: %s\n", consumerId.c_str());
985 OIC::Service::NSConsumer *consumer =
986 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
988 return (jint) consumer->acceptSubscription((bool)jAccepted);
990 LOGE("Couldn't find consumer");
991 LOGD("JNIProviderService: nativeAcceptSubscription - OUT");
992 return (jint) OIC::Service::NSResult::ERROR;
994 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSetConsumerTopic
995 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
997 LOGD("JNIProviderService: nativeSetConsumerTopic - IN");
998 if (!jConsumerId || !jTopicName)
1000 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1001 return (jint) OIC::Service::NSResult::ERROR;
1003 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1004 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1005 std::string topicName(name);
1006 std::string consumerId(id);
1007 OIC::Service::NSConsumer *nsConsumer =
1008 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1011 ThrowNSException(NS_ERROR, "Consumer does exists");
1012 return (jint) OIC::Service::NSResult::ERROR;
1014 OIC::Service::NSResult result = nsConsumer->setTopic(topicName);
1016 if (result != OIC::Service::NSResult::OK)
1018 LOGD("Fail to Select Topic");
1020 env->ReleaseStringUTFChars(jTopicName, name);
1021 env->ReleaseStringUTFChars(jConsumerId, id);
1022 LOGD("JNIProviderService: nativeSetConsumerTopic - OUT");
1023 return (jint) result;
1025 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeUnsetConsumerTopic
1026 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
1028 LOGD("JNIProviderService: nativeUnsetConsumerTopic - IN");
1029 if (!jConsumerId || !jTopicName)
1031 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1032 return (jint) OIC::Service::NSResult::ERROR;
1034 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1035 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1036 std::string topicName(name);
1037 std::string consumerId(id);
1038 OIC::Service::NSConsumer *nsConsumer =
1039 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1042 ThrowNSException(NS_ERROR, "Consumer does exists");
1043 return (jint) OIC::Service::NSResult::ERROR;
1045 OIC::Service::NSResult result = nsConsumer->unsetTopic(topicName);
1047 if (result != OIC::Service::NSResult::OK)
1049 LOGE("Fail to Unselect Topic");
1051 env->ReleaseStringUTFChars(jTopicName, name);
1052 env->ReleaseStringUTFChars(jConsumerId, id);
1053 LOGD("JNIProviderService: nativeUnsetConsumerTopic - OUT");
1054 return (jint) result;
1057 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeGetConsumerTopicList
1058 (JNIEnv *env, jobject jObj, jstring jConsumerId)
1060 LOGD("JNIProviderService: nativeGetConsumerTopicList - IN");
1063 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1066 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1067 std::string consumerId(id);
1068 OIC::Service::NSConsumer *nsConsumer =
1069 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1072 ThrowNSException(NS_ERROR, "Consumer does exists");
1075 env->ReleaseStringUTFChars(jConsumerId, id);
1076 OIC::Service::NSTopicsList *topicList = nsConsumer->getConsumerTopicList();
1077 if (topicList == nullptr)
1079 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
1082 jobject obj_topicList = getJavaTopicsList(env, topicList);
1083 LOGD("JNIProviderService: nativeGetConsumerTopicList - OUT");
1084 return obj_topicList;
1088 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
1090 LOGD("ProviderService_JNI_OnLoad");
1094 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1096 LOGE("Failed to get the environment using GetEnv()");
1100 jclass localMessage = env->FindClass(
1101 "org/iotivity/service/ns/common/Message");
1104 LOGE("Failed to get local Message class");
1107 g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));
1110 LOGE("Failed to set Global Message reference");
1114 jclass localMessageType = env->FindClass(
1115 "org/iotivity/service/ns/common/Message$MessageType");
1116 if (!localMessageType)
1118 LOGE("Failed to get local Message Type class");
1121 g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));
1122 if (!g_cls_Message_Type)
1124 LOGE("Failed to set Global Message Type reference");
1128 jclass localConsumer = env->FindClass(
1129 "org/iotivity/service/ns/provider/Consumer");
1132 LOGE("Failed to get local Provider class");
1135 g_cls_Consumer = (jclass) (env->NewGlobalRef(localConsumer));
1136 if (!g_cls_Consumer)
1138 LOGE("Failed to set Global Provider reference");
1142 jclass localSyncInfo = env->FindClass(
1143 "org/iotivity/service/ns/common/SyncInfo");
1146 LOGE("Failed to get local SyncInfo class");
1149 g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));
1150 if (!g_cls_SyncInfo)
1152 LOGE("Failed to set Global SyncInfo reference");
1156 jclass localSyncType = env->FindClass(
1157 "org/iotivity/service/ns/common/SyncInfo$SyncType");
1160 LOGE("Failed to get local SyncType enum");
1163 g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType));
1164 if (!g_cls_SyncType)
1166 LOGE("Failed to set Global SyncType reference");
1170 jclass localMediaContents = env->FindClass(
1171 "org/iotivity/service/ns/common/MediaContents");
1172 if (!localMediaContents)
1174 LOGE("Failed to get local MediaContents class");
1177 g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));
1178 if (!g_cls_MediaContents)
1180 LOGE("Failed to set Global MediaContents reference");
1184 jclass localTopic = env->FindClass(
1185 "org/iotivity/service/ns/common/Topic");
1188 LOGE("Failed to get local Topic class");
1191 g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));
1194 LOGE("Failed to set Global Topic reference");
1198 jclass localTopicsList = env->FindClass(
1199 "org/iotivity/service/ns/common/TopicsList");
1200 if (!localTopicsList)
1202 LOGE("Failed to get local Topic class");
1205 g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));
1206 if (!g_cls_TopicsList)
1208 LOGE("Failed to set Global TopicsList reference");
1212 jclass localTopicState = env->FindClass(
1213 "org/iotivity/service/ns/common/Topic$TopicState");
1214 if (!localTopicState)
1216 LOGE("Failed to get local TopicState enum");
1219 g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));
1220 if (!g_cls_TopicState)
1222 LOGE("Failed to set Global TopicState reference");
1226 env->DeleteLocalRef(localMessage);
1227 env->DeleteLocalRef(localMessageType);
1228 env->DeleteLocalRef(localConsumer);
1229 env->DeleteLocalRef(localSyncInfo);
1230 env->DeleteLocalRef(localSyncType);
1231 env->DeleteLocalRef(localMediaContents);
1232 env->DeleteLocalRef(localTopic);
1233 env->DeleteLocalRef(localTopicsList);
1234 env->DeleteLocalRef(localTopicState);
1236 return NSExceptionInit(env);
1239 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
1241 LOGD("ProviderService_JNI_OnUnload");
1244 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1246 LOGE("Failed to get the environment using GetEnv()");
1250 env->DeleteGlobalRef(g_cls_Message);
1251 env->DeleteGlobalRef(g_cls_Consumer);
1252 env->DeleteGlobalRef(g_cls_SyncInfo);
1253 env->DeleteGlobalRef(g_cls_SyncType);
1254 env->DeleteGlobalRef(g_cls_MediaContents);
1255 env->DeleteGlobalRef(g_cls_Message_Type);
1256 env->DeleteGlobalRef(g_cls_Topic);
1257 env->DeleteGlobalRef(g_cls_TopicsList);
1258 env->DeleteGlobalRef(g_cls_TopicState);