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"
23 #include "JniOcRepresentation.h"
25 static JavaVM *g_jvm_provider = NULL;
27 static jobject g_obj_subscriptionListener = NULL;
28 static jobject g_obj_syncListener = NULL;
31 jclass g_cls_Message_Type;
32 jclass g_cls_Consumer;
33 jclass g_cls_SyncInfo;
34 jclass g_cls_SyncType;
35 jclass g_cls_MediaContents;
37 jclass g_cls_TopicsList;
38 jclass g_cls_TopicState;
39 jclass g_cls_OcRepresentation;
40 jmethodID g_mid_OcRepresentation_N_ctor_bool = NULL;
42 static JNIEnv *GetJNIEnv(jint *ret)
46 *ret = g_jvm_provider->GetEnv((void **) &env, JNI_CURRENT_VERSION);
52 if (g_jvm_provider->AttachCurrentThread(&env, NULL) != JNI_OK)
54 LOGE ("Failed to get the environment");
62 LOGE ("JNI version is not supported");
64 LOGE ("Failed to get the environment");
69 OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg)
71 LOGD("JNIProviderService: getMessage - IN");
73 jclass cls = env->GetObjectClass( jMsg);
76 jclass cls_messageType = (jclass) (env->NewLocalRef(g_cls_Message_Type));
79 LOGE ("Failed to Get ObjectClass for Message Type");
82 jmethodID mid = env->GetMethodID(cls_messageType, "ordinal", "()I");
83 jfieldID fid_type = env->GetFieldID( cls, "mType",
84 "Lorg/iotivity/service/ns/common/Message$MessageType;");
87 LOGE("Error: jfieldID for message type is null");
90 jobject jobj = env->GetObjectField( jMsg, fid_type);
93 LOGE("Error: object of field Message Type is null");
96 jint jtype = env->CallIntMethod(jobj, mid);
97 OIC::Service::NSMessage::NSMessageType type = (OIC::Service::NSMessage::NSMessageType) jtype;
99 LOGD("Message Type: %ld\n", (long )type);
102 jfieldID fid_tm = env->GetFieldID( cls, "mTime", "Ljava/lang/String;");
105 LOGE("Error: jfieldID for message time is null");
108 jstring jtime = (jstring)env->GetObjectField( jMsg, fid_tm);
109 const char *time = "";
112 time = env->GetStringUTFChars( jtime, NULL);
116 LOGD("Info: messageTitle is null");
118 LOGD("Message Time: %s\n", time);
121 jfieldID fid_ttl = env->GetFieldID( cls, "mTTL", "J");
124 LOGE("Error: jfieldID for message ttl is null");
128 jlong jttl = (jlong) env->GetLongField( jMsg, fid_ttl);
130 LOGD("TTL: %d\n", ttl);
133 jfieldID fid_title = env->GetFieldID( cls, "mTitle", "Ljava/lang/String;");
134 if (fid_title == NULL)
136 LOGE("Error: jfieldID for message title is null");
139 jstring jmsgTitle = (jstring)env->GetObjectField( jMsg, fid_title);
140 const char *messageTitle = "";
143 messageTitle = env->GetStringUTFChars( jmsgTitle, NULL);
147 LOGD("Info: messageTitle is null");
149 LOGD("Message Title: %s\n", messageTitle);
151 // Message Content Text
152 jfieldID fid_body = env->GetFieldID( cls, "mContentText", "Ljava/lang/String;");
153 if (fid_body == NULL)
155 LOGE("Error: jfieldID for message context Text is null");
158 jstring jmsgBody = (jstring)env->GetObjectField( jMsg, fid_body);
159 const char *messageBody = "";
162 messageBody = env->GetStringUTFChars( jmsgBody, NULL);
166 LOGD("Info: messageBody is null");
168 LOGD("Message Body: %s\n", messageBody);
171 jfieldID fid_source = env->GetFieldID( cls, "mSourceName", "Ljava/lang/String;");
172 if (fid_source == NULL)
174 LOGE("Error: jfieldID for message source is null");
177 jstring jmsgSource = (jstring)env->GetObjectField( jMsg, fid_source);
178 const char *messageSource = "";
181 messageSource = env->GetStringUTFChars( jmsgSource, NULL);
185 LOGD("Info: messageSource is null");
187 LOGD("Message Source: %s\n", messageSource);
190 jfieldID fid_topic = env->GetFieldID( cls, "mTopic", "Ljava/lang/String;");
191 if (fid_topic == NULL)
193 LOGE("Error: jfieldID for topic is null");
196 jstring jtopic = (jstring)env->GetObjectField( jMsg, fid_topic);
197 const char *topic = "";
200 topic = env->GetStringUTFChars( jtopic, NULL);
204 LOGD("Info: topic is null");
206 LOGD("Topic : %s\n", topic);
208 // Message MediaContents
209 jfieldID fid_media = env->GetFieldID( cls, "mMediaContents",
210 "Lorg/iotivity/service/ns/common/MediaContents;");
211 if (fid_media == NULL)
213 LOGE("Error: jfieldID for MediaContents is null");
216 jobject jmedia = env->GetObjectField( jMsg, fid_media);
217 OIC::Service::NSMediaContents *media = nullptr;
220 LOGD("Info: jmedia object of MediaContents inside Message is null");
224 jclass cls_MediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
225 if (!cls_MediaContents)
227 LOGE ("Failed to Get ObjectClass for class MediaContents");
230 jfieldID fid_icon = env->GetFieldID( cls_MediaContents, "mIconImage", "Ljava/lang/String;");
231 if (fid_icon == NULL)
233 LOGE("Error: jfieldID for iconImage is null");
236 jstring jiconImage = (jstring)env->GetObjectField( jmedia, fid_icon);
237 const char *iconImage = "";
240 iconImage = env->GetStringUTFChars( jiconImage, NULL);
241 media = new OIC::Service::NSMediaContents(std::string(iconImage));
242 env->ReleaseStringUTFChars(jiconImage, iconImage);
246 LOGD("Info: iconImage is null");
248 env->DeleteLocalRef(cls_MediaContents);
249 LOGD("iconImage: %s\n", iconImage);
253 jfieldID fid_extraInfo = env->GetFieldID( cls, "mExtraInfo",
254 "Lorg/iotivity/base/OcRepresentation;");
255 if (fid_extraInfo == NULL)
257 LOGE("Error: jfieldID for mExtraInfo is null");
260 jobject jExtraInfo = env->GetObjectField( jMsg, fid_extraInfo);
261 OC::OCRepresentation *representation = nullptr;
262 if (jExtraInfo == NULL)
264 LOGE("Error: jExtraInfo object of Message is null");
268 representation = GetHandle<OC::OCRepresentation>(env, jExtraInfo);
269 if (env->ExceptionCheck())
271 LOGE("Failed to get native handle from OcRepresentation");
275 LOGE("Failed to get native object OcRepresentation");
279 OIC::Service::NSMessage *nsMsg;
280 jfieldID nativeHandle = env->GetFieldID(cls, "mNativeHandle", "J");
283 LOGE("Error: fieldID for mNativeHandle is null");
286 jlong jMessage = env->GetLongField(jMsg, nativeHandle);
289 LOGD ("calling sendMessage on mNativeHandle");
290 nsMsg = (OIC::Service::NSMessage *) (jMessage);
294 nsMsg = OIC::Service::NSProviderService::getInstance()->createMessage();
297 nsMsg->setType(type);
298 nsMsg->setTime(std::string(time));
300 nsMsg->setTitle(std::string(messageTitle));
301 nsMsg->setContentText(std::string(messageBody));
302 nsMsg->setSourceName(std::string(messageSource));
305 nsMsg->setMediaContents(media);
307 nsMsg->setTopic(std::string(topic));
308 if (representation != nullptr)
310 nsMsg->setExtraInfo(*representation);
313 env->DeleteLocalRef(cls_messageType);
317 env->ReleaseStringUTFChars(jtime, time);
321 env->ReleaseStringUTFChars(jmsgTitle, messageTitle);
325 env->ReleaseStringUTFChars(jmsgBody, messageBody);
329 env->ReleaseStringUTFChars(jmsgSource, messageSource);
333 env->ReleaseStringUTFChars(jtopic, topic);
336 LOGD("JNIProviderService: getMessage - OUT");
341 jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)
343 LOGD ("JNIProviderService: getJavaMessageType - IN");
346 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:
348 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
349 "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");
350 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
352 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:
354 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
355 "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");
356 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
358 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:
360 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
361 "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");
362 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
364 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:
366 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
367 "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");
368 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
373 LOGD ("JNIProviderService: getJavaMessageType - OUT");
377 jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
379 LOGD ("JNIProviderService: getJavaMessage - IN");
381 LOGD ("id : %llu\n", message->getMessageId());
382 LOGD ("title : %s\n", message->getTitle().c_str());
383 LOGD ("content : %s\n", message->getContentText().c_str());
384 LOGD ("source : %s\n", message->getSourceName().c_str());
386 jlong jMessageId = (jlong) message->getMessageId();
387 jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());
388 jstring jTitle = env->NewStringUTF(message->getTitle().c_str());
389 jstring jContentText = env->NewStringUTF(message->getContentText().c_str());
390 jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());
391 jstring jTopic = env->NewStringUTF(message->getTopic().c_str());
393 jstring jTime = env->NewStringUTF(message->getTime().c_str());
394 jlong jTTL = (jlong) message->getTTL();
396 jlong pMessage = (long) message;
398 jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));
401 LOGE ("Failed to Get ObjectClass for Message");
404 jmethodID mid_message = env->GetMethodID(
405 cls_message, "<init>",
406 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
409 LOGE ("Failed to Get MethodID for Message<init>");
412 jobject obj_message = env->NewObject(cls_message, mid_message,
413 jTitle, jContentText, jSourceName);
416 LOGE ("Failed to Get Java Object for Message");
419 jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");
420 if (!fid_nativeHandle)
422 LOGE("Failed to get nativeHandle for Message");
425 env->SetLongField(obj_message, fid_nativeHandle, pMessage);
427 jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");
430 LOGE("Failed to get field MessageID for Message");
433 env->SetLongField(obj_message, fid_messageId, jMessageId);
435 jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");
438 LOGE("Failed to get field ProviderID for Message");
441 env->SetObjectField(obj_message, fid_providerId, jProviderId);
443 jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");
446 LOGE("Failed to get field Time for Message");
449 env->SetObjectField(obj_message, fid_time, jTime);
451 jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");
454 LOGE("Failed to get field TTL for Message");
457 env->SetLongField(obj_message, fid_ttl, jTTL);
459 jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;");
462 LOGE("Failed to get mTopic for Message");
465 env->SetObjectField(obj_message, fid_topic, jTopic);
467 OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();
468 if (mediaCont != nullptr)
470 jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());
471 jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
472 if (!cls_mediaContents)
474 LOGE ("Failed to Get ObjectClass for MediaContents");
477 jmethodID mid_mediaContents = env->GetMethodID(
478 cls_mediaContents, "<init>", "(Ljava/lang/String;)V");
479 if (!mid_mediaContents)
481 LOGE ("Failed to Get MethodID for MediaContents<init>");
484 jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,
487 jfieldID fid_mediaContents = env->GetFieldID(cls_message, "mMediaContents",
488 "Lorg/iotivity/service/ns/common/MediaContents;");
489 if (!fid_mediaContents)
491 LOGE("Failed to get field mediaContents for Message");
494 env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);
498 jobject jType = getJavaMessageType(env, message->getType());
501 jfieldID fid_type = env->GetFieldID(cls_message, "mType",
502 "Lorg/iotivity/service/ns/common/Message$MessageType;");
505 LOGE("Failed to get field Type for Message");
508 env->SetObjectField(obj_message, fid_type, jType);
511 LOGD("Reading OCRepresentation Object from Native");
512 OC::OCRepresentation *ocRepresentation = new OC::OCRepresentation(message->getExtraInfo());
513 jlong handle = reinterpret_cast<jlong>(ocRepresentation);
514 jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool,
516 if (!jRepresentation)
518 LOGE("Failed to create OcRepresentation");
519 delete ocRepresentation;
523 LOGD("Created OCRepresentation Object from Native");
525 jfieldID fid_extraInfo = env->GetFieldID(cls_message, "mExtraInfo",
526 "Lorg/iotivity/base/OcRepresentation;");
529 LOGE("Failed to get mExtraInfo for Message");
530 delete ocRepresentation;
533 LOGD ("setting extraInfo field");
534 env->SetObjectField(obj_message, fid_extraInfo, jRepresentation);
536 env->DeleteLocalRef(cls_message);
537 LOGD ("JNIProviderService: getJavaMessage - OUT");
541 jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)
543 LOGD("JNIProviderService: getJavaTopicState - IN");
546 jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));
549 LOGE ("Failed to Get ObjectClass for TopicState Type");
555 case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED:
557 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
558 "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
559 return env->GetStaticObjectField(cls_topicState, fieldID);
561 case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:
563 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
564 "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
565 return env->GetStaticObjectField(cls_topicState, fieldID);
572 LOGD("JNIProviderService: getJavaTopicState - OUT");
576 jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
578 LOGD("JNIProviderService: getJavaTopicsList - IN");
579 jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));
582 LOGE ("Failed to Get ObjectClass for TopicsList");
585 jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");
588 LOGE ("Failed to Get MethodID for TopicsList<init>");
591 jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);
594 LOGE ("Failed to Get object for TopicsList");
597 jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic",
598 "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V");
601 LOGE ("Failed to Get MethodID for addTopic");
604 for (auto it : topicList->getTopicsList())
606 jobject jState = getJavaTopicState(env, it->getState());
607 std::string topicName = it->getTopicName();
608 jstring jTopicName = env->NewStringUTF(topicName.c_str());
609 env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);
611 env->DeleteLocalRef(cls_topicList);
612 LOGD("JNIProviderService: getJavaTopicsList - OUT");
613 return obj_topicList;
616 jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType)
618 LOGD ("JNIProviderService: getJavaSyncType - IN");
621 jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType));
624 LOGE ("Failed to Get ObjectClass for SyncType");
629 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD:
631 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
632 "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
633 return env->GetStaticObjectField(cls_SyncType, fieldID);
635 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ :
637 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
638 "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
639 return env->GetStaticObjectField(cls_SyncType, fieldID);
641 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED :
643 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
644 "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
645 return env->GetStaticObjectField(cls_SyncType, fieldID);
651 LOGD ("JNIProviderService: getJavaSyncType - OUT");
656 void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer)
658 LOGD("JNIProviderService_onSubscribeListenerCb - IN");
661 JNIEnv *env = GetJNIEnv(&envRet);
662 if (NULL == env) return ;
664 jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener);
665 if (!jSubscriptionListener)
667 LOGE ("Failed to Get jSubscriptionListener");
668 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
672 LOGD("consumer ID : %s\n", consumer->getConsumerId().c_str());
674 jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str());
676 jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer));
679 LOGE ("Failed to Get ObjectClass for Consumer");
680 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
684 jmethodID mid_consumer = env->GetMethodID(
687 "(Ljava/lang/String;)V");
690 LOGE ("Failed to Get MethodID for Consumer<init>");
691 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
694 jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId);
696 jclass cls = env->GetObjectClass( jSubscriptionListener);
699 LOGE("Failed to Get ObjectClass of jSubscriptionListener");
700 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
703 jmethodID mid = env->GetMethodID(
705 "onConsumerSubscribed",
706 "(Lorg/iotivity/service/ns/provider/Consumer;)V");
709 LOGE("Failed to Get MethodID of onConsumerSubscribed");
710 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
714 env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer);
715 env->DeleteLocalRef(jSubscriptionListener);
716 env->DeleteLocalRef(cls_consumer);
717 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
718 LOGD("JNIProviderService_onSubscribeListenerCb - OUT");
722 void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync)
724 LOGD("JNIProviderService_onSyncInfoListenerCb - IN");
727 JNIEnv *env = GetJNIEnv(&envRet);
728 if (NULL == env) return ;
730 jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);
733 LOGE ("Failed to Get jSyncListener");
734 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
738 LOGD("Sync ID : %ld\n", (long) sync->getMessageId());
739 LOGD("Sync STATE : %d\n", (int) sync->getState());
741 jlong jMessageId = (long) sync->getMessageId();
742 jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());
743 jobject syncType = getJavaSyncType(env, sync->getState());
746 LOGE ("Failed to Get syncType for SyncInfo");
747 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
750 jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo));
753 LOGE ("Failed to Get ObjectClass for SyncInfo");
754 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
757 jmethodID mid_syncInfo = env->GetMethodID(
760 "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V");
763 LOGE ("Failed to Get MethodID for SyncInfo");
764 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
768 jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo,
769 jMessageId, jProviderId, syncType);
772 LOGE ("Failed to Get Object for SyncInfo");
773 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
777 jclass cls = env->GetObjectClass( jSyncListener);
780 LOGE("Failed to Get ObjectClass");
781 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
784 jmethodID mid = env->GetMethodID(
786 "onMessageSynchronized",
787 "(Lorg/iotivity/service/ns/common/SyncInfo;)V");
790 LOGE("Failed to Get MethodID");
791 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
794 env->CallVoidMethod( jSyncListener, mid, obj_syncInfo);
796 env->DeleteLocalRef(jSyncListener);
797 env->DeleteLocalRef(cls_SyncInfo);
798 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
800 LOGD("JNIProviderService: OnSyncInfoListenerCb - OUT");
805 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStart
806 (JNIEnv *env, jobject jObj, jobject jSubscriptionListener, jobject jSyncListener,
807 jboolean jPolicy, jstring jUserInfo, jboolean jResourceSecurity)
809 LOGD("JNIProviderService: nativeStart - IN");
810 if (!jSubscriptionListener || !jSyncListener)
812 LOGE("Fail to set listeners");
813 ThrowNSException(NS_ERROR, "Listener cannot be null");
814 return (jint) OIC::Service::NSResult::ERROR;
817 if (g_obj_subscriptionListener != NULL)
819 env->DeleteGlobalRef(g_obj_subscriptionListener);
821 if (g_obj_syncListener != NULL)
823 env->DeleteGlobalRef(g_obj_syncListener);
826 g_obj_subscriptionListener = (jobject) env->NewGlobalRef(jSubscriptionListener);
827 g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);
829 // check access policy
831 OIC::Service::NSProviderService::ProviderConfig cfg;
832 cfg.m_subscribeRequestCb = onSubscribeListenerCb;
833 cfg.m_syncInfoCb = onSyncInfoListenerCb;
834 cfg.subControllability = (bool) jPolicy;
837 const char *info = env->GetStringUTFChars( jUserInfo, NULL);
838 std::string userInfo(info);
839 cfg.userInfo = userInfo;
841 cfg.resourceSecurity = (bool) jResourceSecurity;
843 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->start(cfg);
844 if (result != OIC::Service::NSResult::OK)
846 LOGE("Fail to start NSProviderService");
850 LOGD("JNIProviderService: nativeStart - OUT");
851 return (jint) result;
854 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStop
855 (JNIEnv *env, jobject jObj)
857 LOGD("JNIProviderService: nativeStop - IN");
859 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->stop();
860 if (result != OIC::Service::NSResult::OK)
862 LOGD("Fail to stop NSProvider service");
863 return (jint) result;
866 env->DeleteGlobalRef( g_obj_subscriptionListener);
867 env->DeleteGlobalRef( g_obj_syncListener);
868 g_obj_subscriptionListener = NULL;
869 g_obj_syncListener = NULL;
871 LOGD("JNIProviderService: nativeStop - OUT");
872 return (jint) result;
875 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendMessage
876 (JNIEnv *env, jobject jObj, jobject jMsg)
878 LOGD("JNIProviderService: nativeSendMessage - IN");
881 LOGD("Fail to send notification - Message is null");
882 ThrowNSException(NS_ERROR, "Message cannot be null");
883 return (jint) OIC::Service::NSResult::ERROR;
885 OIC::Service::NSMessage *nsMsg = getNativeMessage(env, jMsg);
886 if (nsMsg == nullptr)
888 ThrowNSException(NS_ERROR, "Message didn't have a field ID ");
889 return (jint) OIC::Service::NSResult::ERROR;
892 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->sendMessage(nsMsg);
893 if (result != OIC::Service::NSResult::OK)
895 LOGD("Fail to send NSProvider Message");
897 LOGD("JNIProviderService: nativeSendMessage - OUT");
898 return (jint) result;
901 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendSyncInfo
902 (JNIEnv *env, jobject jObj, jlong messageId , jint syncState)
904 LOGD("JNIProviderService: nativeSendSyncInfo - IN");
905 OIC::Service::NSProviderService::getInstance()->sendSyncInfo( messageId,
906 (OIC::Service::NSSyncInfo::NSSyncType) syncState);
907 LOGD("JNIProviderService: nativeSendSyncInfo - OUT");
911 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeCreateMessage
912 (JNIEnv *env, jobject jObj)
914 LOGD("JNIProviderService: nativeCreateMessage - IN");
915 OIC::Service::NSMessage *message =
916 OIC::Service::NSProviderService::getInstance()->createMessage();
917 if (message == nullptr)
919 ThrowNSException(NS_ERROR, "Couldn't get Native Message");
922 jobject jMsg = getJavaMessage(env, message);
925 ThrowNSException(NS_ERROR, "Couldn't create Java Message");
928 LOGD("JNIProviderService: nativeCreateMessage - OUT");
932 JNIEXPORT jint JNICALL
933 Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService
934 (JNIEnv *env, jobject jObj, jstring jstr)
936 LOGD("JNIProviderService: nativeEnableRemoteService - IN");
939 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
940 return (jint) OIC::Service::NSResult::ERROR;
943 const char *address = env->GetStringUTFChars( jstr, NULL);
944 std::string servAddress(address);
945 OIC::Service::NSResult result =
946 OIC::Service::NSProviderService::getInstance()->enableRemoteService(
948 if (result != OIC::Service::NSResult::OK)
950 LOGE("Fail to Enable Remote Service");
952 env->ReleaseStringUTFChars(jstr, address);
953 LOGD("JNIProviderService: nativeEnableRemoteService - OUT");
954 return (jint) result;
957 JNIEXPORT jint JNICALL
958 Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService
959 (JNIEnv *env, jobject jObj, jstring jstr)
961 LOGD("JNIProviderService: nativeDisableRemoteService - IN");
964 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
965 return (jint) OIC::Service::NSResult::ERROR;
968 const char *address = env->GetStringUTFChars( jstr, NULL);
969 std::string servAddress(address);
970 OIC::Service::NSResult result =
971 OIC::Service::NSProviderService::getInstance()->disableRemoteService(
973 if (result != OIC::Service::NSResult::OK)
975 LOGE("Fail to Disable Remote Service");
977 env->ReleaseStringUTFChars(jstr, address);
978 LOGD("JNIProviderService: nativeDisableRemoteService - OUT");
979 return (jint) result;
982 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeRegisterTopic
983 (JNIEnv *env, jobject jObj, jstring jTopicName)
985 LOGD("JNIProviderService: nativeRegisterTopic - IN");
988 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
989 return (jint) OIC::Service::NSResult::ERROR;
991 const char *name = env->GetStringUTFChars( jTopicName, NULL);
992 std::string topicName(name);
993 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->registerTopic(
995 if (result != OIC::Service::NSResult::OK)
997 LOGE("Fail to Register Topic");
999 env->ReleaseStringUTFChars(jTopicName, name);
1000 LOGD("JNIProviderService: nativeRegisterTopic - OUT");
1001 return (jint) result;
1003 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeUnregisterTopic
1004 (JNIEnv *env, jobject jObj, jstring jTopicName)
1006 LOGD("JNIProviderService: nativeUnregisterTopic - IN");
1009 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
1010 return (jint) OIC::Service::NSResult::ERROR;
1012 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1013 std::string topicName(name);
1014 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->unregisterTopic(
1016 if (result != OIC::Service::NSResult::OK)
1018 LOGE("Fail to Unregister Topic");
1020 env->ReleaseStringUTFChars(jTopicName, name);
1021 LOGD("JNIProviderService: nativeUnregisterTopic - OUT");
1022 return (jint) result;
1025 JNIEXPORT jobject JNICALL
1026 Java_org_iotivity_service_ns_provider_ProviderService_nativeGetRegisteredTopicList
1027 (JNIEnv *env, jobject jObj)
1029 LOGD("JNIProviderService: nativeGetRegisteredTopicList - IN");
1031 OIC::Service::NSTopicsList *topicList =
1032 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
1033 if (topicList == nullptr)
1035 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
1039 jobject obj_topicList = getJavaTopicsList(env, topicList);
1041 LOGD("JNIProviderService: nativeGetRegisteredTopicList - OUT");
1042 return obj_topicList;
1045 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription
1046 (JNIEnv *env, jobject jObj, jstring jConsumerId, jboolean jAccepted)
1048 LOGD("JNIProviderService: nativeAcceptSubscription - IN");
1051 ThrowNSException(NS_ERROR, "ConsumerId Can't be NULL");
1052 return (jint) OIC::Service::NSResult::ERROR;
1054 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1055 std::string consumerId(id);
1056 LOGD("Consumer ID: %s\n", consumerId.c_str());
1058 OIC::Service::NSConsumer *consumer =
1059 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1061 return (jint) consumer->acceptSubscription((bool)jAccepted);
1063 LOGE("Couldn't find consumer");
1064 LOGD("JNIProviderService: nativeAcceptSubscription - OUT");
1065 return (jint) OIC::Service::NSResult::ERROR;
1067 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSetConsumerTopic
1068 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
1070 LOGD("JNIProviderService: nativeSetConsumerTopic - IN");
1071 if (!jConsumerId || !jTopicName)
1073 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1074 return (jint) OIC::Service::NSResult::ERROR;
1076 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1077 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1078 std::string topicName(name);
1079 std::string consumerId(id);
1080 OIC::Service::NSConsumer *nsConsumer =
1081 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1084 ThrowNSException(NS_ERROR, "Consumer does exists");
1085 return (jint) OIC::Service::NSResult::ERROR;
1087 OIC::Service::NSResult result = nsConsumer->setTopic(topicName);
1089 if (result != OIC::Service::NSResult::OK)
1091 LOGD("Fail to Select Topic");
1093 env->ReleaseStringUTFChars(jTopicName, name);
1094 env->ReleaseStringUTFChars(jConsumerId, id);
1095 LOGD("JNIProviderService: nativeSetConsumerTopic - OUT");
1096 return (jint) result;
1098 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeUnsetConsumerTopic
1099 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
1101 LOGD("JNIProviderService: nativeUnsetConsumerTopic - IN");
1102 if (!jConsumerId || !jTopicName)
1104 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1105 return (jint) OIC::Service::NSResult::ERROR;
1107 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1108 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1109 std::string topicName(name);
1110 std::string consumerId(id);
1111 OIC::Service::NSConsumer *nsConsumer =
1112 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1115 ThrowNSException(NS_ERROR, "Consumer does exists");
1116 return (jint) OIC::Service::NSResult::ERROR;
1118 OIC::Service::NSResult result = nsConsumer->unsetTopic(topicName);
1120 if (result != OIC::Service::NSResult::OK)
1122 LOGE("Fail to Unselect Topic");
1124 env->ReleaseStringUTFChars(jTopicName, name);
1125 env->ReleaseStringUTFChars(jConsumerId, id);
1126 LOGD("JNIProviderService: nativeUnsetConsumerTopic - OUT");
1127 return (jint) result;
1130 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeGetConsumerTopicList
1131 (JNIEnv *env, jobject jObj, jstring jConsumerId)
1133 LOGD("JNIProviderService: nativeGetConsumerTopicList - IN");
1136 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1139 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1140 std::string consumerId(id);
1141 OIC::Service::NSConsumer *nsConsumer =
1142 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1145 ThrowNSException(NS_ERROR, "Consumer does exists");
1148 env->ReleaseStringUTFChars(jConsumerId, id);
1149 OIC::Service::NSTopicsList *topicList = nsConsumer->getConsumerTopicList();
1150 if (topicList == nullptr)
1152 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
1155 jobject obj_topicList = getJavaTopicsList(env, topicList);
1156 LOGD("JNIProviderService: nativeGetConsumerTopicList - OUT");
1157 return obj_topicList;
1161 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
1163 LOGD("ProviderService_JNI_OnLoad");
1164 g_jvm_provider = jvm;
1167 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1169 LOGE("Failed to get the environment using GetEnv()");
1173 jclass localMessage = env->FindClass(
1174 "org/iotivity/service/ns/common/Message");
1177 LOGE("Failed to get local Message class");
1180 g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));
1183 LOGE("Failed to set Global Message reference");
1187 jclass localMessageType = env->FindClass(
1188 "org/iotivity/service/ns/common/Message$MessageType");
1189 if (!localMessageType)
1191 LOGE("Failed to get local Message Type class");
1194 g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));
1195 if (!g_cls_Message_Type)
1197 LOGE("Failed to set Global Message Type reference");
1201 jclass localConsumer = env->FindClass(
1202 "org/iotivity/service/ns/provider/Consumer");
1205 LOGE("Failed to get local Provider class");
1208 g_cls_Consumer = (jclass) (env->NewGlobalRef(localConsumer));
1209 if (!g_cls_Consumer)
1211 LOGE("Failed to set Global Provider reference");
1215 jclass localSyncInfo = env->FindClass(
1216 "org/iotivity/service/ns/common/SyncInfo");
1219 LOGE("Failed to get local SyncInfo class");
1222 g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));
1223 if (!g_cls_SyncInfo)
1225 LOGE("Failed to set Global SyncInfo reference");
1229 jclass localSyncType = env->FindClass(
1230 "org/iotivity/service/ns/common/SyncInfo$SyncType");
1233 LOGE("Failed to get local SyncType enum");
1236 g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType));
1237 if (!g_cls_SyncType)
1239 LOGE("Failed to set Global SyncType reference");
1243 jclass localMediaContents = env->FindClass(
1244 "org/iotivity/service/ns/common/MediaContents");
1245 if (!localMediaContents)
1247 LOGE("Failed to get local MediaContents class");
1250 g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));
1251 if (!g_cls_MediaContents)
1253 LOGE("Failed to set Global MediaContents reference");
1257 jclass localTopic = env->FindClass(
1258 "org/iotivity/service/ns/common/Topic");
1261 LOGE("Failed to get local Topic class");
1264 g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));
1267 LOGE("Failed to set Global Topic reference");
1271 jclass localTopicsList = env->FindClass(
1272 "org/iotivity/service/ns/common/TopicsList");
1273 if (!localTopicsList)
1275 LOGE("Failed to get local Topic class");
1278 g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));
1279 if (!g_cls_TopicsList)
1281 LOGE("Failed to set Global TopicsList reference");
1285 jclass localTopicState = env->FindClass(
1286 "org/iotivity/service/ns/common/Topic$TopicState");
1287 if (!localTopicState)
1289 LOGE("Failed to get local TopicState enum");
1292 g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));
1293 if (!g_cls_TopicState)
1295 LOGE("Failed to set Global TopicState reference");
1300 jclass localOcRepresentation = env->FindClass("org/iotivity/base/OcRepresentation");
1301 if (!localOcRepresentation)
1303 LOGE("Failed to get local OcRepresentation class");
1306 g_cls_OcRepresentation = (jclass) env->NewGlobalRef(localOcRepresentation);
1307 if (!g_cls_OcRepresentation)
1309 LOGE("Failed to set Global OcRepresentation reference");
1313 g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
1314 if (!g_mid_OcRepresentation_N_ctor_bool)
1316 LOGE("Failed to get Global OcRepresentation Constructor reference");
1320 env->DeleteLocalRef(localMessage);
1321 env->DeleteLocalRef(localMessageType);
1322 env->DeleteLocalRef(localConsumer);
1323 env->DeleteLocalRef(localSyncInfo);
1324 env->DeleteLocalRef(localSyncType);
1325 env->DeleteLocalRef(localMediaContents);
1326 env->DeleteLocalRef(localTopic);
1327 env->DeleteLocalRef(localTopicsList);
1328 env->DeleteLocalRef(localTopicState);
1329 env->DeleteLocalRef(localOcRepresentation);
1331 return NSExceptionInit(env);
1334 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
1336 LOGD("ProviderService_JNI_OnUnload");
1339 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1341 LOGE("Failed to get the environment using GetEnv()");
1345 env->DeleteGlobalRef(g_cls_Message);
1346 env->DeleteGlobalRef(g_cls_Consumer);
1347 env->DeleteGlobalRef(g_cls_SyncInfo);
1348 env->DeleteGlobalRef(g_cls_SyncType);
1349 env->DeleteGlobalRef(g_cls_MediaContents);
1350 env->DeleteGlobalRef(g_cls_Message_Type);
1351 env->DeleteGlobalRef(g_cls_Topic);
1352 env->DeleteGlobalRef(g_cls_TopicsList);
1353 env->DeleteGlobalRef(g_cls_TopicState);
1354 env->DeleteGlobalRef(g_cls_OcRepresentation);