Update snapshot(2018-01-17)
[platform/upstream/iotivity.git] / resource / provisioning / src / OCProvisioningManager.cpp
index c34b505..e83b332 100644 (file)
@@ -890,13 +890,14 @@ namespace OC
     }
 
     OCSecureResource::OCSecureResource(): m_csdkLock(std::weak_ptr<std::recursive_mutex>()),
-                                        devPtr(nullptr)
+                                        devPtr(nullptr),
+                                        context(nullptr)
     {
     }
 
     OCSecureResource::OCSecureResource(std::weak_ptr<std::recursive_mutex> csdkLock,
             OCProvisionDev_t *dPtr)
-        :m_csdkLock(csdkLock), devPtr(dPtr)
+        :m_csdkLock(csdkLock), devPtr(dPtr), context(nullptr)
     {
     }
 
@@ -906,6 +907,10 @@ namespace OC
         {
             OCDeleteDiscoveredDevices(devPtr);
         }
+        if(context)
+        {
+            delete context;
+        }
     }
 
     OCStackResult OCSecureResource::doOwnershipTransfer(ResultCallBack resultCallback)
@@ -922,6 +927,11 @@ namespace OC
         if (cLock)
         {
             ProvisionContext* context = new ProvisionContext(resultCallback);
+            if(context)
+            {
+                delete context;
+            }
+            context = new ProvisionContext(resultCallback);
 
             std::lock_guard<std::recursive_mutex> lock(*cLock);
             result = OCDoOwnershipTransfer(static_cast<void*>(context),
@@ -935,6 +945,37 @@ namespace OC
         return result;
     }
 
+    OCStackResult OCSecureResource::doOwnershipTransfer(ResultCallBack resultCallback, const OicSecOxm_t method)
+    {
+        if (!resultCallback)
+        {
+            oclog() <<"Result callback can't be null";
+            return OC_STACK_INVALID_CALLBACK;
+        }
+
+        OCStackResult result;
+        auto cLock = m_csdkLock.lock();
+
+        if (cLock)
+        {
+            if(context)
+            {
+                 delete context;
+            }
+            context = new ProvisionContext(resultCallback);
+
+            std::lock_guard<std::recursive_mutex> lock(*cLock);
+            result = OCDoCustomOwnershipTransfer(static_cast<void*>(context),
+                   devPtr, &OCSecureResource::callbackWrapper, method);
+        }
+        else
+        {
+            oclog() <<"Mutex not found";
+            result = OC_STACK_ERROR;
+        }
+        return result;
+    }
+
 #ifdef MULTIPLE_OWNER
     OCStackResult OCSecureResource::doMultipleOwnershipTransfer(ResultCallBack resultCallback)
     {