Updated JAVA and JNI API's for Topic Resource
authornikhil.a <nikhil.a7@samsung.com>
Wed, 24 Aug 2016 15:53:08 +0000 (21:23 +0530)
committerUze Choi <uzchoi@samsung.com>
Thu, 25 Aug 2016 03:34:53 +0000 (03:34 +0000)
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 <nikhil.a7@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10883
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
Tested-by: Uze Choi <uzchoi@samsung.com>
13 files changed:
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Message.java
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/Topic.java [new file with mode: 0644]
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/common/TopicsList.java [new file with mode: 0644]
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/ConsumerService.java
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/consumer/Provider.java
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/Consumer.java
service/notification/android/notification-service/src/main/java/org/iotivity/service/ns/provider/ProviderService.java
service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.cpp
service/notification/android/notification-service/src/main/jni/consumer/JniNotificationConsumer.h
service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.cpp
service/notification/android/notification-service/src/main/jni/provider/JniNotificationProvider.h
service/notification/cpp-wrapper/common/NSTopicsList.cpp
service/notification/cpp-wrapper/consumer/src/NSConsumerService.cpp

index 724f58f..6f6f505 100755 (executable)
@@ -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 (file)
index 0000000..2ac3556
--- /dev/null
@@ -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 (file)
index 0000000..6175e77
--- /dev/null
@@ -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<Topic> mTopicsList = new  Vector<Topic>();
+
+    public void addTopic(String topicname, Topic.TopicState state)
+    {
+        mTopicsList.add(new Topic(topicname,state));
+    }
+
+    public void removeTopic(String topicName)
+    {
+        Iterator <Topic> it = getTopicsList().iterator();
+        while(it.hasNext())
+        {
+            if(it.next().getTopicName().equals(topicName))
+            {
+                mTopicsList.remove(it.next());
+            }
+        }
+    }
+
+    public Vector<Topic>  getTopicsList()
+    {
+        return mTopicsList;
+    }
+
+}
+
index 480ce40..d48e7e1 100755 (executable)
@@ -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;
 }
index bb01ec9..a25e7c1 100755 (executable)
@@ -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<Topic> 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<Topic> topicsList) throws NSException;
 }
index 6875ffc..37e2417 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 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
index d09133d..9b695ad 100644 (file)
@@ -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();
 }
index e4b5c1e..e8c6664 100755 (executable)
@@ -32,6 +32,11 @@ jclass g_cls_Message;
 jclass g_cls_Provider;\r
 jclass g_cls_SyncInfo;\r
 jclass g_cls_MediaContents;\r
+jclass g_cls_TopicState;\r
+jclass g_cls_Message_Type;\r
+jclass g_cls_Response;\r
+jclass g_cls_Topic;\r
+jclass g_cls_TopicsList;\r
 \r
 static JNIEnv *GetJNIEnv(jint *ret)\r
 {\r
@@ -60,95 +65,283 @@ static JNIEnv *GetJNIEnv(jint *ret)
     }\r
 }\r
 \r
-void onDiscoverProvider(OIC::Service::NSProvider *provider)\r
+jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)\r
+{\r
+    LOGD ("ConsumerService_getJavaMessageType - IN");\r
+    switch (type)\r
+    {\r
+        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
+                                          "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
+                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
+            }\r
+        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
+                                          "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
+                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
+            }\r
+        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
+                                          "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
+                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
+            }\r
+        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
+                                          "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
+                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
+            }\r
+        default:\r
+            return NULL;\r
+    }\r
+    LOGD ("ConsumerService_getJavaMessageType - OUT");\r
+    return NULL;\r
+}\r
+\r
+jobject getJavaState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)\r
 {\r
-    LOGD ("ConsumerService_onDiscoverProvider");\r
+    LOGD ("ConsumerService_getJavaState - IN");\r
 \r
-    jint envRet;\r
-    JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
+    // TopicState\r
+    jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));\r
+    if (!cls_topicState)\r
+    {\r
+        LOGE ("Failed to Get ObjectClass for TopicState Type");\r
+        return nullptr;\r
+    }\r
 \r
-    jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener);\r
-    if (!jDiscoverListener)\r
+    jobject obj_topicState;\r
+    switch (nsState)\r
     {\r
-        LOGE ("Failed to Get jDiscoverListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        case OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,\r
+                                          "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
+                obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);\r
+            }\r
+        case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,\r
+                                          "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
+                obj_topicState = env->GetStaticObjectField(cls_topicState, fieldID);\r
+            }\r
+\r
+    }\r
+    if (obj_topicState == NULL)\r
+    {\r
+        LOGE("Error: object of field  TopicState  is null");\r
+        return NULL;\r
     }\r
 \r
-    LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
+    env->DeleteLocalRef(cls_topicState);\r
+    LOGD ("ConsumerService_getJavaState - OUT");\r
+    return obj_topicState;\r
+}\r
 \r
-    jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
-    jlong pProvider = (long)provider;\r
 \r
-    jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
-    if (!cls_provider)\r
+jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)\r
+{\r
+    LOGD ("ConsumerService_getJavaTopicsList - IN");\r
+    jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));\r
+    if (!cls_topicList)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for Provider");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        LOGE ("Failed to Get ObjectClass for TopicsList");\r
+        return NULL;\r
     }\r
-    jmethodID mid_provider = env->GetMethodID(\r
-                                 cls_provider, "<init>", "(Ljava/lang/String;)V");\r
-    if (!mid_provider)\r
+    jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");\r
+    if (!mid_topicList)\r
     {\r
-        LOGE ("Failed to Get MethodID for Provider<init>");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        LOGE ("Failed to Get MethodID for TopicsList<init>");\r
+        return NULL;\r
     }\r
-    jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
-                                          jProviderId);\r
+    jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);\r
+    jmethodID mid_addTopic =\r
+        env->GetMethodID(cls_topicList, "addTopic", "(Lorg/iotivity/service/ns/common/Topic;)V");\r
+    for (auto it : topicList->getTopicsList())\r
+    {\r
+        jobject jState = getJavaState(env, it->getState());\r
+        std::string topicName = it->getTopicName();\r
+        jstring jTopicName = env->NewStringUTF(topicName.c_str());\r
+        env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);\r
+    }\r
+    env->DeleteLocalRef(cls_topicList);\r
+    LOGD ("ConsumerService_getJavaTopicsList - OUT");\r
+    return obj_topicList;\r
+}\r
 \r
-    jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
-    if (!nativeHandle)\r
+OIC::Service::NSTopic::NSTopicState getNativeState(JNIEnv *env,  jobject jTopic)\r
+{\r
+    LOGD ("ConsumerService_getNativeState - IN");\r
+\r
+    jclass cls_topic = env->GetObjectClass( jTopic);\r
+    // TopicState\r
+    jclass cls_TopicState = (jclass) (env->NewLocalRef(g_cls_TopicState));\r
+    if (!cls_TopicState)\r
     {\r
-        LOGE("Failed to get nativeHandle for Provider");\r
-        return;\r
+        LOGE ("Failed to Get ObjectClass for cls_TopicState Type");\r
+        ThrowNSException(NS_ERROR, "TopicState class  not found ");\r
+        return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
     }\r
-    env->SetLongField(obj_provider, nativeHandle, pProvider);\r
+    jmethodID mid = env->GetMethodID(cls_TopicState, "ordinal", "()I");\r
+    jfieldID fid_state = env->GetFieldID( cls_TopicState, "mState",\r
+                                          "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
+    if (fid_state == NULL)\r
+    {\r
+        LOGE("Error: jfieldID for state type  is null");\r
+        ThrowNSException(NS_ERROR, "TopicState fid  not found ");\r
+        return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
+    }\r
+    jobject jobj = env->GetObjectField( jTopic, fid_state);\r
+    if (jobj == NULL)\r
+    {\r
+        LOGE("Error: object of field  state Type is null");\r
+        ThrowNSException(NS_ERROR, "TopicState obj  is null ");\r
+        return OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
+    }\r
+    jint jState = env->CallIntMethod(jobj, mid);\r
+    OIC::Service::NSTopic::NSTopicState  state = (OIC::Service::NSTopic::NSTopicState) jState;\r
+    LOGD ("ConsumerService_getNativeState - OUT");\r
+    return state;\r
 \r
-    jclass cls = env->GetObjectClass(jDiscoverListener);\r
-    if (!cls)\r
+}\r
+\r
+const char *getNativeTopicName(JNIEnv *env,  jobject jTopic)\r
+{\r
+    LOGD ("ConsumerService_getNativeTopicName - IN");\r
+    jclass cls_topic = env->GetObjectClass( jTopic);\r
+    jfieldID fid_name = env->GetFieldID( cls_topic, "mTopicname",\r
+                                         "Ljava/lang/String;");\r
+    if (fid_name == NULL)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for jDiscoverListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        LOGE("Error: jfieldID for Topic Name  is null");\r
+        return nullptr;\r
     }\r
-    jmethodID mid = env->GetMethodID(\r
-                        cls,\r
-                        "onProviderDiscovered",\r
-                        "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
-    if (!mid)\r
+    jstring jTopicName = (jstring) env->GetObjectField( jTopic, fid_name);\r
+    const char *topicName;\r
+    if (jTopicName)\r
     {\r
-        LOGE ("Failed to Get MethodID for onProviderDiscovered");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        topicName = env->GetStringUTFChars( jTopicName, NULL);\r
+    }\r
+    else\r
+    {\r
+        LOGI("Info: topicName is null");\r
     }\r
+    LOGD ("ConsumerService_getNativeTopicName - OUT");\r
+    return topicName;\r
 \r
-    env->CallVoidMethod(jDiscoverListener, mid, obj_provider);\r
+}\r
 \r
-    env->DeleteLocalRef(jDiscoverListener);\r
-    env->DeleteLocalRef(cls_provider);\r
-    if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-    return ;\r
+OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList)\r
+{\r
+    LOGD ("ConsumerService_getNativeTopicsList - IN");\r
+\r
+    jclass cls_topicList = env->GetObjectClass( jTopicList);\r
+    jfieldID fid_list = env->GetFieldID( cls_topicList, "mTopicsList",\r
+                                         "Ljava/util/Vector;");\r
+    if (fid_list == NULL)\r
+    {\r
+        LOGE("Error: jfieldID for Topic List  is null");\r
+        return nullptr;\r
+    }\r
+    jobject jobj = env->GetObjectField( jTopicList, fid_list);\r
+    if (jobj == NULL)\r
+    {\r
+        LOGE("Error: object of field  Topic List is null");\r
+        return nullptr;\r
+    }\r
+    jclass cls_vec = env->FindClass("java/util/Vector");\r
+    jmethodID sizeMethod = env->GetMethodID(cls_vec,  "size", "()I;");\r
+    int size = env->CallIntMethod(jobj, sizeMethod);\r
+    jmethodID getMethod = env->GetMethodID(cls_vec,  "get", "(I)Ljava/lang/Object;");\r
+    OIC::Service::NSTopicsList *nsTopicList = new OIC::Service::NSTopicsList();\r
+    for (int index = 0; index < size; index++)\r
+    {\r
+        jobject topicObj = env->CallObjectMethod(jobj, getMethod, index);\r
+        const char *name =  getNativeTopicName(env, topicObj);\r
+        std::string topicName(name);\r
+        OIC::Service::NSTopic::NSTopicState state = getNativeState(env, topicObj);\r
+        nsTopicList->addTopic(topicName, state);\r
+    }\r
+\r
+    env->DeleteLocalRef(cls_vec);\r
+    env->DeleteLocalRef(cls_topicList);\r
+    LOGD ("ConsumerService_getNativeTopicsList - OUT");\r
+    return nsTopicList;\r
 }\r
 \r
-void onProviderChanged(OIC::Service::NSProvider *provider,OIC::Service::NSResponse response)\r
+jobject getJavaResponse(JNIEnv *env, OIC::Service::NSResponse response)\r
 {\r
-    LOGD ("ConsumerService_onSubscriptionAccepted");\r
+    LOGD ("ConsumerService_getJavaResponse - IN");\r
+    switch (response)\r
+    {\r
+        case OIC::Service::NSResponse::ALLOW:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response,\r
+                                          "ALLOW", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;");\r
+                return env->GetStaticObjectField(g_cls_Response, fieldID);\r
+            }\r
+        case OIC::Service::NSResponse::DENY:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response,\r
+                                          "DENY", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;");\r
+                return env->GetStaticObjectField(g_cls_Response, fieldID);\r
+            }\r
+        case OIC::Service::NSResponse::TOPIC:\r
+            {\r
+                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Response,\r
+                                          "TOPIC", "Lorg/iotivity/service/ns/consumer/ConsumerService$Response;");\r
+                return env->GetStaticObjectField(g_cls_Response, fieldID);\r
+            }\r
+        default:\r
+            return NULL;\r
+    }\r
+    LOGD ("ConsumerService_getJavaResponse - OUT");\r
+    return NULL;\r
+}\r
 \r
-    jint envRet;\r
-    JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
+OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj)\r
+{\r
+    LOGD ("ConsumerService_getNativeProvider - IN");\r
+    jclass providerClass = env->GetObjectClass(jObj);\r
+    if (!providerClass)\r
+    {\r
+        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        return NULL;\r
+    }\r
+    jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;");\r
+    if (!jproviderId)\r
+    {\r
+        ThrowNSException(NS_ERROR, "Failed to get providerId for Provider");\r
+        return NULL;\r
+    }\r
+    jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId);\r
+    if (!jprovider_id)\r
+    {\r
+        ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
+        return NULL;\r
+    }\r
 \r
-    jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener);\r
-    if (!jAcceptListener)\r
+    const char *providerId = env->GetStringUTFChars(jprovider_id, 0);\r
+    LOGD ("ProviderId : %s\n", providerId);\r
+\r
+    OIC::Service::NSProvider *provider =\r
+        OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
+    if (provider == nullptr)\r
     {\r
-        LOGE ("Failed to Get jAcceptListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+        return NULL;\r
     }\r
+    env->ReleaseStringUTFChars(jprovider_id, providerId);\r
+    LOGD ("ConsumerService_getNativeProvider - OUT");\r
+    return provider;\r
+}\r
 \r
+jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider)\r
+{\r
+    LOGD ("ConsumerService_getJavaProvider - IN");\r
     LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
 \r
     jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
@@ -158,105 +351,43 @@ void onProviderChanged(OIC::Service::NSProvider *provider,OIC::Service::NSRespon
     if (!cls_provider)\r
     {\r
         LOGE ("Failed to Get ObjectClass for Provider");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        return NULL;\r
     }\r
     jmethodID mid_provider = env->GetMethodID(\r
                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
     if (!mid_provider)\r
     {\r
         LOGE ("Failed to Get MethodID for Provider<init>");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        return NULL;\r
     }\r
-    jobject obj_provider = env->NewObject(cls_provider, mid_provider,\r
-                                          jProviderId);\r
+    jobject obj_provider = env->NewObject(cls_provider, mid_provider, jProviderId);\r
 \r
     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
         LOGE("Failed to get nativeHandle for Provider");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
 \r
-    jclass cls = env->GetObjectClass(jAcceptListener);\r
-    if (!cls)\r
+    jfieldID fid_topic = env->GetFieldID(cls_provider, "mTopicsList",\r
+                                         "Lorg/iotivity/service/ns/common/TopicsList");\r
+    if (!fid_topic)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for jAcceptListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
-    }\r
-    //TODO: Modify to call ProviderChanged Cb adding topic in Java\r
-    jmethodID mid = env->GetMethodID(\r
-                        cls,\r
-                        "onSubscriptionAccepted",\r
-                        "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
-    if (!mid)\r
-    {\r
-        LOGE ("Failed to Get MethodID for onSubscriptionAccepted");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        LOGE("Failed to get nativeHandle for Provider");\r
+        return NULL;\r
     }\r
-\r
-    env->CallVoidMethod(jAcceptListener, mid, obj_provider);\r
-\r
-    env->DeleteLocalRef(jAcceptListener);\r
+    jobject topicList = getJavaTopicsList(env, provider->getTopicList());\r
+    env->SetObjectField(obj_provider, fid_topic, topicList);\r
     env->DeleteLocalRef(cls_provider);\r
-    if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-    return ;\r
-\r
+    LOGD ("ConsumerService_getJavaProvider - OUT");\r
+    return obj_provider;\r
 }\r
 \r
-jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)\r
-{\r
-    switch (type)\r
-    {\r
-        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:\r
-            {\r
-                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
-                                          "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
-            }\r
-        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:\r
-            {\r
-                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
-                                          "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
-            }\r
-        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:\r
-            {\r
-                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
-                                          "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
-            }\r
-        case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:\r
-            {\r
-                static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message,\r
-                                          "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message, fieldID);\r
-            }\r
-        default:\r
-            return NULL;\r
-    }\r
-    return NULL;\r
-}\r
 \r
-void onMessagePosted(OIC::Service::NSMessage *message)\r
+jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)\r
 {\r
-    LOGD ("ConsumerService_onMessagePosted");\r
-\r
-    jint envRet;\r
-    JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
-\r
-    jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener);\r
-    if (!jPostListener)\r
-    {\r
-        LOGE ("Failed to Get jPostListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
-    }\r
+    LOGD ("ConsumerService_getJavaMessage - IN");\r
 \r
     LOGD ("id : %llu\n", message->getMessageId());\r
     LOGD ("title : %s\n", message->getTitle().c_str());\r
@@ -268,6 +399,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     jstring jTitle = env->NewStringUTF(message->getTitle().c_str());\r
     jstring jContentText = env->NewStringUTF(message->getContentText().c_str());\r
     jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());\r
+    jstring jTopic = env->NewStringUTF(message->getTopic().c_str());\r
 \r
     jstring jTime = env->NewStringUTF(message->getTime().c_str());\r
     jlong jTTL = (jlong) message->getTTL();\r
@@ -278,8 +410,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!cls_message)\r
     {\r
         LOGE ("Failed to Get ObjectClass for Message");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        return NULL ;\r
     }\r
     jmethodID mid_message = env->GetMethodID(\r
                                 cls_message, "<init>",\r
@@ -287,8 +418,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!mid_message)\r
     {\r
         LOGE ("Failed to Get MethodID for Message<init>");\r
-        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-        return ;\r
+        return NULL;\r
     }\r
     jobject obj_message = env->NewObject(cls_message, mid_message,\r
                                          jTitle, jContentText, jSourceName);\r
@@ -297,7 +427,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!fid_nativeHandle)\r
     {\r
         LOGE("Failed to get nativeHandle for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetLongField(obj_message, fid_nativeHandle, pMessage);\r
 \r
@@ -305,7 +435,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!fid_messageId)\r
     {\r
         LOGE("Failed to get field MessageID for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetLongField(obj_message, fid_messageId, jMessageId);\r
 \r
@@ -313,7 +443,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!fid_providerId)\r
     {\r
         LOGE("Failed to get field ProviderID for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetObjectField(obj_message, fid_providerId, jProviderId);\r
 \r
@@ -321,7 +451,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!fid_time)\r
     {\r
         LOGE("Failed to get field Time for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetObjectField(obj_message, fid_time, jTime);\r
 \r
@@ -329,10 +459,18 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!fid_ttl)\r
     {\r
         LOGE("Failed to get field TTL for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetLongField(obj_message, fid_ttl, jTTL);\r
 \r
+    jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;");\r
+    if (!fid_topic)\r
+    {\r
+        LOGE("Failed to get mTopic for Message");\r
+        return NULL;\r
+    }\r
+    env->SetObjectField(obj_message, fid_topic, jTopic);\r
+\r
     OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();\r
     if (mediaCont != nullptr)\r
     {\r
@@ -341,16 +479,14 @@ void onMessagePosted(OIC::Service::NSMessage *message)
         if (!cls_mediaContents)\r
         {\r
             LOGE ("Failed to Get ObjectClass for MediaContents");\r
-            if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-            return ;\r
+            return NULL;\r
         }\r
         jmethodID mid_mediaContents = env->GetMethodID(\r
                                           cls_mediaContents, "<init>", "(Ljava/lang/String;)V");\r
         if (!mid_mediaContents)\r
         {\r
             LOGE ("Failed to Get MethodID for MediaContents<init>");\r
-            if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
-            return ;\r
+            return NULL;\r
         }\r
         jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,\r
                                     jIconImage);\r
@@ -360,7 +496,7 @@ void onMessagePosted(OIC::Service::NSMessage *message)
         if (!fid_mediaContents)\r
         {\r
             LOGE("Failed to get field mediaContents for Message");\r
-            return;\r
+            return NULL;\r
         }\r
         env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);\r
 \r
@@ -370,18 +506,144 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     if (!jType)\r
     {\r
         LOGE("Failed to get Type value for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     jfieldID fid_type = env->GetFieldID(cls_message, "mType",\r
                                         "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
     if (!fid_type)\r
     {\r
         LOGE("Failed to get field Type for Message");\r
-        return;\r
+        return NULL;\r
     }\r
     env->SetObjectField(obj_message, fid_type, jType);\r
+    env->DeleteLocalRef(cls_message);\r
+    LOGD ("ConsumerService_getJavaMessage - OUT");\r
+    return obj_message;\r
+}\r
+\r
+void onDiscoverProvider(OIC::Service::NSProvider *provider)\r
+{\r
+    LOGD ("ConsumerService_onDiscoverProvider - IN");\r
+\r
+    jint envRet;\r
+    JNIEnv *env = GetJNIEnv(&envRet);\r
+    if (NULL == env) return ;\r
+\r
+    jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener);\r
+    if (!jDiscoverListener)\r
+    {\r
+        LOGE ("Failed to Get jDiscoverListener");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+\r
+    jobject obj_provider = getJavaProvider(env, provider);\r
+    if (!obj_provider)\r
+    {\r
+        LOGE ("Failed to Get Provider Object");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+\r
+    jclass cls = env->GetObjectClass(jDiscoverListener);\r
+    if (!cls)\r
+    {\r
+        LOGE ("Failed to Get ObjectClass for jDiscoverListener");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+    jmethodID mid = env->GetMethodID(\r
+                        cls,\r
+                        "onProviderDiscovered",\r
+                        "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
+    if (!mid)\r
+    {\r
+        LOGE ("Failed to Get MethodID for onProviderDiscovered");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+\r
+    env->CallVoidMethod(jDiscoverListener, mid, obj_provider);\r
+\r
+    env->DeleteLocalRef(jDiscoverListener);\r
+    if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+    LOGD ("ConsumerService_onDiscoverProvider - OUT");\r
+    return ;\r
+}\r
+\r
+void onProviderChanged(OIC::Service::NSProvider *provider, OIC::Service::NSResponse response)\r
+{\r
+    LOGD ("ConsumerService_onSubscriptionAccepted -IN");\r
+\r
+    jint envRet;\r
+    JNIEnv *env = GetJNIEnv(&envRet);\r
+    if (NULL == env) return ;\r
+\r
+    jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener);\r
+    if (!jAcceptListener)\r
+    {\r
+        LOGE ("Failed to Get jAcceptListener");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+    jobject obj_provider = getJavaProvider(env, provider);\r
+    if (!obj_provider)\r
+    {\r
+        LOGE ("Failed to Get Provider Object");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+\r
+    jclass cls = env->GetObjectClass(jAcceptListener);\r
+    if (!cls)\r
+    {\r
+        LOGE ("Failed to Get ObjectClass for jAcceptListener");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+    jmethodID mid = env->GetMethodID(\r
+                        cls,\r
+                        "onProviderChanged",\r
+                        "(Lorg/iotivity/service/ns/consumer/Provider;Lorg/iotivity/service/ns/consumer/ConsumerService$Response;)V");\r
+    if (!mid)\r
+    {\r
+        LOGE ("Failed to Get MethodID for onProviderChanged");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+    jobject obj_response = getJavaResponse(env, response);\r
+    env->CallVoidMethod(jAcceptListener, mid, obj_provider, obj_response);\r
+\r
+    env->DeleteLocalRef(jAcceptListener);\r
+    if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+    LOGD ("ConsumerService_onSubscriptionAccepted -OUT");\r
+    return ;\r
+\r
+}\r
+\r
+void onMessagePosted(OIC::Service::NSMessage *message)\r
+{\r
+    LOGD ("ConsumerService_onMessagePosted -IN");\r
 \r
+    jint envRet;\r
+    JNIEnv *env = GetJNIEnv(&envRet);\r
+    if (NULL == env) return ;\r
 \r
+    jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener);\r
+    if (!jPostListener)\r
+    {\r
+        LOGE ("Failed to Get jPostListener");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
+\r
+    jobject obj_message = getJavaMessage( env, message);\r
+    if (!obj_message)\r
+    {\r
+        LOGE ("Failed to Get Message Object");\r
+        if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+        return ;\r
+    }\r
     jclass cls = env->GetObjectClass(jPostListener);\r
     if (!cls)\r
     {\r
@@ -403,14 +665,14 @@ void onMessagePosted(OIC::Service::NSMessage *message)
     env->CallVoidMethod(jPostListener, mid, obj_message);\r
 \r
     env->DeleteLocalRef(jPostListener);\r
-    env->DeleteLocalRef(cls_message);\r
     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+    LOGD ("ConsumerService_onMessagePosted -OUT");\r
     return ;\r
 }\r
 \r
 void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)\r
 {\r
-    LOGD ("ConsumerService_onSyncInfoReceived");\r
+    LOGD ("ConsumerService_onSyncInfoReceived - IN");\r
 \r
     jint envRet;\r
     JNIEnv *env = GetJNIEnv(&envRet);\r
@@ -473,13 +735,14 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)
     env->DeleteLocalRef(jSyncListener);\r
     env->DeleteLocalRef(cls_sync);\r
     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
+    LOGD ("ConsumerService_onSyncInfoReceived - OUT");\r
     return ;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStart\r
 (JNIEnv *env, jobject jObj, jobject jDiscoverListener, jobject jAccpetListener)\r
 {\r
-    LOGD ("ConsumerService_StartConsumer");\r
+    LOGD ("ConsumerService_StartConsumer - IN");\r
     if (!jDiscoverListener || !jAccpetListener)\r
     {\r
         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
@@ -503,13 +766,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
     cfg.m_changedCb = onProviderChanged;\r
 \r
     OIC::Service::NSConsumerService::getInstance()->Start(cfg);\r
+    LOGD ("ConsumerService_StartConsumer - OUT");\r
+    return;\r
 \r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStop\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("ConsumerService_StopConsumer");\r
+    LOGD ("ConsumerService_StopConsumer - IN");\r
 \r
     env->DeleteGlobalRef(g_obj_postListener);\r
     env->DeleteGlobalRef(g_obj_discoverListener);\r
@@ -520,13 +785,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
     g_obj_syncListener = NULL;\r
     g_obj_acceptListener = NULL;\r
     OIC::Service::NSConsumerService::getInstance()->Stop();\r
+    LOGD ("ConsumerService_StopConsumer - OUT");\r
+    return;\r
 }\r
 \r
 JNIEXPORT jint JNICALL\r
 Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService\r
 (JNIEnv *env, jobject jObj, jstring jServerAddress)\r
 {\r
-    LOGD ("ConsumerService_EnableRemoteService");\r
+    LOGD ("ConsumerService_EnableRemoteService - IN");\r
     if (!jServerAddress)\r
     {\r
         ThrowNSException(NS_ERROR, "EnableRemoteService server address NULL");\r
@@ -536,21 +803,24 @@ Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService
     OIC::Service::NSResult res =\r
         OIC::Service::NSConsumerService::getInstance()->EnableRemoteService(std::string(serverAddress));\r
     env->ReleaseStringUTFChars(jServerAddress, serverAddress);\r
+    LOGD ("ConsumerService_EnableRemoteService - OUT");\r
     return (jint) res;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeRescanProvider\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("ConsumerService_RescanProvider");\r
-\r
+    LOGD ("ConsumerService_RescanProvider - IN");\r
     OIC::Service::NSConsumerService::getInstance()->RescanProvider();\r
+    LOGD ("ConsumerService_RescanProvider - OUT");\r
+    return;\r
+\r
 }\r
 \r
 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetProvider\r
 (JNIEnv *env, jobject jObj, jstring jProviderId)\r
 {\r
-    LOGD ("ConsumerService_GetProvider");\r
+    LOGD ("ConsumerService_GetProvider - IN");\r
     if (!jProviderId)\r
     {\r
         ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
@@ -598,49 +868,32 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_
 \r
     env->DeleteLocalRef(cls_provider);\r
     env->ReleaseStringUTFChars(jProviderId, providerId);\r
-\r
+    LOGD ("ConsumerService_GetProvider - OUT");\r
     return obj_provider;\r
 }\r
 \r
-OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj)\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetMessage\r
+(JNIEnv *env, jobject jObj, jlong jMsgId)\r
 {\r
-    jclass providerClass = env->GetObjectClass(jObj);\r
-    if (!providerClass)\r
-    {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
-        return NULL;\r
-    }\r
-    jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;");\r
-    if (!jproviderId)\r
-    {\r
-        ThrowNSException(NS_ERROR, "Failed to get providerId for Provider");\r
-        return NULL;\r
-    }\r
-    jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId);\r
-    if (!jprovider_id)\r
+    LOGI("JNIConsumerService: nativeGetMessage - IN");\r
+\r
+    OIC::Service::NSMessage *msg  =\r
+        OIC::Service::NSConsumerService::getInstance()->getMessage((uint64_t)jMsgId);\r
+    if (msg == nullptr)\r
     {\r
-        ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
+        ThrowNSException(NS_ERROR, "Message doesn't exist");\r
         return NULL;\r
     }\r
 \r
-    const char *providerId = env->GetStringUTFChars(jprovider_id, 0);\r
-    LOGD ("ProviderId : %s\n", providerId);\r
+    jobject obj_msg = getJavaMessage(env, msg);\r
 \r
-    OIC::Service::NSProvider *provider =\r
-        OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
-    if (provider == nullptr)\r
-    {\r
-        ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
-        return NULL;\r
-    }\r
-    env->ReleaseStringUTFChars(jprovider_id, providerId);\r
-    return provider;\r
+    LOGI("JNIConsumerService: nativeGetMessage - OUT");\r
+    return obj_msg;\r
 }\r
-\r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("Provider_Subscribe");\r
+    LOGD ("Provider_Subscribe -IN");\r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
@@ -672,12 +925,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubs
         LOGD ("calling subscribe on ProviderID");\r
         provider->subscribe();\r
     }\r
+    LOGD ("Provider_Subscribe -OUT");\r
+    return;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("Provider_Unsubscribe");\r
+    LOGD ("Provider_Unsubscribe - IN");\r
 \r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
@@ -710,12 +965,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsu
         LOGD ("calling unSubscribe on ProviderID");\r
         provider->unSubscribe();\r
     }\r
+    LOGD ("Provider_Unsubscribe - IN");\r
+    return;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
 (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
 {\r
-    LOGD ("Provider_SendSyncInfo");\r
+    LOGD ("Provider_SendSyncInfo - IN");\r
     if (!jMessageId)\r
     {\r
         ThrowNSException(NS_ERROR, "MessageId cannot be 0");\r
@@ -758,12 +1015,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSend
         LOGD ("calling SendSyncInfo on ProviderID");\r
         provider->SendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
     }\r
+    LOGD ("Provider_SendSyncInfo - OUT");\r
+    return;\r
 }\r
 \r
+\r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener\r
 (JNIEnv *env, jobject jObj, jobject jPostListener, jobject jSyncListener)\r
 {\r
-    LOGD ("Provider_SetListener");\r
+    LOGD ("Provider_SetListener - IN");\r
     if (!jPostListener || !jSyncListener)\r
     {\r
         ThrowNSException(NS_ERROR, "Listener cannot be null");\r
@@ -827,8 +1087,66 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetL
 \r
         provider->setListener(onMessagePosted, onSyncInfoReceived);\r
     }\r
+    LOGD ("Provider_SetListener - OUT");\r
+    return;\r
 }\r
 \r
+JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSelectInterestTopics\r
+(JNIEnv *env, jobject jObj, jobject jTopicsList)\r
+{\r
+    LOGD("Provider_SelectInterestTopics -IN");\r
+    if (!jTopicsList)\r
+    {\r
+        LOGI("Fail to select Interest Topics - Topic List is null");\r
+        ThrowNSException(NS_ERROR, "TopicList cannot be null");\r
+        return (jint) OIC::Service::NSResult::ERROR;\r
+    }\r
+    OIC::Service::NSTopicsList *nsTopicsList = getNativeTopicsList(env, jTopicsList);\r
+    if (nsTopicsList == nullptr)\r
+    {\r
+        ThrowNSException(NS_ERROR, "NSTopicList cannot be created ");\r
+        return (jint) OIC::Service::NSResult::ERROR;\r
+    }\r
+\r
+    jclass providerClass = env->GetObjectClass(jObj);\r
+    if (!providerClass)\r
+    {\r
+        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        return  (jint) OIC::Service::NSResult::ERROR;\r
+    }\r
+\r
+    jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
+    if (!nativeHandle)\r
+    {\r
+        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        return  (jint) OIC::Service::NSResult::ERROR;\r
+    }\r
+    jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
+    OIC::Service::NSResult result;\r
+    if (jProvider)\r
+    {\r
+        LOGD ("calling subscribe on mNativeHandle");\r
+        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
+        result = provider->selectInterestTopics(nsTopicsList);\r
+    }\r
+    else\r
+    {\r
+        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
+        if (provider == nullptr)\r
+        {\r
+            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            return (jint) OIC::Service::NSResult::ERROR;\r
+        }\r
+        LOGD ("calling subscribe on ProviderID");\r
+        result = provider->selectInterestTopics(nsTopicsList);\r
+    }\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        LOGI("Fail to select Interest Topics");\r
+    }\r
+    LOGD("Provider_SelectInterestTopics -OUT");\r
+    return (jint) result;\r
+}\r
 // JNI OnLoad\r
 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)\r
 {\r
@@ -897,11 +1215,84 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
         LOGE("Failed to set Global MediaContents reference");\r
         return JNI_ERR;\r
     }\r
+    jclass localTopicState = env->FindClass(\r
+                                 "org/iotivity/service/ns/common/Topic$TopicState");\r
+    if (!localTopicState)\r
+    {\r
+        LOGE("Failed to get local TopicState enum");\r
+        return JNI_ERR;\r
+    }\r
+    g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));\r
+    if (!g_cls_TopicState)\r
+    {\r
+        LOGE("Failed to set Global TopicState reference");\r
+        return JNI_ERR;\r
+    }\r
 \r
+    jclass localTopic = env->FindClass(\r
+                            "org/iotivity/service/ns/common/Topic");\r
+    if (!localTopic)\r
+    {\r
+        LOGE("Failed to get local TopicState enum");\r
+        return JNI_ERR;\r
+    }\r
+    g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));\r
+    if (!g_cls_Topic)\r
+    {\r
+        LOGE("Failed to set Global Topic reference");\r
+        return JNI_ERR;\r
+    }\r
+\r
+    jclass localMessageType = env->FindClass(\r
+                                  "org/iotivity/service/ns/common/Message$MessageType");\r
+    if (!localMessageType)\r
+    {\r
+        LOGE("Failed to get local Message Type class");\r
+        return JNI_ERR;\r
+    }\r
+    g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));\r
+    if (!g_cls_Message_Type)\r
+    {\r
+        LOGE("Failed to set Global Message Type reference");\r
+        return JNI_ERR;\r
+    }\r
+\r
+    jclass localResponse = env->FindClass(\r
+                               "org/iotivity/service/ns/consumer/ConsumerService$Response");\r
+    if (!localResponse)\r
+    {\r
+        LOGE("Failed to get localResponse  Type class");\r
+        return JNI_ERR;\r
+    }\r
+    g_cls_Response = (jclass) (env->NewGlobalRef(localResponse));\r
+    if (!g_cls_Response)\r
+    {\r
+        LOGE("Failed to set Global Response Type reference");\r
+        return JNI_ERR;\r
+    }\r
+\r
+    jclass localTopicsList = env->FindClass(\r
+                                 "org/iotivity/service/ns/common/TopicsList");\r
+    if (!localTopicsList)\r
+    {\r
+        LOGE("Failed to get local Topic class");\r
+        return JNI_ERR;\r
+    }\r
+    g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));\r
+    if (!g_cls_TopicsList)\r
+    {\r
+        LOGE("Failed to set Global TopicsList reference");\r
+        return JNI_ERR;\r
+    }\r
     env->DeleteLocalRef(localMessage);\r
     env->DeleteLocalRef(localProvider);\r
     env->DeleteLocalRef(localSyncInfo);\r
     env->DeleteLocalRef(localMediaContents);\r
+    env->DeleteLocalRef(localTopicState);\r
+    env->DeleteLocalRef(localMessageType);\r
+    env->DeleteLocalRef(localResponse);\r
+    env->DeleteLocalRef(localTopic);\r
+    env->DeleteLocalRef(localTopicsList);\r
 \r
     return NSExceptionInit(env);\r
 }\r
@@ -921,4 +1312,9 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
     env->DeleteGlobalRef(g_cls_Provider);\r
     env->DeleteGlobalRef(g_cls_SyncInfo);\r
     env->DeleteGlobalRef(g_cls_MediaContents);\r
+    env->DeleteGlobalRef(g_cls_TopicState);\r
+    env->DeleteGlobalRef(g_cls_Message_Type);\r
+    env->DeleteGlobalRef(g_cls_Response);\r
+    env->DeleteGlobalRef(g_cls_Topic);\r
+    env->DeleteGlobalRef(g_cls_TopicsList);\r
 }\r
index d742cc2..4fae3eb 100755 (executable)
@@ -47,7 +47,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
 /*\r
  * Class:     org_iotivity_service_ns_consumer_ConsumerService\r
  * Method:    nativeEnableRemoteService\r
- * Signature: (Ljava/lang/String;)jint\r
+ * Signature: (Ljava/lang/String;)I\r
  */\r
 JNIEXPORT jint JNICALL\r
 Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService\r
@@ -70,6 +70,14 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_
 (JNIEnv *, jobject, jstring);\r
 \r
 /*\r
+ * Class:     org_iotivity_service_ns_consumer_ConsumerService\r
+ * Method:    nativeGetMessage\r
+ * Signature: (J)Lorg/iotivity/service/ns/common/Message;\r
+ */\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeGetMessage\r
+(JNIEnv *, jobject, jlong);\r
+\r
+/*\r
  * Class:     org_iotivity_service_ns_consumer_Provider\r
  * Method:    nativeSubscribe\r
  * Signature: ()V\r
@@ -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\r
 (JNIEnv *, jobject, jobject, jobject);\r
 \r
+/*\r
+ * Class:     org_iotivity_service_ns_consumer_Provider\r
+ * Method:    nativeSelectInterestTopics\r
+ * Signature: (Lorg/iotivity/service/ns/common/TopicsList;)I\r
+ */\r
+JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSelectInterestTopics\r
+(JNIEnv *, jobject, jobject);\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 6aa0977..80c02a0 100644 (file)
@@ -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,
-                                 "<init>",
-                                 "(JLjava/lang/String;Lorg/iotivity/service/ns/provider/Consumer)V");
-    if (!mid_consumer)
-    {
-        LOGE ("Failed to Get MethodID for Consumer<init>");
-        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,
-                                 "<init>",
-                                 "(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, "<init>", "()V");
+    if (!mid_topicList)
+    {
+        LOGE ("Failed to Get MethodID for TopicsList<init>");
+        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,
+                                 "<init>",
+                                 "(JLjava/lang/String;Lorg/iotivity/service/ns/provider/Consumer)V");
+    if (!mid_consumer)
+    {
+        LOGE ("Failed to Get MethodID for Consumer<init>");
+        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,
+                                 "<init>",
+                                 "(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);
 }
index 694edfc..bc7779e 100644 (file)
@@ -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
 }
index 35d2365..12abc81 100755 (executable)
@@ -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()
index 18ebf51..fbc4e12 100755 (executable)
@@ -189,7 +189,7 @@ namespace OIC
             return NULL;\r
         }\r
 \r
-        NSMessage *getMessage(uint64_t messageId)\r
+        NSMessage *NSConsumerService::getMessage(uint64_t messageId)\r
         {\r
             NS_LOG(DEBUG, "getMessage - IN");\r
             ::NSMessage *message = NSConsumerGetMessage(messageId);\r