From: nikhil.a Date: Wed, 24 Aug 2016 15:53:08 +0000 (+0530) Subject: Updated JAVA and JNI API's for Topic Resource X-Git-Tag: 1.2.0+RC1~52^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a55edacf13076f3a9535e9f70035255e83153b25;p=platform%2Fupstream%2Fiotivity.git Updated JAVA and JNI API's for Topic Resource 1. Added JAVA APIs related to topic resource for provider and consumer 2. Added JNI for respective Java API's 3. Minor changes for cpp-wrapper Change-Id: I459c70b64529040010d099bf239d42863b1417c2 Signed-off-by: nikhil.a Reviewed-on: https://gerrit.iotivity.org/gerrit/10883 Tested-by: jenkins-iotivity Reviewed-by: Uze Choi Tested-by: Uze Choi --- diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Message.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Message.java index 724f58f..6f6f505 100755 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Message.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Message.java @@ -39,14 +39,14 @@ public class Message private int type; private MessageType(int type) - { - this.type = type; - } - - public int getMessageType() - { - return this.type; - } + { + this.type = type; + } + + public int getMessageType() + { + return this.type; + } }; public long mMessageId = 0; public String mProviderId = null; @@ -58,6 +58,7 @@ public class Message public String mTitle = null; public String mContentText = null; public MediaContents mMediaContents = null; + public String mTopic = null; private long mNativeHandle = 0; @@ -115,6 +116,10 @@ public class Message return mMediaContents; } + public String getTopic() + { + return mTopic; + } public void setSourceName (String sourceName) { mSourceName = sourceName; @@ -149,4 +154,9 @@ public class Message { mMediaContents = mediaContents; } + + public void setTopic(String topic) + { + mTopic = topic; + } } diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Topic.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Topic.java new file mode 100644 index 0000000..2ac3556 --- /dev/null +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Topic.java @@ -0,0 +1,79 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +package org.iotivity.service.ns.common; +import android.util.Log; +/** + * @class Topic + * @brief This class provides implementation of Notification Topic object. + */ +public class Topic +{ + private static final String LOG_TAG = "NotificationService_Topic"; + + public enum TopicState + { + UNSUBSCRIBED (0), + SUBSCRIBED (1); + private int type; + + private TopicState(int type) + { + this.type = type; + } + + public int getTopicState() + { + return this.type; + } + + }; + public String mTopicName = null; + public TopicState mState = TopicState.UNSUBSCRIBED; + + public Topic(String topicName, TopicState state) + { + Log.i (LOG_TAG, "Topic()"); + + mTopicName = topicName; + mState = state; + } + + public String getTopicName() + { + return mTopicName; + } + + public void setTopicName(String topicName) + { + mTopicName = topicName; + } + + public TopicState getState() + { + return mState; + } + + public void setState(TopicState state) + { + mState = state; + } + +} diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java new file mode 100644 index 0000000..6175e77 --- /dev/null +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java @@ -0,0 +1,58 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +package org.iotivity.service.ns.common; +import android.util.Log; +import java.util.Vector; +import java.util.Iterator; +/** + * @class TopicsList + * @brief This class provides implementation of Topics List + */ +public class TopicsList +{ + private static final String LOG_TAG = "NotificationService_TopicList"; + + public Vector mTopicsList = new Vector(); + + public void addTopic(String topicname, Topic.TopicState state) + { + mTopicsList.add(new Topic(topicname,state)); + } + + public void removeTopic(String topicName) + { + Iterator it = getTopicsList().iterator(); + while(it.hasNext()) + { + if(it.next().getTopicName().equals(topicName)) + { + mTopicsList.remove(it.next()); + } + } + } + + public Vector getTopicsList() + { + return mTopicsList; + } + +} + diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/ConsumerService.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/ConsumerService.java index 480ce40..d48e7e1 100755 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/ConsumerService.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/ConsumerService.java @@ -22,6 +22,7 @@ package org.iotivity.service.ns.consumer; import android.util.Log; import org.iotivity.service.ns.common.*; +import java.util.Vector; /** * @class ConsumerService @@ -45,6 +46,24 @@ public class ConsumerService System.loadLibrary("notification_consumer_jni"); } + public enum Response + { + ALLOW(1), + DENY(2), + TOPIC(3); + private int type; + + private Response(int type) + { + this.type = type; + } + + public int getResponseType() + { + return this.type; + } + }; + private static ConsumerService instance; static { @@ -62,10 +81,10 @@ public class ConsumerService public void Start( OnProviderDiscoveredListner onProviderDiscoveredListner, - OnSubscriptionAcceptedListener onSubscriptionAcceptedListener + OnProviderChangedListener onProviderChangedListener ) throws NSException { - nativeStart(onProviderDiscoveredListner, onSubscriptionAcceptedListener); + nativeStart(onProviderDiscoveredListner, onProviderChangedListener); } public void Stop() throws NSException @@ -88,23 +107,29 @@ public class ConsumerService return nativeGetProvider(providerId); } + public Message GetMessage(long messageId) throws NSException + { + return nativeGetMessage(messageId); + } + public interface OnProviderDiscoveredListner { public void onProviderDiscovered(Provider provider); } - public interface OnSubscriptionAcceptedListener + public interface OnProviderChangedListener { - public void onSubscriptionAccepted(Provider provider); + public void onProviderChanged(Provider provider , Response response); } private native void nativeStart ( OnProviderDiscoveredListner onProviderDiscoveredListner, - OnSubscriptionAcceptedListener onSubscriptionAcceptedListener + OnProviderChangedListener onProviderChangedListener ) throws NSException; private native void nativeStop() throws NSException; private native void nativeEnableRemoteService(String serverAddress) throws NSException; private native void nativeRescanProvider() throws NSException; private native Provider nativeGetProvider(String providerId) throws NSException; + private native Message nativeGetMessage(long messageId) throws NSException; } diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java index bb01ec9..a25e7c1 100755 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java @@ -22,6 +22,7 @@ package org.iotivity.service.ns.consumer; import android.util.Log; import org.iotivity.service.ns.common.*; +import java.util.Vector; /** * @class Provider @@ -32,6 +33,7 @@ public class Provider private static final String LOG_TAG = "ConsumerService_Provider"; public String mProviderId = null; + TopicsList mTopicsList = new TopicsList(); private long mNativeHandle = 0; public Provider(String providerId) @@ -46,6 +48,11 @@ public class Provider return mProviderId ; } + public TopicsList getTopicsList() + { + return mTopicsList ; + } + public void Subscribe() throws NSException { nativeSubscribe(); @@ -67,6 +74,11 @@ public class Provider nativeSetListener(onMessageReceivedListner, onSyncInfoReceivedListner); } + public int SelectInterestTopics(Vector topicsList) throws NSException + { + return nativeSelectInterestTopics(topicsList); + } + public interface OnMessageReceivedListner { public void onMessageReceived(Message message); @@ -84,4 +96,5 @@ public class Provider OnMessageReceivedListner onMessageReceivedListner, OnSyncInfoReceivedListner onSyncInfoReceivedListner ) throws NSException; + private native int nativeSelectInterestTopics(Vector topicsList) throws NSException; } diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/Consumer.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/Consumer.java index 6875ffc..37e2417 100644 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/Consumer.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/Consumer.java @@ -19,15 +19,15 @@ //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= package org.iotivity.service.ns.provider; import org.iotivity.service.ns.common.*; +import java.util.Vector; /** * @class Consumer * @brief This class provides implementation of Notification Consumer object. */ public class Consumer { - public native int nativeAcceptSubscription(Consumer consumer, boolean accepted); - public String mConsumerId; + public String mConsumerId = null; public Consumer(final String consumerId) { @@ -44,4 +44,22 @@ public class Consumer return -1; } + public int SelectTopic(String topicName) throws NSException + { + return nativeSelectTopic(mConsumerId, topicName); + } + public int UnselectTopic(String topicName) throws NSException + { + return nativeUnselectTopic(mConsumerId, topicName); + } + + public TopicsList GetConsumerTopics() throws NSException + { + return nativeGetConsumerTopics(mConsumerId); + } + + public native int nativeAcceptSubscription(Consumer consumer, boolean accepted); + public native int nativeSelectTopic(String consumerId, String topicName); + public native int nativeUnselectTopic(String consumerId, String topicName); + public native TopicsList nativeGetConsumerTopics(String consumerId); } \ No newline at end of file diff --git a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/ProviderService.java b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/ProviderService.java index d09133d..9b695ad 100644 --- a/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/ProviderService.java +++ b/service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/ProviderService.java @@ -19,6 +19,7 @@ //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= package org.iotivity.service.ns.provider; import org.iotivity.service.ns.common.*; +import java.util.Vector; /** * @class ProviderService * @brief This class provides a set of Java APIs for Notification ProviderService. @@ -39,14 +40,6 @@ public class ProviderService System.loadLibrary("notification_provider_wrapper"); System.loadLibrary("notification_provider_jni"); } - public native int nativeStart(boolean policy, - OnSubscriptionListener subscriptionListener, - OnSyncInfoListener syncInfoListener); - public native int nativeStop(); - public native int nativeSendMessage(Message message); - public native void nativeSendSyncInfo( long messageId , int type); - public native int nativeEnableRemoteService(String servAdd); - public native int nativeDisableRemoteService(String servAdd); private static ProviderService instance; @@ -72,38 +65,57 @@ public class ProviderService OnSyncInfoListener syncInfoListener) throws NSException { - int result = nativeStart(policy, subscriptionListener, syncInfoListener); - return result; + return nativeStart(policy, subscriptionListener, syncInfoListener); } public int Stop() throws NSException { - int result = nativeStop(); - return result; + return nativeStop(); } public int SendMessage(Message message) throws NSException { - int result = nativeSendMessage(message); - return result; + return nativeSendMessage(message); } public void SendSyncInfo ( long messageId , SyncInfo.SyncType syncType) throws NSException { nativeSendSyncInfo(messageId, syncType.ordinal()); - return ; + return; } public int EnableRemoteService(String servAdd) throws NSException { - int result = nativeEnableRemoteService(servAdd); - return result; + return nativeEnableRemoteService(servAdd); } public int DisableRemoteService(String servAdd) throws NSException { - int result = nativeDisableRemoteService(servAdd); - return result; + return nativeDisableRemoteService(servAdd); } + public int AddTopic(String topicName) throws NSException + { + return nativeAddTopic(topicName); + } + public int DeleteTopic(String topicName) throws NSException + { + return nativeDeleteTopic(topicName); + } + public TopicsList GetTopics() throws NSException + { + return nativeGetTopics(); + } + + public native int nativeStart(boolean policy, + OnSubscriptionListener subscriptionListener, + OnSyncInfoListener syncInfoListener); + public native int nativeStop(); + public native int nativeSendMessage(Message message); + public native void nativeSendSyncInfo( long messageId , int type); + public native int nativeEnableRemoteService(String servAdd); + public native int nativeDisableRemoteService(String servAdd); + public native int nativeAddTopic(String topicName); + public native int nativeDeleteTopic(String topicName); + public native TopicsList nativeGetTopics(); } diff --git a/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp b/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp index e4b5c1e..e8c6664 100755 --- a/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp +++ b/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp @@ -32,6 +32,11 @@ jclass g_cls_Message; jclass g_cls_Provider; jclass g_cls_SyncInfo; jclass g_cls_MediaContents; +jclass g_cls_TopicState; +jclass g_cls_Message_Type; +jclass g_cls_Response; +jclass g_cls_Topic; +jclass g_cls_TopicsList; static JNIEnv *GetJNIEnv(jint *ret) { @@ -60,95 +65,283 @@ static JNIEnv *GetJNIEnv(jint *ret) } } -void onDiscoverProvider(OIC::Service::NSProvider *provider) +jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type) +{ + LOGD ("ConsumerService_getJavaMessageType - IN"); + switch (type) + { + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, + "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;"); + return env->GetStaticObjectField(g_cls_Message, fieldID); + } + default: + return NULL; + } + LOGD ("ConsumerService_getJavaMessageType - OUT"); + return NULL; +} + +jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) { - LOGD ("ConsumerService_onDiscoverProvider"); + LOGD ("ConsumerService_getJavaState - IN"); - jint envRet; - JNIEnv *env = GetJNIEnv(&envRet); - if (NULL == env) return ; + // TopicState + jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState)); + if (!cls_topicState) + { + LOGE ("Failed to Get ObjectClass for TopicState Type"); + return nullptr; + } - jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener); - if (!jDiscoverListener) + jobject obj_topicState; + switch (nsState) { - LOGE ("Failed to Get jDiscoverListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_topicState, + "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;"); + obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID); + } + case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_topicState, + "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;"); + obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID); + } + + } + if (obj_topicState == NULL) + { + LOGE("Error: object of field TopicState is null"); + return NULL; } - LOGD ("ProviderId : %s\n", provider->getProviderId().c_str()); + env->DeleteLocalRef(cls_topicState); + LOGD ("ConsumerService_getJavaState - OUT"); + return obj_topicState; +} - jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str()); - jlong pProvider = (long)provider; - jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider)); - if (!cls_provider) +jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) +{ + LOGD ("ConsumerService_getJavaTopicsList - IN"); + jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList)); + if (!cls_topicList) { - LOGE ("Failed to Get ObjectClass for Provider"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + LOGE ("Failed to Get ObjectClass for TopicsList"); + return NULL; } - jmethodID mid_provider = env->GetMethodID( - cls_provider, "", "(Ljava/lang/String;)V"); - if (!mid_provider) + jmethodID mid_topicList = env->GetMethodID(cls_topicList, "", "()V"); + if (!mid_topicList) { - LOGE ("Failed to Get MethodID for Provider"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + LOGE ("Failed to Get MethodID for TopicsList"); + return NULL; } - jobject obj_provider = env->NewObject(cls_provider, mid_provider, - jProviderId); + jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList); + jmethodID mid_addTopic = + env->GetMethodID(cls_topicList, "addTopic", "(Lorg/iotivity/service/ns/common/Topic;)V"); + for (auto it : topicList->getTopicsList()) + { + jobject jState = getJavaState(env, it->getState()); + std::string topicName = it->getTopicName(); + jstring jTopicName = env->NewStringUTF(topicName.c_str()); + env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState); + } + env->DeleteLocalRef(cls_topicList); + LOGD ("ConsumerService_getJavaTopicsList - OUT"); + return obj_topicList; +} - jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J"); - if (!nativeHandle) +OIC::Service::NSTopic::NSTopicState getNativeState(JNIEnv *env, jobject jTopic) +{ + LOGD ("ConsumerService_getNativeState - IN"); + + jclass cls_topic = env->GetObjectClass( jTopic); + // TopicState + jclass cls_TopicState = (jclass) (env->NewLocalRef(g_cls_TopicState)); + if (!cls_TopicState) { - LOGE("Failed to get nativeHandle for Provider"); - return; + LOGE ("Failed to Get ObjectClass for cls_TopicState Type"); + ThrowNSException(NS_ERROR, "TopicState class not found "); + return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED; } - env->SetLongField(obj_provider, nativeHandle, pProvider); + jmethodID mid = env->GetMethodID(cls_TopicState, "ordinal", "()I"); + jfieldID fid_state = env->GetFieldID( cls_TopicState, "mState", + "Lorg/iotivity/service/ns/common/Topic$TopicState;"); + if (fid_state == NULL) + { + LOGE("Error: jfieldID for state type is null"); + ThrowNSException(NS_ERROR, "TopicState fid not found "); + return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED; + } + jobject jobj = env->GetObjectField( jTopic, fid_state); + if (jobj == NULL) + { + LOGE("Error: object of field state Type is null"); + ThrowNSException(NS_ERROR, "TopicState obj is null "); + return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED; + } + jint jState = env->CallIntMethod(jobj, mid); + OIC::Service::NSTopic::NSTopicState state = (OIC::Service::NSTopic::NSTopicState) jState; + LOGD ("ConsumerService_getNativeState - OUT"); + return state; - jclass cls = env->GetObjectClass(jDiscoverListener); - if (!cls) +} + +const char *getNativeTopicName(JNIEnv *env, jobject jTopic) +{ + LOGD ("ConsumerService_getNativeTopicName - IN"); + jclass cls_topic = env->GetObjectClass( jTopic); + jfieldID fid_name = env->GetFieldID( cls_topic, "mTopicname", + "Ljava/lang/String;"); + if (fid_name == NULL) { - LOGE ("Failed to Get ObjectClass for jDiscoverListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + LOGE("Error: jfieldID for Topic Name is null"); + return nullptr; } - jmethodID mid = env->GetMethodID( - cls, - "onProviderDiscovered", - "(Lorg/iotivity/service/ns/consumer/Provider;)V"); - if (!mid) + jstring jTopicName = (jstring) env->GetObjectField( jTopic, fid_name); + const char *topicName; + if (jTopicName) { - LOGE ("Failed to Get MethodID for onProviderDiscovered"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + topicName = env->GetStringUTFChars( jTopicName, NULL); + } + else + { + LOGI("Info: topicName is null"); } + LOGD ("ConsumerService_getNativeTopicName - OUT"); + return topicName; - env->CallVoidMethod(jDiscoverListener, mid, obj_provider); +} - env->DeleteLocalRef(jDiscoverListener); - env->DeleteLocalRef(cls_provider); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; +OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList) +{ + LOGD ("ConsumerService_getNativeTopicsList - IN"); + + jclass cls_topicList = env->GetObjectClass( jTopicList); + jfieldID fid_list = env->GetFieldID( cls_topicList, "mTopicsList", + "Ljava/util/Vector;"); + if (fid_list == NULL) + { + LOGE("Error: jfieldID for Topic List is null"); + return nullptr; + } + jobject jobj = env->GetObjectField( jTopicList, fid_list); + if (jobj == NULL) + { + LOGE("Error: object of field Topic List is null"); + return nullptr; + } + jclass cls_vec = env->FindClass("java/util/Vector"); + jmethodID sizeMethod = env->GetMethodID(cls_vec, "size", "()I;"); + int size = env->CallIntMethod(jobj, sizeMethod); + jmethodID getMethod = env->GetMethodID(cls_vec, "get", "(I)Ljava/lang/Object;"); + OIC::Service::NSTopicsList *nsTopicList = new OIC::Service::NSTopicsList(); + for (int index = 0; index < size; index++) + { + jobject topicObj = env->CallObjectMethod(jobj, getMethod, index); + const char *name = getNativeTopicName(env, topicObj); + std::string topicName(name); + OIC::Service::NSTopic::NSTopicState state = getNativeState(env, topicObj); + nsTopicList->addTopic(topicName, state); + } + + env->DeleteLocalRef(cls_vec); + env->DeleteLocalRef(cls_topicList); + LOGD ("ConsumerService_getNativeTopicsList - OUT"); + return nsTopicList; } -void onProviderChanged(OIC::Service::NSProvider *provider,OIC::Service::NSResponse response) +jobject getJavaResponse(JNIEnv *env, OIC::Service::NSResponse response) { - LOGD ("ConsumerService_onSubscriptionAccepted"); + LOGD ("ConsumerService_getJavaResponse - IN"); + switch (response) + { + case OIC::Service::NSResponse::ALLOW: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, + "ALLOW", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); + return env->GetStaticObjectField(g_cls_Response, fieldID); + } + case OIC::Service::NSResponse::DENY: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, + "DENY", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); + return env->GetStaticObjectField(g_cls_Response, fieldID); + } + case OIC::Service::NSResponse::TOPIC: + { + static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response, + "TOPIC", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;"); + return env->GetStaticObjectField(g_cls_Response, fieldID); + } + default: + return NULL; + } + LOGD ("ConsumerService_getJavaResponse - OUT"); + return NULL; +} - jint envRet; - JNIEnv *env = GetJNIEnv(&envRet); - if (NULL == env) return ; +OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj) +{ + LOGD ("ConsumerService_getNativeProvider - IN"); + jclass providerClass = env->GetObjectClass(jObj); + if (!providerClass) + { + ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider"); + return NULL; + } + jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;"); + if (!jproviderId) + { + ThrowNSException(NS_ERROR, "Failed to get providerId for Provider"); + return NULL; + } + jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId); + if (!jprovider_id) + { + ThrowNSException(NS_ERROR, "ProviderId cannot be null"); + return NULL; + } - jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener); - if (!jAcceptListener) + const char *providerId = env->GetStringUTFChars(jprovider_id, 0); + LOGD ("ProviderId : %s\n", providerId); + + OIC::Service::NSProvider *provider = + OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId)); + if (provider == nullptr) { - LOGE ("Failed to Get jAcceptListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist"); + return NULL; } + env->ReleaseStringUTFChars(jprovider_id, providerId); + LOGD ("ConsumerService_getNativeProvider - OUT"); + return provider; +} +jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider) +{ + LOGD ("ConsumerService_getJavaProvider - IN"); LOGD ("ProviderId : %s\n", provider->getProviderId().c_str()); jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str()); @@ -158,105 +351,43 @@ void onProviderChanged(OIC::Service::NSProvider *provider,OIC::Service::NSRespon if (!cls_provider) { LOGE ("Failed to Get ObjectClass for Provider"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + return NULL; } jmethodID mid_provider = env->GetMethodID( cls_provider, "", "(Ljava/lang/String;)V"); if (!mid_provider) { LOGE ("Failed to Get MethodID for Provider"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + return NULL; } - jobject obj_provider = env->NewObject(cls_provider, mid_provider, - jProviderId); + jobject obj_provider = env->NewObject(cls_provider, mid_provider, jProviderId); jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J"); if (!nativeHandle) { LOGE("Failed to get nativeHandle for Provider"); - return; + return NULL; } env->SetLongField(obj_provider, nativeHandle, pProvider); - jclass cls = env->GetObjectClass(jAcceptListener); - if (!cls) + jfieldID fid_topic = env->GetFieldID(cls_provider, "mTopicsList", + "Lorg/iotivity/service/ns/common/TopicsList"); + if (!fid_topic) { - LOGE ("Failed to Get ObjectClass for jAcceptListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - //TODO: Modify to call ProviderChanged Cb adding topic in Java - jmethodID mid = env->GetMethodID( - cls, - "onSubscriptionAccepted", - "(Lorg/iotivity/service/ns/consumer/Provider;)V"); - if (!mid) - { - LOGE ("Failed to Get MethodID for onSubscriptionAccepted"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + LOGE("Failed to get nativeHandle for Provider"); + return NULL; } - - env->CallVoidMethod(jAcceptListener, mid, obj_provider); - - env->DeleteLocalRef(jAcceptListener); + jobject topicList = getJavaTopicsList(env, provider->getTopicList()); + env->SetObjectField(obj_provider, fid_topic, topicList); env->DeleteLocalRef(cls_provider); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - + LOGD ("ConsumerService_getJavaProvider - OUT"); + return obj_provider; } -jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type) -{ - switch (type) - { - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); - } - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); - } - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); - } - case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO: - { - static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message, - "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;"); - return env->GetStaticObjectField(g_cls_Message, fieldID); - } - default: - return NULL; - } - return NULL; -} -void onMessagePosted(OIC::Service::NSMessage *message) +jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message) { - LOGD ("ConsumerService_onMessagePosted"); - - jint envRet; - JNIEnv *env = GetJNIEnv(&envRet); - if (NULL == env) return ; - - jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener); - if (!jPostListener) - { - LOGE ("Failed to Get jPostListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } + LOGD ("ConsumerService_getJavaMessage - IN"); LOGD ("id : %llu\n", message->getMessageId()); LOGD ("title : %s\n", message->getTitle().c_str()); @@ -268,6 +399,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) jstring jTitle = env->NewStringUTF(message->getTitle().c_str()); jstring jContentText = env->NewStringUTF(message->getContentText().c_str()); jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str()); + jstring jTopic = env->NewStringUTF(message->getTopic().c_str()); jstring jTime = env->NewStringUTF(message->getTime().c_str()); jlong jTTL = (jlong) message->getTTL(); @@ -278,8 +410,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!cls_message) { LOGE ("Failed to Get ObjectClass for Message"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + return NULL ; } jmethodID mid_message = env->GetMethodID( cls_message, "", @@ -287,8 +418,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!mid_message) { LOGE ("Failed to Get MethodID for Message"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + return NULL; } jobject obj_message = env->NewObject(cls_message, mid_message, jTitle, jContentText, jSourceName); @@ -297,7 +427,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!fid_nativeHandle) { LOGE("Failed to get nativeHandle for Message"); - return; + return NULL; } env->SetLongField(obj_message, fid_nativeHandle, pMessage); @@ -305,7 +435,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!fid_messageId) { LOGE("Failed to get field MessageID for Message"); - return; + return NULL; } env->SetLongField(obj_message, fid_messageId, jMessageId); @@ -313,7 +443,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!fid_providerId) { LOGE("Failed to get field ProviderID for Message"); - return; + return NULL; } env->SetObjectField(obj_message, fid_providerId, jProviderId); @@ -321,7 +451,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!fid_time) { LOGE("Failed to get field Time for Message"); - return; + return NULL; } env->SetObjectField(obj_message, fid_time, jTime); @@ -329,10 +459,18 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!fid_ttl) { LOGE("Failed to get field TTL for Message"); - return; + return NULL; } env->SetLongField(obj_message, fid_ttl, jTTL); + jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;"); + if (!fid_topic) + { + LOGE("Failed to get mTopic for Message"); + return NULL; + } + env->SetObjectField(obj_message, fid_topic, jTopic); + OIC::Service::NSMediaContents *mediaCont = message->getMediaContents(); if (mediaCont != nullptr) { @@ -341,16 +479,14 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!cls_mediaContents) { LOGE ("Failed to Get ObjectClass for MediaContents"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + return NULL; } jmethodID mid_mediaContents = env->GetMethodID( cls_mediaContents, "", "(Ljava/lang/String;)V"); if (!mid_mediaContents) { LOGE ("Failed to Get MethodID for MediaContents"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; + return NULL; } jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents, jIconImage); @@ -360,7 +496,7 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!fid_mediaContents) { LOGE("Failed to get field mediaContents for Message"); - return; + return NULL; } env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents); @@ -370,18 +506,144 @@ void onMessagePosted(OIC::Service::NSMessage *message) if (!jType) { LOGE("Failed to get Type value for Message"); - return; + return NULL; } jfieldID fid_type = env->GetFieldID(cls_message, "mType", "Lorg/iotivity/service/ns/common/Message$MessageType;"); if (!fid_type) { LOGE("Failed to get field Type for Message"); - return; + return NULL; } env->SetObjectField(obj_message, fid_type, jType); + env->DeleteLocalRef(cls_message); + LOGD ("ConsumerService_getJavaMessage - OUT"); + return obj_message; +} + +void onDiscoverProvider(OIC::Service::NSProvider *provider) +{ + LOGD ("ConsumerService_onDiscoverProvider - IN"); + + jint envRet; + JNIEnv *env = GetJNIEnv(&envRet); + if (NULL == env) return ; + + jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener); + if (!jDiscoverListener) + { + LOGE ("Failed to Get jDiscoverListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jobject obj_provider = getJavaProvider(env, provider); + if (!obj_provider) + { + LOGE ("Failed to Get Provider Object"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jclass cls = env->GetObjectClass(jDiscoverListener); + if (!cls) + { + LOGE ("Failed to Get ObjectClass for jDiscoverListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jmethodID mid = env->GetMethodID( + cls, + "onProviderDiscovered", + "(Lorg/iotivity/service/ns/consumer/Provider;)V"); + if (!mid) + { + LOGE ("Failed to Get MethodID for onProviderDiscovered"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + env->CallVoidMethod(jDiscoverListener, mid, obj_provider); + + env->DeleteLocalRef(jDiscoverListener); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + LOGD ("ConsumerService_onDiscoverProvider - OUT"); + return ; +} + +void onProviderChanged(OIC::Service::NSProvider *provider, OIC::Service::NSResponse response) +{ + LOGD ("ConsumerService_onSubscriptionAccepted -IN"); + + jint envRet; + JNIEnv *env = GetJNIEnv(&envRet); + if (NULL == env) return ; + + jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener); + if (!jAcceptListener) + { + LOGE ("Failed to Get jAcceptListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jobject obj_provider = getJavaProvider(env, provider); + if (!obj_provider) + { + LOGE ("Failed to Get Provider Object"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jclass cls = env->GetObjectClass(jAcceptListener); + if (!cls) + { + LOGE ("Failed to Get ObjectClass for jAcceptListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jmethodID mid = env->GetMethodID( + cls, + "onProviderChanged", + "(Lorg/iotivity/service/ns/consumer/Provider;Lorg/iotivity/service/ns/consumer/ConsumerService$Response;)V"); + if (!mid) + { + LOGE ("Failed to Get MethodID for onProviderChanged"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jobject obj_response = getJavaResponse(env, response); + env->CallVoidMethod(jAcceptListener, mid, obj_provider, obj_response); + + env->DeleteLocalRef(jAcceptListener); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + LOGD ("ConsumerService_onSubscriptionAccepted -OUT"); + return ; + +} + +void onMessagePosted(OIC::Service::NSMessage *message) +{ + LOGD ("ConsumerService_onMessagePosted -IN"); + jint envRet; + JNIEnv *env = GetJNIEnv(&envRet); + if (NULL == env) return ; + jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener); + if (!jPostListener) + { + LOGE ("Failed to Get jPostListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jobject obj_message = getJavaMessage( env, message); + if (!obj_message) + { + LOGE ("Failed to Get Message Object"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } jclass cls = env->GetObjectClass(jPostListener); if (!cls) { @@ -403,14 +665,14 @@ void onMessagePosted(OIC::Service::NSMessage *message) env->CallVoidMethod(jPostListener, mid, obj_message); env->DeleteLocalRef(jPostListener); - env->DeleteLocalRef(cls_message); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + LOGD ("ConsumerService_onMessagePosted -OUT"); return ; } void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync) { - LOGD ("ConsumerService_onSyncInfoReceived"); + LOGD ("ConsumerService_onSyncInfoReceived - IN"); jint envRet; JNIEnv *env = GetJNIEnv(&envRet); @@ -473,13 +735,14 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync) env->DeleteLocalRef(jSyncListener); env->DeleteLocalRef(cls_sync); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + LOGD ("ConsumerService_onSyncInfoReceived - OUT"); return ; } JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStart (JNIEnv *env, jobject jObj, jobject jDiscoverListener, jobject jAccpetListener) { - LOGD ("ConsumerService_StartConsumer"); + LOGD ("ConsumerService_StartConsumer - IN"); if (!jDiscoverListener || !jAccpetListener) { ThrowNSException(NS_ERROR, "Listener cannot be null"); @@ -503,13 +766,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat cfg.m_changedCb = onProviderChanged; OIC::Service::NSConsumerService::getInstance()->Start(cfg); + LOGD ("ConsumerService_StartConsumer - OUT"); + return; } JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStop (JNIEnv *env, jobject jObj) { - LOGD ("ConsumerService_StopConsumer"); + LOGD ("ConsumerService_StopConsumer - IN"); env->DeleteGlobalRef(g_obj_postListener); env->DeleteGlobalRef(g_obj_discoverListener); @@ -520,13 +785,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat g_obj_syncListener = NULL; g_obj_acceptListener = NULL; OIC::Service::NSConsumerService::getInstance()->Stop(); + LOGD ("ConsumerService_StopConsumer - OUT"); + return; } JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService (JNIEnv *env, jobject jObj, jstring jServerAddress) { - LOGD ("ConsumerService_EnableRemoteService"); + LOGD ("ConsumerService_EnableRemoteService - IN"); if (!jServerAddress) { ThrowNSException(NS_ERROR, "EnableRemoteService server address NULL"); @@ -536,21 +803,24 @@ Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService OIC::Service::NSResult res = OIC::Service::NSConsumerService::getInstance()->EnableRemoteService(std::string(serverAddress)); env->ReleaseStringUTFChars(jServerAddress, serverAddress); + LOGD ("ConsumerService_EnableRemoteService - OUT"); return (jint) res; } JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeRescanProvider (JNIEnv *env, jobject jObj) { - LOGD ("ConsumerService_RescanProvider"); - + LOGD ("ConsumerService_RescanProvider - IN"); OIC::Service::NSConsumerService::getInstance()->RescanProvider(); + LOGD ("ConsumerService_RescanProvider - OUT"); + return; + } JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetProvider (JNIEnv *env, jobject jObj, jstring jProviderId) { - LOGD ("ConsumerService_GetProvider"); + LOGD ("ConsumerService_GetProvider - IN"); if (!jProviderId) { ThrowNSException(NS_ERROR, "ProviderId cannot be null"); @@ -598,49 +868,32 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_ env->DeleteLocalRef(cls_provider); env->ReleaseStringUTFChars(jProviderId, providerId); - + LOGD ("ConsumerService_GetProvider - OUT"); return obj_provider; } -OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj) +JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetMessage +(JNIEnv *env, jobject jObj, jlong jMsgId) { - jclass providerClass = env->GetObjectClass(jObj); - if (!providerClass) - { - ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider"); - return NULL; - } - jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;"); - if (!jproviderId) - { - ThrowNSException(NS_ERROR, "Failed to get providerId for Provider"); - return NULL; - } - jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId); - if (!jprovider_id) + LOGI("JNIConsumerService: nativeGetMessage - IN"); + + OIC::Service::NSMessage *msg = + OIC::Service::NSConsumerService::getInstance()->getMessage((uint64_t)jMsgId); + if (msg == nullptr) { - ThrowNSException(NS_ERROR, "ProviderId cannot be null"); + ThrowNSException(NS_ERROR, "Message doesn't exist"); return NULL; } - const char *providerId = env->GetStringUTFChars(jprovider_id, 0); - LOGD ("ProviderId : %s\n", providerId); + jobject obj_msg = getJavaMessage(env, msg); - OIC::Service::NSProvider *provider = - OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId)); - if (provider == nullptr) - { - ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist"); - return NULL; - } - env->ReleaseStringUTFChars(jprovider_id, providerId); - return provider; + LOGI("JNIConsumerService: nativeGetMessage - OUT"); + return obj_msg; } - JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe (JNIEnv *env, jobject jObj) { - LOGD ("Provider_Subscribe"); + LOGD ("Provider_Subscribe -IN"); jclass providerClass = env->GetObjectClass(jObj); if (!providerClass) { @@ -672,12 +925,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubs LOGD ("calling subscribe on ProviderID"); provider->subscribe(); } + LOGD ("Provider_Subscribe -OUT"); + return; } JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe (JNIEnv *env, jobject jObj) { - LOGD ("Provider_Unsubscribe"); + LOGD ("Provider_Unsubscribe - IN"); jclass providerClass = env->GetObjectClass(jObj); if (!providerClass) @@ -710,12 +965,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsu LOGD ("calling unSubscribe on ProviderID"); provider->unSubscribe(); } + LOGD ("Provider_Unsubscribe - IN"); + return; } JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType) { - LOGD ("Provider_SendSyncInfo"); + LOGD ("Provider_SendSyncInfo - IN"); if (!jMessageId) { ThrowNSException(NS_ERROR, "MessageId cannot be 0"); @@ -758,12 +1015,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSend LOGD ("calling SendSyncInfo on ProviderID"); provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType); } + LOGD ("Provider_SendSyncInfo - OUT"); + return; } + JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener (JNIEnv *env, jobject jObj, jobject jPostListener, jobject jSyncListener) { - LOGD ("Provider_SetListener"); + LOGD ("Provider_SetListener - IN"); if (!jPostListener || !jSyncListener) { ThrowNSException(NS_ERROR, "Listener cannot be null"); @@ -827,8 +1087,66 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetL provider->setListener(onMessagePosted, onSyncInfoReceived); } + LOGD ("Provider_SetListener - OUT"); + return; } +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSelectInterestTopics +(JNIEnv *env, jobject jObj, jobject jTopicsList) +{ + LOGD("Provider_SelectInterestTopics -IN"); + if (!jTopicsList) + { + LOGI("Fail to select Interest Topics - Topic List is null"); + ThrowNSException(NS_ERROR, "TopicList cannot be null"); + return (jint) OIC::Service::NSResult::ERROR; + } + OIC::Service::NSTopicsList *nsTopicsList = getNativeTopicsList(env, jTopicsList); + if (nsTopicsList == nullptr) + { + ThrowNSException(NS_ERROR, "NSTopicList cannot be created "); + return (jint) OIC::Service::NSResult::ERROR; + } + + jclass providerClass = env->GetObjectClass(jObj); + if (!providerClass) + { + ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider"); + return (jint) OIC::Service::NSResult::ERROR; + } + + jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J"); + if (!nativeHandle) + { + ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider"); + return (jint) OIC::Service::NSResult::ERROR; + } + jlong jProvider = env->GetLongField(jObj, nativeHandle); + OIC::Service::NSResult result; + if (jProvider) + { + LOGD ("calling subscribe on mNativeHandle"); + OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider); + result = provider->selectInterestTopics(nsTopicsList); + } + else + { + OIC::Service::NSProvider *provider = getNativeProvider(env, jObj); + if (provider == nullptr) + { + ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist"); + return (jint) OIC::Service::NSResult::ERROR; + } + LOGD ("calling subscribe on ProviderID"); + result = provider->selectInterestTopics(nsTopicsList); + } + if (result != OIC::Service::NSResult::OK) + { + LOGI("Fail to select Interest Topics"); + } + LOGD("Provider_SelectInterestTopics -OUT"); + return (jint) result; +} // JNI OnLoad JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { @@ -897,11 +1215,84 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) LOGE("Failed to set Global MediaContents reference"); return JNI_ERR; } + jclass localTopicState = env->FindClass( + "org/iotivity/service/ns/common/Topic$TopicState"); + if (!localTopicState) + { + LOGE("Failed to get local TopicState enum"); + return JNI_ERR; + } + g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState)); + if (!g_cls_TopicState) + { + LOGE("Failed to set Global TopicState reference"); + return JNI_ERR; + } + jclass localTopic = env->FindClass( + "org/iotivity/service/ns/common/Topic"); + if (!localTopic) + { + LOGE("Failed to get local TopicState enum"); + return JNI_ERR; + } + g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic)); + if (!g_cls_Topic) + { + LOGE("Failed to set Global Topic reference"); + return JNI_ERR; + } + + jclass localMessageType = env->FindClass( + "org/iotivity/service/ns/common/Message$MessageType"); + if (!localMessageType) + { + LOGE("Failed to get local Message Type class"); + return JNI_ERR; + } + g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType)); + if (!g_cls_Message_Type) + { + LOGE("Failed to set Global Message Type reference"); + return JNI_ERR; + } + + jclass localResponse = env->FindClass( + "org/iotivity/service/ns/consumer/ConsumerService$Response"); + if (!localResponse) + { + LOGE("Failed to get localResponse Type class"); + return JNI_ERR; + } + g_cls_Response = (jclass) (env->NewGlobalRef(localResponse)); + if (!g_cls_Response) + { + LOGE("Failed to set Global Response Type reference"); + return JNI_ERR; + } + + jclass localTopicsList = env->FindClass( + "org/iotivity/service/ns/common/TopicsList"); + if (!localTopicsList) + { + LOGE("Failed to get local Topic class"); + return JNI_ERR; + } + g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList)); + if (!g_cls_TopicsList) + { + LOGE("Failed to set Global TopicsList reference"); + return JNI_ERR; + } env->DeleteLocalRef(localMessage); env->DeleteLocalRef(localProvider); env->DeleteLocalRef(localSyncInfo); env->DeleteLocalRef(localMediaContents); + env->DeleteLocalRef(localTopicState); + env->DeleteLocalRef(localMessageType); + env->DeleteLocalRef(localResponse); + env->DeleteLocalRef(localTopic); + env->DeleteLocalRef(localTopicsList); return NSExceptionInit(env); } @@ -921,4 +1312,9 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved) env->DeleteGlobalRef(g_cls_Provider); env->DeleteGlobalRef(g_cls_SyncInfo); env->DeleteGlobalRef(g_cls_MediaContents); + env->DeleteGlobalRef(g_cls_TopicState); + env->DeleteGlobalRef(g_cls_Message_Type); + env->DeleteGlobalRef(g_cls_Response); + env->DeleteGlobalRef(g_cls_Topic); + env->DeleteGlobalRef(g_cls_TopicsList); } diff --git a/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.h b/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.h index d742cc2..4fae3eb 100755 --- a/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.h +++ b/service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.h @@ -47,7 +47,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat /* * Class: org_iotivity_service_ns_consumer_ConsumerService * Method: nativeEnableRemoteService - * Signature: (Ljava/lang/String;)jint + * Signature: (Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService @@ -70,6 +70,14 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_ (JNIEnv *, jobject, jstring); /* + * Class: org_iotivity_service_ns_consumer_ConsumerService + * Method: nativeGetMessage + * Signature: (J)Lorg/iotivity/service/ns/common/Message; + */ +JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetMessage +(JNIEnv *, jobject, jlong); + +/* * Class: org_iotivity_service_ns_consumer_Provider * Method: nativeSubscribe * Signature: ()V @@ -101,6 +109,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSend JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener (JNIEnv *, jobject, jobject, jobject); +/* + * Class: org_iotivity_service_ns_consumer_Provider + * Method: nativeSelectInterestTopics + * Signature: (Lorg/iotivity/service/ns/common/TopicsList;)I + */ +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSelectInterestTopics +(JNIEnv *, jobject, jobject); + #ifdef __cplusplus } #endif diff --git a/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp b/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp index 6aa0977..80c02a0 100644 --- a/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp +++ b/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp @@ -32,6 +32,9 @@ jclass g_cls_Consumer; jclass g_cls_SyncInfo; jclass g_cls_SyncType; jclass g_cls_MediaContents; +jclass g_cls_Topic; +jclass g_cls_TopicsList; +jclass g_cls_TopicState; static JNIEnv *GetJNIEnv(jint *ret) { @@ -60,176 +63,9 @@ static JNIEnv *GetJNIEnv(jint *ret) } } -void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer) -{ - LOGI("JNIProviderService_onSubscribeListenerCb - IN"); - - jint envRet; - JNIEnv *env = GetJNIEnv(&envRet); - if (NULL == env) return ; - - jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener); - if (!jSubscriptionListener) - { - LOGE ("Failed to Get jSubscriptionListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - - LOGI("consumer ID : %s\n", consumer->getConsumerId().c_str()); - - jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str()); - - jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer)); - if (!cls_consumer) - { - LOGE ("Failed to Get ObjectClass for Consumer"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - - jmethodID mid_consumer = env->GetMethodID( - cls_consumer, - "", - "(JLjava/lang/String;Lorg/iotivity/service/ns/provider/Consumer)V"); - if (!mid_consumer) - { - LOGE ("Failed to Get MethodID for Consumer"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId); - - jclass cls = env->GetObjectClass( jSubscriptionListener); - if (!cls) - { - LOGE("Failed to Get ObjectClass of jSubscriptionListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return; - } - jmethodID mid = env->GetMethodID( - cls, - "onConsumerSubscribed", - "(Lorg/iotivity/service/ns/provider/Consumer;)V"); - if (!mid) - { - LOGE("Failed to Get MethodID of onConsumerSubscribed"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return; - } - - env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer); - env->DeleteLocalRef(jSubscriptionListener); - env->DeleteLocalRef(cls_consumer); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - LOGI("JNIProviderService_onSubscribeListenerCb - OUT"); - return; -} - -void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) +OIC::Service::NSMessage *getNativeMessage(JNIEnv *env, jobject jMsg) { - LOGI("JNIProviderService_onSyncInfoListenerCb - IN"); - - jint envRet; - JNIEnv *env = GetJNIEnv(&envRet); - if (NULL == env) return ; - - jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener); - if (!jSyncListener) - { - LOGE ("Failed to Get jSyncListener"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - - LOGI("Sync ID : %ld\n", (long) sync->getMessageId()); - LOGI("Sync STATE : %d\n", (int) sync->getState()); - - jlong jMessageId = (long) sync->getMessageId(); - jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str()); - jobject syncType; - - jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType)); - if (!cls_SyncType) - { - LOGE ("Failed to Get ObjectClass for SyncType"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - switch (sync->getState()) - { - case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD: - { - static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, - "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); - syncType = env->GetStaticObjectField(cls_SyncType, fieldID); - } - case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ : - { - static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, - "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); - syncType = env->GetStaticObjectField(cls_SyncType, fieldID); - } - case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED : - { - static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, - "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); - syncType = env->GetStaticObjectField(cls_SyncType, fieldID); - } - - } - - jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo)); - if (!cls_SyncInfo) - { - LOGE ("Failed to Get ObjectClass for SyncInfo"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - jmethodID mid_syncInfo = env->GetMethodID( - cls_SyncInfo, - "", - "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType)V"); - if (!mid_syncInfo) - { - LOGE ("Failed to Get MethodID for SyncInfo"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return ; - } - - jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo, jMessageId, jProviderId, - syncType); - - jclass cls = env->GetObjectClass( jSyncListener); - if (!cls) - { - LOGE("Failed to Get ObjectClass"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return; - } - jmethodID mid = env->GetMethodID( cls, "onMessageSynchronized", - "(Lorg/iotivity/service/ns/common/SyncInfo)V"); - if (!mid) - { - LOGE("Failed to Get MethodID"); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - return; - } - env->CallVoidMethod( jSyncListener, mid, obj_syncInfo); - - env->DeleteLocalRef(jSyncListener); - env->DeleteLocalRef(cls_SyncInfo); - env->DeleteLocalRef(cls_SyncType); - if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); - - LOGI("JNIProviderService: OnSyncInfoListenerCb - OUT"); - return; - -} - -OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) -{ - LOGI("JNIProviderService: getMessage - IN"); + LOGD("JNIProviderService: getMessage - IN"); jclass cls = env->GetObjectClass( jMsg); @@ -257,7 +93,7 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) jint jtype = env->CallIntMethod(jobj, mid); OIC::Service::NSMessage::NSMessageType type = (OIC::Service::NSMessage::NSMessageType) jtype; - LOGI("Message Type: %ld\n", (long )type); + LOGD("Message Type: %ld\n", (long )type); // Message Time jfieldID fid_tm = env->GetFieldID( cls, "mTime", "Ljava/lang/String;"); @@ -274,9 +110,9 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) } else { - LOGI("Info: messageTitle is null"); + LOGD("Info: messageTitle is null"); } - LOGI("Message Time: %s\n", time); + LOGD("Message Time: %s\n", time); // Message TTL jfieldID fid_ttl = env->GetFieldID( cls, "mTTL", "J"); @@ -288,7 +124,7 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) jlong jttl = (jlong) env->GetObjectField( jMsg, fid_ttl); uint64_t ttl = jttl; - LOGI("Message ID: %lld\n", ttl); + LOGD("Message ID: %lld\n", ttl); // Message Title jfieldID fid_title = env->GetFieldID( cls, "mTitle", "Ljava/lang/String;"); @@ -305,9 +141,9 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) } else { - LOGI("Info: messageTitle is null"); + LOGD("Info: messageTitle is null"); } - LOGI("Message Title: %s\n", messageTitle); + LOGD("Message Title: %s\n", messageTitle); // Message Content Text jfieldID fid_body = env->GetFieldID( cls, "mContentText", "Ljava/lang/String;"); @@ -324,9 +160,9 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) } else { - LOGI("Info: messageBody is null"); + LOGD("Info: messageBody is null"); } - LOGI("Message Body: %s\n", messageBody); + LOGD("Message Body: %s\n", messageBody); // Message Source jfieldID fid_source = env->GetFieldID( cls, "mSourceName", "Ljava/lang/String;"); @@ -343,9 +179,9 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) } else { - LOGI("Info: messageSource is null"); + LOGD("Info: messageSource is null"); } - LOGI("Message Source: %s\n", messageSource); + LOGD("Message Source: %s\n", messageSource); // Message MediaContents jfieldID fid_media = env->GetFieldID( cls, "mMediaContents", @@ -381,10 +217,10 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) } else { - LOGI("Info: iconImage is null"); + LOGD("Info: iconImage is null"); } - LOGI("iconImage: %s\n", iconImage); + LOGD("iconImage: %s\n", iconImage); OIC::Service::NSMediaContents *media = new OIC::Service::NSMediaContents(std::string(iconImage)); OIC::Service::NSMessage *nsMsg = OIC::Service::NSProviderService::getInstance()->CreateMessage(); @@ -400,19 +236,19 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) env->DeleteLocalRef(cls_messageType); env->DeleteLocalRef(cls_MediaContents); - if (jtime) + if (jtime) { env->ReleaseStringUTFChars(jtime, time); } - if (jmsgTitle) + if (jmsgTitle) { env->ReleaseStringUTFChars(jmsgTitle, messageTitle); } - if (jmsgBody) + if (jmsgBody) { env->ReleaseStringUTFChars(jmsgBody, messageBody); } - if (jmsgSource) + if (jmsgSource) { env->ReleaseStringUTFChars(jmsgSource, messageSource); } @@ -421,16 +257,252 @@ OIC::Service::NSMessage *getMessage(JNIEnv *env, jobject jMsg) env->ReleaseStringUTFChars(jiconImage, iconImage); } - LOGI("JNIProviderService: getMessage - OUT"); + LOGD("JNIProviderService: getMessage - OUT"); return nsMsg; } +jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState) +{ + LOGD("JNIProviderService: getJavaState - IN"); + + // TopicState + jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState)); + if (!cls_topicState) + { + LOGE ("Failed to Get ObjectClass for TopicState Type"); + return nullptr; + } + + jobject obj_topicState; + switch (nsState) + { + case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_topicState, + "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;"); + obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID); + } + case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_topicState, + "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;"); + obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID); + } + + } + if (obj_topicState == NULL) + { + LOGE("Error: object of field TopicState is null"); + return NULL; + } + env->DeleteLocalRef(cls_topicState); + LOGD("JNIProviderService: getJavaState - OUT"); + return obj_topicState; +} + +jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList) +{ + LOGD("JNIProviderService: getJavaTopicsList - IN"); + jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList)); + if (!cls_topicList) + { + LOGE ("Failed to Get ObjectClass for TopicsList"); + return NULL; + } + jmethodID mid_topicList = env->GetMethodID(cls_topicList, "", "()V"); + if (!mid_topicList) + { + LOGE ("Failed to Get MethodID for TopicsList"); + return NULL; + } + jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList); + jmethodID mid_addTopic = + env->GetMethodID(cls_topicList, "addTopic", "(Lorg/iotivity/service/ns/common/Topic;)V"); + for (auto it : topicList->getTopicsList()) + { + jobject jState = getJavaState(env, it->getState()); + std::string topicName = it->getTopicName(); + jstring jTopicName = env->NewStringUTF(topicName.c_str()); + env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState); + } + env->DeleteLocalRef(cls_topicList); + LOGD("JNIProviderService: getJavaTopicsList - OUT"); + return obj_topicList; +} + +void onSubscribeListenerCb(OIC::Service::NSConsumer *consumer) +{ + LOGD("JNIProviderService_onSubscribeListenerCb - IN"); + + jint envRet; + JNIEnv *env = GetJNIEnv(&envRet); + if (NULL == env) return ; + + jobject jSubscriptionListener = (jobject) env->NewLocalRef(g_obj_subscriptionListener); + if (!jSubscriptionListener) + { + LOGE ("Failed to Get jSubscriptionListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + LOGD("consumer ID : %s\n", consumer->getConsumerId().c_str()); + + jstring jConsumerId = env->NewStringUTF( consumer->getConsumerId().c_str()); + + jclass cls_consumer = (jclass) (env->NewLocalRef(g_cls_Consumer)); + if (!cls_consumer) + { + LOGE ("Failed to Get ObjectClass for Consumer"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jmethodID mid_consumer = env->GetMethodID( + cls_consumer, + "", + "(JLjava/lang/String;Lorg/iotivity/service/ns/provider/Consumer)V"); + if (!mid_consumer) + { + LOGE ("Failed to Get MethodID for Consumer"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jobject obj_consumer = env->NewObject( cls_consumer, mid_consumer, jConsumerId); + + jclass cls = env->GetObjectClass( jSubscriptionListener); + if (!cls) + { + LOGE("Failed to Get ObjectClass of jSubscriptionListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return; + } + jmethodID mid = env->GetMethodID( + cls, + "onConsumerSubscribed", + "(Lorg/iotivity/service/ns/provider/Consumer;)V"); + if (!mid) + { + LOGE("Failed to Get MethodID of onConsumerSubscribed"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return; + } + + env->CallVoidMethod( jSubscriptionListener, mid, obj_consumer); + env->DeleteLocalRef(jSubscriptionListener); + env->DeleteLocalRef(cls_consumer); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + LOGD("JNIProviderService_onSubscribeListenerCb - OUT"); + return; +} + +void onSyncInfoListenerCb(OIC::Service::NSSyncInfo *sync) +{ + LOGD("JNIProviderService_onSyncInfoListenerCb - IN"); + + jint envRet; + JNIEnv *env = GetJNIEnv(&envRet); + if (NULL == env) return ; + + jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener); + if (!jSyncListener) + { + LOGE ("Failed to Get jSyncListener"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + LOGD("Sync ID : %ld\n", (long) sync->getMessageId()); + LOGD("Sync STATE : %d\n", (int) sync->getState()); + + jlong jMessageId = (long) sync->getMessageId(); + jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str()); + jobject syncType; + + jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType)); + if (!cls_SyncType) + { + LOGE ("Failed to Get ObjectClass for SyncType"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + switch (sync->getState()) + { + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD: + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ : + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED : + { + static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType, + "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;"); + syncType = env->GetStaticObjectField(cls_SyncType, fieldID); + } + + } + + jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo)); + if (!cls_SyncInfo) + { + LOGE ("Failed to Get ObjectClass for SyncInfo"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + jmethodID mid_syncInfo = env->GetMethodID( + cls_SyncInfo, + "", + "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType)V"); + if (!mid_syncInfo) + { + LOGE ("Failed to Get MethodID for SyncInfo"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return ; + } + + jobject obj_syncInfo = env->NewObject( cls_SyncInfo, mid_syncInfo, jMessageId, jProviderId, + syncType); + + jclass cls = env->GetObjectClass( jSyncListener); + if (!cls) + { + LOGE("Failed to Get ObjectClass"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return; + } + jmethodID mid = env->GetMethodID( cls, "onMessageSynchronized", + "(Lorg/iotivity/service/ns/common/SyncInfo)V"); + if (!mid) + { + LOGE("Failed to Get MethodID"); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + return; + } + env->CallVoidMethod( jSyncListener, mid, obj_syncInfo); + + env->DeleteLocalRef(jSyncListener); + env->DeleteLocalRef(cls_SyncInfo); + env->DeleteLocalRef(cls_SyncType); + if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); + + LOGD("JNIProviderService: OnSyncInfoListenerCb - OUT"); + return; + +} + JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStart( JNIEnv *env, jobject jObj, jboolean jPolicy, jobject jSubscriptionListener, jobject jSyncListener) { - LOGI("JNIProviderService: nativeStart - IN"); + LOGD("JNIProviderService: nativeStart - IN"); if (!jSubscriptionListener || !jSyncListener) { LOGE("Fail to set listeners"); @@ -464,19 +536,19 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nat } - LOGI("JNIProviderService: nativeStart - OUT"); + LOGD("JNIProviderService: nativeStart - OUT"); return (jint) result; } JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeStop( JNIEnv *env, jobject jObj) { - LOGI("JNIProviderService: nativeStop - IN"); + LOGD("JNIProviderService: nativeStop - IN"); OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->Stop(); if (result != OIC::Service::NSResult::OK) { - LOGI("Fail to stop NSProvider service"); + LOGD("Fail to stop NSProvider service"); return (jint) result; } @@ -485,21 +557,21 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nat g_obj_subscriptionListener = NULL; g_obj_syncListener = NULL; - LOGI("JNIProviderService: nativeStop - OUT"); + LOGD("JNIProviderService: nativeStop - OUT"); return (jint) result; } JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendMessage( JNIEnv *env, jobject jObj, jobject jMsg) { - LOGI("JNIProviderService: nativeSendMessage - IN"); + LOGD("JNIProviderService: nativeSendMessage - IN"); if (!jMsg) { - LOGI("Fail to send notification - Message is null"); + LOGD("Fail to send notification - Message is null"); ThrowNSException(NS_ERROR, "Message cannot be null"); return (jint) OIC::Service::NSResult::ERROR; } - OIC::Service::NSMessage *nsMsg = getMessage(env, jMsg); + OIC::Service::NSMessage *nsMsg = getNativeMessage(env, jMsg); if (nsMsg == nullptr) { ThrowNSException(NS_ERROR, "Message didn't have a field ID "); @@ -509,19 +581,19 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nat OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->SendMessage(nsMsg); if (result != OIC::Service::NSResult::OK) { - LOGI("Fail to send NSProvider Message"); + LOGD("Fail to send NSProvider Message"); } - LOGI("JNIProviderService: nativeSendMessage - OUT"); + LOGD("JNIProviderService: nativeSendMessage - OUT"); return (jint) result; } JNIEXPORT void JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeSendSyncInfo( JNIEnv *env, jobject jObj, jlong messageId , jint syncState) { - LOGI("JNIProviderService: nativeSendSyncInfo - IN"); + LOGD("JNIProviderService: nativeSendSyncInfo - IN"); OIC::Service::NSProviderService::getInstance()->SendSyncInfo( messageId, (OIC::Service::NSSyncInfo::NSSyncType) syncState); - LOGI("JNIProviderService: nativeSendSyncInfo - OUT"); + LOGD("JNIProviderService: nativeSendSyncInfo - OUT"); return; } @@ -529,7 +601,7 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService(JNIEnv *env, jobject jObj, jstring jstr) { - LOGI("JNIProviderService: nativeEnableRemoteService - IN"); + LOGD("JNIProviderService: nativeEnableRemoteService - IN"); if (!jstr) { ThrowNSException(NS_ERROR, "Server Address Can't be NULL"); @@ -538,14 +610,15 @@ Java_org_iotivity_service_ns_provider_ProviderService_nativeEnableRemoteService( const char *address = env->GetStringUTFChars( jstr, NULL); std::string servAddress(address); - OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->EnableRemoteService( - servAddress); + OIC::Service::NSResult result = + OIC::Service::NSProviderService::getInstance()->EnableRemoteService( + servAddress); if (result != OIC::Service::NSResult::OK) { LOGE("Fail to Enable Remote Service"); } env->ReleaseStringUTFChars(jstr, address); - LOGI("JNIProviderService: nativeEnableRemoteService - OUT"); + LOGD("JNIProviderService: nativeEnableRemoteService - OUT"); return (jint) result; } @@ -553,7 +626,7 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService(JNIEnv *env, jobject jObj, jstring jstr) { - LOGI("JNIProviderService: nativeDisableRemoteService - IN"); + LOGD("JNIProviderService: nativeDisableRemoteService - IN"); if (!jstr) { ThrowNSException(NS_ERROR, "Server Address Can't be NULL"); @@ -562,20 +635,82 @@ Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService const char *address = env->GetStringUTFChars( jstr, NULL); std::string servAddress(address); - OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->DisableRemoteService( - servAddress); + OIC::Service::NSResult result = + OIC::Service::NSProviderService::getInstance()->DisableRemoteService( + servAddress); if (result != OIC::Service::NSResult::OK) { LOGE("Fail to Disable Remote Service"); } env->ReleaseStringUTFChars(jstr, address); - LOGI("JNIProviderService: nativeDisableRemoteService - OUT"); + LOGD("JNIProviderService: nativeDisableRemoteService - OUT"); return (jint) result; } +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeAddTopic +(JNIEnv *env, jobject jObj, jstring jTopicName) +{ + LOGD("JNIProviderService: nativeAddTopic - IN"); + if (!jTopicName) + { + ThrowNSException(NS_ERROR, "Topic Name Can't be NULL"); + return (jint) OIC::Service::NSResult::ERROR; + } + const char *name = env->GetStringUTFChars( jTopicName, NULL); + std::string topicName(name); + OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->AddTopic( + topicName); + if (result != OIC::Service::NSResult::OK) + { + LOGE("Fail to Add Topic"); + } + env->ReleaseStringUTFChars(jTopicName, name); + LOGD("JNIProviderService: nativeAddTopic - OUT"); + return (jint) result; +} +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeDeleteTopic +(JNIEnv *env, jobject jObj, jstring jTopicName) +{ + LOGD("JNIProviderService: nativeDeleteTopic - IN"); + if (!jTopicName) + { + ThrowNSException(NS_ERROR, "Topic Name Can't be NULL"); + return (jint) OIC::Service::NSResult::ERROR; + } + const char *name = env->GetStringUTFChars( jTopicName, NULL); + std::string topicName(name); + OIC::Service::NSResult result = OIC::Service::NSProviderService::getInstance()->DeleteTopic( + topicName); + if (result != OIC::Service::NSResult::OK) + { + LOGE("Fail to Add Topic"); + } + env->ReleaseStringUTFChars(jTopicName, name); + LOGD("JNIProviderService: nativeDeleteTopic - OUT"); + return (jint) result; +} + +JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_ProviderService_nativeGetTopics +(JNIEnv *env, jobject jObj) +{ + LOGD("JNIProviderService: nativeGetTopics - IN"); + + OIC::Service::NSTopicsList *topicList = + OIC::Service::NSProviderService::getInstance()->GetTopics(); + if (topicList == nullptr) + { + ThrowNSException(NS_ERROR, "Topic List doesn't exist"); + return NULL; + } + + jobject obj_topicList = getJavaTopicsList(env, topicList); + + LOGD("JNIProviderService: nativeGetTopics - OUT"); + return obj_topicList; +} + JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription( - JNIEnv *env, - jobject jObj, jobject jConsumer, jboolean jAccepted) + JNIEnv *env, jobject jObj, jobject jConsumer, jboolean jAccepted) { LOGD("JNIProviderService: nativeAcceptSubscription - IN"); @@ -596,34 +731,125 @@ JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcce } jstring jconId = (jstring)env->GetObjectField( jConsumer, fid_id); - const char *conId = ""; - if (conId) + if (!jconId) { - conId = env->GetStringUTFChars( jconId, NULL); - } - else - { - LOGI("Info: Consumer Id is null"); + ThrowNSException(NS_ERROR, "ProviderId cannot be null"); + return (jint) OIC::Service::NSResult::ERROR;; } + const char *conId = env->GetStringUTFChars( jconId, NULL); std::string consumerId(conId); env->ReleaseStringUTFChars(jconId, conId); - LOGI("Consumer ID: %s\n", consumerId.c_str()); + LOGD("Consumer ID: %s\n", consumerId.c_str()); - OIC::Service::NSConsumer *consumer = new OIC::Service::NSConsumer(consumerId); + OIC::Service::NSConsumer *consumer = + OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId); int result = consumer->acceptSubscription(consumer, (bool)jAccepted); if (jAccepted) { - LOGI("Subscription Accepted"); + LOGD("Subscription Accepted"); } else { - LOGI("Subscription Denied"); + LOGD("Subscription Denied"); } LOGD("JNIProviderService: nativeAcceptSubscription - OUT"); return result; } +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSelectTopic +(JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName) +{ + LOGD("JNIProviderService: nativeSelectTopic - IN"); + if (!jConsumerId || !jTopicName) + { + ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL"); + return (jint) OIC::Service::NSResult::ERROR; + } + const char *name = env->GetStringUTFChars( jTopicName, NULL); + const char *id = env->GetStringUTFChars( jConsumerId, NULL); + std::string topicName(name); + std::string consumerId(id); + OIC::Service::NSConsumer *nsConsumer = + OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId); + if (!nsConsumer) + { + ThrowNSException(NS_ERROR, "Consumer does exists"); + return (jint) OIC::Service::NSResult::ERROR; + } + OIC::Service::NSResult result = nsConsumer->selectTopic(topicName); + + if (result != OIC::Service::NSResult::OK) + { + LOGD("Fail to Select Topic"); + } + env->ReleaseStringUTFChars(jTopicName, name); + env->ReleaseStringUTFChars(jConsumerId, id); + LOGD("JNIProviderService: nativeSelectTopic - OUT"); + return (jint) result; +} +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeUnselectTopic +(JNIEnv *env, jobject jObj, jstring jConsumerId, jstring jTopicName) +{ + LOGD("JNIProviderService: nativeUnselectTopic - IN"); + if (!jConsumerId || !jTopicName) + { + ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL"); + return (jint) OIC::Service::NSResult::ERROR; + } + const char *name = env->GetStringUTFChars( jTopicName, NULL); + const char *id = env->GetStringUTFChars( jConsumerId, NULL); + std::string topicName(name); + std::string consumerId(id); + OIC::Service::NSConsumer *nsConsumer = + OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId); + if (!nsConsumer) + { + ThrowNSException(NS_ERROR, "Consumer does exists"); + return (jint) OIC::Service::NSResult::ERROR; + } + OIC::Service::NSResult result = nsConsumer->unselectTopic(topicName); + + if (result != OIC::Service::NSResult::OK) + { + LOGE("Fail to Unselect Topic"); + } + env->ReleaseStringUTFChars(jTopicName, name); + env->ReleaseStringUTFChars(jConsumerId, id); + LOGD("JNIProviderService: nativeUnselectTopic - OUT"); + return (jint) result; +} + +JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeGetConsumerTopics +(JNIEnv *env, jobject jObj, jstring jConsumerId) +{ + LOGD("JNIProviderService: nativeGetConsumerTopics - IN"); + if (!jConsumerId) + { + ThrowNSException(NS_ERROR, "Topic Name or ConsumerId Can't be NULL"); + return NULL; + } + const char *id = env->GetStringUTFChars( jConsumerId, NULL); + std::string consumerId(id); + OIC::Service::NSConsumer *nsConsumer = + OIC::Service::NSProviderService::getInstance()->getConsumer(consumerId); + if (!nsConsumer) + { + ThrowNSException(NS_ERROR, "Consumer does exists"); + return NULL; + } + OIC::Service::NSTopicsList *topicList = nsConsumer->getConsumerTopics(); + if (topicList == nullptr) + { + ThrowNSException(NS_ERROR, "Topic List doesn't exist"); + return NULL; + } + jobject obj_topicList = getJavaTopicsList(env, topicList); + + env->ReleaseStringUTFChars(jConsumerId, id); + LOGD("JNIProviderService: nativeGetConsumerTopics - OUT"); + return obj_topicList; +} // JNI OnLoad JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) @@ -722,19 +948,64 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) return JNI_ERR; } + jclass localTopic = env->FindClass( + "org/iotivity/service/ns/common/Topic"); + if (!localTopic) + { + LOGE("Failed to get local Topic class"); + return JNI_ERR; + } + g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic)); + if (!g_cls_Topic) + { + LOGE("Failed to set Global Topic reference"); + return JNI_ERR; + } + + jclass localTopicsList = env->FindClass( + "org/iotivity/service/ns/common/TopicsList"); + if (!localTopicsList) + { + LOGE("Failed to get local Topic class"); + return JNI_ERR; + } + g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList)); + if (!g_cls_TopicsList) + { + LOGE("Failed to set Global TopicsList reference"); + return JNI_ERR; + } + + jclass localTopicState = env->FindClass( + "org/iotivity/service/ns/common/Topic$TopicState"); + if (!localTopicState) + { + LOGE("Failed to get local TopicState enum"); + return JNI_ERR; + } + g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState)); + if (!g_cls_TopicState) + { + LOGE("Failed to set Global TopicState reference"); + return JNI_ERR; + } + env->DeleteLocalRef(localMessage); env->DeleteLocalRef(localMessageType); env->DeleteLocalRef(localConsumer); env->DeleteLocalRef(localSyncInfo); env->DeleteLocalRef(localSyncType); env->DeleteLocalRef(localMediaContents); + env->DeleteLocalRef(localTopic); + env->DeleteLocalRef(localTopicsList); + env->DeleteLocalRef(localTopicState); return NSExceptionInit(env); } JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved) { - LOGI("ProviderService_JNI_OnUnload"); + LOGD("ProviderService_JNI_OnUnload"); JNIEnv *env; if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK) @@ -749,4 +1020,7 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved) env->DeleteGlobalRef(g_cls_SyncType); env->DeleteGlobalRef(g_cls_MediaContents); env->DeleteGlobalRef(g_cls_Message_Type); + env->DeleteGlobalRef(g_cls_Topic); + env->DeleteGlobalRef(g_cls_TopicsList); + env->DeleteGlobalRef(g_cls_TopicState); } diff --git a/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.h b/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.h index 694edfc..bc7779e 100644 --- a/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.h +++ b/service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.h @@ -78,6 +78,33 @@ Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService (JNIEnv *, jobject, jstring); /* + * Class: org_iotivity_service_ns_provider_ProviderService + * Method: nativeAddTopic + * Signature: (Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL +Java_org_iotivity_service_ns_provider_ProviderService_nativeAddTopic +(JNIEnv *, jobject, jstring); + +/* + * Class: org_iotivity_service_ns_provider_ProviderService + * Method: nativeDeleteTopic + * Signature: (Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL +Java_org_iotivity_service_ns_provider_ProviderService_nativeDeleteTopic +(JNIEnv *, jobject, jstring); + +/* + * Class: org_iotivity_service_ns_provider_ProviderService + * Method: nativeGetTopics + * Signature: ()Lorg/iotivity/service/ns/common/TopicsList; + */ +JNIEXPORT jobject JNICALL +Java_org_iotivity_service_ns_provider_ProviderService_nativeGetTopics +(JNIEnv *, jobject); + +/* * Class: org_iotivity_service_ns_provider_Consumer * Method: nativeAcceptSubscription * Signature: (Lorg/iotivity/service/ns/provider/Consumer;Z)I @@ -85,6 +112,30 @@ Java_org_iotivity_service_ns_provider_ProviderService_nativeDisableRemoteService JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeAcceptSubscription (JNIEnv *, jobject, jobject, jboolean); +/* + * Class: org_iotivity_service_ns_provider_Consumer + * Method: nativeSelectTopic + * Signature: (Ljava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeSelectTopic +(JNIEnv *, jobject, jstring, jstring); + +/* + * Class: org_iotivity_service_ns_provider_Consumer + * Method: nativeUnselectTopic + * Signature: (Ljava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_provider_Consumer_nativeUnselectTopic +(JNIEnv *, jobject, jstring, jstring); + +/* + * Class: org_iotivity_service_ns_provider_Consumer + * Method: nativeGetConsumerTopics + * Signature: (Ljava/lang/String;)Lorg/iotivity/service/ns/common/TopicsList; + */ +JNIEXPORT jobject JNICALL +Java_org_iotivity_service_ns_provider_Consumer_nativeGetConsumerTopics +(JNIEnv *, jobject, jstring); #ifdef __cplusplus } diff --git a/service/notification/cpp-wrapper/common/NSTopicsList.cpp b/service/notification/cpp-wrapper/common/NSTopicsList.cpp index 35d2365..12abc81 100755 --- a/service/notification/cpp-wrapper/common/NSTopicsList.cpp +++ b/service/notification/cpp-wrapper/common/NSTopicsList.cpp @@ -36,15 +36,6 @@ namespace OIC topicsNode = topicsNode->next; } - topicsNode = topics; - while (topicsNode != nullptr) - { - topics = topics->next; - if (topicsNode->topicName) - OICFree(topicsNode->topicName); - OICFree(topicsNode); - topicsNode = topics; - } } NSTopicsList::~NSTopicsList() diff --git a/service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp b/service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp index 18ebf51..fbc4e12 100755 --- a/service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp +++ b/service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp @@ -189,7 +189,7 @@ namespace OIC return NULL; } - NSMessage *getMessage(uint64_t messageId) + NSMessage *NSConsumerService::getMessage(uint64_t messageId) { NS_LOG(DEBUG, "getMessage - IN"); ::NSMessage *message = NSConsumerGetMessage(messageId);