Merge 'security-basecamp' branch into master with CBOR
authorSachin Agrawal <sachin.agrawal@intel.com>
Wed, 15 Jul 2015 16:40:26 +0000 (09:40 -0700)
committerSachin Agrawal <sachin.agrawal@intel.com>
Wed, 15 Jul 2015 16:40:26 +0000 (09:40 -0700)
security-basecamp for 0.9.2 is merged in master brach.

Change-Id: Ia5cd2710a688d3e631009ed03f7e5eb97aba5d24
Signed-off-by: Sachin Agrawal <sachin.agrawal@intel.com>
14 files changed:
1  2 
android/android_api/base/jni/Android.mk
android/android_api/base/jni/JniOcPlatform.cpp
android/android_api/base/jni/JniOcPlatform.h
android/android_api/base/src/main/java/org/iotivity/base/OcPlatform.java
resource/csdk/security/include/internal/srmresourcestrings.h
resource/csdk/security/provisioning/SConscript
resource/csdk/security/provisioning/src/provisioningmanager.c
resource/csdk/security/src/policyengine.c
resource/csdk/security/src/srmresourcestrings.c
resource/examples/simpleclient.cpp
resource/include/OCApi.h
resource/include/OCSerialization.h
resource/src/OCPlatform_impl.cpp
resource/unittests/OCPlatformTest.cpp

@@@ -43,7 -43,6 +43,7 @@@ LOCAL_SRC_FILES :=  JniOcStack.cpp 
                      JniEntityHandler.cpp \\r
                      JniOnResourceFoundListener.cpp \\r
                      JniOnDeviceInfoListener.cpp \\r
 +                  JniOnPlatformInfoListener.cpp \\r
                      JniOnPresenceListener.cpp \\r
                      JniOnGetListener.cpp \\r
                      JniOnPutListener.cpp \\r
@@@ -58,7 -57,8 +58,8 @@@
                      JniOcResourceResponse.cpp \\r
                      JniOcPlatform.cpp \\r
                      JniOcResource.cpp \\r
-                     JniOcResourceIdentifier.cpp\r
+                     JniOcResourceIdentifier.cpp \
+                     JniOcSecurity.cpp
  \r
  LOCAL_LDLIBS := -llog\r
  LOCAL_STATIC_LIBRARIES := android-oc\r
- /*
- * //******************************************************************
- * //
- * // Copyright 2015 Intel Corporation.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- * //
- * // 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.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- */
- #include "JniOcPlatform.h"
- #include "OCPlatform.h"
- #include "JniOcResource.h"
- #include "JniOcResourceHandle.h"
- #include "JniOcPresenceHandle.h"
- #include "JniOcResourceResponse.h"
- #include "JniUtils.h"
- using namespace OC;
- JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener)
- {
-     JniOnResourceFoundListener *onResourceFoundListener = NULL;
-     resourceFoundMapLock.lock();
-     for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)
-     {
-         if (env->IsSameObject(jListener, it->first))
-         {
-             auto refPair = it->second;
-             onResourceFoundListener = refPair.first;
-             refPair.second++;
-             it->second = refPair;
-             onResourceFoundListenerMap.insert(*it);
-             LOGD("OnResourceFoundListener: ref. count incremented");
-             break;
-         }
-     }
-     if (!onResourceFoundListener)
-     {
-         onResourceFoundListener = new JniOnResourceFoundListener(env, jListener, RemoveOnResourceFoundListener);
-         jobject jgListener = env->NewGlobalRef(jListener);
-         onResourceFoundListenerMap.insert(std::pair < jobject, std::pair < JniOnResourceFoundListener*,
-             int >> (jgListener, std::pair<JniOnResourceFoundListener*, int>(onResourceFoundListener, 1)));
-         LOGD("OnResourceFoundListener: new listener");
-     }
-     resourceFoundMapLock.unlock();
-     return onResourceFoundListener;
- }
- void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener)
- {
-     resourceFoundMapLock.lock();
-     for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)
-     {
-         if (env->IsSameObject(jListener, it->first))
-         {
-             auto refPair = it->second;
-             if (refPair.second > 1)
-             {
-                 refPair.second--;
-                 it->second = refPair;
-                 onResourceFoundListenerMap.insert(*it);
-                 LOGI("OnResourceFoundListener: ref. count decremented");
-             }
-             else
-             {
-                 env->DeleteGlobalRef(it->first);
-                 JniOnResourceFoundListener* listener = refPair.first;
-                 delete listener;
-                 onResourceFoundListenerMap.erase(it);
-                 LOGI("OnResourceFoundListener removed");
-             }
-             break;
-         }
-     }
-     resourceFoundMapLock.unlock();
- }
- JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener)
- {
-     JniOnDeviceInfoListener *onDeviceInfoListener = NULL;
-     deviceInfoMapLock.lock();
-     for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)
-     {
-         if (env->IsSameObject(jListener, it->first))
-         {
-             auto refPair = it->second;
-             onDeviceInfoListener = refPair.first;
-             refPair.second++;
-             it->second = refPair;
-             onDeviceInfoListenerMap.insert(*it);
-             LOGD("OnDeviceInfoListener: ref. count incremented");
-             break;
-         }
-     }
-     if (!onDeviceInfoListener)
-     {
-         onDeviceInfoListener = new JniOnDeviceInfoListener(env, jListener, RemoveOnDeviceInfoListener);
-         jobject jgListener = env->NewGlobalRef(jListener);
-         onDeviceInfoListenerMap.insert(std::pair < jobject, std::pair < JniOnDeviceInfoListener*,
-             int >> (jgListener, std::pair<JniOnDeviceInfoListener*, int>(onDeviceInfoListener, 1)));
-         LOGI("OnDeviceInfoListener: new listener");
-     }
-     deviceInfoMapLock.unlock();
-     return onDeviceInfoListener;
- }
- void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener)
- {
-     deviceInfoMapLock.lock();
-     bool isFound = false;
-     for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)
-     {
-         if (env->IsSameObject(jListener, it->first))
-         {
-             auto refPair = it->second;
-             if (refPair.second > 1)
-             {
-                 refPair.second--;
-                 it->second = refPair;
-                 onDeviceInfoListenerMap.insert(*it);
-                 LOGI("OnDeviceInfoListener: ref. count decremented");
-             }
-             else
-             {
-                 env->DeleteGlobalRef(it->first);
-                 JniOnDeviceInfoListener* listener = refPair.first;
-                 delete listener;
-                 onDeviceInfoListenerMap.erase(it);
-                 LOGI("OnDeviceInfoListener removed");
-             }
-             isFound = true;
-             break;
-         }
-     }
-     if (!isFound)
-     {
-         ThrowOcException(JNI_EXCEPTION, "OnDeviceInfoListenet not found");
-     }
-     deviceInfoMapLock.unlock();
+ /*\r
+ * //******************************************************************\r
+ * //\r
+ * // Copyright 2015 Intel Corporation.\r
+ * //\r
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ * //\r
+ * // Licensed under the Apache License, Version 2.0 (the "License");\r
+ * // you may not use this file except in compliance with the License.\r
+ * // You may obtain a copy of the License at\r
+ * //\r
+ * //      http://www.apache.org/licenses/LICENSE-2.0\r
+ * //\r
+ * // Unless required by applicable law or agreed to in writing, software\r
+ * // distributed under the License is distributed on an "AS IS" BASIS,\r
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * // See the License for the specific language governing permissions and\r
+ * // limitations under the License.\r
+ * //\r
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+ #include "JniOcPlatform.h"\r
+ #include "OCPlatform.h"\r
+ #include "JniOcResource.h"\r
+ #include "JniOcResourceHandle.h"\r
+ #include "JniOcPresenceHandle.h"\r
+ #include "JniOcResourceResponse.h"\r
+ #include "JniOcSecurity.h"
+ #include "JniUtils.h"\r
\r
+ using namespace OC;\r
\r
+ JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener)\r
+ {\r
+     JniOnResourceFoundListener *onResourceFoundListener = NULL;\r
\r
+     resourceFoundMapLock.lock();\r
\r
+     for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)\r
+     {\r
+         if (env->IsSameObject(jListener, it->first))\r
+         {\r
+             auto refPair = it->second;\r
+             onResourceFoundListener = refPair.first;\r
+             refPair.second++;\r
+             it->second = refPair;\r
+             onResourceFoundListenerMap.insert(*it);\r
+             LOGD("OnResourceFoundListener: ref. count incremented");\r
+             break;\r
+         }\r
+     }\r
\r
+     if (!onResourceFoundListener)\r
+     {\r
+         onResourceFoundListener = new JniOnResourceFoundListener(env, jListener, RemoveOnResourceFoundListener);\r
+         jobject jgListener = env->NewGlobalRef(jListener);\r
\r
+         onResourceFoundListenerMap.insert(std::pair < jobject, std::pair < JniOnResourceFoundListener*,\r
+             int >> (jgListener, std::pair<JniOnResourceFoundListener*, int>(onResourceFoundListener, 1)));\r
+         LOGD("OnResourceFoundListener: new listener");\r
+     }\r
+     resourceFoundMapLock.unlock();\r
+     return onResourceFoundListener;\r
+ }\r
\r
+ void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener)\r
+ {\r
+     resourceFoundMapLock.lock();\r
\r
+     for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)\r
+     {\r
+         if (env->IsSameObject(jListener, it->first))\r
+         {\r
+             auto refPair = it->second;\r
+             if (refPair.second > 1)\r
+             {\r
+                 refPair.second--;\r
+                 it->second = refPair;\r
+                 onResourceFoundListenerMap.insert(*it);\r
+                 LOGI("OnResourceFoundListener: ref. count decremented");\r
+             }\r
+             else\r
+             {\r
+                 env->DeleteGlobalRef(it->first);\r
+                 JniOnResourceFoundListener* listener = refPair.first;\r
+                 delete listener;\r
+                 onResourceFoundListenerMap.erase(it);\r
+                 LOGI("OnResourceFoundListener removed");\r
+             }\r
+             break;\r
+         }\r
+     }\r
+     resourceFoundMapLock.unlock();\r
+ }\r
\r
+ JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener)\r
+ {\r
+     JniOnDeviceInfoListener *onDeviceInfoListener = NULL;\r
\r
+     deviceInfoMapLock.lock();\r
\r
+     for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)\r
+     {\r
+         if (env->IsSameObject(jListener, it->first))\r
+         {\r
+             auto refPair = it->second;\r
+             onDeviceInfoListener = refPair.first;\r
+             refPair.second++;\r
+             it->second = refPair;\r
+             onDeviceInfoListenerMap.insert(*it);\r
+             LOGD("OnDeviceInfoListener: ref. count incremented");\r
+             break;\r
+         }\r
+     }\r
\r
+     if (!onDeviceInfoListener)\r
+     {\r
+         onDeviceInfoListener = new JniOnDeviceInfoListener(env, jListener, RemoveOnDeviceInfoListener);\r
+         jobject jgListener = env->NewGlobalRef(jListener);\r
\r
+         onDeviceInfoListenerMap.insert(std::pair < jobject, std::pair < JniOnDeviceInfoListener*,\r
+             int >> (jgListener, std::pair<JniOnDeviceInfoListener*, int>(onDeviceInfoListener, 1)));\r
+         LOGI("OnDeviceInfoListener: new listener");\r
+     }\r
\r
+     deviceInfoMapLock.unlock();\r
+     return onDeviceInfoListener;\r
+ }\r
\r
+ void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener)\r
+ {\r
+     deviceInfoMapLock.lock();\r
+     bool isFound = false;\r
+     for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)\r
+     {\r
+         if (env->IsSameObject(jListener, it->first))\r
+         {\r
+             auto refPair = it->second;\r
+             if (refPair.second > 1)\r
+             {\r
+                 refPair.second--;\r
+                 it->second = refPair;\r
+                 onDeviceInfoListenerMap.insert(*it);\r
+                 LOGI("OnDeviceInfoListener: ref. count decremented");\r
+             }\r
+             else\r
+             {\r
+                 env->DeleteGlobalRef(it->first);\r
+                 JniOnDeviceInfoListener* listener = refPair.first;\r
+                 delete listener;\r
+                 onDeviceInfoListenerMap.erase(it);\r
\r
+                 LOGI("OnDeviceInfoListener removed");\r
+             }\r
\r
+             isFound = true;\r
+             break;\r
+         }\r
+     }\r
\r
+     if (!isFound)\r
+     {\r
+         ThrowOcException(JNI_EXCEPTION, "OnDeviceInfoListenet not found");\r
+     }\r
+     deviceInfoMapLock.unlock();\r
 +}
 +
 +JniOnPlatformInfoListener* AddOnPlatformInfoListener(JNIEnv* env, jobject jListener)
 +{
 +    JniOnPlatformInfoListener *onPlatformInfoListener = NULL;
 +
 +    platformInfoMapLock.lock();
 +
 +    for (auto it = onPlatformInfoListenerMap.begin(); it != onPlatformInfoListenerMap.end(); ++it)
 +    {
 +        if (env->IsSameObject(jListener, it->first))
 +        {
 +            auto refPair = it->second;
 +            onPlatformInfoListener = refPair.first;
 +            refPair.second++;
 +            it->second = refPair;
 +            onPlatformInfoListenerMap.insert(*it);
 +            LOGD("OnPlatformInfoListener: ref. count incremented");
 +            break;
 +        }
 +    }
 +
 +    if (!onPlatformInfoListener)
 +    {
 +        onPlatformInfoListener = new JniOnPlatformInfoListener(env, jListener, RemoveOnPlatformInfoListener);
 +        jobject jgListener = env->NewGlobalRef(jListener);
 +
 +        onPlatformInfoListenerMap.insert(std::pair < jobject, std::pair < JniOnPlatformInfoListener*,
 +            int >> (jgListener, std::pair<JniOnPlatformInfoListener*, int>(onPlatformInfoListener, 1)));
 +        LOGI("OnPlatformInfoListener: new listener");
 +    }
 +
 +    platformInfoMapLock.unlock();
 +    return onPlatformInfoListener;
 +}
 +
 +void RemoveOnPlatformInfoListener(JNIEnv* env, jobject jListener)
 +{
 +    platformInfoMapLock.lock();
 +    bool isFound = false;
 +    for (auto it = onPlatformInfoListenerMap.begin(); it != onPlatformInfoListenerMap.end(); ++it)
 +    {
 +        if (env->IsSameObject(jListener, it->first))
 +        {
 +            auto refPair = it->second;
 +            if (refPair.second > 1)
 +            {
 +                refPair.second--;
 +                it->second = refPair;
 +                onPlatformInfoListenerMap.insert(*it);
 +                LOGI("OnPlatformInfoListener: ref. count decremented");
 +            }
 +            else
 +            {
 +                env->DeleteGlobalRef(it->first);
 +                JniOnPlatformInfoListener* listener = refPair.first;
 +                delete listener;
 +                onPlatformInfoListenerMap.erase(it);
 +
 +                LOGI("OnPlatformInfoListener removed");
 +            }
 +
 +            isFound = true;
 +            break;
 +        }
 +    }
 +
 +    if (!isFound)
 +    {
 +        ThrowOcException(JNI_EXCEPTION, "OnPlatformInfoListenet not found");
 +    }
 +    platformInfoMapLock.unlock();
- }
- JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener)
- {
-     JniOnPresenceListener *onPresenceListener = NULL;
-     presenceMapLock.lock();
-     for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)
-     {
-         if (env->IsSameObject(jListener, it->first))
-         {
-             auto refPair = it->second;
-             onPresenceListener = refPair.first;
-             refPair.second++;
-             it->second = refPair;
-             onPresenceListenerMap.insert(*it);
-             LOGD("OnPresenceListener: ref. count incremented");
-             break;
-         }
-     }
-     if (!onPresenceListener)
-     {
-         onPresenceListener = new JniOnPresenceListener(env, jListener, RemoveOnPresenceListener);
-         jobject jgListener = env->NewGlobalRef(jListener);
-         onPresenceListenerMap.insert(std::pair < jobject, std::pair < JniOnPresenceListener*,
-             int >> (jgListener, std::pair<JniOnPresenceListener*, int>(onPresenceListener, 1)));
-         LOGI("OnPresenceListener: new listener");
-     }
-     presenceMapLock.unlock();
-     return onPresenceListener;
- }
- void RemoveOnPresenceListener(JNIEnv* env, jobject jListener)
- {
-     presenceMapLock.lock();
-     bool isFound = false;
-     for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)
-     {
-         if (env->IsSameObject(jListener, it->first))
-         {
-             auto refPair = it->second;
-             if (refPair.second > 1)
-             {
-                 refPair.second--;
-                 it->second = refPair;
-                 onPresenceListenerMap.insert(*it);
-                 LOGI("OnPresenceListener: ref. count decremented");
-             }
-             else
-             {
-                 env->DeleteGlobalRef(it->first);
-                 JniOnPresenceListener* listener = refPair.first;
-                 delete listener;
-                 onPresenceListenerMap.erase(it);
-                 LOGI("OnPresenceListener is removed");
-             }
-             isFound = true;
-             break;
-         }
-     }
-     if (!isFound)
-     {
-         ThrowOcException(JNI_EXCEPTION, "OnPresenceListener not found");
-     }
-     presenceMapLock.unlock();
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    configure
- * Signature: (IILjava/lang/String;II)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure
- (JNIEnv *env, jclass clazz, jint jServiceType, jint jModeType, jstring jIpAddress, jint jPort, jint jQOS)
- {
-     LOGI("OcPlatform_configure");
-     std::string ipAddress;
-     if (jIpAddress)
-     {
-         ipAddress = env->GetStringUTFChars(jIpAddress, NULL);
-     }
-     uint16_t port;
-     if (jPort > 0)
-     {
-         port = static_cast<uint16_t>(jPort);
-     }
-     PlatformConfig cfg{
-         JniUtils::getServiceType(env, jServiceType),
-         JniUtils::getModeType(env, jModeType),
-         ipAddress,
-         port,
-         JniUtils::getQOS(env, static_cast<int>(jQOS))
-     };
-     OCPlatform::Configure(cfg);
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    notifyAllObservers0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0
- (JNIEnv *env, jclass clazz, jobject jResourceHandle)
- {
-     LOGI("OcPlatform_notifyAllObservers");
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try
-     {
-         OCStackResult result = OCPlatform::notifyAllObservers(jniOcResourceHandle->getOCResourceHandle());
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to notify all observers");
-             return;
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    notifyAllObservers1
- * Signature: (Lorg/iotivity/base/OcResourceHandle;I)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
- (JNIEnv *env, jclass clazz, jobject jResourceHandle, jint jQoS)
- {
-     LOGI("OcPlatform_notifyAllObservers1");
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try{
-         OCStackResult result = OCPlatform::notifyAllObservers(
-             jniOcResourceHandle->getOCResourceHandle(),
-             JniUtils::getQOS(env, static_cast<int>(jQoS)));
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to notify all observers");
-             return;
+ }\r
\r
+ JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener)\r
+ {\r
+     JniOnPresenceListener *onPresenceListener = NULL;\r
\r
+     presenceMapLock.lock();\r
\r
+     for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)\r
+     {\r
+         if (env->IsSameObject(jListener, it->first))\r
+         {\r
+             auto refPair = it->second;\r
+             onPresenceListener = refPair.first;\r
+             refPair.second++;\r
+             it->second = refPair;\r
+             onPresenceListenerMap.insert(*it);\r
+             LOGD("OnPresenceListener: ref. count incremented");\r
+             break;\r
+         }\r
+     }\r
+     if (!onPresenceListener)\r
+     {\r
+         onPresenceListener = new JniOnPresenceListener(env, jListener, RemoveOnPresenceListener);\r
+         jobject jgListener = env->NewGlobalRef(jListener);\r
+         onPresenceListenerMap.insert(std::pair < jobject, std::pair < JniOnPresenceListener*,\r
+             int >> (jgListener, std::pair<JniOnPresenceListener*, int>(onPresenceListener, 1)));\r
+         LOGI("OnPresenceListener: new listener");\r
+     }\r
+     presenceMapLock.unlock();\r
+     return onPresenceListener;\r
+ }\r
\r
+ void RemoveOnPresenceListener(JNIEnv* env, jobject jListener)\r
+ {\r
+     presenceMapLock.lock();\r
+     bool isFound = false;\r
+     for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)\r
+     {\r
+         if (env->IsSameObject(jListener, it->first))\r
+         {\r
+             auto refPair = it->second;\r
+             if (refPair.second > 1)\r
+             {\r
+                 refPair.second--;\r
+                 it->second = refPair;\r
+                 onPresenceListenerMap.insert(*it);\r
+                 LOGI("OnPresenceListener: ref. count decremented");\r
+             }\r
+             else\r
+             {\r
+                 env->DeleteGlobalRef(it->first);\r
+                 JniOnPresenceListener* listener = refPair.first;\r
+                 delete listener;\r
+                 onPresenceListenerMap.erase(it);\r
+                 LOGI("OnPresenceListener is removed");\r
+             }\r
+             isFound = true;\r
+             break;\r
+         }\r
+     }\r
+     if (!isFound)\r
+     {\r
+         ThrowOcException(JNI_EXCEPTION, "OnPresenceListener not found");\r
+     }\r
+     presenceMapLock.unlock();\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    configure\r
 -* Signature: (IILjava/lang/String;IILjava/lang/String;)V
++* Signature: (IILjava/lang/String;II)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure\r
+ (JNIEnv *env, jclass clazz, jint jServiceType, jint jModeType, jstring jIpAddress, jint jPort,
+                                                                  jint jQOS, jstring jDbPath)
+ {\r
+     LOGI("OcPlatform_configure");\r
\r
+     std::string ipAddress;\r
+     std::string dbfile;
+     if (jIpAddress)\r
+     {\r
+         ipAddress = env->GetStringUTFChars(jIpAddress, NULL);\r
+     }\r
+     if (jDbPath)
+     {
+         dbfile = env->GetStringUTFChars(jDbPath, nullptr);
+         JniOcSecurity::StoreDbPath(dbfile);
+     }
+     uint16_t port;\r
+     if (jPort > 0)\r
+     {\r
+         port = static_cast<uint16_t>(jPort);\r
+     }\r
+     PlatformConfig cfg{\r
+         JniUtils::getServiceType(env, jServiceType),\r
+         JniUtils::getModeType(env, jModeType),\r
+         ipAddress,\r
+         port,\r
+         JniUtils::getQOS(env, static_cast<int>(jQOS)),
+         JniOcSecurity::getOCPersistentStorage()
+     };\r
\r
+     OCPlatform::Configure(cfg);\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    notifyAllObservers0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle)\r
+ {\r
+     LOGI("OcPlatform_notifyAllObservers");\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::notifyAllObservers(jniOcResourceHandle->getOCResourceHandle());\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to notify all observers");\r
+             return;\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    notifyAllObservers1\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;I)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle, jint jQoS)\r
+ {\r
+     LOGI("OcPlatform_notifyAllObservers1");\r
\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try{\r
+         OCStackResult result = OCPlatform::notifyAllObservers(\r
+             jniOcResourceHandle->getOCResourceHandle(),\r
+             JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to notify all observers");\r
+             return;\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    notifyListOfObservers2\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse)\r
+ {\r
+     LOGD("OcPlatform_notifyListOfObservers2");\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
+     if (!jObservationIdArr)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");\r
+         return;\r
+     }\r
+     if (!jResourceResponse)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(\r
+         env, jResourceResponse);\r
+     if (!jniOcResourceResponse) return;\r
\r
+     int len = env->GetArrayLength(jObservationIdArr);\r
+     uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);\r
\r
+     ObservationIds observationIds;\r
+     for (int i = 0; i < len; ++i)\r
+     {\r
+         observationIds.push_back(bArr[i]);\r
+     }\r
\r
+     env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);\r
\r
+     try{\r
+         OCStackResult result = OCPlatform::notifyListOfObservers(\r
+             jniOcResourceHandle->getOCResourceHandle(),\r
+             observationIds,\r
+             jniOcResourceResponse->getOCResourceResponse());\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to notify all observers");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    notifyListOfObservers3\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;I)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse, jint jQoS)\r
+ {\r
+     LOGD("OcPlatform_notifyListOfObservers3");\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
+     if (!jObservationIdArr)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");\r
+         return;\r
+     }\r
+     if (!jResourceResponse)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(\r
+         env, jResourceResponse);\r
+     if (!jniOcResourceResponse) return;\r
\r
+     int len = env->GetArrayLength(jObservationIdArr);\r
+     uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);\r
\r
+     ObservationIds observationIds;\r
+     for (int i = 0; i < len; ++i)\r
+     {\r
+         observationIds.push_back(bArr[i]);\r
+     }\r
\r
+     env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);\r
\r
+     try{\r
+         OCStackResult result = OCPlatform::notifyListOfObservers(\r
+             jniOcResourceHandle->getOCResourceHandle(),\r
+             observationIds,\r
+             jniOcResourceResponse->getOCResourceResponse(),\r
+             JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to notify all observers");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    findResource0\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)\r
+ {\r
+     LOGD("OcPlatform_findResource");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     std::string resourceUri;\r
+     if (jResourceUri)\r
+     {\r
+         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);\r
\r
+     FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)\r
+     {\r
+         onResFoundListener->foundResourceCallback(resource);\r
+     };\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::findResource(\r
+             host,\r
+             resourceUri,\r
+             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+             findCallback);\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Find resource has failed");\r
+             return;\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    findResource1\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)\r
+ {\r
+     LOGD("OcPlatform_findResource");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     std::string resourceUri;\r
+     if (jResourceUri)\r
+     {\r
+         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");\r
+         return;\r
+     }\r
+     JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);\r
\r
+     FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)\r
+     {\r
+         onResFoundListener->foundResourceCallback(resource);\r
+     };\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::findResource(\r
+             host,\r
+             resourceUri,\r
+             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+             findCallback,\r
+             JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Find resource has failed");\r
+             return;\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    getDeviceInfo0\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)\r
+ {\r
+     LOGD("OcPlatform_getDeviceInfo0");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     std::string resourceUri;\r
+     if (jResourceUri)\r
+     {\r
+         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");\r
+         return;\r
+     }\r
+     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);\r
\r
+     FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)\r
+     {\r
+         onDeviceInfoListener->foundDeviceCallback(ocRepresentation);\r
+     };\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::getDeviceInfo(\r
+             host,\r
+             resourceUri,\r
+             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+             findDeviceCallback);\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Find device has failed");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    getDeviceInfo1\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;I)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)\r
+ {\r
+     LOGD("OcPlatform_getDeviceInfo1");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     std::string resourceUri;\r
+     if (jResourceUri)\r
+     {\r
+         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");\r
+         return;\r
+     }\r
+     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);\r
\r
+     FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)\r
+     {\r
+         onDeviceInfoListener->foundDeviceCallback(ocRepresentation);\r
+     };\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::getDeviceInfo(\r
+             host,\r
+             resourceUri,\r
+             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+             findDeviceCallback,\r
+             JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Find device has failed");\r
 +        }
 +    }
 +    catch (OCException& e)
 +    {
 +        LOGE("%s", e.reason().c_str());
 +        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
 +    }
 +}
 +
 +/*
 +* Class:     org_iotivity_base_OcPlatform
- * Method:    notifyListOfObservers2
- * Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;)V
++* Method:    getPlatformInfo0
++* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;)V
 +*/
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
- (JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse)
++JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
++(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
 +{
-     LOGD("OcPlatform_notifyListOfObservers2");
-     if (!jResourceHandle)
++    LOGD("OcPlatform_getPlatformInfo0");
++    std::string host;
++    if (jHost)
 +    {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
++        host = env->GetStringUTFChars(jHost, NULL);
 +    }
-     if (!jObservationIdArr)
++    std::string resourceUri;
++    if (jResourceUri)
 +    {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");
-         return;
++        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
 +    }
-     if (!jResourceResponse)
++    if (!jListener)
 +    {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");
++        ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
 +        return;
 +    }
++    JniOnPlatformInfoListener *onPlatformInfoListener = AddOnPlatformInfoListener(env, jListener);
 +
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-         env, jResourceResponse);
-     if (!jniOcResourceResponse) return;
-     int len = env->GetArrayLength(jObservationIdArr);
-     uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);
-     ObservationIds observationIds;
-     for (int i = 0; i < len; ++i)
++    FindPlatformCallback findPlatformCallback = [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
 +    {
-         observationIds.push_back(bArr[i]);
-     }
-     env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);
++        onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
++    };
 +
-     try{
-         OCStackResult result = OCPlatform::notifyListOfObservers(
-             jniOcResourceHandle->getOCResourceHandle(),
-             observationIds,
-             jniOcResourceResponse->getOCResourceResponse());
++    try
++    {
++        OCStackResult result = OCPlatform::getPlatformInfo(
++            host,
++            resourceUri,
++            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
++            findPlatformCallback);
 +
 +        if (OC_STACK_OK != result)
 +        {
-             ThrowOcException(result, "Failed to notify all observers");
++            ThrowOcException(result, "Find platform has failed");
 +        }
 +    }
 +    catch (OCException& e)
 +    {
 +        LOGE("%s", e.reason().c_str());
 +        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
 +    }
 +}
 +
 +/*
 +* Class:     org_iotivity_base_OcPlatform
- * Method:    notifyListOfObservers3
- * Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;I)V
++* Method:    getPlatformInfo1
++* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;I)V
 +*/
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
- (JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse, jint jQoS)
++JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
++(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
 +{
-     LOGD("OcPlatform_notifyListOfObservers3");
-     if (!jResourceHandle)
++    LOGD("OcPlatform_getPlatformInfo1");
++    std::string host;
++    if (jHost)
 +    {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
++        host = env->GetStringUTFChars(jHost, NULL);
 +    }
-     if (!jObservationIdArr)
++    std::string resourceUri;
++    if (jResourceUri)
 +    {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");
-         return;
++        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
 +    }
-     if (!jResourceResponse)
++    if (!jListener)
 +    {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");
++        ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
 +        return;
 +    }
++    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
 +
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-         env, jResourceResponse);
-     if (!jniOcResourceResponse) return;
-     int len = env->GetArrayLength(jObservationIdArr);
-     uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);
-     ObservationIds observationIds;
-     for (int i = 0; i < len; ++i)
++    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
 +    {
-         observationIds.push_back(bArr[i]);
-     }
-     env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);
++        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
++    };
 +
-     try{
-         OCStackResult result = OCPlatform::notifyListOfObservers(
-             jniOcResourceHandle->getOCResourceHandle(),
-             observationIds,
-             jniOcResourceResponse->getOCResourceResponse(),
++    try
++    {
++        OCStackResult result = OCPlatform::getPlatformInfo(
++            host,
++            resourceUri,
++            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
++            findDeviceCallback,
 +            JniUtils::getQOS(env, static_cast<int>(jQoS)));
 +
 +        if (OC_STACK_OK != result)
 +        {
-             ThrowOcException(result, "Failed to notify all observers");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    findResource0
- * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
- {
-     LOGD("OcPlatform_findResource");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");
-         return;
-     }
-     JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);
-     FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)
-     {
-         onResFoundListener->foundResourceCallback(resource);
-     };
-     try
-     {
-         OCStackResult result = OCPlatform::findResource(
-             host,
-             resourceUri,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             findCallback);
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Find resource has failed");
-             return;
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    findResource1
- * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
- {
-     LOGD("OcPlatform_findResource");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");
-         return;
-     }
-     JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);
-     FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)
-     {
-         onResFoundListener->foundResourceCallback(resource);
-     };
-     try
-     {
-         OCStackResult result = OCPlatform::findResource(
-             host,
-             resourceUri,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             findCallback,
-             JniUtils::getQOS(env, static_cast<int>(jQoS)));
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Find resource has failed");
-             return;
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    getDeviceInfo0
- * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
- {
-     LOGD("OcPlatform_getDeviceInfo0");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");
-         return;
-     }
-     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
-     FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-     {
-         onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-     };
-     try
-     {
-         OCStackResult result = OCPlatform::getDeviceInfo(
-             host,
-             resourceUri,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             findDeviceCallback);
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Find device has failed");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    getDeviceInfo1
- * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;I)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
- {
-     LOGD("OcPlatform_getDeviceInfo1");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");
-         return;
-     }
-     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
-     FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-     {
-         onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-     };
-     try
-     {
-         OCStackResult result = OCPlatform::getDeviceInfo(
-             host,
-             resourceUri,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             findDeviceCallback,
-             JniUtils::getQOS(env, static_cast<int>(jQoS)));
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Find device has failed");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    getPlatformInfo0
- * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
- {
-     LOGD("OcPlatform_getPlatformInfo0");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
-         return;
-     }
-     JniOnPlatformInfoListener *onPlatformInfoListener = AddOnPlatformInfoListener(env, jListener);
-     FindPlatformCallback findPlatformCallback = [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
-     {
-         onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
-     };
-     try
-     {
-         OCStackResult result = OCPlatform::getPlatformInfo(
-             host,
-             resourceUri,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             findPlatformCallback);
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Find platform has failed");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    getPlatformInfo1
- * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;I)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
- {
-     LOGD("OcPlatform_getPlatformInfo1");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
-         return;
-     }
-     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
-     FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-     {
-         onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-     };
-     try
-     {
-         OCStackResult result = OCPlatform::getPlatformInfo(
-             host,
-             resourceUri,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             findDeviceCallback,
-             JniUtils::getQOS(env, static_cast<int>(jQoS)));
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Find platform has failed");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    registerResource0
- * Signature: (Lorg/iotivity/base/OcResource;)Lorg/iotivity/base/OcResourceHandle;
- */
- JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0
- (JNIEnv *env, jclass clazz, jobject jResource)
- {
-     LOGD("OcPlatform_registerResource");
-     if (!jResource)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "Resource cannot be null");
-         return nullptr;
-     }
-     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, jResource);
-     if (!resource) return nullptr;
-     LOGD("OcPlatform_registerResource1");
-     OCResourceHandle resourceHandle;
-     try
-     {
-         LOGD("OcPlatform_registerResource2");
-         OCStackResult result = OCPlatform::registerResource(
-             resourceHandle,
-             resource->getOCResource());
-         LOGD("OcPlatform_registerResource3");
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "register resource");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-         return nullptr;
-     }
-     LOGD("OcPlatform_registerResource4");
-     JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);
-     jlong handle = reinterpret_cast<jlong>(jniHandle);
-     jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);
-     LOGD("OcPlatform_registerResource5");
-     if (!jResourceHandle)
-     {
-         LOGE("Failed to create OcResourceHandle");
-         delete jniHandle;
-     }
-     return jResourceHandle;
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    registerResource1
- * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcPlatform/EntityHandler;I)Lorg/iotivity/base/OcResourceHandle;
- */
- JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource1
- (JNIEnv *env, jclass clazz, jstring jResourceUri, jstring jResourceTypeName, jstring jResourceInterface,
- jobject jListener, jint jResourceProperty)
- {
-     LOGI("OcPlatform_registerResource1");
-     std::string resourceUri;
-     if (jResourceUri)
-     {
-         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-     }
-     std::string resourceTypeName;
-     if (jResourceTypeName)
-     {
-         resourceTypeName = env->GetStringUTFChars(jResourceTypeName, NULL);
-     }
-     std::string resourceInterface;
-     if (jResourceInterface)
-     {
-         resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "entityHandler cannot be null");
-         return nullptr;
-     }
-     JniEntityHandler* entityHandler = new JniEntityHandler(env, jListener);
-     EntityHandler handleEntityCallback = [entityHandler](const std::shared_ptr<OCResourceRequest> request) ->
-         OCEntityHandlerResult{
-         return entityHandler->handleEntity(request);
-     };
-     OCResourceHandle resourceHandle;
-     try
-     {
-         OCStackResult result = OCPlatform::registerResource(
-             resourceHandle,
-             resourceUri,
-             resourceTypeName,
-             resourceInterface,
-             handleEntityCallback,
-             static_cast<int>(jResourceProperty));
-         if (OC_STACK_OK != result)
-         {
-             delete entityHandler;
-             ThrowOcException(result, "register resource");
-             return nullptr;
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         delete entityHandler;
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-         return nullptr;
-     }
-     JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);
-     jlong handle = reinterpret_cast<jlong>(jniHandle);
-     jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);
-     if (!jResourceHandle)
-     {
-         LOGE("Failed to create OcResourceHandle");
-         delete jniHandle;
-     }
-     return jResourceHandle;
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    registerDeviceInfo0
- * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0
- (JNIEnv *env,
- jclass clazz,
- jstring jDeviceName)
- {
-     LOGI("OcPlatform_registerDeviceInfo");
-     std::string deviceName;
-     if (jDeviceName)
-     {
-         deviceName = env->GetStringUTFChars(jDeviceName, NULL);
-     }
-     OCDeviceInfo deviceInfo;
-     try
-     {
-         DuplicateString(&deviceInfo.deviceName, deviceName);
-     }
-     catch (std::exception &e)
-     {
-         ThrowOcException(JNI_EXCEPTION, "Failed to construct device info");
-         return;
-     }
-     try
-     {
-         OCStackResult result = OCPlatform::registerDeviceInfo(deviceInfo);
-         delete deviceInfo.deviceName;
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to register device info");
-             return;
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
++            ThrowOcException(result, "Find platform has failed");
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    registerResource0\r
+ * Signature: (Lorg/iotivity/base/OcResource;)Lorg/iotivity/base/OcResourceHandle;\r
+ */\r
+ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0\r
+ (JNIEnv *env, jclass clazz, jobject jResource)\r
+ {\r
+     LOGD("OcPlatform_registerResource");\r
+     if (!jResource)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "Resource cannot be null");\r
+         return nullptr;\r
+     }\r
+     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, jResource);\r
+     if (!resource) return nullptr;\r
 -\r
++    LOGD("OcPlatform_registerResource1");
+     OCResourceHandle resourceHandle;\r
+     try\r
+     {\r
++        LOGD("OcPlatform_registerResource2");
+         OCStackResult result = OCPlatform::registerResource(\r
+             resourceHandle,\r
+             resource->getOCResource());\r
++        LOGD("OcPlatform_registerResource3");
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "register resource");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+         return nullptr;\r
+     }\r
 -\r
++    LOGD("OcPlatform_registerResource4");
+     JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);\r
+     jlong handle = reinterpret_cast<jlong>(jniHandle);\r
+     jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);\r
++    LOGD("OcPlatform_registerResource5");
+     if (!jResourceHandle)\r
+     {\r
+         LOGE("Failed to create OcResourceHandle");\r
+         delete jniHandle;\r
+     }\r
+     return jResourceHandle;\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    registerResource1\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcPlatform/EntityHandler;I)Lorg/iotivity/base/OcResourceHandle;\r
+ */\r
+ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource1\r
+ (JNIEnv *env, jclass clazz, jstring jResourceUri, jstring jResourceTypeName, jstring jResourceInterface,\r
+ jobject jListener, jint jResourceProperty)\r
+ {\r
+     LOGI("OcPlatform_registerResource1");\r
+     std::string resourceUri;\r
+     if (jResourceUri)\r
+     {\r
+         resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+     }\r
+     std::string resourceTypeName;\r
+     if (jResourceTypeName)\r
+     {\r
+         resourceTypeName = env->GetStringUTFChars(jResourceTypeName, NULL);\r
+     }\r
+     std::string resourceInterface;\r
+     if (jResourceInterface)\r
+     {\r
+         resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "entityHandler cannot be null");\r
+         return nullptr;\r
+     }\r
+     JniEntityHandler* entityHandler = new JniEntityHandler(env, jListener);\r
+     EntityHandler handleEntityCallback = [entityHandler](const std::shared_ptr<OCResourceRequest> request) ->\r
+         OCEntityHandlerResult{\r
+         return entityHandler->handleEntity(request);\r
+     };\r
\r
+     OCResourceHandle resourceHandle;\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::registerResource(\r
+             resourceHandle,\r
+             resourceUri,\r
+             resourceTypeName,\r
+             resourceInterface,\r
+             handleEntityCallback,\r
+             static_cast<int>(jResourceProperty));\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             delete entityHandler;\r
+             ThrowOcException(result, "register resource");\r
+             return nullptr;\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         delete entityHandler;\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+         return nullptr;\r
+     }\r
\r
+     JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);\r
+     jlong handle = reinterpret_cast<jlong>(jniHandle);\r
+     jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);\r
+     if (!jResourceHandle)\r
+     {\r
+         LOGE("Failed to create OcResourceHandle");\r
+         delete jniHandle;\r
+     }\r
\r
+     return jResourceHandle;\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    registerDeviceInfo0\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0\r
+ (JNIEnv *env,\r
+ jclass clazz,\r
+ jstring jDeviceName)\r
+ {\r
+     LOGI("OcPlatform_registerDeviceInfo");\r
\r
+     std::string deviceName;\r
+     if (jDeviceName)\r
+     {\r
+         deviceName = env->GetStringUTFChars(jDeviceName, NULL);\r
+     }\r
\r
+     OCDeviceInfo deviceInfo;\r
+     try\r
+     {\r
+         DuplicateString(&deviceInfo.deviceName, deviceName);\r
+     }\r
+     catch (std::exception &e)\r
+     {\r
+         ThrowOcException(JNI_EXCEPTION, "Failed to construct device info");\r
+         return;\r
+     }\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::registerDeviceInfo(deviceInfo);\r
\r
+         delete deviceInfo.deviceName;\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to register device info");\r
+             return;\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
 +* Method:    registerPlatformInfo0
 +* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 +*/
 +JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerPlatformInfo0
 +(JNIEnv *env,
 +jclass clazz,
 +jstring jPlatformID,
 +jstring jManufacturerName,
 +jstring jManufacturerUrl,
 +jstring jModelNumber,
 +jstring jDateOfManufacture,
 +jstring jPlatformVersion,
 +jstring jOperatingSystemVersion,
 +jstring jHardwareVersion,
 +jstring jFirmwareVersion,
 +jstring jSupportUrl,
 +jstring jSystemTime)
 +{
 +    LOGI("OcPlatform_registerPlatformInfo");
 +
 +
 +    std::string platformID;
 +        std::string manufacturerName;
 +        std::string manufacturerUrl;
 +        std::string modelNumber;
 +        std::string dateOfManufacture;
 +        std::string platformVersion;
 +        std::string operatingSystemVersion;
 +        std::string hardwareVersion;
 +        std::string firmwareVersion;
 +        std::string supportUrl;
 +        std::string systemTime;
 +
 +        if (jPlatformID)
 +        {
 +            platformID = env->GetStringUTFChars(jPlatformID, NULL);
 +        }
 +        if (jManufacturerName)
 +        {
 +            manufacturerName = env->GetStringUTFChars(jManufacturerName, NULL);
 +        }
 +        if (jManufacturerUrl)
 +        {
 +            manufacturerUrl = env->GetStringUTFChars(jManufacturerUrl, NULL);
 +        }
 +        if (jModelNumber)
 +        {
-             modelNumber = env->GetStringUTFChars(jModelNumber, NULL);
-         }
-         if (jDateOfManufacture)
-         {
-             dateOfManufacture = env->GetStringUTFChars(jDateOfManufacture, NULL);
-         }
-         if (jPlatformVersion)
-         {
-             platformVersion = env->GetStringUTFChars(jPlatformVersion, NULL);
-         }
-         if (jOperatingSystemVersion)
-         {
-             operatingSystemVersion = env->GetStringUTFChars(jOperatingSystemVersion, NULL);
-         }
-         if (jHardwareVersion)
-         {
-             hardwareVersion = env->GetStringUTFChars(jHardwareVersion, NULL);
-         }
-         if (jFirmwareVersion)
-         {
-             firmwareVersion = env->GetStringUTFChars(jFirmwareVersion, NULL);
-         }
-         if (jSupportUrl)
-         {
-             supportUrl = env->GetStringUTFChars(jSupportUrl, NULL);
-         }
-         if (jSystemTime)
-         {
-             systemTime = env->GetStringUTFChars(jSystemTime, NULL);
-         }
-         OCPlatformInfo platformInfo;
-         try
-         {
-             DuplicateString(&platformInfo.platformID, platformID);
-             DuplicateString(&platformInfo.manufacturerName, manufacturerName);
-             DuplicateString(&platformInfo.manufacturerUrl, manufacturerUrl);
-             DuplicateString(&platformInfo.modelNumber, modelNumber);
-             DuplicateString(&platformInfo.dateOfManufacture, dateOfManufacture);
-             DuplicateString(&platformInfo.platformVersion, platformVersion);
-             DuplicateString(&platformInfo.operatingSystemVersion, operatingSystemVersion);
-             DuplicateString(&platformInfo.hardwareVersion, hardwareVersion);
-             DuplicateString(&platformInfo.firmwareVersion, firmwareVersion);
-             DuplicateString(&platformInfo.supportUrl, supportUrl);
-             DuplicateString(&platformInfo.systemTime, systemTime);
-         }
-         catch (std::exception &e)
-         {
-             ThrowOcException(JNI_EXCEPTION, "Failed to construct platform info");
-             return;
-         }
-        // __android_log_print(ANDROID_LOG_INFO, "Rahul", "platformID  = %s", platformID);
-         try
-         {
-             OCStackResult result = OCPlatform::registerPlatformInfo(platformInfo);
-             delete platformInfo.platformID;
-             delete platformInfo.manufacturerName;
-             delete platformInfo.manufacturerUrl;
-             delete platformInfo.modelNumber;
-             delete platformInfo.dateOfManufacture;
-             delete platformInfo.platformVersion;
-             delete platformInfo.operatingSystemVersion;
-             delete platformInfo.hardwareVersion;
-             delete platformInfo.firmwareVersion;
-             delete platformInfo.supportUrl;
-             delete platformInfo.systemTime;
-             if (OC_STACK_OK != result)
-             {
-                 ThrowOcException(result, "Failed to register platform info");
-                 return;
-             }
-         }
-         catch (OCException& e)
-         {
-             LOGE("Error is due to %s", e.reason().c_str());
-             ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-         }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    unregisterResource0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0
- (JNIEnv *env, jclass clazz, jobject jResourceHandle)
- {
-     LOGI("OcPlatform_unregisterResource");
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try
-     {
-         OCResourceHandle resHandle = jniOcResourceHandle->getOCResourceHandle();
-         OCStackResult result = OCPlatform::unregisterResource(resHandle);
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to unregister resource");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    bindResource0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0
- (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)
- {
-     LOGI("OcPlatform_bindResource");
-     if (!jResourceCollectionHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-         return;
-     }
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceCollectionHandle);
-     if (!jniOcResourceCollectionHandle) return;
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try
-     {
-         OCStackResult result = OCPlatform::bindResource(
-             jniOcResourceCollectionHandle->getOCResourceHandle(),
-             jniOcResourceHandle->getOCResourceHandle()
-             );
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to bind resource");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    bindResources0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
- (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)
- {
-     LOGI("OcPlatform_bindResources");
-     if (!jResourceCollectionHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-         return;
-     }
-     if (!jResourceHandleArray)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceCollectionHandle);
-     if (!jniOcResourceCollectionHandle) return;
-     std::vector<OCResourceHandle> resourceHandleList;
-     int len = env->GetArrayLength(jResourceHandleArray);
-     for (int i = 0; i < len; ++i)
-     {
-         jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);
-         if (!jResourceHandle)
-         {
-             ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");
-             return;
-         }
-         JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-             env, jResourceHandle);
-         if (!jniOcResourceHandle) return;
-         resourceHandleList.push_back(
-             jniOcResourceHandle->getOCResourceHandle());
-     }
-     try
-     {
-         OCStackResult result = OCPlatform::bindResources(
-             jniOcResourceCollectionHandle->getOCResourceHandle(),
-             resourceHandleList
-             );
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to bind resources");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    unbindResource0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0
- (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)
- {
-     LOGI("OcPlatform_unbindResource");
-     if (!jResourceCollectionHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-         return;
-     }
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceCollectionHandle);
-     if (!jniOcResourceCollectionHandle) return;
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try
-     {
-         OCStackResult result = OCPlatform::unbindResource(
-             jniOcResourceCollectionHandle->getOCResourceHandle(),
-             jniOcResourceHandle->getOCResourceHandle()
-             );
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to unbind resource");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    unbindResources0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
- (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)
- {
-     LOGI("OcPlatform_unbindResources");
-     if (!jResourceCollectionHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-         return;
-     }
-     if (!jResourceHandleArray)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");
-         return;
-     }
-     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceCollectionHandle);
-     if (!jniOcResourceCollectionHandle) return;
-     std::vector<OCResourceHandle> resourceHandleList;
-     int len = env->GetArrayLength(jResourceHandleArray);
-     for (int i = 0; i < len; ++i)
-     {
-         jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);
-         if (!jResourceHandle)
-         {
-             ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");
-             return;
-         }
-         JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-             env, jResourceHandle);
-         if (!jniOcResourceHandle) return;
-         resourceHandleList.push_back(
-             jniOcResourceHandle->getOCResourceHandle());
-     }
-     try
-     {
-         OCStackResult result = OCPlatform::unbindResources(
-             jniOcResourceCollectionHandle->getOCResourceHandle(),
-             resourceHandleList
-             );
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "Failed to unbind resources");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    bindTypeToResource0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0
- (JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceTypeName)
- {
-     LOGI("OcPlatform_bindTypeToResource");
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     std::string typeName;
-     if (jResourceTypeName)
-     {
-         typeName = env->GetStringUTFChars(jResourceTypeName, NULL);
-     }
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try
-     {
-         OCStackResult result = OCPlatform::bindTypeToResource(
-             jniOcResourceHandle->getOCResourceHandle(),
-             typeName
-             );
-         if (OC_STACK_OK != result)
++            modelNumber = env->GetStringUTFChars(jModelNumber, NULL);
++        }
++        if (jDateOfManufacture)
 +        {
-             ThrowOcException(result, "Failed to bind type to resource");
++            dateOfManufacture = env->GetStringUTFChars(jDateOfManufacture, NULL);
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    bindInterfaceToResource0
- * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource0
- (JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceInterfaceName)
- {
-     LOGI("OcPlatform_bindInterfaceToResource");
-     if (!jResourceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-         return;
-     }
-     std::string interfaceName;
-     if (jResourceInterfaceName)
-     {
-         interfaceName = env->GetStringUTFChars(jResourceInterfaceName, NULL);
-     }
-     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-         env, jResourceHandle);
-     if (!jniOcResourceHandle) return;
-     try
-     {
-         OCStackResult result = OCPlatform::bindInterfaceToResource(
-             jniOcResourceHandle->getOCResourceHandle(),
-             interfaceName
-             );
-         if (OC_STACK_OK != result)
++        if (jPlatformVersion)
 +        {
-             ThrowOcException(result, "Failed to bind interface to resource");
++            platformVersion = env->GetStringUTFChars(jPlatformVersion, NULL);
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    startPresence0
- * Signature: (I)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0
- (JNIEnv *env, jclass clazz, jint ttl)
- {
-     LOGI("OcPlatform_startPresence");
-     try
-     {
-         OCStackResult result = OCPlatform::startPresence((unsigned int)ttl);
-         if (OC_STACK_OK != result)
++        if (jOperatingSystemVersion)
 +        {
-             ThrowOcException(result, "Failed to start presence");
++            operatingSystemVersion = env->GetStringUTFChars(jOperatingSystemVersion, NULL);
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    stopPresence0
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0
- (JNIEnv *env, jclass clazz)
- {
-     LOGI("OcPlatform_stopPresence");
-     try
-     {
-         OCStackResult result = OCPlatform::stopPresence();
-         if (OC_STACK_OK != result)
++        if (jHardwareVersion)
 +        {
-             ThrowOcException(result, "Failed to stop presence");
++            hardwareVersion = env->GetStringUTFChars(jHardwareVersion, NULL);
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    subscribePresence0
- * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;
- */
- JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0
- (JNIEnv *env, jclass clazz, jstring jHost, jint jConnectivityType, jobject jListener)
- {
-     LOGD("OcPlatform_subscribePresence");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");
-         return nullptr;
-     }
-     JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);
-     SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result, const unsigned int nonce,
-         const std::string& hostAddress)
-     {
-         onPresenceListener->onPresenceCallback(result, nonce, hostAddress);
-     };
-     OCPlatform::OCPresenceHandle presenceHandle;
-     try
-     {
-         OCStackResult result = OCPlatform::subscribePresence(
-             presenceHandle,
-             host,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             subscribeCallback);
-         if (OC_STACK_OK != result)
++        if (jFirmwareVersion)
 +        {
-             ThrowOcException(result, "subscribe presence has failed");
++            firmwareVersion = env->GetStringUTFChars(jFirmwareVersion, NULL);
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-         return nullptr;
-     }
-     JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);
-     jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);
-     jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);
-     if (!jPresenceHandle)
-     {
-         LOGE("Failed to create OcPresenceHandle");
-         delete jniPresenceHandle;
-     }
-     return jPresenceHandle;
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    subscribePresence1
- * Signature: (Ljava/lang/String;Ljava/lang/String;I
- Lorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;
- */
- JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceType, jint jConnectivityType, jobject jListener)
- {
-     LOGD("OcPlatform_subscribePresence1");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string resourceType;
-     if (jResourceType)
-     {
-         resourceType = env->GetStringUTFChars(jResourceType, NULL);
-     }
-     if (!jListener)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");
-         return nullptr;
-     }
-     JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);
-     SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result,
-         const unsigned int nonce, const std::string& hostAddress)
-     {
-         onPresenceListener->onPresenceCallback(result, nonce, hostAddress);
-     };
-     OCPlatform::OCPresenceHandle presenceHandle;
-     try
-     {
-         OCStackResult result = OCPlatform::subscribePresence(
-             presenceHandle,
-             host,
-             resourceType,
-             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-             subscribeCallback);
-         if (OC_STACK_OK != result)
++        if (jSupportUrl)
 +        {
-             ThrowOcException(result, "subscribe presence has failed");
++            supportUrl = env->GetStringUTFChars(jSupportUrl, NULL);
++        }
++        if (jSystemTime)
++        {
++            systemTime = env->GetStringUTFChars(jSystemTime, NULL);
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-         return nullptr;
-     }
-     JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);
-     jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);
-     jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);
-     if (!jPresenceHandle)
-     {
-         LOGE("Failed to create OcPresenceHandle");
-         delete jniPresenceHandle;
-     }
-     return jPresenceHandle;
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    unsubscribePresence0
- * Signature: (Lorg/iotivity/base/OcPresenceHandle;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
- (JNIEnv *env, jclass clazz, jobject jPresenceHandle)
- {
-     LOGD("OcPlatform_unsubscribePresence");
-     if (!jPresenceHandle)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "presenceHandle cannot be null");
-         return;
-     }
-     JniOcPresenceHandle* jniPresenceHandle = JniOcPresenceHandle::getJniOcPresenceHandlePtr(env, jPresenceHandle);
-     if (!jniPresenceHandle) return;
-     OCPresenceHandle presenceHandle = jniPresenceHandle->getOCPresenceHandle();
-     try
-     {
-         OCStackResult result = OCPlatform::unsubscribePresence(presenceHandle);
 +
-         if (OC_STACK_OK != result)
++        OCPlatformInfo platformInfo;
++        try
 +        {
-             ThrowOcException(result, "unsubscribe presence has failed");
-             return;
++            DuplicateString(&platformInfo.platformID, platformID);
++            DuplicateString(&platformInfo.manufacturerName, manufacturerName);
++            DuplicateString(&platformInfo.manufacturerUrl, manufacturerUrl);
++            DuplicateString(&platformInfo.modelNumber, modelNumber);
++            DuplicateString(&platformInfo.dateOfManufacture, dateOfManufacture);
++            DuplicateString(&platformInfo.platformVersion, platformVersion);
++            DuplicateString(&platformInfo.operatingSystemVersion, operatingSystemVersion);
++            DuplicateString(&platformInfo.hardwareVersion, hardwareVersion);
++            DuplicateString(&platformInfo.firmwareVersion, firmwareVersion);
++            DuplicateString(&platformInfo.supportUrl, supportUrl);
++            DuplicateString(&platformInfo.systemTime, systemTime);
 +        }
-         jweak jwOnPresenceListener = jniPresenceHandle->getJniOnPresenceListener()->getJWListener();
-         if (jwOnPresenceListener)
++        catch (std::exception &e)
 +        {
-             RemoveOnPresenceListener(env, jwOnPresenceListener);
++            ThrowOcException(JNI_EXCEPTION, "Failed to construct platform info");
++            return;
 +        }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
- }
- /*
- * Class:     org_iotivity_base_OcPlatform
- * Method:    constructResourceObject0
- * Signature: (Ljava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;[Ljava/lang/String;)
- Lorg/iotivity/base/OcResource;
- */
- JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructResourceObject0
- (JNIEnv *env, jclass clazz, jstring jHost, jstring jUri, jint jConnectivityType,
- jboolean jIsObservable, jobjectArray jResourceTypeArray, jobjectArray jInterfaceArray)
- {
-     LOGD("OcPlatform_constructResourceObject");
-     std::string host;
-     if (jHost)
-     {
-         host = env->GetStringUTFChars(jHost, NULL);
-     }
-     std::string uri;
-     if (jUri)
-     {
-         uri = env->GetStringUTFChars(jUri, NULL);
-     }
-     if (!jResourceTypeArray)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceTypeList cannot be null");
-         return nullptr;
-     }
-     if (!jInterfaceArray)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "interfaceList cannot be null");
-         return nullptr;
-     }
 +
-     std::vector<std::string> resourceTypes;
-     JniUtils::convertJavaStrArrToStrVector(env, jResourceTypeArray, resourceTypes);
++       // __android_log_print(ANDROID_LOG_INFO, "Rahul", "platformID  = %s", platformID);
++        try
++        {
++            OCStackResult result = OCPlatform::registerPlatformInfo(platformInfo);
 +
-     std::vector<std::string> interfaces;
-     JniUtils::convertJavaStrArrToStrVector(env, jInterfaceArray, interfaces);
++            delete platformInfo.platformID;
++            delete platformInfo.manufacturerName;
++            delete platformInfo.manufacturerUrl;
++            delete platformInfo.modelNumber;
++            delete platformInfo.dateOfManufacture;
++            delete platformInfo.platformVersion;
++            delete platformInfo.operatingSystemVersion;
++            delete platformInfo.hardwareVersion;
++            delete platformInfo.firmwareVersion;
++            delete platformInfo.supportUrl;
++            delete platformInfo.systemTime;
 +
-     std::shared_ptr<OCResource> resource = OCPlatform::constructResourceObject(
-         host,
-         uri,
-         JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-         static_cast<bool>(jIsObservable),
-         resourceTypes,
-         interfaces);
++            if (OC_STACK_OK != result)
++            {
++                ThrowOcException(result, "Failed to register platform info");
++                return;
++            }
++        }
++        catch (OCException& e)
++        {
++            LOGE("Error is due to %s", e.reason().c_str());
++            ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
++        }
 +
-     if (!resource)
-     {
-         ThrowOcException(OC_STACK_ERROR, "Failed to create OCResource");
-         return nullptr;
-     }
 +
-     JniOcResource *jniOcResource = new JniOcResource(resource);
-     jlong handle = reinterpret_cast<jlong>(jniOcResource);
 +
-     jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
-     if (!jResource)
-     {
-         delete jniOcResource;
-         return nullptr;
-     }
-     SetHandle<JniOcResource>(env, jResource, jniOcResource);
-     if (env->ExceptionCheck())
-     {
-         delete jniOcResource;
-         return nullptr;
-     }
-     return jResource;
 +}
 +
 +/*
 +* Class:     org_iotivity_base_OcPlatform
- * Method:    sendResponse0
- * Signature: (Lorg/iotivity/base/OcResourceResponse;)V
- */
- JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0
- (JNIEnv *env, jclass clazz, jobject jResourceResponse)
- {
-     LOGD("OcPlatform_sendResponse");
-     if (!jResourceResponse)
-     {
-         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");
-         return;
-     }
-     JniOcResourceResponse *jniResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-         env, jResourceResponse);
-     if (!jniResponse) return;
-     try
-     {
-         OCStackResult result = OCPlatform::sendResponse(jniResponse->getOCResourceResponse());
-         if (OC_STACK_OK != result)
-         {
-             ThrowOcException(result, "failed to send response");
-         }
-     }
-     catch (OCException& e)
-     {
-         LOGE("%s", e.reason().c_str());
-         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-     }
+ * Method:    unregisterResource0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle)\r
+ {\r
+     LOGI("OcPlatform_unregisterResource");\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try\r
+     {\r
+         OCResourceHandle resHandle = jniOcResourceHandle->getOCResourceHandle();\r
+         OCStackResult result = OCPlatform::unregisterResource(resHandle);\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to unregister resource");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    bindResource0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)\r
+ {\r
+     LOGI("OcPlatform_bindResource");\r
+     if (!jResourceCollectionHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+         return;\r
+     }\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
+     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceCollectionHandle);\r
+     if (!jniOcResourceCollectionHandle) return;\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::bindResource(\r
+             jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+             jniOcResourceHandle->getOCResourceHandle()\r
+             );\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to bind resource");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    bindResources0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)\r
+ {\r
+     LOGI("OcPlatform_bindResources");\r
\r
+     if (!jResourceCollectionHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+         return;\r
+     }\r
+     if (!jResourceHandleArray)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceCollectionHandle);\r
+     if (!jniOcResourceCollectionHandle) return;\r
\r
+     std::vector<OCResourceHandle> resourceHandleList;\r
+     int len = env->GetArrayLength(jResourceHandleArray);\r
+     for (int i = 0; i < len; ++i)\r
+     {\r
+         jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);\r
+         if (!jResourceHandle)\r
+         {\r
+             ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");\r
+             return;\r
+         }\r
\r
+         JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+             env, jResourceHandle);\r
+         if (!jniOcResourceHandle) return;\r
\r
+         resourceHandleList.push_back(\r
+             jniOcResourceHandle->getOCResourceHandle());\r
+     }\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::bindResources(\r
+             jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+             resourceHandleList\r
+             );\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to bind resources");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    unbindResource0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)\r
+ {\r
+     LOGI("OcPlatform_unbindResource");\r
+     if (!jResourceCollectionHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+         return;\r
+     }\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceCollectionHandle);\r
+     if (!jniOcResourceCollectionHandle) return;\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::unbindResource(\r
+             jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+             jniOcResourceHandle->getOCResourceHandle()\r
+             );\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to unbind resource");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    unbindResources0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)\r
+ {\r
+     LOGI("OcPlatform_unbindResources");\r
+     if (!jResourceCollectionHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+         return;\r
+     }\r
+     if (!jResourceHandleArray)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceCollectionHandle);\r
+     if (!jniOcResourceCollectionHandle) return;\r
\r
+     std::vector<OCResourceHandle> resourceHandleList;\r
+     int len = env->GetArrayLength(jResourceHandleArray);\r
+     for (int i = 0; i < len; ++i)\r
+     {\r
+         jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);\r
+         if (!jResourceHandle)\r
+         {\r
+             ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");\r
+             return;\r
+         }\r
\r
+         JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+             env, jResourceHandle);\r
+         if (!jniOcResourceHandle) return;\r
\r
+         resourceHandleList.push_back(\r
+             jniOcResourceHandle->getOCResourceHandle());\r
+     }\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::unbindResources(\r
+             jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+             resourceHandleList\r
+             );\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to unbind resources");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    bindTypeToResource0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceTypeName)\r
+ {\r
+     LOGI("OcPlatform_bindTypeToResource");\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
+     std::string typeName;\r
+     if (jResourceTypeName)\r
+     {\r
+         typeName = env->GetStringUTFChars(jResourceTypeName, NULL);\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::bindTypeToResource(\r
+             jniOcResourceHandle->getOCResourceHandle(),\r
+             typeName\r
+             );\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to bind type to resource");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    bindInterfaceToResource0\r
+ * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceInterfaceName)\r
+ {\r
+     LOGI("OcPlatform_bindInterfaceToResource");\r
+     if (!jResourceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+         return;\r
+     }\r
+     std::string interfaceName;\r
+     if (jResourceInterfaceName)\r
+     {\r
+         interfaceName = env->GetStringUTFChars(jResourceInterfaceName, NULL);\r
+     }\r
\r
+     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+         env, jResourceHandle);\r
+     if (!jniOcResourceHandle) return;\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::bindInterfaceToResource(\r
+             jniOcResourceHandle->getOCResourceHandle(),\r
+             interfaceName\r
+             );\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to bind interface to resource");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    startPresence0\r
+ * Signature: (I)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0\r
+ (JNIEnv *env, jclass clazz, jint ttl)\r
+ {\r
+     LOGI("OcPlatform_startPresence");\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::startPresence((unsigned int)ttl);\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to start presence");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    stopPresence0\r
+ * Signature: ()V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0\r
+ (JNIEnv *env, jclass clazz)\r
+ {\r
+     LOGI("OcPlatform_stopPresence");\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::stopPresence();\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "Failed to stop presence");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    subscribePresence0\r
+ * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;\r
+ */\r
+ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jint jConnectivityType, jobject jListener)\r
+ {\r
+     LOGD("OcPlatform_subscribePresence");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");\r
+         return nullptr;\r
+     }\r
\r
+     JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);\r
\r
+     SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result, const unsigned int nonce,\r
+         const std::string& hostAddress)\r
+     {\r
+         onPresenceListener->onPresenceCallback(result, nonce, hostAddress);\r
+     };\r
\r
+     OCPlatform::OCPresenceHandle presenceHandle;\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::subscribePresence(\r
+             presenceHandle,\r
+             host,\r
+             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+             subscribeCallback);\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "subscribe presence has failed");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+         return nullptr;\r
+     }\r
\r
+     JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);\r
+     jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);\r
+     jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);\r
+     if (!jPresenceHandle)\r
+     {\r
+         LOGE("Failed to create OcPresenceHandle");\r
+         delete jniPresenceHandle;\r
+     }\r
 -\r
+     return jPresenceHandle;\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    subscribePresence1\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;I\r
+ Lorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;\r
+ */\r
+ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceType, jint jConnectivityType, jobject jListener)\r
+ {\r
+     LOGD("OcPlatform_subscribePresence1");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     std::string resourceType;\r
+     if (jResourceType)\r
+     {\r
+         resourceType = env->GetStringUTFChars(jResourceType, NULL);\r
+     }\r
+     if (!jListener)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");\r
+         return nullptr;\r
+     }\r
\r
+     JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);\r
\r
+     SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result,\r
+         const unsigned int nonce, const std::string& hostAddress)\r
+     {\r
+         onPresenceListener->onPresenceCallback(result, nonce, hostAddress);\r
+     };\r
\r
+     OCPlatform::OCPresenceHandle presenceHandle;\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::subscribePresence(\r
+             presenceHandle,\r
+             host,\r
+             resourceType,\r
+             JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+             subscribeCallback);\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "subscribe presence has failed");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+         return nullptr;\r
+     }\r
\r
+     JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);\r
+     jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);\r
+     jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);\r
+     if (!jPresenceHandle)\r
+     {\r
+         LOGE("Failed to create OcPresenceHandle");\r
+         delete jniPresenceHandle;\r
+     }\r
+     return jPresenceHandle;\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    unsubscribePresence0\r
+ * Signature: (Lorg/iotivity/base/OcPresenceHandle;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0\r
+ (JNIEnv *env, jclass clazz, jobject jPresenceHandle)\r
+ {\r
+     LOGD("OcPlatform_unsubscribePresence");\r
+     if (!jPresenceHandle)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "presenceHandle cannot be null");\r
+         return;\r
+     }\r
+     JniOcPresenceHandle* jniPresenceHandle = JniOcPresenceHandle::getJniOcPresenceHandlePtr(env, jPresenceHandle);\r
+     if (!jniPresenceHandle) return;\r
\r
+     OCPresenceHandle presenceHandle = jniPresenceHandle->getOCPresenceHandle();\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::unsubscribePresence(presenceHandle);\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "unsubscribe presence has failed");\r
+             return;\r
+         }\r
+         jweak jwOnPresenceListener = jniPresenceHandle->getJniOnPresenceListener()->getJWListener();\r
+         if (jwOnPresenceListener)\r
+         {\r
+             RemoveOnPresenceListener(env, jwOnPresenceListener);\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    constructResourceObject0\r
+ * Signature: (Ljava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;[Ljava/lang/String;)\r
+ Lorg/iotivity/base/OcResource;\r
+ */\r
+ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructResourceObject0\r
+ (JNIEnv *env, jclass clazz, jstring jHost, jstring jUri, jint jConnectivityType,\r
+ jboolean jIsObservable, jobjectArray jResourceTypeArray, jobjectArray jInterfaceArray)\r
+ {\r
+     LOGD("OcPlatform_constructResourceObject");\r
+     std::string host;\r
+     if (jHost)\r
+     {\r
+         host = env->GetStringUTFChars(jHost, NULL);\r
+     }\r
+     std::string uri;\r
+     if (jUri)\r
+     {\r
+         uri = env->GetStringUTFChars(jUri, NULL);\r
+     }\r
+     if (!jResourceTypeArray)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceTypeList cannot be null");\r
+         return nullptr;\r
+     }\r
+     if (!jInterfaceArray)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "interfaceList cannot be null");\r
+         return nullptr;\r
+     }\r
\r
+     std::vector<std::string> resourceTypes;\r
+     JniUtils::convertJavaStrArrToStrVector(env, jResourceTypeArray, resourceTypes);\r
\r
+     std::vector<std::string> interfaces;\r
+     JniUtils::convertJavaStrArrToStrVector(env, jInterfaceArray, interfaces);\r
\r
+     std::shared_ptr<OCResource> resource = OCPlatform::constructResourceObject(\r
+         host,\r
+         uri,\r
+         JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+         static_cast<bool>(jIsObservable),\r
+         resourceTypes,\r
+         interfaces);\r
\r
+     if (!resource)\r
+     {\r
+         ThrowOcException(OC_STACK_ERROR, "Failed to create OCResource");\r
+         return nullptr;\r
+     }\r
\r
+     JniOcResource *jniOcResource = new JniOcResource(resource);\r
+     jlong handle = reinterpret_cast<jlong>(jniOcResource);\r
\r
+     jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);\r
+     if (!jResource)\r
+     {\r
+         delete jniOcResource;\r
+         return nullptr;\r
+     }\r
+     SetHandle<JniOcResource>(env, jResource, jniOcResource);\r
+     if (env->ExceptionCheck())\r
+     {\r
+         delete jniOcResource;\r
+         return nullptr;\r
+     }\r
+     return jResource;\r
+ }\r
\r
+ /*\r
+ * Class:     org_iotivity_base_OcPlatform\r
+ * Method:    sendResponse0\r
+ * Signature: (Lorg/iotivity/base/OcResourceResponse;)V\r
+ */\r
+ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0\r
+ (JNIEnv *env, jclass clazz, jobject jResourceResponse)\r
+ {\r
+     LOGD("OcPlatform_sendResponse");\r
+     if (!jResourceResponse)\r
+     {\r
+         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");\r
+         return;\r
+     }\r
\r
+     JniOcResourceResponse *jniResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(\r
+         env, jResourceResponse);\r
+     if (!jniResponse) return;\r
\r
+     try\r
+     {\r
+         OCStackResult result = OCPlatform::sendResponse(jniResponse->getOCResourceResponse());\r
\r
+         if (OC_STACK_OK != result)\r
+         {\r
+             ThrowOcException(result, "failed to send response");\r
+         }\r
+     }\r
+     catch (OCException& e)\r
+     {\r
+         LOGE("%s", e.reason().c_str());\r
+         ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+     }\r
  }
- /*
- * //******************************************************************
- * //
- * // Copyright 2015 Intel Corporation.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- * //
- * // 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.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- */
- #include "JniOcStack.h"
- #include "JniOnResourceFoundListener.h"
- #include "JniOnDeviceInfoListener.h"
+ /*\r
+ * //******************************************************************\r
+ * //\r
+ * // Copyright 2015 Intel Corporation.\r
+ * //\r
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ * //\r
+ * // Licensed under the Apache License, Version 2.0 (the "License");\r
+ * // you may not use this file except in compliance with the License.\r
+ * // You may obtain a copy of the License at\r
+ * //\r
+ * //      http://www.apache.org/licenses/LICENSE-2.0\r
+ * //\r
+ * // Unless required by applicable law or agreed to in writing, software\r
+ * // distributed under the License is distributed on an "AS IS" BASIS,\r
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * // See the License for the specific language governing permissions and\r
+ * // limitations under the License.\r
+ * //\r
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+ #include "JniOcStack.h"\r
+ #include "JniOnResourceFoundListener.h"\r
+ #include "JniOnDeviceInfoListener.h"\r
 +#include "JniOnPlatformInfoListener.h"
- #include "JniOnPresenceListener.h"
- #include <mutex>
- #ifndef _Included_org_iotivity_base_OcPlatform
- #define _Included_org_iotivity_base_OcPlatform
- using namespace OC;
- JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener);
- void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener);
- JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener);
- void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener);
+ #include "JniOnPresenceListener.h"\r
+ #include <mutex>\r
\r
+ #ifndef _Included_org_iotivity_base_OcPlatform\r
+ #define _Included_org_iotivity_base_OcPlatform\r
\r
+ using namespace OC;\r
\r
+ JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener);\r
+ void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener);\r
\r
+ JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener);\r
+ void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener);\r
\r
 +JniOnPlatformInfoListener* AddOnPlatformInfoListener(JNIEnv* env, jobject jListener);
 +void RemoveOnPlatformInfoListener(JNIEnv* env, jobject jListener);
 +
- JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener);
- void RemoveOnPresenceListener(JNIEnv* env, jobject jListener);
- std::map<jobject, std::pair<JniOnResourceFoundListener*, int>> onResourceFoundListenerMap;
- std::map<jobject, std::pair<JniOnDeviceInfoListener*, int>> onDeviceInfoListenerMap;
+ JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener);\r
+ void RemoveOnPresenceListener(JNIEnv* env, jobject jListener);\r
\r
+ std::map<jobject, std::pair<JniOnResourceFoundListener*, int>> onResourceFoundListenerMap;\r
+ std::map<jobject, std::pair<JniOnDeviceInfoListener*, int>> onDeviceInfoListenerMap;\r
 +std::map<jobject, std::pair<JniOnPlatformInfoListener*, int>> onPlatformInfoListenerMap;
- std::map<jobject, std::pair<JniOnPresenceListener*, int>> onPresenceListenerMap;
- std::mutex resourceFoundMapLock;
- std::mutex deviceInfoMapLock;
+ std::map<jobject, std::pair<JniOnPresenceListener*, int>> onPresenceListenerMap;\r
\r
+ std::mutex resourceFoundMapLock;\r
+ std::mutex deviceInfoMapLock;\r
 +std::mutex platformInfoMapLock;
- std::mutex presenceMapLock;
- #ifdef __cplusplus
- extern "C" {
- #endif
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    configure
-     * Signature: (IILjava/lang/String;II)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure
-         (JNIEnv *, jclass, jint, jint, jstring, jint, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    notifyAllObservers0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0
-         (JNIEnv *, jclass, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    notifyAllObservers1
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;I)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
-         (JNIEnv *, jclass, jobject, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    notifyListOfObservers2
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;[BLorg/iotivity/base/OcResourceResponse;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
-         (JNIEnv *, jclass, jobject, jbyteArray, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    notifyListOfObservers3
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;[BLorg/iotivity/base/OcResourceResponse;I)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
-         (JNIEnv *, jclass, jobject, jbyteArray, jobject, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    findResource0
-     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0
-         (JNIEnv *, jclass, jstring, jstring, jint, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    findResource1
-     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
-         (JNIEnv *, jclass, jstring, jstring, jint, jobject, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    getDeviceInfo0
-     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0
-         (JNIEnv *, jclass, jstring, jstring, jint, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    getDeviceInfo1
-     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;I)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1
+ std::mutex presenceMapLock;\r
\r
+ #ifdef __cplusplus\r
+ extern "C" {\r
+ #endif\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    configure\r
+     * Signature: (IILjava/lang/String;II)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure\r
+         (JNIEnv *, jclass, jint, jint, jstring, jint, jint, jstring);
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    notifyAllObservers0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0\r
+         (JNIEnv *, jclass, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    notifyAllObservers1\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;I)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1\r
+         (JNIEnv *, jclass, jobject, jint);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    notifyListOfObservers2\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;[BLorg/iotivity/base/OcResourceResponse;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2\r
+         (JNIEnv *, jclass, jobject, jbyteArray, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    notifyListOfObservers3\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;[BLorg/iotivity/base/OcResourceResponse;I)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3\r
+         (JNIEnv *, jclass, jobject, jbyteArray, jobject, jint);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    findResource0\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0\r
+         (JNIEnv *, jclass, jstring, jstring, jint, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    findResource1\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1\r
+         (JNIEnv *, jclass, jstring, jstring, jint, jobject, jint);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    getDeviceInfo0\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0\r
+         (JNIEnv *, jclass, jstring, jstring, jint, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    getDeviceInfo1\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;I)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1\r
 +        (JNIEnv *, jclass, jstring, jstring, jint, jobject, jint);
 +
 +    /*
 +     * Class:     org_iotivity_base_OcPlatform
 +     * Method:    getPlatformInfo0
 +     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;)V
 +     */
 +     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
 +        (JNIEnv *, jclass, jstring, jstring, jint, jobject);
 +
 +    /*
 +     * Class:     org_iotivity_base_OcPlatform
 +     * Method:    getPlatformInfo1
 +     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;I)V
 +     */
 +     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
-         (JNIEnv *, jclass, jstring, jstring, jint, jobject, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    registerResource0
-     * Signature: (Lorg/iotivity/base/OcResource;)Lorg/iotivity/base/OcResourceHandle;
-     */
-     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0
-         (JNIEnv *, jclass, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    registerResource1
-     * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcPlatform/EntityHandler;I)Lorg/iotivity/base/OcResourceHandle;
-     */
-     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource1
-         (JNIEnv *, jclass, jstring, jstring, jstring, jobject, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    registerDeviceInfo0
+         (JNIEnv *, jclass, jstring, jstring, jint, jobject, jint);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    registerResource0\r
+     * Signature: (Lorg/iotivity/base/OcResource;)Lorg/iotivity/base/OcResourceHandle;\r
+     */\r
+     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0\r
+         (JNIEnv *, jclass, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    registerResource1\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcPlatform/EntityHandler;I)Lorg/iotivity/base/OcResourceHandle;\r
+     */\r
+     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource1\r
+         (JNIEnv *, jclass, jstring, jstring, jstring, jobject, jint);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    registerDeviceInfo0\r
 -    * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\r
 +    * Signature: (Ljava/lang/String;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0\r
 -        (JNIEnv *, jclass, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring);\r
 +        (JNIEnv *, jclass, jstring);
 +
 +    /*
 +    * Class:     org_iotivity_base_OcPlatform
 +    * Method:    registerPlatformInfo0
 +    * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 +    */
 +    JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerPlatformInfo0
 +        (JNIEnv *, jclass, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring, jstring);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    unregisterResource0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0
-         (JNIEnv *, jclass, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    bindResource0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0
-         (JNIEnv *, jclass, jobject, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    bindResources0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
-         (JNIEnv *, jclass, jobject, jobjectArray);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    unbindResource0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0
-         (JNIEnv *, jclass, jobject, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    unbindResources0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
-         (JNIEnv *, jclass, jobject, jobjectArray);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    bindTypeToResource0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0
-         (JNIEnv *, jclass, jobject, jstring);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    bindInterfaceToResource0
-     * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource0
-         (JNIEnv *, jclass, jobject, jstring);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    startPresence0
-     * Signature: (I)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0
-         (JNIEnv *, jclass, jint);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    stopPresence0
-     * Signature: ()V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0
-         (JNIEnv *, jclass);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    subscribePresence0
-     * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;
-     */
-     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0
-         (JNIEnv *, jclass, jstring, jint, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    subscribePresence1
-     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;
-     */
-     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1
-         (JNIEnv *, jclass, jstring, jstring, jint, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    unsubscribePresence0
-     * Signature: (Lorg/iotivity/base/OcPresenceHandle;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
-         (JNIEnv *, jclass, jobject);
-     /*
-     * Class:     org_iotivity_base_OcPlatform
-     * Method:    constructResourceObject0
-     * Signature: (Ljava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;[Ljava/lang/String;)Lorg/iotivity/base/OcResource;
-     */
-     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructResourceObject0
-         (JNIEnv *, jclass, jstring, jstring, jint, jboolean, jobjectArray, jobjectArray);
-     /*
-     * Class:     org_iotivity_base_OcPlatform0
-     * Method:    sendResponse0
-     * Signature: (Lorg/iotivity/base/OcResourceResponse;)V
-     */
-     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0
-         (JNIEnv *, jclass, jobject);
- #ifdef __cplusplus
- }
- #endif
- #endif
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    unregisterResource0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0\r
+         (JNIEnv *, jclass, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    bindResource0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0\r
+         (JNIEnv *, jclass, jobject, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    bindResources0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0\r
+         (JNIEnv *, jclass, jobject, jobjectArray);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    unbindResource0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0\r
+         (JNIEnv *, jclass, jobject, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    unbindResources0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0\r
+         (JNIEnv *, jclass, jobject, jobjectArray);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    bindTypeToResource0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0\r
+         (JNIEnv *, jclass, jobject, jstring);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    bindInterfaceToResource0\r
+     * Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource0\r
+         (JNIEnv *, jclass, jobject, jstring);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    startPresence0\r
+     * Signature: (I)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0\r
+         (JNIEnv *, jclass, jint);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    stopPresence0\r
+     * Signature: ()V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0\r
+         (JNIEnv *, jclass);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    subscribePresence0\r
+     * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;\r
+     */\r
+     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0\r
+         (JNIEnv *, jclass, jstring, jint, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    subscribePresence1\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;\r
+     */\r
+     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1\r
+         (JNIEnv *, jclass, jstring, jstring, jint, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    unsubscribePresence0\r
+     * Signature: (Lorg/iotivity/base/OcPresenceHandle;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0\r
+         (JNIEnv *, jclass, jobject);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform\r
+     * Method:    constructResourceObject0\r
+     * Signature: (Ljava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;[Ljava/lang/String;)Lorg/iotivity/base/OcResource;\r
+     */\r
+     JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructResourceObject0\r
+         (JNIEnv *, jclass, jstring, jstring, jint, jboolean, jobjectArray, jobjectArray);\r
\r
+     /*\r
+     * Class:     org_iotivity_base_OcPlatform0\r
+     * Method:    sendResponse0\r
+     * Signature: (Lorg/iotivity/base/OcResourceResponse;)V\r
+     */\r
+     JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0\r
+         (JNIEnv *, jclass, jobject);\r
\r
+ #ifdef __cplusplus\r
+ }\r
+ #endif\r
+ #endif\r
 +
- /*
-  * //******************************************************************
-  * //
-  * // Copyright 2015 Intel Corporation.
-  * //
-  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-  * //
-  * // 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.base;
- import org.iotivity.ca.CaInterface;
- import java.util.EnumSet;
- import java.util.Iterator;
- import java.util.List;
- /**
-  * Contains the main entrance/functionality of the product. To set a custom configuration, the
-  * implementer must make a call to OcPlatform.Configure before the first usage of a function in this
-  * class.
-  */
- public final class OcPlatform {
-     static {
-         System.loadLibrary("oc_logger");
-         System.loadLibrary("octbstack");
-         System.loadLibrary("connectivity_abstraction");
-         System.loadLibrary("oc");
-         System.loadLibrary("ocstack-jni");
-     }
-     /**
-      * Default interface
-      */
-     public static final String DEFAULT_INTERFACE = "oic.if.baseline";
-     /**
-      * Used in discovering (GET) links to other resources of a collection
-      */
-     public static final String LINK_INTERFACE = "oic.if.ll";
-     /**
-      * Used in GET, PUT, POST, DELETE methods on links to other resources of a collection
-      */
-     public static final String BATCH_INTERFACE = "oic.if.b";
-     /**
-      * Used in GET, PUT, POST methods on links to other remote resources of a group
-      */
-     public static final String GROUP_INTERFACE = "oic.mi.grp";
-     public static final String WELL_KNOWN_QUERY = "224.0.1.187:5683/oic/res";
-     public static final String MULTICAST_PREFIX = "224.0.1.187:5683";
-     public static final String MULTICAST_IP = "224.0.1.187";
-     public static final int MULTICAST_PORT = 5683;
-     public static final int DEFAULT_PRESENCE_TTL = 60;
-     public static final String DEVICE_URI = "/oic/d";
-     public static final String PRESENCE_URI = "/oic/ad";
-     private static volatile boolean sIsPlatformInitialized = false;
-     private OcPlatform() {
-     }
-     /**
-      * API for setting the configuration of the OcPlatform.
-      * Note: Any calls made to this AFTER the first call to OcPlatform.Configure will have no affect
-      *
-      * @param platformConfig platform configuration
-      */
-     public synchronized static void Configure(PlatformConfig platformConfig) {
-         if (!sIsPlatformInitialized) {
-             CaInterface.initialize(platformConfig.getContext());
-             OcPlatform.configure(
-                     platformConfig.getServiceType().getValue(),
-                     platformConfig.getModeType().getValue(),
-                     platformConfig.getIpAddress(),
-                     platformConfig.getPort(),
-                     platformConfig.getQualityOfService().getValue()
-             );
-             sIsPlatformInitialized = true;
-         }
-     }
-     private static native void configure(int serviceType,
-                                          int modeType,
-                                          String ipAddress,
-                                          int port,
-                                          int qualityOfService);
-     /**
-      * API for notifying base that resource's attributes have changed.
-      *
-      * @param ocResourceHandle resource handle of the resource
-      * @throws OcException
-      */
-     public static void notifyAllObservers(
-             OcResourceHandle ocResourceHandle) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.notifyAllObservers0(ocResourceHandle);
-     }
-     private static native void notifyAllObservers0(
-             OcResourceHandle ocResourceHandle) throws OcException;
-     /**
-      * API for notifying base that resource's attributes have changed.
-      *
-      * @param ocResourceHandle resource handle of the resource
-      * @param qualityOfService the quality of communication
-      * @throws OcException
-      */
-     public static void notifyAllObservers(
-             OcResourceHandle ocResourceHandle,
-             QualityOfService qualityOfService) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.notifyAllObservers1(ocResourceHandle, qualityOfService.getValue());
-     }
-     private static native void notifyAllObservers1(
-             OcResourceHandle ocResourceHandle,
-             int qualityOfService) throws OcException;
-     /**
-      * API for notifying only specific clients that resource's attributes have changed.
-      *
-      * @param ocResourceHandle    resource handle of the resource
-      * @param ocObservationIdList These set of ids are ones which which will be notified upon
-      *                            resource change.
-      * @param ocResourceResponse  OcResourceResponse object used by app to fill the response for
-      *                            this resource change
-      * @throws OcException
-      */
-     public static void notifyListOfObservers(
-             OcResourceHandle ocResourceHandle,
-             List<Byte> ocObservationIdList,
-             OcResourceResponse ocResourceResponse) throws OcException {
-         OcPlatform.initCheck();
-         byte[] idArr = new byte[ocObservationIdList.size()];
-         Iterator<Byte> it = ocObservationIdList.iterator();
-         int i = 0;
-         while (it.hasNext()) {
-             idArr[i++] = (byte) it.next();
-         }
-         OcPlatform.notifyListOfObservers2(
-                 ocResourceHandle,
-                 idArr,
-                 ocResourceResponse);
-     }
-     private static native void notifyListOfObservers2(
-             OcResourceHandle ocResourceHandle,
-             byte[] ocObservationIdArray,
-             OcResourceResponse ocResourceResponse) throws OcException;
-     /**
-      * API for notifying only specific clients that resource's attributes have changed.
-      *
-      * @param ocResourceHandle    resource handle of the resource
-      * @param ocObservationIdList These set of ids are ones which which will be notified upon
-      *                            resource change.
-      * @param ocResourceResponse  OcResourceResponse object used by app to fill the response for
-      *                            this resource change
-      * @param qualityOfService    the quality of communication
-      * @throws OcException
-      */
-     public static void notifyListOfObservers(
-             OcResourceHandle ocResourceHandle,
-             List<Byte> ocObservationIdList,
-             OcResourceResponse ocResourceResponse,
-             QualityOfService qualityOfService) throws OcException {
-         OcPlatform.initCheck();
-         byte[] idArr = new byte[ocObservationIdList.size()];
-         Iterator<Byte> it = ocObservationIdList.iterator();
-         int i = 0;
-         while (it.hasNext()) {
-             idArr[i++] = (byte) it.next();
-         }
-         OcPlatform.notifyListOfObservers3(
-                 ocResourceHandle,
-                 idArr,
-                 ocResourceResponse,
-                 qualityOfService.getValue()
-         );
-     }
-     private static native void notifyListOfObservers3(
-             OcResourceHandle ocResourceHandle,
-             byte[] ocObservationIdArray,
-             OcResourceResponse ocResourceResponse,
-             int qualityOfService) throws OcException;
-     /**
-      * API for Service and Resource Discovery. NOTE: This API applies to client side only
-      *
-      * @param host                    Host IP Address of a service to direct resource discovery query.
-      *                                If empty, performs multicast resource discovery query
-      * @param resourceUri             name of the resource. If null or empty, performs search for all
-      *                                resource names
-      * @param connectivityType        a type of connectivity indicating the interface. Example: IPV4,
-      *                                IPV6, ALL
-      * @param onResourceFoundListener Handles events, success states and failure states.
-      * @throws OcException
-      */
-     public static void findResource(
-             String host,
-             String resourceUri,
-             OcConnectivityType connectivityType,
-             OnResourceFoundListener onResourceFoundListener) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.findResource0(
-                 host,
-                 resourceUri,
-                 connectivityType.getValue(),
-                 onResourceFoundListener
-         );
-     }
-     private static native void findResource0(
-             String host,
-             String resourceUri,
-             int connectivityType,
-             OnResourceFoundListener onResourceFoundListener) throws OcException;
-     /**
-      * API for Service and Resource Discovery. NOTE: This API applies to client side only
-      *
-      * @param host                    Host IP Address of a service to direct resource discovery query.
-      *                                If empty, performs multicast resource discovery query
-      * @param resourceUri             name of the resource. If null or empty, performs search for all
-      *                                resource names
-      * @param connectivityType        a type of connectivity indicating the interface. Example: IPV4,
-      *                                IPV6, ALL
-      * @param onResourceFoundListener Handles events, success states and failure states.
-      * @param qualityOfService        the quality of communication
-      * @throws OcException
-      */
-     public static void findResource(
-             String host,
-             String resourceUri,
-             OcConnectivityType connectivityType,
-             OnResourceFoundListener onResourceFoundListener,
-             QualityOfService qualityOfService) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.findResource1(host,
-                 resourceUri,
-                 connectivityType.getValue(),
-                 onResourceFoundListener,
-                 qualityOfService.getValue()
-         );
-     }
-     private static native void findResource1(
-             String host,
-             String resourceUri,
-             int connectivityType,
-             OnResourceFoundListener onResourceFoundListener,
-             int qualityOfService) throws OcException;
-     /**
-      * API for Device Discovery
-      *
-      * @param host                  Host IP Address. If null or empty, Multicast is performed.
-      * @param deviceUri             Uri containing address to the virtual device
-      * @param connectivityType      a type of connectivity indicating the interface. Example: IPV4,
-      *                              IPV6, ALL
-      * @param onDeviceFoundListener Handles events, success states and failure states.
-      * @throws OcException
-      */
-     public static void getDeviceInfo(
-             String host,
-             String deviceUri,
-             OcConnectivityType connectivityType,
-             OnDeviceFoundListener onDeviceFoundListener) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.getDeviceInfo0(
-                 host,
-                 deviceUri,
-                 connectivityType.getValue(),
-                 onDeviceFoundListener
-         );
-     }
-     private static native void getDeviceInfo0(
-             String host,
-             String deviceUri,
-             int connectivityType,
-             OnDeviceFoundListener onDeviceFoundListener) throws OcException;
-     /**
-      * API for Device Discovery
-      *
-      * @param host                  Host IP Address. If null or empty, Multicast is performed.
-      * @param deviceUri             Uri containing address to the virtual device
-      * @param connectivityType      a type of connectivity indicating the interface. Example: IPV4,
-      *                              IPV6, ALL
-      * @param onDeviceFoundListener Handles events, success states and failure states.
-      * @param qualityOfService      the quality of communication
-      * @throws OcException
-      */
-     public static void getDeviceInfo(
-             String host,
-             String deviceUri,
-             OcConnectivityType connectivityType,
-             OnDeviceFoundListener onDeviceFoundListener,
-             QualityOfService qualityOfService) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.getDeviceInfo1(
-                 host,
-                 deviceUri,
-                 connectivityType.getValue(),
-                 onDeviceFoundListener,
-                 qualityOfService.getValue()
-         );
-     }
-     private static native void getDeviceInfo1(
-             String host,
-             String deviceUri,
-             int connectivityType,
-             OnDeviceFoundListener onDeviceFoundListener,
+ /*\r
+  * //******************************************************************\r
+  * //\r
+  * // Copyright 2015 Intel Corporation.\r
+  * //\r
+  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+  * //\r
+  * // Licensed under the Apache License, Version 2.0 (the "License");\r
+  * // you may not use this file except in compliance with the License.\r
+  * // You may obtain a copy of the License at\r
+  * //\r
+  * //      http://www.apache.org/licenses/LICENSE-2.0\r
+  * //\r
+  * // Unless required by applicable law or agreed to in writing, software\r
+  * // distributed under the License is distributed on an "AS IS" BASIS,\r
+  * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * // See the License for the specific language governing permissions and\r
+  * // limitations under the License.\r
+  * //\r
+  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+  */\r
\r
+ package org.iotivity.base;\r
\r
+ import org.iotivity.ca.CaInterface;\r
\r
+ import java.util.EnumSet;\r
+ import java.util.Iterator;\r
+ import java.util.List;\r
\r
+ /**\r
+  * Contains the main entrance/functionality of the product. To set a custom configuration, the\r
+  * implementer must make a call to OcPlatform.Configure before the first usage of a function in this\r
+  * class.\r
+  */\r
+ public final class OcPlatform {\r
\r
+     static {\r
+         System.loadLibrary("oc_logger");\r
+         System.loadLibrary("octbstack");\r
+         System.loadLibrary("connectivity_abstraction");\r
+         System.loadLibrary("oc");\r
+         System.loadLibrary("ocstack-jni");\r
+     }\r
\r
+     /**\r
+      * Default interface\r
+      */\r
+     public static final String DEFAULT_INTERFACE = "oic.if.baseline";\r
\r
+     /**\r
+      * Used in discovering (GET) links to other resources of a collection\r
+      */\r
+     public static final String LINK_INTERFACE = "oic.if.ll";\r
\r
+     /**\r
+      * Used in GET, PUT, POST, DELETE methods on links to other resources of a collection\r
+      */\r
+     public static final String BATCH_INTERFACE = "oic.if.b";\r
\r
+     /**\r
+      * Used in GET, PUT, POST methods on links to other remote resources of a group\r
+      */\r
+     public static final String GROUP_INTERFACE = "oic.mi.grp";\r
\r
+     public static final String WELL_KNOWN_QUERY = "224.0.1.187:5683/oic/res";\r
+     public static final String MULTICAST_PREFIX = "224.0.1.187:5683";\r
+     public static final String MULTICAST_IP = "224.0.1.187";\r
+     public static final int MULTICAST_PORT = 5683;\r
+     public static final int DEFAULT_PRESENCE_TTL = 60;\r
+     public static final String DEVICE_URI = "/oic/d";\r
+     public static final String PRESENCE_URI = "/oic/ad";\r
\r
+     private static volatile boolean sIsPlatformInitialized = false;\r
\r
+     private OcPlatform() {\r
+     }\r
\r
+     /**\r
+      * API for setting the configuration of the OcPlatform.\r
+      * Note: Any calls made to this AFTER the first call to OcPlatform.Configure will have no affect\r
+      *\r
+      * @param platformConfig platform configuration\r
+      */\r
+     public synchronized static void Configure(PlatformConfig platformConfig) {\r
+         if (!sIsPlatformInitialized) {\r
+             CaInterface.initialize(platformConfig.getContext());\r
\r
+             OcPlatform.configure(\r
+                     platformConfig.getServiceType().getValue(),\r
+                     platformConfig.getModeType().getValue(),\r
+                     platformConfig.getIpAddress(),\r
+                     platformConfig.getPort(),\r
+                     platformConfig.getQualityOfService().getValue(),
+                     platformConfig.getSvrDbPath()
+             );\r
\r
+             sIsPlatformInitialized = true;\r
+         }\r
+     }\r
\r
+     private static native void configure(int serviceType,\r
+                                          int modeType,\r
+                                          String ipAddress,\r
+                                          int port,\r
+                                          int qualityOfService,
+                                          String dbPath);
\r
+     /**\r
+      * API for notifying base that resource's attributes have changed.\r
+      *\r
+      * @param ocResourceHandle resource handle of the resource\r
+      * @throws OcException\r
+      */\r
+     public static void notifyAllObservers(\r
+             OcResourceHandle ocResourceHandle) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.notifyAllObservers0(ocResourceHandle);\r
+     }\r
\r
+     private static native void notifyAllObservers0(\r
+             OcResourceHandle ocResourceHandle) throws OcException;\r
\r
+     /**\r
+      * API for notifying base that resource's attributes have changed.\r
+      *\r
+      * @param ocResourceHandle resource handle of the resource\r
+      * @param qualityOfService the quality of communication\r
+      * @throws OcException\r
+      */\r
+     public static void notifyAllObservers(\r
+             OcResourceHandle ocResourceHandle,\r
+             QualityOfService qualityOfService) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.notifyAllObservers1(ocResourceHandle, qualityOfService.getValue());\r
+     }\r
\r
+     private static native void notifyAllObservers1(\r
+             OcResourceHandle ocResourceHandle,\r
+             int qualityOfService) throws OcException;\r
\r
+     /**\r
+      * API for notifying only specific clients that resource's attributes have changed.\r
+      *\r
+      * @param ocResourceHandle    resource handle of the resource\r
+      * @param ocObservationIdList These set of ids are ones which which will be notified upon\r
+      *                            resource change.\r
+      * @param ocResourceResponse  OcResourceResponse object used by app to fill the response for\r
+      *                            this resource change\r
+      * @throws OcException\r
+      */\r
+     public static void notifyListOfObservers(\r
+             OcResourceHandle ocResourceHandle,\r
+             List<Byte> ocObservationIdList,\r
+             OcResourceResponse ocResourceResponse) throws OcException {\r
+         OcPlatform.initCheck();\r
\r
+         byte[] idArr = new byte[ocObservationIdList.size()];\r
+         Iterator<Byte> it = ocObservationIdList.iterator();\r
+         int i = 0;\r
+         while (it.hasNext()) {\r
+             idArr[i++] = (byte) it.next();\r
+         }\r
\r
+         OcPlatform.notifyListOfObservers2(\r
+                 ocResourceHandle,\r
+                 idArr,\r
+                 ocResourceResponse);\r
+     }\r
\r
+     private static native void notifyListOfObservers2(\r
+             OcResourceHandle ocResourceHandle,\r
+             byte[] ocObservationIdArray,\r
+             OcResourceResponse ocResourceResponse) throws OcException;\r
\r
+     /**\r
+      * API for notifying only specific clients that resource's attributes have changed.\r
+      *\r
+      * @param ocResourceHandle    resource handle of the resource\r
+      * @param ocObservationIdList These set of ids are ones which which will be notified upon\r
+      *                            resource change.\r
+      * @param ocResourceResponse  OcResourceResponse object used by app to fill the response for\r
+      *                            this resource change\r
+      * @param qualityOfService    the quality of communication\r
+      * @throws OcException\r
+      */\r
+     public static void notifyListOfObservers(\r
+             OcResourceHandle ocResourceHandle,\r
+             List<Byte> ocObservationIdList,\r
+             OcResourceResponse ocResourceResponse,\r
+             QualityOfService qualityOfService) throws OcException {\r
+         OcPlatform.initCheck();\r
\r
+         byte[] idArr = new byte[ocObservationIdList.size()];\r
+         Iterator<Byte> it = ocObservationIdList.iterator();\r
+         int i = 0;\r
+         while (it.hasNext()) {\r
+             idArr[i++] = (byte) it.next();\r
+         }\r
\r
+         OcPlatform.notifyListOfObservers3(\r
+                 ocResourceHandle,\r
+                 idArr,\r
+                 ocResourceResponse,\r
+                 qualityOfService.getValue()\r
+         );\r
+     }\r
\r
+     private static native void notifyListOfObservers3(\r
+             OcResourceHandle ocResourceHandle,\r
+             byte[] ocObservationIdArray,\r
+             OcResourceResponse ocResourceResponse,\r
+             int qualityOfService) throws OcException;\r
\r
+     /**\r
+      * API for Service and Resource Discovery. NOTE: This API applies to client side only\r
+      *\r
+      * @param host                    Host IP Address of a service to direct resource discovery query.\r
+      *                                If empty, performs multicast resource discovery query\r
+      * @param resourceUri             name of the resource. If null or empty, performs search for all\r
+      *                                resource names\r
+      * @param connectivityType        a type of connectivity indicating the interface. Example: IPV4,\r
+      *                                IPV6, ALL\r
+      * @param onResourceFoundListener Handles events, success states and failure states.\r
+      * @throws OcException\r
+      */\r
+     public static void findResource(\r
+             String host,\r
+             String resourceUri,\r
+             OcConnectivityType connectivityType,\r
+             OnResourceFoundListener onResourceFoundListener) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.findResource0(\r
+                 host,\r
+                 resourceUri,\r
+                 connectivityType.getValue(),\r
+                 onResourceFoundListener\r
+         );\r
+     }\r
\r
+     private static native void findResource0(\r
+             String host,\r
+             String resourceUri,\r
+             int connectivityType,\r
+             OnResourceFoundListener onResourceFoundListener) throws OcException;\r
\r
+     /**\r
+      * API for Service and Resource Discovery. NOTE: This API applies to client side only\r
+      *\r
+      * @param host                    Host IP Address of a service to direct resource discovery query.\r
+      *                                If empty, performs multicast resource discovery query\r
+      * @param resourceUri             name of the resource. If null or empty, performs search for all\r
+      *                                resource names\r
+      * @param connectivityType        a type of connectivity indicating the interface. Example: IPV4,\r
+      *                                IPV6, ALL\r
+      * @param onResourceFoundListener Handles events, success states and failure states.\r
+      * @param qualityOfService        the quality of communication\r
+      * @throws OcException\r
+      */\r
+     public static void findResource(\r
+             String host,\r
+             String resourceUri,\r
+             OcConnectivityType connectivityType,\r
+             OnResourceFoundListener onResourceFoundListener,\r
+             QualityOfService qualityOfService) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.findResource1(host,\r
+                 resourceUri,\r
+                 connectivityType.getValue(),\r
+                 onResourceFoundListener,\r
+                 qualityOfService.getValue()\r
+         );\r
+     }\r
\r
+     private static native void findResource1(\r
+             String host,\r
+             String resourceUri,\r
+             int connectivityType,\r
+             OnResourceFoundListener onResourceFoundListener,\r
+             int qualityOfService) throws OcException;\r
\r
+     /**\r
+      * API for Device Discovery\r
+      *\r
+      * @param host                  Host IP Address. If null or empty, Multicast is performed.\r
+      * @param deviceUri             Uri containing address to the virtual device\r
+      * @param connectivityType      a type of connectivity indicating the interface. Example: IPV4,\r
+      *                              IPV6, ALL\r
+      * @param onDeviceFoundListener Handles events, success states and failure states.\r
+      * @throws OcException\r
+      */\r
+     public static void getDeviceInfo(\r
+             String host,\r
+             String deviceUri,\r
+             OcConnectivityType connectivityType,\r
+             OnDeviceFoundListener onDeviceFoundListener) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.getDeviceInfo0(\r
+                 host,\r
+                 deviceUri,\r
+                 connectivityType.getValue(),\r
+                 onDeviceFoundListener\r
+         );\r
+     }\r
\r
+     private static native void getDeviceInfo0(\r
+             String host,\r
+             String deviceUri,\r
+             int connectivityType,\r
+             OnDeviceFoundListener onDeviceFoundListener) throws OcException;\r
\r
+     /**\r
+      * API for Device Discovery\r
+      *\r
+      * @param host                  Host IP Address. If null or empty, Multicast is performed.\r
+      * @param deviceUri             Uri containing address to the virtual device\r
+      * @param connectivityType      a type of connectivity indicating the interface. Example: IPV4,\r
+      *                              IPV6, ALL\r
+      * @param onDeviceFoundListener Handles events, success states and failure states.\r
+      * @param qualityOfService      the quality of communication\r
+      * @throws OcException\r
+      */\r
+     public static void getDeviceInfo(\r
+             String host,\r
+             String deviceUri,\r
+             OcConnectivityType connectivityType,\r
+             OnDeviceFoundListener onDeviceFoundListener,\r
+             QualityOfService qualityOfService) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.getDeviceInfo1(\r
+                 host,\r
+                 deviceUri,\r
+                 connectivityType.getValue(),\r
+                 onDeviceFoundListener,\r
+                 qualityOfService.getValue()\r
+         );\r
+     }\r
\r
+     private static native void getDeviceInfo1(\r
+             String host,\r
+             String deviceUri,\r
+             int connectivityType,\r
+             OnDeviceFoundListener onDeviceFoundListener,\r
 +            int qualityOfService) throws OcException;
 +
 +    /**
 +     * API for Platform Discovery
 +     *
 +     * @param host                  Host IP Address. If null or empty, Multicast is performed.
 +     * @param platformUri           Uri containing address to the platform
 +     * @param connectivityType      a type of connectivity indicating the interface. Example: IPV4,
 +     *                              IPV6, ALL
 +     * @param onPlatformFoundListener Handles events, success states and failure states.
 +     * @throws OcException
 +     */
 +
 +    public static void getPlatformInfo(
 +            String host,
 +            String platformUri,
 +            OcConnectivityType connectivityType,
 +            OnPlatformFoundListener onPlatformFoundListener) throws OcException {
 +        OcPlatform.initCheck();
 +        OcPlatform.getPlatformInfo0(
 +                host,
 +                platformUri,
 +                connectivityType.getValue(),
 +                onPlatformFoundListener
 +        );
 +    }
 +
 +    private static native void getPlatformInfo0(
 +            String host,
 +            String platformUri,
 +            int connectivityType,
 +            OnPlatformFoundListener onPlatformInfoFoundListener) throws OcException;
 +
 +    /**
 +     * API for Platform Discovery
 +     *
 +     * @param host                  Host IP Address. If null or empty, Multicast is performed.
 +     * @param platformUri           Uri containing address to the platform
 +     * @param connectivityType      a type of connectivity indicating the interface. Example: IPV4,
 +     *                              IPV6, ALL
 +     * @param onPlatformFoundListener Handles events, success states and failure states.
 +     * @param qualityOfService      the quality of communication
 +     * @throws OcException
 +     */
 +
 +    public static void getPlatformInfo(
 +            String host,
 +            String platformUri,
 +            OcConnectivityType connectivityType,
 +            OnPlatformFoundListener onPlatformFoundListener,
 +            QualityOfService qualityOfService) throws OcException {
 +        OcPlatform.initCheck();
 +        OcPlatform.getPlatformInfo1(
 +                host,
 +                platformUri,
 +                connectivityType.getValue(),
 +                onPlatformFoundListener,
 +                qualityOfService.getValue()
 +        );
 +    }
 +
 +    private static native void getPlatformInfo1(
 +            String host,
 +            String platformUri,
 +            int connectivityType,
 +            OnPlatformFoundListener onPlatformFoundListener,
-             int qualityOfService) throws OcException;
-     /**
-      * This API registers a resource with the server NOTE: This API applies to server side only.
-      *
-      * @param ocResource The instance of OcResource with all data filled
-      * @return resource handle
-      * @throws OcException
-      */
-     public static OcResourceHandle registerResource(
-             OcResource ocResource) throws OcException {
-         OcPlatform.initCheck();
-         return OcPlatform.registerResource0(ocResource);
-     }
-     private static native OcResourceHandle registerResource0(
-             OcResource ocResource) throws OcException;
-     /**
-      * This API registers a resource with the server NOTE: This API applies to server side only.
-      *
-      * @param resourceUri         The URI of the resource. Example: "a/light"
-      * @param resourceTypeName    The resource type. Example: "light"
-      * @param resourceInterface   The resource interface (whether it is collection etc).
-      * @param entityHandler       entity handler.
-      * @param resourcePropertySet indicates the property of the resource
-      * @return resource handle
-      * @throws OcException
-      */
-     public static OcResourceHandle registerResource(
-             String resourceUri,
-             String resourceTypeName,
-             String resourceInterface,
-             EntityHandler entityHandler,
-             EnumSet<ResourceProperty> resourcePropertySet) throws OcException {
-         OcPlatform.initCheck();
-         int resProperty = 0;
-         for (ResourceProperty prop : ResourceProperty.values()) {
-             if (resourcePropertySet.contains(prop))
-                 resProperty |= prop.getValue();
-         }
-         return OcPlatform.registerResource1(resourceUri,
-                 resourceTypeName,
-                 resourceInterface,
-                 entityHandler,
-                 resProperty);
-     }
-     private static native OcResourceHandle registerResource1(
-             String resourceUri,
-             String resourceTypeName,
-             String resourceInterface,
-             EntityHandler entityHandler,
-             int resourceProperty) throws OcException;
-     /**
-      * Register Device Info
-      *
-      * @param ocDeviceInfo object containing all the device specific information
-      * @throws OcException
-      */
-     public static void registerDeviceInfo(
-             OcDeviceInfo ocDeviceInfo) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.registerDeviceInfo0(
-                 ocDeviceInfo.getDeviceName()
-         );
-     }
-     private static native void registerDeviceInfo0(
-             String deviceName
-             ) throws OcException;
-     /**
+             int qualityOfService) throws OcException;\r
\r
+     /**\r
+      * This API registers a resource with the server NOTE: This API applies to server side only.\r
+      *\r
+      * @param ocResource The instance of OcResource with all data filled\r
+      * @return resource handle\r
+      * @throws OcException\r
+      */\r
+     public static OcResourceHandle registerResource(\r
+             OcResource ocResource) throws OcException {\r
+         OcPlatform.initCheck();\r
+         return OcPlatform.registerResource0(ocResource);\r
+     }\r
\r
+     private static native OcResourceHandle registerResource0(\r
+             OcResource ocResource) throws OcException;\r
\r
+     /**\r
+      * This API registers a resource with the server NOTE: This API applies to server side only.\r
+      *\r
+      * @param resourceUri         The URI of the resource. Example: "a/light"\r
+      * @param resourceTypeName    The resource type. Example: "light"\r
+      * @param resourceInterface   The resource interface (whether it is collection etc).\r
+      * @param entityHandler       entity handler.\r
+      * @param resourcePropertySet indicates the property of the resource\r
+      * @return resource handle\r
+      * @throws OcException\r
+      */\r
+     public static OcResourceHandle registerResource(\r
+             String resourceUri,\r
+             String resourceTypeName,\r
+             String resourceInterface,\r
+             EntityHandler entityHandler,\r
+             EnumSet<ResourceProperty> resourcePropertySet) throws OcException {\r
+         OcPlatform.initCheck();\r
\r
+         int resProperty = 0;\r
\r
+         for (ResourceProperty prop : ResourceProperty.values()) {\r
+             if (resourcePropertySet.contains(prop))\r
+                 resProperty |= prop.getValue();\r
+         }\r
\r
+         return OcPlatform.registerResource1(resourceUri,\r
+                 resourceTypeName,\r
+                 resourceInterface,\r
+                 entityHandler,\r
+                 resProperty);\r
+     }\r
\r
+     private static native OcResourceHandle registerResource1(\r
+             String resourceUri,\r
+             String resourceTypeName,\r
+             String resourceInterface,\r
+             EntityHandler entityHandler,\r
+             int resourceProperty) throws OcException;\r
\r
+     /**\r
+      * Register Device Info\r
+      *\r
+      * @param ocDeviceInfo object containing all the device specific information\r
+      * @throws OcException\r
+      */\r
+     public static void registerDeviceInfo(\r
+             OcDeviceInfo ocDeviceInfo) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.registerDeviceInfo0(\r
+                 ocDeviceInfo.getDeviceName()\r
+         );\r
+     }\r
\r
+     private static native void registerDeviceInfo0(\r
+             String deviceName\r
+             ) throws OcException;\r
\r
+     /**\r
 +     * Register Platform Info
 +     *
 +     * @param ocPlatformInfo object containing all the platform specific information
 +     * @throws OcException
 +     */
 +    public static void registerPlatformInfo(
 +            OcPlatformInfo ocPlatformInfo) throws OcException {
 +        OcPlatform.initCheck();
 +        OcPlatform.registerPlatformInfo0(
 +                ocPlatformInfo.getPlatformID(),
 +                ocPlatformInfo.getManufacturerName(),
 +                ocPlatformInfo.getManufacturerUrl(),
 +                ocPlatformInfo.getModelNumber(),
 +                ocPlatformInfo.getDateOfManufacture(),
 +                ocPlatformInfo.getPlatformVersion(),
 +                ocPlatformInfo.getOperatingSystemVersion(),
 +                ocPlatformInfo.getHardwareVersion(),
 +                ocPlatformInfo.getFirmwareVersion(),
 +                ocPlatformInfo.getSupportUrl(),
 +                ocPlatformInfo.getSystemTime()
 +        );
 +    }
 +
 +    private static native void registerPlatformInfo0(
 +            String platformId, String manufacturerName, String manufacturerUrl,
 +            String modelNumber, String dateOfManufacture, String platformVersion,
 +            String operatingSystemVersion, String hardwareVersion, String firmwareVersion,
 +            String supportUrl, String systemTime
 +    ) throws OcException;
 +
 +    /**
-      * This API unregisters a resource with the server NOTE: This API applies to server side only.
-      *
-      * @param ocResourceHandle This is the resource handle which we which to unregister from the
-      *                         server
-      * @throws OcException
-      */
-     public static void unregisterResource(
-             OcResourceHandle ocResourceHandle) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.unregisterResource0(ocResourceHandle);
-     }
-     private static native void unregisterResource0(
-             OcResourceHandle ocResourceHandle) throws OcException;
-     /**
-      * Add a resource to a collection resource
-      *
-      * @param ocResourceCollectionHandle handle to the collection resource
-      * @param ocResourceHandle           handle to resource to be added to the collection resource
-      * @throws OcException
-      */
-     public static void bindResource(
-             OcResourceHandle ocResourceCollectionHandle,
-             OcResourceHandle ocResourceHandle) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.bindResource0(ocResourceCollectionHandle, ocResourceHandle);
-     }
-     private static native void bindResource0(
-             OcResourceHandle ocResourceCollectionHandle,
-             OcResourceHandle ocResourceHandle) throws OcException;
-     /**
-      * Add multiple resources to a collection resource.
-      *
-      * @param ocResourceCollectionHandle handle to the collection resource
-      * @param ocResourceHandleList       reference to list of resource handles to be added to the
-      *                                   collection resource
-      * @throws OcException
-      */
-     public static void bindResources(
-             OcResourceHandle ocResourceCollectionHandle,
-             List<OcResourceHandle> ocResourceHandleList) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.bindResources0(
-                 ocResourceCollectionHandle,
-                 ocResourceHandleList.toArray(
-                         new OcResourceHandle[ocResourceHandleList.size()])
-         );
-     }
-     private static native void bindResources0(
-             OcResourceHandle ocResourceCollectionHandle,
-             OcResourceHandle[] ocResourceHandleArray) throws OcException;
-     /**
-      * Unbind a resource from a collection resource.
-      *
-      * @param ocResourceCollectionHandle handle to the collection resource
-      * @param ocResourceHandle           resource handle to be unbound from the collection resource
-      * @throws OcException
-      */
-     public static void unbindResource(
-             OcResourceHandle ocResourceCollectionHandle,
-             OcResourceHandle ocResourceHandle) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.unbindResource0(ocResourceCollectionHandle, ocResourceHandle);
-     }
-     private static native void unbindResource0(
-             OcResourceHandle ocResourceCollectionHandle,
-             OcResourceHandle ocResourceHandle) throws OcException;
-     /**
-      * Unbind resources from a collection resource.
-      *
-      * @param ocResourceCollectionHandle Handle to the collection resource
-      * @param ocResourceHandleList       List of resource handles to be unbound from the collection
-      *                                   resource
-      * @throws OcException
-      */
-     public static void unbindResources(
-             OcResourceHandle ocResourceCollectionHandle,
-             List<OcResourceHandle> ocResourceHandleList) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.unbindResources0(
-                 ocResourceCollectionHandle,
-                 ocResourceHandleList.toArray(
-                         new OcResourceHandle[ocResourceHandleList.size()])
-         );
-     }
-     private static native void unbindResources0(
-             OcResourceHandle ocResourceCollectionHandle,
-             OcResourceHandle[] ocResourceHandleArray) throws OcException;
-     /**
-      * Binds a type to a particular resource
-      *
-      * @param ocResourceHandle handle to the resource
-      * @param resourceTypeName new typename to bind to the resource
-      * @throws OcException
-      */
-     public static void bindTypeToResource(
-             OcResourceHandle ocResourceHandle,
-             String resourceTypeName) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.bindTypeToResource0(ocResourceHandle, resourceTypeName);
-     }
-     private static native void bindTypeToResource0(
-             OcResourceHandle ocResourceHandle,
-             String resourceTypeName) throws OcException;
-     /**
-      * Binds an interface to a particular resource
-      *
-      * @param ocResourceHandle      handle to the resource
-      * @param resourceInterfaceName new interface to bind to the resource
-      * @throws OcException
-      */
-     public static void bindInterfaceToResource(
-             OcResourceHandle ocResourceHandle,
-             String resourceInterfaceName) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.bindInterfaceToResource0(ocResourceHandle, resourceInterfaceName);
-     }
-     private static native void bindInterfaceToResource0(
-             OcResourceHandle ocResourceHandle,
-             String resourceInterfaceName) throws OcException;
-     /**
-      * Start Presence announcements.
-      *
-      * @param ttl time to live in seconds
-      * @throws OcException
-      */
-     public static void startPresence(int ttl) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.startPresence0(ttl);
-     }
-     private static native void startPresence0(int ttl) throws OcException;
-     /**
-      * Stop Presence announcements.
-      *
-      * @throws OcException
-      */
-     public static void stopPresence() throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.stopPresence0();
-     }
-     private static native void stopPresence0() throws OcException;
-     /**
-      * Subscribes to a server's presence change events. By making this subscription, every time a
-      * server adds/removes/alters a resource, starts or is intentionally stopped
-      *
-      * @param host               The IP address/addressable name of the server to subscribe to
-      * @param connectivityType   a type of connectivity indicating the interface. Example: IPV4,
-      *                           IPV6, ALL
-      * @param onPresenceListener listener that will receive notifications/subscription events
-      * @return a handle object that can be used to identify this subscription request. It can be
-      * used to unsubscribe from these events in the future
-      * @throws OcException
-      */
-     public static OcPresenceHandle subscribePresence(
-             String host,
-             OcConnectivityType connectivityType,
-             OnPresenceListener onPresenceListener) throws OcException {
-         OcPlatform.initCheck();
-         return OcPlatform.subscribePresence0(
-                 host,
-                 connectivityType.getValue(),
-                 onPresenceListener
-         );
-     }
-     private static native OcPresenceHandle subscribePresence0(
-             String host,
-             int connectivityType,
-             OnPresenceListener onPresenceListener) throws OcException;
-     /**
-      * Subscribes to a server's presence change events. By making this subscription, every time a
-      * server adds/removes/alters a resource, starts or is intentionally stopped
-      *
-      * @param host               The IP address/addressable name of the server to subscribe to
-      * @param resourceType       a resource type specified as a filter for subscription events.
-      * @param connectivityType   a type of connectivity indicating the interface. Example: IPV4,
-      *                           IPV6, ALL
-      * @param onPresenceListener listener that will receive notifications/subscription events
-      * @return a handle object that can be used to identify this subscription request. It can be
-      * used to unsubscribe from these events in the future
-      * @throws OcException
-      */
-     public static OcPresenceHandle subscribePresence(
-             String host,
-             String resourceType,
-             OcConnectivityType connectivityType,
-             OnPresenceListener onPresenceListener) throws OcException {
-         OcPlatform.initCheck();
-         return OcPlatform.subscribePresence1(
-                 host,
-                 resourceType,
-                 connectivityType.getValue(),
-                 onPresenceListener);
-     }
-     private static native OcPresenceHandle subscribePresence1(
-             String host,
-             String resourceType,
-             int connectivityType,
-             OnPresenceListener onPresenceListener) throws OcException;
-     /**
-      * Unsubscribes from a previously subscribed server's presence events. Note that you may for
-      * a short time still receive events from the server since it may take time for the
-      * unsubscribe to take effect.
-      *
-      * @param ocPresenceHandle the handle object provided by the subscribePresence call that
-      *                         identifies this subscription
-      * @throws OcException
-      */
-     public static void unsubscribePresence(
-             OcPresenceHandle ocPresenceHandle) throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.unsubscribePresence0(ocPresenceHandle);
-     }
-     private static native void unsubscribePresence0(
-             OcPresenceHandle ocPresenceHandle) throws OcException;
-     /**
-      * Creates a resource proxy object so that get/put/observe functionality can be used without
-      * discovering the object in advance. Note that the consumer of this method needs to provide
-      * all of the details required to correctly contact and observe the object. If the consumer
-      * lacks any of this information, they should discover the resource object normally.
-      * Additionally, you can only create this object if OcPlatform was initialized to be a Client
-      * or Client/Server.
-      *
-      * @param host             a string containing a resolvable host address of the server holding
-      *                         the resource
-      * @param uri              the rest of the resource's URI that will permit messages to be
-      *                         properly routed.
-      *                         Example: /a/light
-      * @param connectivityType a type of connectivity indicating the interface. Example: IPV4,
-      *                         IPV6, ALL
-      * @param isObservable     a boolean containing whether the resource supports observation
-      * @param resourceTypeList a collection of resource types implemented by the resource
-      * @param interfaceList    a collection of interfaces that the resource supports/implements
-      * @return new resource object
-      * @throws OcException
-      */
-     public static OcResource constructResourceObject(
-             String host,
-             String uri,
-             OcConnectivityType connectivityType,
-             boolean isObservable,
-             List<String> resourceTypeList,
-             List<String> interfaceList) throws OcException {
-         OcPlatform.initCheck();
-         return OcPlatform.constructResourceObject0(
-                 host,
-                 uri,
-                 connectivityType.getValue(),
-                 isObservable,
-                 resourceTypeList.toArray(new String[resourceTypeList.size()]),
-                 interfaceList.toArray(new String[interfaceList.size()])
-         );
-     }
-     private static native OcResource constructResourceObject0(
-             String host,
-             String uri,
-             int connectivityType,
-             boolean isObservable,
-             String[] resourceTypes,
-             String[] interfaces) throws OcException;
-     /**
-      * Allows application entity handler to send response to an incoming request.
-      *
-      * @param ocResourceResponse resource response
-      * @throws OcException
-      */
-     public static void sendResponse(OcResourceResponse ocResourceResponse)
-             throws OcException {
-         OcPlatform.initCheck();
-         OcPlatform.sendResponse0(ocResourceResponse);
-     }
-     private static native void sendResponse0(OcResourceResponse ocResourceResponse)
-             throws OcException;
-     /**
-      * An OnResourceFoundListener can be registered via the OcPlatform.findResource call.
-      * Event listeners are notified asynchronously
-      */
-     public interface OnResourceFoundListener {
-         public void onResourceFound(OcResource resource);
-     }
-     /**
-      * An OnDeviceFoundListener can be registered via the OcPlatform.getDeviceInfo call.
-      * Event listeners are notified asynchronously
-      */
-     public interface OnDeviceFoundListener {
-         public void onDeviceFound(OcRepresentation ocRepresentation);
+      * This API unregisters a resource with the server NOTE: This API applies to server side only.\r
+      *\r
+      * @param ocResourceHandle This is the resource handle which we which to unregister from the\r
+      *                         server\r
+      * @throws OcException\r
+      */\r
+     public static void unregisterResource(\r
+             OcResourceHandle ocResourceHandle) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.unregisterResource0(ocResourceHandle);\r
+     }\r
\r
+     private static native void unregisterResource0(\r
+             OcResourceHandle ocResourceHandle) throws OcException;\r
\r
\r
+     /**\r
+      * Add a resource to a collection resource\r
+      *\r
+      * @param ocResourceCollectionHandle handle to the collection resource\r
+      * @param ocResourceHandle           handle to resource to be added to the collection resource\r
+      * @throws OcException\r
+      */\r
+     public static void bindResource(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             OcResourceHandle ocResourceHandle) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.bindResource0(ocResourceCollectionHandle, ocResourceHandle);\r
+     }\r
\r
+     private static native void bindResource0(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             OcResourceHandle ocResourceHandle) throws OcException;\r
\r
+     /**\r
+      * Add multiple resources to a collection resource.\r
+      *\r
+      * @param ocResourceCollectionHandle handle to the collection resource\r
+      * @param ocResourceHandleList       reference to list of resource handles to be added to the\r
+      *                                   collection resource\r
+      * @throws OcException\r
+      */\r
+     public static void bindResources(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             List<OcResourceHandle> ocResourceHandleList) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.bindResources0(\r
+                 ocResourceCollectionHandle,\r
+                 ocResourceHandleList.toArray(\r
+                         new OcResourceHandle[ocResourceHandleList.size()])\r
+         );\r
+     }\r
\r
+     private static native void bindResources0(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             OcResourceHandle[] ocResourceHandleArray) throws OcException;\r
\r
+     /**\r
+      * Unbind a resource from a collection resource.\r
+      *\r
+      * @param ocResourceCollectionHandle handle to the collection resource\r
+      * @param ocResourceHandle           resource handle to be unbound from the collection resource\r
+      * @throws OcException\r
+      */\r
+     public static void unbindResource(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             OcResourceHandle ocResourceHandle) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.unbindResource0(ocResourceCollectionHandle, ocResourceHandle);\r
+     }\r
\r
+     private static native void unbindResource0(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             OcResourceHandle ocResourceHandle) throws OcException;\r
\r
+     /**\r
+      * Unbind resources from a collection resource.\r
+      *\r
+      * @param ocResourceCollectionHandle Handle to the collection resource\r
+      * @param ocResourceHandleList       List of resource handles to be unbound from the collection\r
+      *                                   resource\r
+      * @throws OcException\r
+      */\r
+     public static void unbindResources(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             List<OcResourceHandle> ocResourceHandleList) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.unbindResources0(\r
+                 ocResourceCollectionHandle,\r
+                 ocResourceHandleList.toArray(\r
+                         new OcResourceHandle[ocResourceHandleList.size()])\r
+         );\r
+     }\r
\r
+     private static native void unbindResources0(\r
+             OcResourceHandle ocResourceCollectionHandle,\r
+             OcResourceHandle[] ocResourceHandleArray) throws OcException;\r
\r
+     /**\r
+      * Binds a type to a particular resource\r
+      *\r
+      * @param ocResourceHandle handle to the resource\r
+      * @param resourceTypeName new typename to bind to the resource\r
+      * @throws OcException\r
+      */\r
+     public static void bindTypeToResource(\r
+             OcResourceHandle ocResourceHandle,\r
+             String resourceTypeName) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.bindTypeToResource0(ocResourceHandle, resourceTypeName);\r
+     }\r
\r
+     private static native void bindTypeToResource0(\r
+             OcResourceHandle ocResourceHandle,\r
+             String resourceTypeName) throws OcException;\r
\r
+     /**\r
+      * Binds an interface to a particular resource\r
+      *\r
+      * @param ocResourceHandle      handle to the resource\r
+      * @param resourceInterfaceName new interface to bind to the resource\r
+      * @throws OcException\r
+      */\r
+     public static void bindInterfaceToResource(\r
+             OcResourceHandle ocResourceHandle,\r
+             String resourceInterfaceName) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.bindInterfaceToResource0(ocResourceHandle, resourceInterfaceName);\r
+     }\r
\r
+     private static native void bindInterfaceToResource0(\r
+             OcResourceHandle ocResourceHandle,\r
+             String resourceInterfaceName) throws OcException;\r
\r
+     /**\r
+      * Start Presence announcements.\r
+      *\r
+      * @param ttl time to live in seconds\r
+      * @throws OcException\r
+      */\r
+     public static void startPresence(int ttl) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.startPresence0(ttl);\r
+     }\r
\r
+     private static native void startPresence0(int ttl) throws OcException;\r
\r
+     /**\r
+      * Stop Presence announcements.\r
+      *\r
+      * @throws OcException\r
+      */\r
+     public static void stopPresence() throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.stopPresence0();\r
+     }\r
\r
+     private static native void stopPresence0() throws OcException;\r
\r
+     /**\r
+      * Subscribes to a server's presence change events. By making this subscription, every time a\r
+      * server adds/removes/alters a resource, starts or is intentionally stopped\r
+      *\r
+      * @param host               The IP address/addressable name of the server to subscribe to\r
+      * @param connectivityType   a type of connectivity indicating the interface. Example: IPV4,\r
+      *                           IPV6, ALL\r
+      * @param onPresenceListener listener that will receive notifications/subscription events\r
+      * @return a handle object that can be used to identify this subscription request. It can be\r
+      * used to unsubscribe from these events in the future\r
+      * @throws OcException\r
+      */\r
+     public static OcPresenceHandle subscribePresence(\r
+             String host,\r
+             OcConnectivityType connectivityType,\r
+             OnPresenceListener onPresenceListener) throws OcException {\r
+         OcPlatform.initCheck();\r
+         return OcPlatform.subscribePresence0(\r
+                 host,\r
+                 connectivityType.getValue(),\r
+                 onPresenceListener\r
+         );\r
+     }\r
\r
+     private static native OcPresenceHandle subscribePresence0(\r
+             String host,\r
+             int connectivityType,\r
+             OnPresenceListener onPresenceListener) throws OcException;\r
\r
+     /**\r
+      * Subscribes to a server's presence change events. By making this subscription, every time a\r
+      * server adds/removes/alters a resource, starts or is intentionally stopped\r
+      *\r
+      * @param host               The IP address/addressable name of the server to subscribe to\r
+      * @param resourceType       a resource type specified as a filter for subscription events.\r
+      * @param connectivityType   a type of connectivity indicating the interface. Example: IPV4,\r
+      *                           IPV6, ALL\r
+      * @param onPresenceListener listener that will receive notifications/subscription events\r
+      * @return a handle object that can be used to identify this subscription request. It can be\r
+      * used to unsubscribe from these events in the future\r
+      * @throws OcException\r
+      */\r
+     public static OcPresenceHandle subscribePresence(\r
+             String host,\r
+             String resourceType,\r
+             OcConnectivityType connectivityType,\r
+             OnPresenceListener onPresenceListener) throws OcException {\r
+         OcPlatform.initCheck();\r
+         return OcPlatform.subscribePresence1(\r
+                 host,\r
+                 resourceType,\r
+                 connectivityType.getValue(),\r
+                 onPresenceListener);\r
+     }\r
\r
+     private static native OcPresenceHandle subscribePresence1(\r
+             String host,\r
+             String resourceType,\r
+             int connectivityType,\r
+             OnPresenceListener onPresenceListener) throws OcException;\r
\r
+     /**\r
+      * Unsubscribes from a previously subscribed server's presence events. Note that you may for\r
+      * a short time still receive events from the server since it may take time for the\r
+      * unsubscribe to take effect.\r
+      *\r
+      * @param ocPresenceHandle the handle object provided by the subscribePresence call that\r
+      *                         identifies this subscription\r
+      * @throws OcException\r
+      */\r
+     public static void unsubscribePresence(\r
+             OcPresenceHandle ocPresenceHandle) throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.unsubscribePresence0(ocPresenceHandle);\r
+     }\r
\r
+     private static native void unsubscribePresence0(\r
+             OcPresenceHandle ocPresenceHandle) throws OcException;\r
\r
+     /**\r
+      * Creates a resource proxy object so that get/put/observe functionality can be used without\r
+      * discovering the object in advance. Note that the consumer of this method needs to provide\r
+      * all of the details required to correctly contact and observe the object. If the consumer\r
+      * lacks any of this information, they should discover the resource object normally.\r
+      * Additionally, you can only create this object if OcPlatform was initialized to be a Client\r
+      * or Client/Server.\r
+      *\r
+      * @param host             a string containing a resolvable host address of the server holding\r
+      *                         the resource\r
+      * @param uri              the rest of the resource's URI that will permit messages to be\r
+      *                         properly routed.\r
+      *                         Example: /a/light\r
+      * @param connectivityType a type of connectivity indicating the interface. Example: IPV4,\r
+      *                         IPV6, ALL\r
+      * @param isObservable     a boolean containing whether the resource supports observation\r
+      * @param resourceTypeList a collection of resource types implemented by the resource\r
+      * @param interfaceList    a collection of interfaces that the resource supports/implements\r
+      * @return new resource object\r
+      * @throws OcException\r
+      */\r
+     public static OcResource constructResourceObject(\r
+             String host,\r
+             String uri,\r
+             OcConnectivityType connectivityType,\r
+             boolean isObservable,\r
+             List<String> resourceTypeList,\r
+             List<String> interfaceList) throws OcException {\r
+         OcPlatform.initCheck();\r
+         return OcPlatform.constructResourceObject0(\r
+                 host,\r
+                 uri,\r
+                 connectivityType.getValue(),\r
+                 isObservable,\r
+                 resourceTypeList.toArray(new String[resourceTypeList.size()]),\r
+                 interfaceList.toArray(new String[interfaceList.size()])\r
+         );\r
+     }\r
\r
+     private static native OcResource constructResourceObject0(\r
+             String host,\r
+             String uri,\r
+             int connectivityType,\r
+             boolean isObservable,\r
+             String[] resourceTypes,\r
+             String[] interfaces) throws OcException;\r
\r
+     /**\r
+      * Allows application entity handler to send response to an incoming request.\r
+      *\r
+      * @param ocResourceResponse resource response\r
+      * @throws OcException\r
+      */\r
+     public static void sendResponse(OcResourceResponse ocResourceResponse)\r
+             throws OcException {\r
+         OcPlatform.initCheck();\r
+         OcPlatform.sendResponse0(ocResourceResponse);\r
+     }\r
\r
+     private static native void sendResponse0(OcResourceResponse ocResourceResponse)\r
+             throws OcException;\r
\r
+     /**\r
+      * An OnResourceFoundListener can be registered via the OcPlatform.findResource call.\r
+      * Event listeners are notified asynchronously\r
+      */\r
+     public interface OnResourceFoundListener {\r
+         public void onResourceFound(OcResource resource);\r
+     }\r
\r
+     /**\r
+      * An OnDeviceFoundListener can be registered via the OcPlatform.getDeviceInfo call.\r
+      * Event listeners are notified asynchronously\r
+      */\r
+     public interface OnDeviceFoundListener {\r
+         public void onDeviceFound(OcRepresentation ocRepresentation);\r
 +    }
 +
 +    /**
 +     * An OnPlatformFoundListener can be registered via the OcPlatform.getPlatformInfo call.
 +     * Event listeners are notified asynchronously
 +     */
 +    public interface OnPlatformFoundListener {
 +        public void onPlatformFound(OcRepresentation ocRepresentation);
-     }
-     /**
-      * An OnPresenceListener can be registered via the OcPlatform.subscribePresence call.
-      * Event listeners are notified asynchronously
-      */
-     public interface OnPresenceListener {
-         public void onPresence(OcPresenceStatus ocPresenceStatus, int nonce, String hostAddress);
-     }
-     /**
-      * An EntityHandler can be registered via the OcPlatform.registerResource call.
-      * Event listeners are notified asynchronously
-      */
-     public interface EntityHandler {
-         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest);
-     }
-     private static void initCheck() {
-         if (!sIsPlatformInitialized) {
-             throw new IllegalStateException("OcPlatform must be configured by making a call to " +
-                     "OcPlatform.Configure before any other API calls are permitted");
-         }
-     }
- }
+     }\r
\r
+     /**\r
+      * An OnPresenceListener can be registered via the OcPlatform.subscribePresence call.\r
+      * Event listeners are notified asynchronously\r
+      */\r
+     public interface OnPresenceListener {\r
+         public void onPresence(OcPresenceStatus ocPresenceStatus, int nonce, String hostAddress);\r
+     }\r
\r
+     /**\r
+      * An EntityHandler can be registered via the OcPlatform.registerResource call.\r
+      * Event listeners are notified asynchronously\r
+      */\r
+     public interface EntityHandler {\r
+         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest);\r
+     }\r
\r
+     private static void initCheck() {\r
+         if (!sIsPlatformInitialized) {\r
+             throw new IllegalStateException("OcPlatform must be configured by making a call to " +\r
+                     "OcPlatform.Configure before any other API calls are permitted");\r
+         }\r
+     }\r
+ }\r
  extern const char * SVR_DB_FILE_NAME;
  extern const char * OIC_MI_DEF;
  
 -extern const char * OIC_RSRC_CORE_URI;
 -extern const char * OIC_RSRC_CORE_D_URI;
 -extern const char * OIC_RSRC_CORE_P_URI;
 -extern const char * OIC_RSRC_PRESENCE_URI;
 -extern const char * OIC_RSRC_TYPES_D_URI;
 -
  //ACL
  extern const char * OIC_RSRC_TYPE_SEC_ACL;
  extern const char * OIC_RSRC_ACL_URI;
@@@ -73,6 -79,7 +73,7 @@@ extern const char * OIC_JSON_SM_NAME
  
  extern OicUuid_t WILDCARD_SUBJECT_ID;
  extern size_t WILDCARD_SUBJECT_ID_LEN;
+ extern const char * WILDCARD_RESOURCE_URI;
  
  //Ownership Transfer Methods
  extern const char * OXM_JUST_WORKS;
@@@ -28,7 -28,6 +28,7 @@@ provisioning_env = env.Clone(
  ######################################################################
  provisioning_env.AppendUnique(CPPPATH = [
                '../../stack/include',
 +              '../../stack/include/internal',
                '../../ocrandom/include',
                '../../logger/include',
                '../../../oc_logger/include',
@@@ -84,6 -83,7 +84,8 @@@ provisioning_src = 
  provisioningserver = provisioning_env.StaticLibrary('ocspapi', provisioning_src)
  
  provisioning_env.InstallTarget(provisioningserver, 'libocspapi')
 +provisioning_env.UserInstallTargetLib(provisioningserver, 'libocspapi')
  
- SConscript('sample/SConscript')
+ if target_os in ['linux']:
+       SConscript('sample/SConscript')
  #include <stdbool.h>
  
  #include "cJSON.h"
 +#include "ocpayload.h"
 +#include "ocpayloadcbor.h"
  #include "oic_malloc.h"
  #include "logger.h"
  #include "cacommon.h"
- #include "ocpayload.h"
  #include "cainterface.h"
  #include "provisioningmanager.h"
  #include "credentialgenerator.h"
@@@ -54,6 -51,9 +53,9 @@@
  #include "pstatresource.h"
  #include "srmresourcestrings.h"
  #include "credresource.h"
+ #include "oic_string.h"
+ #include "secureresourcemanager.h"
  
  typedef enum
  {
@@@ -91,7 -91,7 +93,7 @@@
  #define COAPS_QUERY "coaps://%s:%d%s"
  #define CA_SECURE_PORT   5684
  
void (*handler)(const CAEndpoint_t *, const CAResponseInfo_t *);
bool (*handler)(const CAEndpoint_t *, const CAResponseInfo_t *);
  
  /**
   * CA token to keep track of response.
@@@ -311,11 -311,12 +313,18 @@@ static CAResult_t sendCARequest(CAMetho
                                  const char *resourceUri,
                                  char *payload, int payloadLen)
  {
++    if (payload && '\0' != (*(payload + payloadLen)))
++    {
++        OC_LOG(ERROR, TAG, "Payload not properly terminated.");
++        return CA_STATUS_INVALID_PARAM;
++    }
++
      if (CA_STATUS_OK != CAGenerateToken(&gToken, CA_MAX_TOKEN_LEN))
      {
          OC_LOG(ERROR, TAG, "Error while generating token");
          return CA_MEMORY_ALLOC_FAILED;
      }
      CAEndpoint_t *endpoint = NULL;
      if (CA_STATUS_OK != CACreateEndpoint((CATransportFlags_t)secure,
                                           devAddr->adapter, devAddr->addr,
          CADestroyEndpoint(endpoint);
          return CA_STATUS_FAILED;
      }
--    CAMessageType_t msgType = CA_MSG_CONFIRM;
 -    CAInfo_t requestData = { 0 };
 -    requestData.token = gToken;
 -    requestData.tokenLength  = CA_MAX_TOKEN_LEN;
--    if (payload && '\0' != (*(payload + payloadLen)))
--    {
--        OC_LOG(ERROR, TAG, "Payload not properly terminated.");
--        CADestroyEndpoint(endpoint);
--        return CA_STATUS_INVALID_PARAM;
--    }
-     OCSecurityPayload secPayload;
 -    requestData.payload = payload;
 -    requestData.type = msgType;
 -    requestData.resourceUri = (CAURI_t)resourceUri;
 -    CARequestInfo_t requestInfo = { 0 };
++    OCSecurityPayload secPayload = {};
 +    secPayload.securityData = payload;
 +    secPayload.base.type = PAYLOAD_TYPE_SECURITY;
-     CARequestInfo_t requestInfo = { 0 };
++
++    CARequestInfo_t requestInfo = {};
      requestInfo.method = method;
 -    requestInfo.info = requestData;
      requestInfo.isMulticast = false;
-     requestInfo.info.type = msgType;
 +    OCConvertPayload((OCPayload*)(&secPayload), &requestInfo.info.payload,
 +            &requestInfo.info.payloadSize);
-     requestInfo.info.resourceUri  = resourceUri;
++
++    requestInfo.info.type = CA_MSG_CONFIRM;
 +    requestInfo.info.token = gToken;
 +    requestInfo.info.tokenLength  = CA_MAX_TOKEN_LEN;
-     requestInfo.isMulticast = false;
++    requestInfo.info.resourceUri  = (CAURI_t)resourceUri;
 +
      CAResult_t caResult = CA_STATUS_OK;
      caResult = CASendRequest(endpoint, &requestInfo);
      if (CA_STATUS_OK != caResult)
  /**
   * addDevice to list.
   *
-  * @param[in] ip                    IP of target device.
-  * @param[in] port                  port of remote server.
-  * @param[in] adapter              adapter type of endpoint.
-  * @param[in] doxm                  pointer to doxm instance.
+  * @param[in] endpoint   Endpoint information
+  * @param[in] doxm   pointer to doxm instance.
   * @return SP_RESULT_SUCCESS for success and errorcode otherwise.
   */
- static SPResult addDevice(const char *ip, int port, OCTransportAdapter adapter, OicSecDoxm_t *doxm)
+ static SPResult addDevice(const CAEndpoint_t *endpoint, OicSecDoxm_t* doxm)
  {
-     if (NULL == ip || 0 >= port)
+     if (NULL == endpoint)
      {
          return SP_RESULT_INVALID_PARAM;
      }
          return SP_RESULT_MEM_ALLOCATION_FAIL;
      }
  
-     SPStringCopy(ptr->endpoint.addr, ip, MAX_ADDR_STR_SIZE);
-     ptr->endpoint.port = port;
-     ptr->endpoint.adapter = adapter;
+     memcpy(&(ptr->endpoint), endpoint, sizeof(CAEndpoint_t));
      ptr->doxm = doxm;
 +
      ptr->next = NULL;
  
      if (NULL == gStartOfDiscoveredDevices)
@@@ -428,14 -420,14 +427,14 @@@ static SPResult selectProvisioningMetho
      return SP_RESULT_SUCCESS;
  }
  
- OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, size_t payloadSize);
  /**
   * Response handler for discovery.
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void ProvisionDiscoveryHandler(const CAEndpoint_t *object,
+ static bool ProvisionDiscoveryHandler(const CAEndpoint_t *object,
                                        const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_DISCOVERY_STARTED) && gToken)
              }
              else
              {
 -                // temp logic for trimming oc attribute from the json.
 -                // JSONToBin should handle oc attribute.
 -                char *pTempPayload = (char *)OICMalloc(strlen(responseInfo->info.payload));
 -                if (NULL == pTempPayload)
 +                OCPayload* payload;
 +                OCStackResult result = OCParsePayload(&payload, responseInfo->info.payload,
 +                        responseInfo->info.payloadSize);
 +
 +                OicSecDoxm_t *ptrDoxm = NULL;
 +
 +                if(result == OC_STACK_OK && payload->type == PAYLOAD_TYPE_SECURITY)
                  {
 -                    OC_LOG(ERROR, TAG, "Error while Memory allocation.");
 -                    gStateManager = gStateManager | SP_DISCOVERY_ERROR;
 -                    return true;
 +                    ptrDoxm = JSONToDoxmBin(((OCSecurityPayload*)payload)->securityData);
                  }
  
 -                strcpy(pTempPayload, responseInfo->info.payload + 8);
 -                pTempPayload[strlen(pTempPayload) - 2] = '\0';
 -                OC_LOG_V(DEBUG, TAG, "Trimmed payload: %s", pTempPayload);
 -                OicSecDoxm_t *ptrDoxm = JSONToDoxmBin(pTempPayload);
 -                OICFree(pTempPayload);
 -
                  if (NULL == ptrDoxm)
                  {
                      OC_LOG(INFO, TAG, "Ignoring malformed JSON");
                  {
                      OC_LOG(DEBUG, TAG, "Successfully converted doxm json to bin.");
  
-                     SPResult res = addDevice(object->addr, object->port, object->adapter, ptrDoxm);
+                     SPResult res = addDevice(object, ptrDoxm);
                      if (SP_RESULT_SUCCESS != res)
                      {
                          OC_LOG(ERROR, TAG, "Error while adding data to linkedlist.");
                          gStateManager = gStateManager | SP_DISCOVERY_ERROR;
                          DeleteDoxmBinData(ptrDoxm);
-                         return;
+                         return true;
                      }
                      OC_LOG(INFO, TAG, "Exiting ProvisionDiscoveryHandler.");
                      gStateManager |= SP_DISCOVERY_DONE;
                  }
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void OwnerShipTransferModeHandler(const CAEndpoint_t *object,
+ static bool OwnerShipTransferModeHandler(const CAEndpoint_t *object,
          const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_UP_OWN_TR_METH_STARTED) && gToken)
                  gStateManager |= SP_UP_OWN_TR_METH_ERROR;
                  OC_LOG(ERROR, TAG, "Error in OwnerShipTransferModeHandler.");
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void ListMethodsHandler(const CAEndpoint_t *object,
+ static bool ListMethodsHandler(const CAEndpoint_t *object,
                                 const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_LIST_METHODS_STARTED) && gToken)
                  {
                      OC_LOG(ERROR, TAG, "response payload is null.");
                      gStateManager |= SP_LIST_METHODS_ERROR;
-                     return;
+                     return true;
                  }
  
 -                char *pTempPayload = (char *)OICMalloc(strlen(responseInfo->info.payload));
 -                if (NULL == pTempPayload)
 +                OCPayload* payload;
 +                OCStackResult result = OCParsePayload(&payload, responseInfo->info.payload,
 +                        responseInfo->info.payloadSize);
 +
 +                OicSecPstat_t *pstat = NULL;
 +
 +                if(result == OC_STACK_OK && payload->type == PAYLOAD_TYPE_SECURITY)
                  {
 -                    OC_LOG(ERROR, TAG, "Error in memory allocation.");
 -                    gStateManager |= SP_LIST_METHODS_ERROR;
 -                    return true;
 +                    pstat =  JSONToPstatBin(((OCSecurityPayload*)payload)->securityData);
                  }
  
 -                strcpy(pTempPayload, responseInfo->info.payload + 8);
 -                pTempPayload[strlen(pTempPayload) - 2] = '\0';
 -
 -                OicSecPstat_t *pstat =  JSONToPstatBin(pTempPayload);
                  if (NULL == pstat)
                  {
                      OC_LOG(ERROR, TAG, "Error while converting json to pstat bin");
 -                    OICFree(pTempPayload);
                      gStateManager |= SP_LIST_METHODS_ERROR;
-                     return;
+                     return true;
                  }
 -                OICFree(pTempPayload);
                  DeletePstatBinData(gPstat);
  
                  gPstat = pstat;
  
                  OC_LOG(INFO, TAG, "Exiting ListMethodsHandler.");
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void OperationModeUpdateHandler(const CAEndpoint_t *object,
+ static bool OperationModeUpdateHandler(const CAEndpoint_t *object,
                                         const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_UPDATE_OP_MODE_STARTED) && gToken)
                  gStateManager |= SP_UPDATE_OP_MODE_ERROR;
                  OC_LOG(ERROR, TAG, "Error in OperationModeUpdateHandler.");
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void OwnerShipUpdateHandler(const CAEndpoint_t *object,
+ static bool OwnerShipUpdateHandler(const CAEndpoint_t *object,
                                     const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_UPDATE_OWNER_STARTED) && gToken)
                  gStateManager |= SP_UPDATE_OWNER_ERROR;
                  OC_LOG(ERROR, TAG, "Error in OwnerShipUpdateHandler.");
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void ACLProvisioningHandler(const CAEndpoint_t *object,
+ static bool ACLProvisioningHandler(const CAEndpoint_t *object,
                                     const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_PROV_ACL_STARTED) && gToken)
                  OC_LOG(ERROR, TAG, "Error in ACLProvisioningHandler.");
                  gStateManager |= SP_PROV_ACL_ERROR;
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object       Remote endpoint object
   * @param[in] requestInfo  Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void FinalizeProvisioningHandler(const CAEndpoint_t *object,
+ static bool FinalizeProvisioningHandler(const CAEndpoint_t *object,
                                          const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_UP_HASH_STARTED) && gToken)
                  gStateManager |= SP_UP_HASH_ERROR;
                  OC_LOG(ERROR, TAG, "Error in FinalizeProvisioningHandler.");
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object        Remote endpoint object
   * @param[in] requestInfo   Datastructure containing request information.
+  * @return true is CA token matches request token, false otherwise.
   */
- static void CredProvisioningHandler(const CAEndpoint_t *object,
+ static bool CredProvisioningHandler(const CAEndpoint_t *object,
                                      const CAResponseInfo_t *responseInfo)
  {
      if ((gStateManager & SP_PROV_CRED_STARTED) && gToken)
                  gStateManager |= SP_PROV_CRED_ERROR;
                  OC_LOG(ERROR, TAG, "Error in CredProvisioningHandler.");
              }
+             return true;
          }
      }
+     return false;
  }
  
  /**
   *
   * @param[in] object        Remote endpoint object
   * @param[in] responseInfo  Datastructure containing response information.
+  * @return true if received response is for provisioning API false otherwise.
   */
- static void SPResponseHandler(const CAEndpoint_t *object,
+ static bool SPResponseHandler(const CAEndpoint_t *object,
                                const CAResponseInfo_t *responseInfo)
  {
+     bool isProvResponse = false;
      if ((NULL != responseInfo) && (NULL != responseInfo->info.token))
      {
-         handler(object, responseInfo);
+         isProvResponse = handler(object, responseInfo);
      }
- }
- /**
-  * Error Handler
-  *
-  * @param[in] object     Remote endpoint object
-  * @param[in] errorInfo  Datastructure containing error information.
-  */
- static void SPErrorHandler(const CAEndpoint_t *object,
-                            const CAErrorInfo_t *errorInfo)
- {
-     OC_LOG(INFO, TAG, "Error Handler.");
- }
- /**
-  * Request Handler
-  *
-  * @param[in] object       Remote endpoint object
-  * @param[in] requestInfo  Datastructure containing request information.
-  */
- static void SPRequestHandler(const CAEndpoint_t *object, const CARequestInfo_t *requestInfo)
- {
-     OC_LOG(INFO, TAG, "Request Handler.");
+     return isProvResponse;
  }
  
  /**
@@@ -781,7 -784,6 +783,7 @@@ static SPResult findResource(unsigned s
      requestData.token = gToken;
      requestData.tokenLength  = CA_MAX_TOKEN_LEN;
      requestData.payload = NULL;
 +    requestData.payloadSize = 0;
      requestData.type = msgType;
      requestData.resourceUri = DOXM_OWNED_FALSE_MULTICAST_QUERY;
      CARequestInfo_t requestInfo = { 0 };
@@@ -959,17 -961,9 +961,9 @@@ static SPResult updateOperationMode(uns
   * @param[in]  deviceInfo  Provisioning context
   * @return SP_SUCCESS on success
   */
- static SPResult initiateDtlsHandshake(SPTargetDeviceInfo_t *deviceInfo)
+ static SPResult initiateDtlsHandshake(const CAEndpoint_t *endpoint)
  {
-     CAResult_t caresult = CASelectCipherSuite(TLS_ECDH_anon_WITH_AES_128_CBC_SHA);
-     if (CA_STATUS_OK != caresult)
-     {
-         OC_LOG(ERROR, TAG, "Unable to select cipher suite");
-         return SP_RESULT_INTERNAL_ERROR;
-     }
-     OC_LOG(INFO, TAG, "Anonymous cipher suite selected. ");
-     caresult = CAEnableAnonECDHCipherSuite(true);
+     CAResult_t caresult = CAEnableAnonECDHCipherSuite(true);
      if (CA_STATUS_OK != caresult)
      {
          OC_LOG_V(ERROR, TAG, "Unable to enable anon cipher suite");
      }
      OC_LOG(INFO, TAG, "Anonymous cipher suite Enabled.");
  
-     //TODO: It is a temporary fix. Revisit it.
-     deviceInfo->endpoint.port = CA_SECURE_PORT;
-     caresult = CAInitiateHandshake((CAEndpoint_t *)&deviceInfo->endpoint);
+     caresult = CAInitiateHandshake(endpoint);
      if (CA_STATUS_OK != caresult)
      {
          OC_LOG_V(ERROR, TAG, "DTLS handshake failure.");
@@@ -1023,7 -1015,7 +1015,7 @@@ static SPResult sendOwnershipInfo(unsig
  
      CAResult_t result = sendCARequest(CA_PUT,
                                        &selectedDeviceInfo->endpoint,
-                                       OC_SECURE,
+                                       OC_FLAG_SECURE,
                                        OIC_RSRC_DOXM_URI,
                                        payloadBuffer, payloadLen);
      if (CA_STATUS_OK != result)
@@@ -1055,9 -1047,8 +1047,8 @@@ static SPResult saveOwnerPSK(SPTargetDe
  {
      SPResult result = SP_RESULT_INTERNAL_ERROR;
  
-     CAEndpoint_t endpoint = {0};
-     strncpy(endpoint.addr, selectedDeviceInfo->endpoint.addr, MAX_ADDR_STR_SIZE_CA);
-     endpoint.addr[MAX_ADDR_STR_SIZE_CA - 1] = '\0';
+     CAEndpoint_t endpoint = {};
+     OICStrcpy(endpoint.addr, MAX_ADDR_STR_SIZE_CA, selectedDeviceInfo->endpoint.addr);
      endpoint.port = CA_SECURE_PORT;
  
      OicUuid_t provTooldeviceID = {};
@@@ -1172,23 -1163,39 +1163,39 @@@ static SPResult doOwnerShipTransfer(uns
      }
      if (*selectedOperationMode == SINGLE_SERVICE_CLIENT_DRIVEN)
      {
-         res = initiateDtlsHandshake(selectedDeviceInfo);
-         if (SP_RESULT_SUCCESS != res)
+         CAEndpoint_t endpoint = {0};
+         OICStrcpy(endpoint.addr, MAX_ADDR_STR_SIZE_CA, selectedDeviceInfo->endpoint.addr);
+         endpoint.port = CA_SECURE_PORT;
+         res = initiateDtlsHandshake(&endpoint);
+         if (SP_RESULT_SUCCESS == res)
          {
-             OC_LOG(ERROR, TAG, "Error while DTLS handshake.");
-             return SP_RESULT_INTERNAL_ERROR;
-         }
+             selectedDeviceInfo->endpoint.port = CA_SECURE_PORT;
+             res = sendOwnershipInfo(timeout, selectedDeviceInfo);
+             if (SP_RESULT_SUCCESS != res)
+             {
+                 OC_LOG(ERROR, TAG, "Error while updating ownership information.");
+             }
+             res = saveOwnerPSK(selectedDeviceInfo);
  
-         res = sendOwnershipInfo(timeout, selectedDeviceInfo);
-         if (SP_RESULT_SUCCESS != res)
+             //Close temporal DTLS session
+             if(CA_STATUS_OK != CACloseDtlsSession(&endpoint))
+             {
+                 OC_LOG(WARNING, TAG, "doOwnerShipTransfer() : failed to close the dtls session");
+             }
+         }
+         else
          {
-             OC_LOG(ERROR, TAG, "Error while updating ownership information.");
-             return SP_RESULT_INTERNAL_ERROR;
+             OC_LOG(ERROR, TAG, "Error during initiating DTLS handshake.");
          }
  
-         saveOwnerPSK(selectedDeviceInfo);
+         //Disable Anonymous ECDH cipher suite before leaving this method
+         if(CA_STATUS_OK != CAEnableAnonECDHCipherSuite(false))
+         {
+             OC_LOG(WARNING, TAG, "doOwnerShipTransfer() : failed to disable Anon ECDH cipher suite");
+         }
      }
-     return SP_RESULT_SUCCESS;
+     return (res != SP_RESULT_SUCCESS) ? SP_RESULT_INTERNAL_ERROR : SP_RESULT_SUCCESS;
  
  }
  
@@@ -1219,7 -1226,7 +1226,7 @@@ SPResult provisionCredentials(unsigned 
  
      CAResult_t result = sendCARequest(CA_POST,
                                        &deviceInfo->endpoint,
-                                       OC_SECURE,
+                                       OC_FLAG_SECURE,
                                        OIC_RSRC_CRED_URI,
                                        credJson, payloadLen);
      OICFree(credJson);
          return SP_RESULT_TIMEOUT;
      }
      CADestroyToken(gToken);
+     gStateManager = 0;
      return res;
  }
  
@@@ -1249,8 -1257,7 +1257,7 @@@ SPResult SPProvisioningDiscovery(unsign
          OC_LOG(ERROR, TAG, "List is not null can cause memory leak");
          return SP_RESULT_INVALID_PARAM;
      }
-     CARegisterHandler(SPRequestHandler, SPResponseHandler, SPErrorHandler);
+     SRMRegisterProvisioningResponseHandler(SPResponseHandler);
      SPResult smResponse = SP_RESULT_SUCCESS;
      smResponse = findResource(timeout);
      if (SP_RESULT_SUCCESS != smResponse)
@@@ -1324,7 -1331,7 +1331,7 @@@ SPResult SPProvisionACL(unsigned short 
  
      CAResult_t result = sendCARequest(CA_POST,
                                        &selectedDeviceInfo->endpoint,
-                                       OC_SECURE,
+                                       OC_FLAG_SECURE,
                                        OIC_RSRC_ACL_URI,
                                        aclString, payloadLen);
      OICFree(aclString);
@@@ -1440,7 -1447,7 +1447,7 @@@ SPResult SPFinalizeProvisioning(unsigne
  
      CAResult_t result = sendCARequest(CA_PUT,
                                        &selectedDeviceInfo->endpoint,
-                                       OC_SECURE,
+                                       OC_FLAG_SECURE,
                                        OIC_RSRC_PSTAT_URI,
                                        payloadBuffer, payloadLen);
      OICFree(payloadBuffer);
          return SP_RESULT_TIMEOUT;
      }
  
-     CAEndpoint_t endpoint = {0};
-     strncpy(endpoint.addr, selectedDeviceInfo->endpoint.addr, MAX_ADDR_STR_SIZE_CA);
-     endpoint.addr[DEV_ADDR_SIZE_MAX - 1] = '\0';
+     CAEndpoint_t endpoint = {};
+     OICStrcpy(endpoint.addr, MAX_ADDR_STR_SIZE_CA, selectedDeviceInfo->endpoint.addr);
      endpoint.port = CA_SECURE_PORT;
  
      result = CACloseDtlsSession(&endpoint);
      if (CA_STATUS_OK != result)
      {
-         OC_LOG_V(ERROR, TAG, "DTLS handshake failure.");
+         OC_LOG(WARNING, TAG, "Failed to close the DTLS session.");
      }
  
      CADestroyToken(gToken);
@@@ -196,7 -196,8 +196,8 @@@ exit
   {
      for(size_t n = 0; n < acl->resourcesLen; n++)
      {
-         if(0 == strcmp(resource, acl->resources[n])) // TODO null terms?
+         if(0 == strcmp(resource, acl->resources[n]) || // TODO null terms?
+          0 == strcmp(WILDCARD_RESOURCE_URI, acl->resources[n]))
          {
              return true;
          }
@@@ -227,6 -228,9 +228,6 @@@ void ProcessAccessRequest(PEContext_t *
          {
              OC_LOG(INFO, TAG, PCF("ProcessAccessRequest(): getting ACL..."));
              currentAcl = GetACLResourceData(context->subject, &savePtr);
 -            char *tmp = (char*)OICMalloc(sizeof(OicUuid_t) +1);
 -            memcpy(tmp, context->subject, sizeof(OicUuid_t));
 -            tmp[sizeof(OicUuid_t) + 1] = '\0';
              if(NULL != currentAcl)
              {
                  // Found the subject, so how about resource?
              }
          }
          while((NULL != currentAcl) && (false == context->matchingAclFound));
 -    }
 -    if(IsAccessGranted(context->retVal))
 -    {
 -        OC_LOG(INFO, TAG, PCF("ProcessAccessRequest(): \
 -            Leaving ProcessAccessRequest(ACCESS_GRANTED)"));
 +
 +        if(IsAccessGranted(context->retVal))
 +        {
 +            OC_LOG(INFO, TAG, PCF("ProcessAccessRequest(): \
 +                Leaving ProcessAccessRequest(ACCESS_GRANTED)"));
 +        }
 +        else
 +        {
 +            OC_LOG(INFO, TAG, PCF("ProcessAccessRequest(): \
 +                Leaving ProcessAccessRequest(ACCESS_DENIED)"));
 +        }
      }
      else
      {
          OC_LOG(INFO, TAG, PCF("ProcessAccessRequest(): \
 -            Leaving ProcessAccessRequest(ACCESS_DENIED)"));
 +            Leaving ProcessAccessRequest(context is NULL)"));
      }
 +
  }
  
  /**
  const char * SVR_DB_FILE_NAME = "oic_svr_db.json";
  const char * OIC_MI_DEF = "oic.mi.def";
  
 -const char * OIC_RSRC_CORE_URI =  "/oic/res";
 -const char * OIC_RSRC_CORE_D_URI =  "/oic/res/d";
 -const char * OIC_RSRC_CORE_P_URI =  "/oic/p";
 -const char * OIC_RSRC_PRESENCE_URI =  "/oic/ad";
 -const char * OIC_RSRC_TYPES_D_URI =  "/oic/res/types/d";
 -
  //ACL
  const char * OIC_RSRC_TYPE_SEC_ACL = "oic.sec.acl";
  const char * OIC_RSRC_ACL_URI =  "/oic/sec/acl";
@@@ -70,7 -76,8 +70,8 @@@ const char * OIC_JSON_PRIVATEDATA_NAME 
  const char * OIC_JSON_PERIOD_NAME = "period";
  
  OicUuid_t WILDCARD_SUBJECT_ID = {"*"};
- size_t WILDCARD_SUBJECT_ID_LEN = 1 ;
+ size_t WILDCARD_SUBJECT_ID_LEN = 1;
+ const char * WILDCARD_RESOURCE_URI = "*";
  
  //Ownership Transfer Methods
  const char * OXM_JUST_WORKS = "oic.sec.doxm.jw";
@@@ -412,10 -412,15 +412,15 @@@ void checkObserverValue(int value
      }
  }
  
+ static FILE* client_open(const char *path, const char *mode)
+ {
+     return fopen("./oic_svr_db_client.json", mode);
+ }
  int main(int argc, char* argv[]) {
  
      std::ostringstream requestURI;
+     OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink };
      try
      {
          printUsage();
      // Create PlatformConfig object
      PlatformConfig cfg {
          OC::ServiceType::InProc,
-         OC::ModeType::Client,
+         OC::ModeType::Both,
          "0.0.0.0",
          0,
-         OC::QualityOfService::LowQos
+         OC::QualityOfService::LowQos,
+         &ps
      };
  
      OCPlatform::Configure(cfg);
          // makes it so that all boolean values are printed as 'true/false' in this stream
          std::cout.setf(std::ios::boolalpha);
          // Find all resources
 -        requestURI << OC_MULTICAST_DISCOVERY_URI << "?rt=core.light";
 +        requestURI << OC_RSRVD_WELL_KNOWN_URI;// << "?rt=core.light";
  
          OCPlatform::findResource("", requestURI.str(),
                  CT_DEFAULT, &foundResource);
diff --combined resource/include/OCApi.h
index d3431ba,2014ce3..d38eb47
mode 100755,100644..100755
@@@ -21,7 -21,6 +21,6 @@@
  #ifndef __INTEL_OCAPI_H_2014_07_10
  #define __INTEL_OCAPI_H_2014_07_10
  
  #include <string>
  #include <sstream>
  #include <vector>
@@@ -112,7 -111,8 +111,8 @@@ namespace O
      *  ModeType   : indicate whether we want to do server, client or both
      *  ServerConnectivity : default flags for server
      *  ClientConnectivity : default flags for client
-     *  QoS       : indicate Quality of Service : LowQos, MidQos,HighQos and NaQos(No quality Defined).
 -    *  QoS        : Quality of Service : CONFIRMABLE or NON CONFIRMABLE.
++    *  QoS        : indicate Quality of Service : LowQos, MidQos,HighQos and NaQos(No quality Defined).
+     *  ps         : persistant storage Handler structure (open/read/write/close/unlink)
      */
      struct PlatformConfig
      {
          std::string                ipAddress;   // not used
          uint16_t                   port;        // not used
          QualityOfService           QoS;
+         OCPersistentStorage        *ps;
  
          public:
              PlatformConfig()
                  clientConnectivity(CT_DEFAULT),
                  ipAddress("0.0.0.0"),
                  port(0),
-                 QoS(QualityOfService::NaQos)
+                 QoS(QualityOfService::NaQos),
+                 ps(nullptr)
          {}
              PlatformConfig(const ServiceType serviceType_,
              const ModeType mode_,
              OCConnectivityType serverConnectivity_,
              OCConnectivityType clientConnectivity_,
-             const QualityOfService QoS_)
+             const QualityOfService QoS_,
+             OCPersistentStorage *ps_ = nullptr)
                  : serviceType(serviceType_),
                  mode(mode_),
                  serverConnectivity(serverConnectivity_),
                  clientConnectivity(clientConnectivity_),
                  ipAddress(""),
                  port(0),
-                 QoS(QoS_)
+                 QoS(QoS_),
+                 ps(ps_)
          {}
              // for backward compatibility
              PlatformConfig(const ServiceType serviceType_,
              const ModeType mode_,
              const std::string& ipAddress_,
              const uint16_t port_,
-             const QualityOfService QoS_)
+             const QualityOfService QoS_,
+             OCPersistentStorage *ps_ = nullptr)
                  : serviceType(serviceType_),
                  mode(mode_),
                  serverConnectivity(CT_DEFAULT),
                  clientConnectivity(CT_DEFAULT),
                  ipAddress(ipAddress_),
                  port(port_),
-                 QoS(QoS_)
+                 QoS(QoS_),
+                 ps(ps_)
          {}
      };
  
      const std::string BATCH_INTERFACE = "oic.if.b";
  
      // Used in GET, PUT, POST methods on links to other remote resources of a group.
 -    const std::string GROUP_INTERFACE = "oc.mi.grp";
 +    const std::string GROUP_INTERFACE = "oic.mi.grp";
  
  
      typedef std::function<void(std::shared_ptr<OCResource>)> FindCallback;
  //
  //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  
 -#include <cereal/cereal.hpp>
 -#include <cereal/types/memory.hpp>
 -#include <cereal/types/vector.hpp>
 -#include <cereal/archives/json.hpp>
 -
  #include <StringConstants.h>
 +#include "ocpayload.h"
 +#include "ocrandom.h"
  
  namespace OC
  {
      class ListenOCContainer
      {
          private:
-                     const OCDevAddr& devAddr, OCDiscoveryPayload* payload)
 +            static std::vector<std::string> StringLLToVector(OCStringLL* ll)
 +            {
 +                std::vector<std::string> strs;
 +                while(ll)
 +                {
 +                    strs.push_back(ll->value);
 +                    ll = ll->next;
 +                }
 +                return strs;
 +            }
 +
 +        public:
 +            ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
-             const OCDevAddr& m_devAddr;
++                    OCDevAddr& devAddr, OCDiscoveryPayload* payload)
 +                    : m_clientWrapper(cw), m_devAddr(devAddr)
 +            {
 +                OCResourcePayload* res = payload->resources;
 +
 +                while(res)
 +                {
 +                    char uuidString[UUID_STRING_SIZE];
 +                    if(OCConvertUuidToString(res->sid, uuidString) != RAND_UUID_OK)
 +                    {
 +                        uuidString[0]= '\0';
 +                    }
 +
++                    if (res->secure)
++                    {
++                        m_devAddr.flags =
++                              (OCTransportFlags)(OC_FLAG_SECURE | m_devAddr.flags);
++                    }
++ 
++                    if (res->port != 0)
++                    {
++                         m_devAddr.port = res->port;
++                    }
++
 +                    m_resources.push_back(std::shared_ptr<OC::OCResource>(
 +                                new OC::OCResource(m_clientWrapper, m_devAddr,
 +                                    std::string(res->uri),
 +                                    std::string(uuidString),
 +                                    (res->bitmap & OC_OBSERVABLE) == OC_OBSERVABLE,
 +                                    StringLLToVector(res->types),
 +                                    StringLLToVector(res->interfaces)
 +                                    )));
 +                    res = res->next;
 +                }
 +
 +            }
 +
 +            const std::vector<std::shared_ptr<OCResource>>& Resources() const
 +            {
 +                return m_resources;
 +            }
 +        private:
 +            std::vector<std::shared_ptr<OC::OCResource>> m_resources;
 +            std::weak_ptr<IClientWrapper> m_clientWrapper;
++            OCDevAddr& m_devAddr;
 +    };
 +    /*
 +    class ListenOCContainer
 +    {
 +        private:
          enum class OCSecureType
          {
              NotSecure,
              Secure
          };
  
 -        class ListenResourceContainer
 +        class DiscoveredResources
          {
 -            class ListenResourcePolicyContainer
 +            class Resource
              {
                  friend class cereal::access;
 -                friend class ListenResourceContainer;
 -                friend class ListenResourcePropertiesContainer;
  
 -                template<class Archive>
 -                void serialize(Archive& ar)
 +                class ResourcePolicy
                  {
 -                    m_secure = false;
 -                    m_port = -1;
 +                    friend class cereal::access;
 +                    friend class Resource;
  
 -                    try
 +                    template<class Archive>
 +                    void serialize(Archive& ar)
                      {
 -                        m_observable = false;
 -                        ar(cereal::make_nvp(OC::Key::BMKEY, m_bm));
 -                        // In case of observable
 -                        if(m_bm & OC_OBSERVABLE)
 +                        try
 +                        {
 +                            m_observable = false;
 +                            ar(cereal::make_nvp(OC::Key::BMKEY, m_bm));
 +
 +                            if(m_bm & OC_OBSERVABLE)
 +                            {
 +                                m_observable = true;
 +                            }
 +                        }
 +                        catch(cereal::Exception&)
                          {
 -                            m_observable = true;
 +                            ar.setNextName(nullptr);
                          }
 +
 +                        try
 +                        {
 +                            m_secure = false;
 +                            int secureTemp;
 +                            ar(cereal::make_nvp(OC::Key::SECUREKEY, secureTemp));
 +                            m_secure = secureTemp != 0;
 +
 +                            m_port = -1;
 +                            ar(cereal::make_nvp(OC::Key::PORTKEY, m_port));
 +                        }
 +                        catch(cereal::Exception&)
 +                        {
 +                            ar.setNextName(nullptr);
 +                        }
 +                     }
 +
 +                     bool m_observable;
 +                     uint8_t m_bm;
 +                     bool m_secure;
 +                     int m_port;
 +                };
 +
 +                template <class Archive>
 +                void serialize(Archive& ar)
 +                {
 +                    try
 +                    {
 +                        ar(cereal::make_nvp(OC::Key::URIKEY, m_uri));
 +                        m_loaded = true;
                      }
                      catch(cereal::Exception&)
                      {
                          ar.setNextName(nullptr);
                      }
 +
                      try
                      {
 -                        int secureTemp;
 -                        ar(cereal::make_nvp(OC::Key::SECUREKEY, secureTemp));
 -                        m_secure = secureTemp != 0;
 -
 -                        ar(cereal::make_nvp(OC::Key::PORTKEY, m_port));
 +                        ar(cereal::make_nvp(OC::Key::RESOURCETYPESKEY,m_resourceTypes));
 +                        m_loaded = true;
                      }
                      catch(cereal::Exception&)
                      {
                          ar.setNextName(nullptr);
                      }
  
 -                 }
 -
 -                 bool m_observable;
 -                 uint8_t m_bm;
 -                 bool m_secure;
 -                 int m_port;
 -            };
 -
 -            class ListenResourcePropertiesContainer
 -            {
 -                friend class cereal::access;
 -                friend class ListenResourceContainer;
 -
 -                template<class Archive>
 -                void serialize(Archive& ar)
 -                {
                      try
                      {
 -                        ar(cereal::make_nvp(OC::Key::POLICYKEY, m_policy));
 -
 +                        ar(cereal::make_nvp(OC::Key::INTERFACESKEY, m_interfaces));
 +                        m_loaded = true;
                      }
                      catch(cereal::Exception&)
                      {
 -                        // we swallow this exception, since it means the key
 -                        // doesn't exist, allowing these to be optional
 -                        oclog() << "Invalid POLICYKEY"<<std::flush;
                          ar.setNextName(nullptr);
                      }
  
                      try
                      {
 -                        ar(cereal::make_nvp(OC::Key::RESOURCETYPESKEY,m_resourceTypes));
 +                        ar(cereal::make_nvp(OC::Key::POLICYKEY, m_policy));
 +                        m_loaded = true;
                      }
                      catch(cereal::Exception&)
                      {
                          ar.setNextName(nullptr);
                      }
 +
 +                    // Although not expected, a server id as part of a resource's own
 +                    // representation is legal. It may be used if needed.
                      try
                      {
 -                        ar(cereal::make_nvp(OC::Key::INTERFACESKEY, m_interfaces));
 +                        ar(cereal::make_nvp(OC::Key::DEVICEIDKEY, m_serverId));
 +                        m_loaded = true;
                      }
                      catch(cereal::Exception&)
                      {
                          ar.setNextName(nullptr);
                      }
                  }
 +            public:
 +                Resource(): m_loaded(false)
 +                {}
  
 +                bool observable() const
 +                {
 +                    return m_policy.m_observable;
 +                }
 +
 +                OCSecureType secureType() const
 +                {
 +                    return m_policy.m_secure ? OCSecureType::Secure : OCSecureType::NotSecure;
 +                }
 +
 +                int port() const
 +                {
 +                    return m_policy.m_port;
 +                }
 +
 +                std::vector<std::string> resourceTypes() const
 +                {
 +                    return m_resourceTypes;
 +                }
 +
 +                std::vector<std::string> interfaces() const
 +                {
 +                    return m_interfaces;
 +                }
 +
 +                bool loaded() const{
 +                    return m_loaded;
 +                }
 +
 +                std::string m_uri;
 +                std::string m_serverId;
                  std::vector<std::string> m_resourceTypes;
                  std::vector<std::string> m_interfaces;
 -                ListenResourcePolicyContainer m_policy;
 +                ResourcePolicy m_policy;
 +                bool m_loaded;
              };
  
              public:
 -            ListenResourceContainer() : m_loaded(false)
 +            DiscoveredResources()
              {}
  
              private:
              {
                  try
                  {
 -                    ar(cereal::make_nvp(OC::Key::URIKEY, m_uri));
 -                    m_loaded=true;
 -                }
 -                catch(cereal::Exception&)
 -                {
 -                    ar.setNextName(nullptr);
 -                }
 -                try
 -                {
 -                    ar(cereal::make_nvp(OC::Key::SERVERIDKEY, m_serverId));
 -                    m_loaded=true;
 -                }
 -                catch(cereal::Exception&)
 -                {
 -                    ar.setNextName(nullptr);
 +                    ar(cereal::make_nvp(OC::Key::DEVICEIDKEY, m_serverIdOfThisDevice));
                  }
 +                catch(cereal::Exception&) { ar.setNextName(nullptr); }
 +
                  try
                  {
 -                    ar(cereal::make_nvp(OC::Key::PROPERTYKEY, m_props));
 -                    m_loaded=true;
 +                    ar(cereal::make_nvp(OC::Key::LINKS, resources));
                  }
 -                catch(cereal::Exception&)
 -                {
 -                    ar.setNextName(nullptr);
 -                }
 -
 -            }
 -
 -            std::string m_uri;
 -            std::string m_serverId;
 -            bool m_loaded;
 -            ListenResourcePropertiesContainer m_props;
 -
 -            bool loaded() const
 -            {
 -                return m_loaded;
 -            }
 -
 -            bool observable() const
 -            {
 -                return m_props.m_policy.m_observable;
 -            }
 -
 -            OCSecureType secureType() const
 -            {
 -                return m_props.m_policy.m_secure ? OCSecureType::Secure : OCSecureType::NotSecure;
 -            }
 -
 -            int port() const
 -            {
 -                return m_props.m_policy.m_port;
 -            }
 -
 -            std::vector<std::string> resourceTypes() const
 -            {
 -                return m_props.m_resourceTypes;
 +                catch(cereal::Exception&) { ar.setNextName(nullptr); }
              }
  
 -            std::vector<std::string> interfaces() const
 -            {
 -                return m_props.m_interfaces;
 -            }
 +            std::string m_serverIdOfThisDevice;
 +            std::vector<Resource> resources;
          };
  
          private:
              template <class Archive>
              void serialize(Archive& ar)
              {
 -                std::vector<ListenResourceContainer> resources;
 +                std::vector<DiscoveredResources> resources;
                  ar(resources);
              }
          public:
              ListenOCContainer(std::weak_ptr<IClientWrapper> cw,
                      const OCDevAddr& devAddr, std::stringstream& json)
                      : m_clientWrapper(cw), m_devAddr(devAddr)
 +
              {
                  LoadFromJson(json);
              }
              {
                  cereal::JSONInputArchive archive(json);
  
 -                std::vector<ListenResourceContainer> resources;
 +                std::vector<DiscoveredResources> resources;
                  archive(cereal::make_nvp(OC::Key::OCKEY, resources));
  
                  m_resources.clear();
  
 -                for(const auto& res : resources)
 +                for(const auto& resourcesAtDevice : resources)
                  {
 -                    try
 +                    std::string serverIDForThisResourceRep = resourcesAtDevice.m_serverIdOfThisDevice;
 +
 +                    for (const auto& resource : resourcesAtDevice.resources)
                      {
 -                        if(res.loaded())
 +                        try
                          {
 -                            if (res.secureType() == OCSecureType::Secure)
 -                            {
 -                                m_devAddr.flags =
 -                                    (OCTransportFlags)(OC_FLAG_SECURE | m_devAddr.flags);
 -                            }
 -                            if (res.port() != -1)
 +                            if(resource.loaded())
                              {
 -                                m_devAddr.port = res.port();
 +                                m_resources.push_back(std::shared_ptr<OCResource>
 +                                (
 +                                    new OCResource
 +                                    (
 +                                        m_clientWrapper,
 +                                        m_devAddr,
 +                                        resource.m_uri,
 +                                        serverIDForThisResourceRep,
 +                                        resource.observable(),
 +                                        resource.resourceTypes(),
 +                                        resource.interfaces()
 +                                    )
 +                                ));
                              }
 -                            m_resources.push_back(std::shared_ptr<OCResource>(
 -                                new OCResource(m_clientWrapper, m_devAddr,
 -                                    res.m_uri, res.m_serverId, res.observable(),
 -                                    res.resourceTypes(), res.interfaces())));
                          }
 -
 -                    }
 -                    catch(ResourceInitException& e)
 -                    {
 -                        oclog() << "listenCallback(): failed to create resource: " << e.what()
 -                                << std::flush;
 +                        catch(ResourceInitException& e)
 +                        {
 +                            oclog() << "listenCallback(): failed to create resource: " << e.what()
 +                                    << std::flush;
 +                        }
                      }
                  }
              }
 -            std::vector<std::shared_ptr<OC::OCResource>> m_resources;
 -            std::weak_ptr<IClientWrapper> m_clientWrapper;
 -            OCDevAddr m_devAddr;
      };
 +*/
  }
@@@ -42,7 -42,6 +42,7 @@@
  #include "OCApi.h"
  #include "OCException.h"
  #include "OCUtilities.h"
 +#include "ocpayload.h"
  
  #include "oc_logger.hpp"
  
@@@ -57,6 -56,7 +57,7 @@@ namespace O
  
      void OCPlatform_impl::Configure(const PlatformConfig& config)
      {
+         OCRegisterPersistentStorageHandler(config.ps);
          globalConfig() = config;
      }
  
           return result_guard(OC_STACK_ERROR);
          }
  
 -        std::string payload(pResponse->getResourceRepresentation().getJSONRepresentation());
 -
 -        return result_guard(
 +        OCRepPayload* pl = pResponse->getResourceRepresentation().getPayload();
 +        OCStackResult result =
                     OCNotifyListOfObservers(resourceHandle,
                              &observationIds[0], observationIds.size(),
 -                            payload.c_str(),
 -                            static_cast<OCQualityOfService>(QoS)));
 +                            pl,
 +                            static_cast<OCQualityOfService>(QoS));
 +        OCRepPayloadDestroy(pl);
 +        return result_guard(result);
      }
  
      OCResource::Ptr OCPlatform_impl::constructResourceObject(const std::string& host,
          std::vector<std::string> resourceTypes = resource->getResourceTypes();
  
          return checked_guard(m_server, &IServerWrapper::registerResource,
 -                std::ref(resourceHandle), resource->uri(),
 +                std::ref(resourceHandle), resource->host() + resource->uri(),
                  resourceTypes[0]/*"core.remote"*/, DEFAULT_INTERFACE,
                  (EntityHandler) nullptr, resourceProperty);
      }
@@@ -31,7 -31,13 +31,13 @@@ namespace OCPlatformTes
      const std::string gResourceInterface = DEFAULT_INTERFACE;
      const uint8_t gResourceProperty = OC_DISCOVERABLE | OC_OBSERVABLE;
      OCResourceHandle resourceHandle;
+   //OCPersistent Storage Handlers
  
+    static FILE* client_open(const char *path, const char *mode)
+    {
+        std::cout << "<===Opening SVR DB file = './oic_svr_db_client.json' with mode = '"<< mode<<"' "<<std::endl;
+                return fopen("./oic_svr_db_client.json", mode);
+    }
      // Callbacks
      OCEntityHandlerResult entityHandler(std::shared_ptr<OCResourceRequest> request)
      {
                   resourceHandle, uri, type,
                   gResourceInterface, entityHandler, gResourceProperty));
      }
+     //PersistentStorageTest
+     TEST(ConfigureTest, ConfigureDefaultNULLPersistentStorage)
+     {
+         PlatformConfig cfg {
+              OC::ServiceType::InProc,
+              OC::ModeType::Both,
+              "0.0.0.0",
+              0,
+              OC::QualityOfService::LowQos
+          };
+          OCPlatform::Configure(cfg);
+          EXPECT_NO_THROW(OCPlatform::setDefaultDeviceEntityHandler(nullptr));
+      }
+     //PersistentStorageTest
+     TEST(ConfigureTest, ConfigureNULLPersistentStorage)
+     {
+         PlatformConfig cfg {
+              OC::ServiceType::InProc,
+              OC::ModeType::Both,
+              "0.0.0.0",
+              0,
+              OC::QualityOfService::LowQos,
+              nullptr
+          };
+          OCPlatform::Configure(cfg);
+          EXPECT_NO_THROW(OCPlatform::setDefaultDeviceEntityHandler(nullptr));
+      }
+     //PersistentStorageTest
+     TEST(ConfigureTest, ConfigurePersistentStorage)
+     {
+         OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink };
+         PlatformConfig cfg {
+              OC::ServiceType::InProc,
+              OC::ModeType::Both,
+              "0.0.0.0",
+              0,
+              OC::QualityOfService::LowQos,
+              &ps
+          };
+          OCPlatform::Configure(cfg);
+          EXPECT_NO_THROW(OCPlatform::setDefaultDeviceEntityHandler(nullptr));
+      }
+     //PersistentStorageTest
+     TEST(ConfigureTest, ConfigureNULLHandlersPersistentStorage)
+     {
+         OCPersistentStorage ps {client_open, nullptr, nullptr, nullptr, nullptr };
+         PlatformConfig cfg {
+              OC::ServiceType::InProc,
+              OC::ModeType::Both,
+              "0.0.0.0",
+              0,
+              OC::QualityOfService::LowQos,
+              &ps
+          };
+          OCPlatform::Configure(cfg);
+          EXPECT_NO_THROW(OCPlatform::setDefaultDeviceEntityHandler(nullptr));
+      }
  
      //RegisterResourceTest
      TEST(RegisterResourceTest, RegisterSingleResource)
      TEST(FindResourceTest, DISABLED_FindResourceValid)
      {
        std::ostringstream requestURI;
 -      requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +      requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
        EXPECT_EQ(OC_STACK_OK, OCPlatform::findResource("", requestURI.str(),
                CT_DEFAULT, &foundResource));
      }
      TEST(FindResourceTest, FindResourceNullResourceURI1)
      {
        std::ostringstream requestURI;
 -      requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +      requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
        EXPECT_ANY_THROW(OCPlatform::findResource(nullptr, requestURI.str(),
                CT_DEFAULT, &foundResource));
      }
      TEST(FindResourceTest, FindResourceNullHost)
      {
        std::ostringstream requestURI;
 -      requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +      requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
        EXPECT_ANY_THROW(OCPlatform::findResource(nullptr, requestURI.str(),
                CT_DEFAULT, &foundResource));
      }
      TEST(FindResourceTest, FindResourceNullresourceHandler)
      {
        std::ostringstream requestURI;
 -      requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +      requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
        EXPECT_THROW(OCPlatform::findResource("", requestURI.str(),
                CT_DEFAULT, NULL), OC::OCException);
      }
      TEST(FindResourceTest, DISABLED_FindResourceWithLowQoS)
      {
          std::ostringstream requestURI;
 -        requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +        requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
          EXPECT_EQ(OC_STACK_OK,
                  OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, &foundResource,
                          OC::QualityOfService::LowQos));
      TEST(FindResourceTest, DISABLED_FindResourceWithMidQos)
      {
          std::ostringstream requestURI;
 -        requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +        requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
          EXPECT_EQ(OC_STACK_OK,
                  OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, &foundResource,
                          OC::QualityOfService::MidQos));
      TEST(FindResourceTest, DISABLED_FindResourceWithHighQos)
      {
          std::ostringstream requestURI;
 -        requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +        requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
          EXPECT_EQ(OC_STACK_OK,
                  OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, &foundResource,
                          OC::QualityOfService::HighQos));
      TEST(FindResourceTest, DISABLED_FindResourceWithNaQos)
      {
          std::ostringstream requestURI;
 -        requestURI << OC_WELL_KNOWN_QUERY << "?rt=core.light";
 +        requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=core.light";
          EXPECT_EQ(OC_STACK_OK,
                  OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, &foundResource,
                          OC::QualityOfService::NaQos));
                  OC_MULTICAST_IP, CT_DEFAULT, &presenceHandler));
          EXPECT_EQ(OC_STACK_OK, OCPlatform::unsubscribePresence(presenceHandle));
      }
  }