Merge all changes of easy setup in master branch to 1.2-rel branch
[platform/upstream/iotivity.git] / service / easy-setup / mediator / richsdk / src / RemoteEnrollee.cpp
index 3760875..e23f2c2 100755 (executable)
@@ -39,7 +39,7 @@ namespace OIC
         #define ES_REMOTE_ENROLLEE_TAG "ES_REMOTE_ENROLLEE"
         #define DISCOVERY_TIMEOUT 5
 
-        RemoteEnrollee::RemoteEnrollee(std::shared_ptr< OC::OCResource > resource)
+        RemoteEnrollee::RemoteEnrollee(const std::shared_ptr< OC::OCResource > resource)
         {
             m_ocResource = resource;
             m_enrolleeResource = std::make_shared<EnrolleeResource>(m_ocResource);
@@ -54,8 +54,9 @@ namespace OIC
         }
 
 #ifdef __WITH_DTLS__
-        ESResult RemoteEnrollee::registerSecurityCallbackHandler(SecurityPinCb securityPinCb,
-                SecProvisioningDbPathCb secProvisioningDbPathCb)
+        ESResult RemoteEnrollee::registerSecurityCallbackHandler(
+                const SecurityPinCb securityPinCb,
+                const SecProvisioningDbPathCb secProvisioningDbPathCb)
         {
             // No need to check NULL for m_secProvisioningDbPathCB as this is not a mandatory
             // callback function. If m_secProvisioningDbPathCB is NULL, provisioning manager
@@ -69,7 +70,7 @@ namespace OIC
 #endif //__WITH_DTLS__
 
         void RemoteEnrollee::securityStatusHandler(
-                        std::shared_ptr< SecProvisioningStatus > status)
+                const std::shared_ptr< SecProvisioningStatus > status) const
         {
             OIC_LOG_V(DEBUG, ES_REMOTE_ENROLLEE_TAG, "easySetupStatusCallback status is, UUID = %s,"
                     "Status = %d", status->getDeviceUUID().c_str(),
@@ -80,7 +81,7 @@ namespace OIC
                 OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "Ownership and ACL are successful. "
                         "Continue with Network information provisioning");
 
-                OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Before ProvisionEnrollee");
+                OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Before provisionProperties");
 
                 m_securityProvStatusCb(status);
             }
@@ -92,7 +93,8 @@ namespace OIC
             }
         }
 
-        void RemoteEnrollee::getStatusHandler(std::shared_ptr< GetEnrolleeStatus > status)
+        void RemoteEnrollee::getStatusHandler(
+                const std::shared_ptr< GetEnrolleeStatus > status) const
         {
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering getStatusHandler");
 
@@ -102,7 +104,7 @@ namespace OIC
         }
 
         void RemoteEnrollee::getConfigurationStatusHandler (
-                std::shared_ptr< GetConfigurationStatus > status)
+                const std::shared_ptr< GetConfigurationStatus > status) const
         {
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering getConfigurationStatusHandler");
 
@@ -113,7 +115,7 @@ namespace OIC
         }
 
         void RemoteEnrollee::devicePropProvisioningStatusHandler(
-                std::shared_ptr< DevicePropProvisioningStatus > status)
+                const std::shared_ptr< DevicePropProvisioningStatus > status) const
         {
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering DevicePropProvisioningStatusHandler");
 
@@ -125,12 +127,12 @@ namespace OIC
         }
 
         void RemoteEnrollee::cloudPropProvisioningStatusHandler (
-                std::shared_ptr< CloudPropProvisioningStatus > status)
+                const std::shared_ptr< CloudPropProvisioningStatus > status) const
         {
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Entering cloudPropProvisioningStatusHandler");
 
             OIC_LOG_V(DEBUG,ES_REMOTE_ENROLLEE_TAG,"CloudProvStatus = %d",
-                                                    status->getESCloudState());
+                                                    status->getESResult());
 
             m_cloudPropProvStatusCb(status);
             return;
@@ -219,9 +221,14 @@ namespace OIC
             return ES_OK;
         }
 
-        void RemoteEnrollee::provisionSecurity(SecurityProvStatusCb callback)
+        void RemoteEnrollee::provisionSecurity(const SecurityProvStatusCb callback)
         {
 #ifdef __WITH_DTLS__
+            ESResult res = ESResult::ES_ERROR;
+            if(!callback)
+            {
+                throw ESInvalidParameterException("Callback is empty");
+            }
             m_securityProvStatusCb = callback;
 
             SecurityProvStatusCb securityProvStatusCb = std::bind(
@@ -234,33 +241,25 @@ namespace OIC
             m_enrolleeSecurity->registerCallbackHandler(securityProvStatusCb, m_securityPinCb,
                                                         m_secProvisioningDbPathCb);
 
-            try
-            {
-                m_enrolleeSecurity->performOwnershipTransfer();
-            }
-            catch (const std::exception& e)
-            {
-                OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_TAG,
-                        "Exception for performOwnershipTransfer : %s", e.what());
-
-                OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Fail performOwnershipTransfer");
-                std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus =
-                        std::make_shared< SecProvisioningStatus >
-                                                        (m_enrolleeSecurity->getUUID(), ES_ERROR);
-                    m_securityProvStatusCb(securityProvisioningStatus);
-                return ;
-            }
+            res = m_enrolleeSecurity->provisionOwnership();
+
+            std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus =
+                            std::make_shared< SecProvisioningStatus >(m_enrolleeSecurity->getUUID(), res);
+            m_securityProvStatusCb(securityProvisioningStatus);
 #else
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Mediator is unsecured.");
-
+            if(!callback)
+            {
+                throw ESInvalidParameterException("Callback is empty");
+            }
             std::shared_ptr< SecProvisioningStatus > securityProvisioningStatus =
                      std::make_shared< SecProvisioningStatus >
-                                                        ("", ES_UNSUPPORTED_OPERATION);
-            m_securityProvStatusCb(securityProvisioningStatus);
+                                   ("", ESResult::ES_SEC_OPERATION_IS_NOT_SUPPORTED);
+            callback(securityProvisioningStatus);
 #endif
         }
 
-        void RemoteEnrollee::getStatus(GetStatusCb callback)
+        void RemoteEnrollee::getStatus(const GetStatusCb callback)
         {
             if(!callback)
             {
@@ -281,7 +280,7 @@ namespace OIC
 
         }
 
-        void RemoteEnrollee::getConfiguration(GetConfigurationStatusCb callback)
+        void RemoteEnrollee::getConfiguration(const GetConfigurationStatusCb callback)
         {
             if(!callback)
             {
@@ -302,7 +301,7 @@ namespace OIC
         }
 
         void RemoteEnrollee::provisionDeviceProperties(const DeviceProp& deviceProp,
-                                                            DevicePropProvStatusCb callback)
+                                                            const DevicePropProvStatusCb callback)
         {
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Enter provisionDeviceProperties");
 
@@ -328,18 +327,13 @@ namespace OIC
                     this, std::placeholders::_1);
 
             m_enrolleeResource->registerDevicePropProvStatusCallback(devicePropProvStatusCb);
-            m_enrolleeResource->provisionEnrollee(deviceProp);
+            m_enrolleeResource->provisionProperties(deviceProp);
         }
 
         void RemoteEnrollee::initCloudResource()
         {
             ESResult result = ES_ERROR;
 
-            if (m_cloudResource != nullptr)
-            {
-                throw ESBadRequestException ("Already created");
-            }
-
             result = discoverResource();
 
             if (result == ES_ERROR)
@@ -354,12 +348,6 @@ namespace OIC
                 if(m_ocResource != nullptr)
                 {
                     m_cloudResource = std::make_shared<CloudResource>(m_ocResource);
-
-                    std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared<
-                        CloudPropProvisioningStatus >(ESResult::ES_OK,
-                                                        ESCloudProvState::ES_CLOUD_ENROLLEE_FOUND);
-
-                    m_cloudPropProvStatusCb(provStatus);
                 }
                 else
                 {
@@ -369,10 +357,9 @@ namespace OIC
         }
 
         void RemoteEnrollee::provisionCloudProperties(const CloudProp& cloudProp,
-                                                            CloudPropProvStatusCb callback)
+                                                            const CloudPropProvStatusCb callback)
         {
             OIC_LOG(DEBUG,ES_REMOTE_ENROLLEE_TAG,"Enter provisionCloudProperties");
-            ESResult res = ES_OK;
 
             if(!callback)
             {
@@ -399,45 +386,33 @@ namespace OIC
                     "Exception caught in provisionCloudProperties = %s", e.what());
 
                 std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared<
-                        CloudPropProvisioningStatus >(ESResult::ES_ERROR,
-                                                    ESCloudProvState::ES_CLOUD_ENROLLEE_NOT_FOUND);
+                        CloudPropProvisioningStatus >(ESResult::ES_ENROLLEE_DISCOVERY_FAILURE);
                 m_cloudPropProvStatusCb(provStatus);
                 return;
             }
-
-#ifdef __WITH_DTLS__
-            try
+#if defined(__WITH_DTLS__) && defined(__WITH_TLS__)
+            if(!(cloudProp.getCloudID().empty() && cloudProp.getCredID() <= 0))
             {
+                ESResult res = ESResult::ES_ERROR;
                 m_enrolleeSecurity = std::make_shared <EnrolleeSecurity> (m_ocResource, "");
 
-                if(cloudProp.getCloudID().empty())
-                {
-                    throw ESBadRequestException("Invalid Cloud Server UUID.");
-                }
-
-                res = m_enrolleeSecurity->performACLProvisioningForCloudServer(cloudProp.getCloudID());
+                res = m_enrolleeSecurity->provisionSecurityForCloudServer(cloudProp.getCloudID(),
+                                                                          cloudProp.getCredID());
 
-                if(res == ESResult::ES_ERROR)
+                if(res != ESResult::ES_OK)
                 {
-                    throw ESBadRequestException("Error in provisioning operation!");
+                    m_cloudResource = nullptr;
+                    std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared<
+                            CloudPropProvisioningStatus >(res);
+                    m_cloudPropProvStatusCb(provStatus);
+                    return;
                 }
-
             }
-
-            catch (const std::exception& e)
+            else
             {
-                OIC_LOG_V(ERROR, ES_REMOTE_ENROLLEE_TAG,
-                    "Exception caught in provisionCloudProperties = %s", e.what());
-
-                m_cloudResource = nullptr;
-
-                std::shared_ptr< CloudPropProvisioningStatus > provStatus = std::make_shared<
-                        CloudPropProvisioningStatus >(ESResult::ES_ERROR,
-                                                    ESCloudProvState::ES_CLOUD_PROVISIONING_ERROR);
-                m_cloudPropProvStatusCb(provStatus);
-                return;
+                OIC_LOG(DEBUG, ES_REMOTE_ENROLLEE_TAG, "ACL and Cert. provisioning are skipped.");
             }
-#endif
+#endif //defined(__WITH_DTLS__) && defined(__WITH_TLS__)
 
             if (m_cloudResource == nullptr)
             {
@@ -449,7 +424,7 @@ namespace OIC
                                     this, std::placeholders::_1);
 
             m_cloudResource->registerCloudPropProvisioningStatusCallback(cloudPropProvStatusCb);
-            m_cloudResource->provisionEnrollee(cloudProp);
+            m_cloudResource->provisionProperties(cloudProp);
         }
     }
 }