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");
127 jlong jttl = (jlong) env->GetObjectField( jMsg, fid_ttl);
130 LOGD("Message ID: %lld\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);
219 LOGE("Error: jmedia object of MediaContents inside Message is null");
222 jclass cls_MediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
223 if (!cls_MediaContents)
225 LOGE ("Failed to Get ObjectClass for class MediaContents");
228 jfieldID fid_icon = env->GetFieldID( cls_MediaContents, "mIconImage", "Ljava/lang/String;");
229 if (fid_icon == NULL)
231 LOGE("Error: jfieldID for iconImage is null");
234 jstring jiconImage = (jstring)env->GetObjectField( jmedia, fid_icon);
235 const char *iconImage = "";
238 iconImage = env->GetStringUTFChars( jiconImage, NULL);
242 LOGD("Info: iconImage is null");
245 LOGD("iconImage: %s\n", iconImage);
248 jfieldID fid_extraInfo = env->GetFieldID( cls, "mExtraInfo",
249 "Lorg/iotivity/base/OcRepresentation;");
250 if (fid_extraInfo == NULL)
252 LOGE("Error: jfieldID for mExtraInfo is null");
255 jobject jExtraInfo = env->GetObjectField( jMsg, fid_extraInfo);
256 OC::OCRepresentation *representation = nullptr;
257 if (jExtraInfo == NULL)
259 LOGE("Error: jExtraInfo object of Message is null");
263 representation = GetHandle<OC::OCRepresentation>(env, jExtraInfo);
264 if (env->ExceptionCheck())
266 LOGE("Failed to get native handle from OcRepresentation");
270 LOGE("Failed to get native object OcRepresentation");
273 OIC::Service::NSMediaContents *media = new OIC::Service::NSMediaContents(std::string(iconImage));
274 OIC::Service::NSMessage *nsMsg = OIC::Service::NSProviderService::getInstance()->createMessage();
276 nsMsg->setType(type);
277 nsMsg->setTime(std::string(time));
279 nsMsg->setTitle(std::string(messageTitle));
280 nsMsg->setContentText(std::string(messageBody));
281 nsMsg->setSourceName(std::string(messageSource));
282 nsMsg->setMediaContents(media);
283 nsMsg->setTopic(std::string(topic));
284 if (representation != nullptr)
286 nsMsg->setExtraInfo(*representation);
289 env->DeleteLocalRef(cls_messageType);
290 env->DeleteLocalRef(cls_MediaContents);
294 env->ReleaseStringUTFChars(jtime, time);
298 env->ReleaseStringUTFChars(jmsgTitle, messageTitle);
302 env->ReleaseStringUTFChars(jmsgBody, messageBody);
306 env->ReleaseStringUTFChars(jmsgSource, messageSource);
310 env->ReleaseStringUTFChars(jtopic, topic);
314 env->ReleaseStringUTFChars(jiconImage, iconImage);
317 LOGD("JNIProviderService: getMessage - OUT");
322 jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)
324 LOGD ("JNIProviderService: getJavaMessageType - IN");
327 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:
329 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
330 "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");
331 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
333 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:
335 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
336 "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");
337 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
339 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:
341 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
342 "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");
343 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
345 case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:
347 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,
348 "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");
349 return env->GetStaticObjectField(g_cls_Message_Type, fieldID);
354 LOGD ("JNIProviderService: getJavaMessageType - OUT");
358 jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
360 LOGD ("JNIProviderService: getJavaMessage - IN");
362 LOGD ("id : %llu\n", message->getMessageId());
363 LOGD ("title : %s\n", message->getTitle().c_str());
364 LOGD ("content : %s\n", message->getContentText().c_str());
365 LOGD ("source : %s\n", message->getSourceName().c_str());
367 jlong jMessageId = (jlong) message->getMessageId();
368 jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());
369 jstring jTitle = env->NewStringUTF(message->getTitle().c_str());
370 jstring jContentText = env->NewStringUTF(message->getContentText().c_str());
371 jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());
372 jstring jTopic = env->NewStringUTF(message->getTopic().c_str());
374 jstring jTime = env->NewStringUTF(message->getTime().c_str());
375 jlong jTTL = (jlong) message->getTTL();
377 jlong pMessage = (long) message;
379 jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));
382 LOGE ("Failed to Get ObjectClass for Message");
385 jmethodID mid_message = env->GetMethodID(
386 cls_message, "<init>",
387 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
390 LOGE ("Failed to Get MethodID for Message<init>");
393 jobject obj_message = env->NewObject(cls_message, mid_message,
394 jTitle, jContentText, jSourceName);
397 LOGE ("Failed to Get Java Object for Message");
400 jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");
401 if (!fid_nativeHandle)
403 LOGE("Failed to get nativeHandle for Message");
406 env->SetLongField(obj_message, fid_nativeHandle, pMessage);
408 jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");
411 LOGE("Failed to get field MessageID for Message");
414 env->SetLongField(obj_message, fid_messageId, jMessageId);
416 jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");
419 LOGE("Failed to get field ProviderID for Message");
422 env->SetObjectField(obj_message, fid_providerId, jProviderId);
424 jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");
427 LOGE("Failed to get field Time for Message");
430 env->SetObjectField(obj_message, fid_time, jTime);
432 jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");
435 LOGE("Failed to get field TTL for Message");
438 env->SetLongField(obj_message, fid_ttl, jTTL);
440 jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;");
443 LOGE("Failed to get mTopic for Message");
446 env->SetObjectField(obj_message, fid_topic, jTopic);
448 OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();
449 if (mediaCont != nullptr)
451 jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());
452 jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));
453 if (!cls_mediaContents)
455 LOGE ("Failed to Get ObjectClass for MediaContents");
458 jmethodID mid_mediaContents = env->GetMethodID(
459 cls_mediaContents, "<init>", "(Ljava/lang/String;)V");
460 if (!mid_mediaContents)
462 LOGE ("Failed to Get MethodID for MediaContents<init>");
465 jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,
468 jfieldID fid_mediaContents = env->GetFieldID(cls_message, "mMediaContents",
469 "Lorg/iotivity/service/ns/common/MediaContents;");
470 if (!fid_mediaContents)
472 LOGE("Failed to get field mediaContents for Message");
475 env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);
479 jobject jType = getJavaMessageType(env, message->getType());
482 jfieldID fid_type = env->GetFieldID(cls_message, "mType",
483 "Lorg/iotivity/service/ns/common/Message$MessageType;");
486 LOGE("Failed to get field Type for Message");
489 env->SetObjectField(obj_message, fid_type, jType);
492 LOGD("Reading OCRepresentation Object from Native");
493 OC::OCRepresentation *ocRepresentation = new OC::OCRepresentation(message->getExtraInfo());
494 jlong handle = reinterpret_cast<jlong>(ocRepresentation);
495 jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool,
497 if (!jRepresentation)
499 LOGE("Failed to create OcRepresentation");
500 delete ocRepresentation;
504 LOGD("Created OCRepresentation Object from Native");
506 jfieldID fid_extraInfo = env->GetFieldID(cls_message, "mExtraInfo",
507 "Lorg/iotivity/base/OcRepresentation;");
510 LOGE("Failed to get mExtraInfo for Message");
511 delete ocRepresentation;
514 LOGD ("setting extraInfo field");
515 env->SetObjectField(obj_message, fid_extraInfo, jRepresentation);
517 env->DeleteLocalRef(cls_message);
518 LOGD ("JNIProviderService: getJavaMessage - OUT");
522 jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)
524 LOGD("JNIProviderService: getJavaTopicState - IN");
527 jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));
530 LOGE ("Failed to Get ObjectClass for TopicState Type");
534 jobject obj_topicState;
537 case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED:
539 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
540 "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
541 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);
543 case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:
545 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,
546 "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");
547 obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);
551 if (obj_topicState == NULL)
553 LOGE("Error: object of field TopicState is null");
555 env->DeleteLocalRef(cls_topicState);
556 LOGD("JNIProviderService: getJavaTopicState - OUT");
557 return obj_topicState;
560 jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)
562 LOGD("JNIProviderService: getJavaTopicsList - IN");
563 jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));
566 LOGE ("Failed to Get ObjectClass for TopicsList");
569 jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");
572 LOGE ("Failed to Get MethodID for TopicsList<init>");
575 jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);
578 LOGE ("Failed to Get object for TopicsList");
581 jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic",
582 "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V");
585 LOGE ("Failed to Get MethodID for addTopic");
588 for (auto it : topicList->getTopicsList())
590 jobject jState = getJavaTopicState(env, it->getState());
591 std::string topicName = it->getTopicName();
592 jstring jTopicName = env->NewStringUTF(topicName.c_str());
593 env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);
595 env->DeleteLocalRef(cls_topicList);
596 LOGD("JNIProviderService: getJavaTopicsList - OUT");
597 return obj_topicList;
600 jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType)
602 LOGD ("JNIProviderService: getJavaSyncType - IN");
605 jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType));
608 LOGE ("Failed to Get ObjectClass for SyncType");
614 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD:
616 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
617 "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
618 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
620 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ :
622 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
623 "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
624 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
626 case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED :
628 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,
629 "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");
630 syncType = env->GetStaticObjectField(cls_SyncType, fieldID);
635 if (syncType == NULL)
637 LOGE("Error: object of field Synctype is null");
640 env->DeleteLocalRef(cls_SyncType);
641 LOGD ("JNIProviderService: getJavaSyncType - OUT");
646 void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer)
648 LOGD("JNIProviderService_onSubscribeListenerCb - IN");
651 JNIEnv *env = GetJNIEnv(&envRet);
652 if (NULL == env) return ;
654 jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener);
655 if (!jSubscriptionListener)
657 LOGE ("Failed to Get jSubscriptionListener");
658 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
662 LOGD("consumer ID : %s\n", consumer->getConsumerId().c_str());
664 jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str());
666 jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer));
669 LOGE ("Failed to Get ObjectClass for Consumer");
670 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
674 jmethodID mid_consumer = env->GetMethodID(
677 "(Ljava/lang/String;)V");
680 LOGE ("Failed to Get MethodID for Consumer<init>");
681 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
684 jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId);
686 jclass cls = env->GetObjectClass( jSubscriptionListener);
689 LOGE("Failed to Get ObjectClass of jSubscriptionListener");
690 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
693 jmethodID mid = env->GetMethodID(
695 "onConsumerSubscribed",
696 "(Lorg/iotivity/service/ns/provider/Consumer;)V");
699 LOGE("Failed to Get MethodID of onConsumerSubscribed");
700 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
704 env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer);
705 env->DeleteLocalRef(jSubscriptionListener);
706 env->DeleteLocalRef(cls_consumer);
707 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
708 LOGD("JNIProviderService_onSubscribeListenerCb - OUT");
712 void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync)
714 LOGD("JNIProviderService_onSyncInfoListenerCb - IN");
717 JNIEnv *env = GetJNIEnv(&envRet);
718 if (NULL == env) return ;
720 jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);
723 LOGE ("Failed to Get jSyncListener");
724 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
728 LOGD("Sync ID : %ld\n", (long) sync->getMessageId());
729 LOGD("Sync STATE : %d\n", (int) sync->getState());
731 jlong jMessageId = (long) sync->getMessageId();
732 jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());
733 jobject syncType = getJavaSyncType(env, sync->getState());
736 LOGE ("Failed to Get syncType for SyncInfo");
737 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
740 jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo));
743 LOGE ("Failed to Get ObjectClass for SyncInfo");
744 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
747 jmethodID mid_syncInfo = env->GetMethodID(
750 "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V");
753 LOGE ("Failed to Get MethodID for SyncInfo");
754 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
758 jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo,
759 jMessageId, jProviderId, syncType);
762 LOGE ("Failed to Get Object for SyncInfo");
763 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
767 jclass cls = env->GetObjectClass( jSyncListener);
770 LOGE("Failed to Get ObjectClass");
771 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
774 jmethodID mid = env->GetMethodID(
776 "onMessageSynchronized",
777 "(Lorg/iotivity/service/ns/common/SyncInfo;)V");
780 LOGE("Failed to Get MethodID");
781 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
784 env->CallVoidMethod( jSyncListener, mid, obj_syncInfo);
786 env->DeleteLocalRef(jSyncListener);
787 env->DeleteLocalRef(cls_SyncInfo);
788 if (JNI_EDETACHED == envRet) g_jvm_provider->DetachCurrentThread();
790 LOGD("JNIProviderService: OnSyncInfoListenerCb - OUT");
795 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStart
796 (JNIEnv *env, jobject jObj, jobject jSubscriptionListener, jobject jSyncListener,
797 jboolean jPolicy, jstring jUserInfo, jboolean jResourceSecurity)
799 LOGD("JNIProviderService: nativeStart - IN");
800 if (!jSubscriptionListener || !jSyncListener)
802 LOGE("Fail to set listeners");
803 ThrowNSException(NS_ERROR, "Listener cannot be null");
804 return (jint) OIC::Service::NSResult::ERROR;
807 if (g_obj_subscriptionListener != NULL)
809 env->DeleteGlobalRef(g_obj_subscriptionListener);
811 if (g_obj_syncListener != NULL)
813 env->DeleteGlobalRef(g_obj_syncListener);
816 g_obj_subscriptionListener = (jobject) env->NewGlobalRef(jSubscriptionListener);
817 g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);
819 // check access policy
821 OIC::Service::NSProviderService::ProviderConfig cfg;
822 cfg.m_subscribeRequestCb = onSubscribeListenerCb;
823 cfg.m_syncInfoCb = onSyncInfoListenerCb;
824 cfg.subControllability = (bool) jPolicy;
827 const char *info = env->GetStringUTFChars( jUserInfo, NULL);
828 std::string userInfo(info);
829 cfg.userInfo = userInfo;
831 cfg.resourceSecurity = (bool) jResourceSecurity;
833 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->start(cfg);
834 if (result != OIC::Service::NSResult::OK)
836 LOGE("Fail to start NSProviderService");
840 LOGD("JNIProviderService: nativeStart - OUT");
841 return (jint) result;
844 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStop
845 (JNIEnv *env, jobject jObj)
847 LOGD("JNIProviderService: nativeStop - IN");
849 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->stop();
850 if (result != OIC::Service::NSResult::OK)
852 LOGD("Fail to stop NSProvider service");
853 return (jint) result;
856 env->DeleteGlobalRef( g_obj_subscriptionListener);
857 env->DeleteGlobalRef( g_obj_syncListener);
858 g_obj_subscriptionListener = NULL;
859 g_obj_syncListener = NULL;
861 LOGD("JNIProviderService: nativeStop - OUT");
862 return (jint) result;
865 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendMessage
866 (JNIEnv *env, jobject jObj, jobject jMsg)
868 LOGD("JNIProviderService: nativeSendMessage - IN");
871 LOGD("Fail to send notification - Message is null");
872 ThrowNSException(NS_ERROR, "Message cannot be null");
873 return (jint) OIC::Service::NSResult::ERROR;
875 OIC::Service::NSMessage *nsMsg = getNativeMessage(env, jMsg);
876 if (nsMsg == nullptr)
878 ThrowNSException(NS_ERROR, "Message didn't have a field ID ");
879 return (jint) OIC::Service::NSResult::ERROR;
882 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->sendMessage(nsMsg);
883 if (result != OIC::Service::NSResult::OK)
885 LOGD("Fail to send NSProvider Message");
887 LOGD("JNIProviderService: nativeSendMessage - OUT");
888 return (jint) result;
891 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendSyncInfo
892 (JNIEnv *env, jobject jObj, jlong messageId , jint syncState)
894 LOGD("JNIProviderService: nativeSendSyncInfo - IN");
895 OIC::Service::NSProviderService::getInstance()->sendSyncInfo( messageId,
896 (OIC::Service::NSSyncInfo::NSSyncType) syncState);
897 LOGD("JNIProviderService: nativeSendSyncInfo - OUT");
901 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeCreateMessage
902 (JNIEnv *env, jobject jObj)
904 LOGD("JNIProviderService: nativeCreateMessage - IN");
905 OIC::Service::NSMessage *message =
906 OIC::Service::NSProviderService::getInstance()->createMessage();
907 if (message == nullptr)
909 ThrowNSException(NS_ERROR, "Couldn't get Native Message");
912 jobject jMsg = getJavaMessage(env, message);
915 ThrowNSException(NS_ERROR, "Couldn't create Java Message");
918 LOGD("JNIProviderService: nativeCreateMessage - OUT");
922 JNIEXPORT jint JNICALL
923 Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService
924 (JNIEnv *env, jobject jObj, jstring jstr)
926 LOGD("JNIProviderService: nativeEnableRemoteService - IN");
929 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
930 return (jint) OIC::Service::NSResult::ERROR;
933 const char *address = env->GetStringUTFChars( jstr, NULL);
934 std::string servAddress(address);
935 OIC::Service::NSResult result =
936 OIC::Service::NSProviderService::getInstance()->enableRemoteService(
938 if (result != OIC::Service::NSResult::OK)
940 LOGE("Fail to Enable Remote Service");
942 env->ReleaseStringUTFChars(jstr, address);
943 LOGD("JNIProviderService: nativeEnableRemoteService - OUT");
944 return (jint) result;
947 JNIEXPORT jint JNICALL
948 Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService
949 (JNIEnv *env, jobject jObj, jstring jstr)
951 LOGD("JNIProviderService: nativeDisableRemoteService - IN");
954 ThrowNSException(NS_ERROR, "Server Address Can't be NULL");
955 return (jint) OIC::Service::NSResult::ERROR;
958 const char *address = env->GetStringUTFChars( jstr, NULL);
959 std::string servAddress(address);
960 OIC::Service::NSResult result =
961 OIC::Service::NSProviderService::getInstance()->disableRemoteService(
963 if (result != OIC::Service::NSResult::OK)
965 LOGE("Fail to Disable Remote Service");
967 env->ReleaseStringUTFChars(jstr, address);
968 LOGD("JNIProviderService: nativeDisableRemoteService - OUT");
969 return (jint) result;
972 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeRegisterTopic
973 (JNIEnv *env, jobject jObj, jstring jTopicName)
975 LOGD("JNIProviderService: nativeRegisterTopic - IN");
978 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
979 return (jint) OIC::Service::NSResult::ERROR;
981 const char *name = env->GetStringUTFChars( jTopicName, NULL);
982 std::string topicName(name);
983 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->registerTopic(
985 if (result != OIC::Service::NSResult::OK)
987 LOGE("Fail to Register Topic");
989 env->ReleaseStringUTFChars(jTopicName, name);
990 LOGD("JNIProviderService: nativeRegisterTopic - OUT");
991 return (jint) result;
993 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeUnregisterTopic
994 (JNIEnv *env, jobject jObj, jstring jTopicName)
996 LOGD("JNIProviderService: nativeUnregisterTopic - IN");
999 ThrowNSException(NS_ERROR, "Topic Name Can't be NULL");
1000 return (jint) OIC::Service::NSResult::ERROR;
1002 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1003 std::string topicName(name);
1004 OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->unregisterTopic(
1006 if (result != OIC::Service::NSResult::OK)
1008 LOGE("Fail to Unregister Topic");
1010 env->ReleaseStringUTFChars(jTopicName, name);
1011 LOGD("JNIProviderService: nativeUnregisterTopic - OUT");
1012 return (jint) result;
1015 JNIEXPORT jobject JNICALL
1016 Java_org_iotivity_service_ns_provider_ProviderService_nativeGetRegisteredTopicList
1017 (JNIEnv *env, jobject jObj)
1019 LOGD("JNIProviderService: nativeGetRegisteredTopicList - IN");
1021 OIC::Service::NSTopicsList *topicList =
1022 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
1023 if (topicList == nullptr)
1025 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
1029 jobject obj_topicList = getJavaTopicsList(env, topicList);
1031 LOGD("JNIProviderService: nativeGetRegisteredTopicList - OUT");
1032 return obj_topicList;
1035 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription
1036 (JNIEnv *env, jobject jObj, jstring jConsumerId, jboolean jAccepted)
1038 LOGD("JNIProviderService: nativeAcceptSubscription - IN");
1041 ThrowNSException(NS_ERROR, "ConsumerId Can't be NULL");
1042 return (jint) OIC::Service::NSResult::ERROR;
1044 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1045 std::string consumerId(id);
1046 LOGD("Consumer ID: %s\n", consumerId.c_str());
1048 OIC::Service::NSConsumer *consumer =
1049 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1051 return (jint) consumer->acceptSubscription((bool)jAccepted);
1053 LOGE("Couldn't find consumer");
1054 LOGD("JNIProviderService: nativeAcceptSubscription - OUT");
1055 return (jint) OIC::Service::NSResult::ERROR;
1057 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSetConsumerTopic
1058 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
1060 LOGD("JNIProviderService: nativeSetConsumerTopic - IN");
1061 if (!jConsumerId || !jTopicName)
1063 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1064 return (jint) OIC::Service::NSResult::ERROR;
1066 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1067 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1068 std::string topicName(name);
1069 std::string consumerId(id);
1070 OIC::Service::NSConsumer *nsConsumer =
1071 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1074 ThrowNSException(NS_ERROR, "Consumer does exists");
1075 return (jint) OIC::Service::NSResult::ERROR;
1077 OIC::Service::NSResult result = nsConsumer->setTopic(topicName);
1079 if (result != OIC::Service::NSResult::OK)
1081 LOGD("Fail to Select Topic");
1083 env->ReleaseStringUTFChars(jTopicName, name);
1084 env->ReleaseStringUTFChars(jConsumerId, id);
1085 LOGD("JNIProviderService: nativeSetConsumerTopic - OUT");
1086 return (jint) result;
1088 JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeUnsetConsumerTopic
1089 (JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName)
1091 LOGD("JNIProviderService: nativeUnsetConsumerTopic - IN");
1092 if (!jConsumerId || !jTopicName)
1094 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1095 return (jint) OIC::Service::NSResult::ERROR;
1097 const char *name = env->GetStringUTFChars( jTopicName, NULL);
1098 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1099 std::string topicName(name);
1100 std::string consumerId(id);
1101 OIC::Service::NSConsumer *nsConsumer =
1102 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1105 ThrowNSException(NS_ERROR, "Consumer does exists");
1106 return (jint) OIC::Service::NSResult::ERROR;
1108 OIC::Service::NSResult result = nsConsumer->unsetTopic(topicName);
1110 if (result != OIC::Service::NSResult::OK)
1112 LOGE("Fail to Unselect Topic");
1114 env->ReleaseStringUTFChars(jTopicName, name);
1115 env->ReleaseStringUTFChars(jConsumerId, id);
1116 LOGD("JNIProviderService: nativeUnsetConsumerTopic - OUT");
1117 return (jint) result;
1120 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeGetConsumerTopicList
1121 (JNIEnv *env, jobject jObj, jstring jConsumerId)
1123 LOGD("JNIProviderService: nativeGetConsumerTopicList - IN");
1126 ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL");
1129 const char *id = env->GetStringUTFChars( jConsumerId, NULL);
1130 std::string consumerId(id);
1131 OIC::Service::NSConsumer *nsConsumer =
1132 OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId);
1135 ThrowNSException(NS_ERROR, "Consumer does exists");
1138 env->ReleaseStringUTFChars(jConsumerId, id);
1139 OIC::Service::NSTopicsList *topicList = nsConsumer->getConsumerTopicList();
1140 if (topicList == nullptr)
1142 ThrowNSException(NS_ERROR, "Topic List doesn't exist");
1145 jobject obj_topicList = getJavaTopicsList(env, topicList);
1146 LOGD("JNIProviderService: nativeGetConsumerTopicList - OUT");
1147 return obj_topicList;
1151 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
1153 LOGD("ProviderService_JNI_OnLoad");
1154 g_jvm_provider = jvm;
1157 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1159 LOGE("Failed to get the environment using GetEnv()");
1163 jclass localMessage = env->FindClass(
1164 "org/iotivity/service/ns/common/Message");
1167 LOGE("Failed to get local Message class");
1170 g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));
1173 LOGE("Failed to set Global Message reference");
1177 jclass localMessageType = env->FindClass(
1178 "org/iotivity/service/ns/common/Message$MessageType");
1179 if (!localMessageType)
1181 LOGE("Failed to get local Message Type class");
1184 g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));
1185 if (!g_cls_Message_Type)
1187 LOGE("Failed to set Global Message Type reference");
1191 jclass localConsumer = env->FindClass(
1192 "org/iotivity/service/ns/provider/Consumer");
1195 LOGE("Failed to get local Provider class");
1198 g_cls_Consumer = (jclass) (env->NewGlobalRef(localConsumer));
1199 if (!g_cls_Consumer)
1201 LOGE("Failed to set Global Provider reference");
1205 jclass localSyncInfo = env->FindClass(
1206 "org/iotivity/service/ns/common/SyncInfo");
1209 LOGE("Failed to get local SyncInfo class");
1212 g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));
1213 if (!g_cls_SyncInfo)
1215 LOGE("Failed to set Global SyncInfo reference");
1219 jclass localSyncType = env->FindClass(
1220 "org/iotivity/service/ns/common/SyncInfo$SyncType");
1223 LOGE("Failed to get local SyncType enum");
1226 g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType));
1227 if (!g_cls_SyncType)
1229 LOGE("Failed to set Global SyncType reference");
1233 jclass localMediaContents = env->FindClass(
1234 "org/iotivity/service/ns/common/MediaContents");
1235 if (!localMediaContents)
1237 LOGE("Failed to get local MediaContents class");
1240 g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));
1241 if (!g_cls_MediaContents)
1243 LOGE("Failed to set Global MediaContents reference");
1247 jclass localTopic = env->FindClass(
1248 "org/iotivity/service/ns/common/Topic");
1251 LOGE("Failed to get local Topic class");
1254 g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));
1257 LOGE("Failed to set Global Topic reference");
1261 jclass localTopicsList = env->FindClass(
1262 "org/iotivity/service/ns/common/TopicsList");
1263 if (!localTopicsList)
1265 LOGE("Failed to get local Topic class");
1268 g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));
1269 if (!g_cls_TopicsList)
1271 LOGE("Failed to set Global TopicsList reference");
1275 jclass localTopicState = env->FindClass(
1276 "org/iotivity/service/ns/common/Topic$TopicState");
1277 if (!localTopicState)
1279 LOGE("Failed to get local TopicState enum");
1282 g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));
1283 if (!g_cls_TopicState)
1285 LOGE("Failed to set Global TopicState reference");
1290 jclass localOcRepresentation = env->FindClass("org/iotivity/base/OcRepresentation");
1291 if (!localOcRepresentation)
1293 LOGE("Failed to get local OcRepresentation class");
1296 g_cls_OcRepresentation = (jclass) env->NewGlobalRef(localOcRepresentation);
1297 if (!g_cls_OcRepresentation)
1299 LOGE("Failed to set Global OcRepresentation reference");
1303 g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
1304 if (!g_mid_OcRepresentation_N_ctor_bool)
1306 LOGE("Failed to get Global OcRepresentation Constructor reference");
1310 env->DeleteLocalRef(localMessage);
1311 env->DeleteLocalRef(localMessageType);
1312 env->DeleteLocalRef(localConsumer);
1313 env->DeleteLocalRef(localSyncInfo);
1314 env->DeleteLocalRef(localSyncType);
1315 env->DeleteLocalRef(localMediaContents);
1316 env->DeleteLocalRef(localTopic);
1317 env->DeleteLocalRef(localTopicsList);
1318 env->DeleteLocalRef(localTopicState);
1319 env->DeleteLocalRef(localOcRepresentation);
1321 return NSExceptionInit(env);
1324 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
1326 LOGD("ProviderService_JNI_OnUnload");
1329 if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
1331 LOGE("Failed to get the environment using GetEnv()");
1335 env->DeleteGlobalRef(g_cls_Message);
1336 env->DeleteGlobalRef(g_cls_Consumer);
1337 env->DeleteGlobalRef(g_cls_SyncInfo);
1338 env->DeleteGlobalRef(g_cls_SyncType);
1339 env->DeleteGlobalRef(g_cls_MediaContents);
1340 env->DeleteGlobalRef(g_cls_Message_Type);
1341 env->DeleteGlobalRef(g_cls_Topic);
1342 env->DeleteGlobalRef(g_cls_TopicsList);
1343 env->DeleteGlobalRef(g_cls_TopicState);
1344 env->DeleteGlobalRef(g_cls_OcRepresentation);