replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / easy-setup / mediator / richsdk / inc / RemoteEnrollee.h
old mode 100644 (file)
new mode 100755 (executable)
index 1fb83b3..76ce155
 #ifndef REMOTE_ENROLLEE_H_
 #define REMOTE_ENROLLEE_H_
 
+#include <memory>
+#include <iostream>
+#include <condition_variable>
+
 #include "ESRichCommon.h"
+#include "OCApi.h"
+
+using namespace OC;
 
 namespace OIC
 {
     namespace Service
     {
-        class RemoteEnrolleeResource;
+        class OCResource;
+        class EnrolleeResource;
+        class CloudResource;
         class EnrolleeSecurity;
 
+        typedef std::function<void(const std::shared_ptr<OC::OCResource> resource)>  onDeviceDiscoveredCb;
+
         /**
-         * This class represents Remote Enrollee device instance.
-         * It will provide APIs for Mediator to perform operations to enable the Enrollee device
-         * to connect to the Enroller.
+         * This class represents Remote Enrollee device instance. What operation the class provides:
+         * 1) Ownership transfer for enabling secured communication between Mediator and Enrollee
+         * devices.
+         * 2) Provision WiFi AP information used for which Enrollee is going to connect to the AP
+         * 3) Provision Device confiruation setting, i.e. language, country, and etc
+         * 4) Provision Cloud information used for which Enrollee is going to register to the cloud
          */
-        class RemoteEnrollee
+        class RemoteEnrollee : public std::enable_shared_from_this<RemoteEnrollee>
         {
         public:
-            /**
-             * RemoteEnrollee constructor
-             *
-             * @param enrolleeNWProvInfo Provisioning information for the Enrollee
-             *
-             * @throw ESBadRequestException is thrown if the parameters are invalid
-             */
-            RemoteEnrollee(const ProvConfig& enrolleeNWProvInfo, const WiFiOnboadingConnection& connection) ;
-
             ~RemoteEnrollee() = default;
 
-            typedef std::shared_ptr< RemoteEnrollee > shared_ptr;
-
             /**
-             * Callback definition to be invoked when EasySetup status is changed.
-             * The same callback will be invoked when there is an error in the
-             * EasySetup process.
+             * Get an Enrollee's status which includes provisioning status and last error code
              *
-             * @see registerResourceHandler
-             * @see ResourceState
+             * @param callback will give the requested status
+             *
+             * @throws ESInvalidParameterException If callback is null.
+             * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
+             *
+             * @see GetStatusCb
              */
-            typedef std::function< void(std::shared_ptr< EasySetupStatus >) >
-                                                                        EasySetupStatusCB;
+            void getStatus(const GetStatusCb callback);
 
-#ifdef __WITH_DTLS__
             /**
-             * Register Security status and other information callback handlers.
+             * Get an Enrollee's configuration which includes WiFi supported frequency and device name
              *
-             * @param secProvisioningDbCb Callback to be invoked when the stack expects a
-             *        path for the provisioning db.
-             * @param securityPinCb Callback to get security pin during pin based ownership transfer.
+             * @param callback will give the requested configuration
              *
-             * @throws InvalidParameterException If callback is an empty function or null.
-             * @throws ESBadRequestException If registration is already completed.
+             * @throws ESInvalidParameterException If callback is null.
+             * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
              *
-             * @see SecProvisioningResult
+             * @see GetConfigurationStatusCb
              */
-            ESResult registerSecurityCallbackHandler(SecurityPinCb securityPinCb,
-                    SecProvisioningDbPathCb secProvisioningDbPathCb);
-#endif //__WITH_DTLS__
+            void getConfiguration(const GetConfigurationStatusCb callback);
 
             /**
-             * Register EasySetup status handler.
+             * Do security provisioning such as ownership tranfer to Enrollee.
              *
-             * @param callback Callback to get EasySetup status.
-             * @param secProvisioningDbCB Callback to be invoked when the stack expects a
-             *        path for the provisioning db.
+             * @param callback will give the result if the security provisioning succeeds or fails for some reasons
              *
-             * @throws InvalidParameterException If callback is an empty function or null.
-             * @throws ESBadRequestException If registration is already completed.
+             * @throws ESInvalidParameterException If callback is null.
+             * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
              *
-             * @see EasySetupStatus
+             * @see SecurityProvStatusCb
              */
-            void registerEasySetupStatusHandler(EasySetupStatusCB callback);
+            void provisionSecurity(const SecurityProvStatusCb callback);
 
             /**
-             * Start provisioning of target Enrollers information to the Enrollee.
+             * Do security provisioning such as ownership tranfer to Enrollee which may require more
+             * specific user selections like a type of ownership transfer method or pre-configured
+             * pin number used to Pre-configured pin-based MOT.
              *
+             * @param callback will give the result if the security provisioning succeeds or fails for some reasons.
+             *
+             * @throws ESInvalidParameterException If callback is null.
              * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
              *
-             * @see RemoteEnrollee
+             * @see SecurityProvStatusCb
              */
-            void startProvisioning();
+            void provisionSecurity(const SecurityProvStatusCbWithOption callback);
 
             /**
-             * Stop provisioning process that is currently in progress.
+             * Provision WiFi AP information and device configuration to Enrollee
+             * 1. WiFi AP information includes a SSID, password, auth type, and encryption type.
+             * 2. Device configuration includes a language (IETF language tags) and country (ISO 3166-1 Alpha-2)
+             *
+             * @param devProp a data structure storing the above information to be delivered
+             * @param callback will give the result if the provisioning succeeds or fails
              *
-             * @throws BadRequestException If provisioning is not in progress.
+             * @throws ESInvalidParameterException If callback is null.
+             * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
+             *
+             * @see DeviceProp
+             * @see DevicePropProvStatusCb
              */
-            void stopProvisioning();
+            void provisionDeviceProperties(const DeviceProp& devProp,
+                                               const DevicePropProvStatusCb callback);
 
             /**
-             * Check if the Enrollee device provisioned.
+             * Provision Cloud information to Enrollee, which includes Auth code, auth provider,
+             * Cloud interface server URL, and etc.
+             * In this function, Discovery for the Enrollee will happen again in a given network.
+             * Because, this function is expected to call *AFTER* the Enrollee disconnects its Soft AP
+             * and successfully connects to the certain WiFi AP. In that case, Mediator should discover
+             * the Enrollee with a certain Device ID in the network.
+             *
+             * @param cloudProp a data structure storing the above information to be delivered
+             * @param callback will give the result if the provisioning succeeds or fails
+             *
+             * @throws ESInvalidParameterException If callback is null.
+             * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
+             *
+             * @see CloudProp
+             * @see CloudPropProvStatusCb
              */
-            bool isEnrolleeProvisioned();
+            void provisionCloudProperties(const CloudProp& cloudProp,
+                                              const CloudPropProvStatusCb callback);
 
             /**
-             * Get the Provisioning information provided for the current Enrollee.
+             * Provision Cloud information to Enrollee, which includes Auth code, auth provider,
+             * Cloud interface server URL, and etc.
+             * Note that, this API is skipping finding Enrollee in a given network. Instead, an OCResource
+             * given as a first parameter will be considered to the Enrollee for cloud provisioning.
+             *
+             * @param resource an OCResource corresponding to a target Enrollee for cloud provisioning
+             * @param cloudProp a data structure storing the above information to be delivered
+             * @param callback will give the result if the provisioning succeeds or fails
+             *
+             * @throws ESInvalidParameterException If callback is null.
+             * @throws ESBadRequestException If RemoteEnrollee device not created prior to this call.
              *
-             * @return ProvConfig Provisioning information provided for the current Enrollee.
+             * @see CloudProp
+             * @see CloudPropProvStatusCb
              */
-            ProvConfig getProvConfig ();
+            void provisionCloudProperties(const std::shared_ptr< OC::OCResource > resource,
+                                            const CloudProp& cloudProp,
+                                            const CloudPropProvStatusCb callback);
 
             /**
-             * Get the Onboarding connection information between Mediator and Enrollee.
+             * Notify an Enrollee to Connect WiFi/Cloud
+             *
+             * @param connectTypes Target configurations to be connected. E.g. WiFi and coap cloud server
+             * @param callback will give the result if the connect request succeeds or fails
              *
-             * @return WiFiOnboadingConnection information between Mediator and Enrollee.
+             * @see ES_CONNECT_TYPE
+             * @see ConnectRequestStatusCb
              */
+            void requestToConnect(const std::vector<ES_CONNECT_TYPE> &connectTypes, const ConnectRequestStatusCb callback);
+
+        private:
+            RemoteEnrollee(const std::shared_ptr< OC::OCResource > resource);
+
+            ESResult discoverResource();
+
+            static void onDiscoveredCallback(const std::shared_ptr<OC::OCResource> resource,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            static void onGetStatusHandlerCallback(
+                const std::shared_ptr< GetEnrolleeStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            static void onGetConfigurationStatusHandlerCallback(
+                const std::shared_ptr< GetConfigurationStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
 
-            WiFiOnboadingConnection getOnboardConn();
+            static void onDevicePropProvisioningStatusHandlerCallback(
+                const std::shared_ptr< DevicePropProvisioningStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            static void onCloudPropProvisioningStatusHandlerCallback(
+                const std::shared_ptr< CloudPropProvisioningStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            static void onConnectRequestStatusHandlerCallback(
+                const std::shared_ptr< ConnectRequestStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            static void onSecurityStatusHandlerCallback(
+                const std::shared_ptr< SecProvisioningStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            static ESOwnershipTransferData onSecurityStatusWithOptionHandlerCallback(
+                const std::shared_ptr< SecProvisioningStatus > status,
+                std::weak_ptr<RemoteEnrollee> this_ptr);
+
+            void onDeviceDiscovered(const std::shared_ptr<OC::OCResource> resource);
+            void initCloudResource();
+
+            void getStatusHandler
+                (const std::shared_ptr< GetEnrolleeStatus > status) const;
+            void getConfigurationStatusHandler
+                (const std::shared_ptr< GetConfigurationStatus > status) const;
+            void devicePropProvisioningStatusHandler
+                (const std::shared_ptr< DevicePropProvisioningStatus > status) const;
+            void cloudPropProvisioningStatusHandler
+                (const std::shared_ptr< CloudPropProvisioningStatus > status) const;
+            void connectRequestStatusHandler(
+                const std::shared_ptr< ConnectRequestStatus > status) const;
+            void securityStatusHandler
+                (const std::shared_ptr< SecProvisioningStatus > status) const;
+            ESOwnershipTransferData securityStatusWithOptionHandler
+                (const std::shared_ptr< SecProvisioningStatus > status) const;
 
         private:
-            std::shared_ptr< RemoteEnrolleeResource > m_remoteResource;
-            EasySetupStatusCB m_easySetupStatusCb;
-            EnrolleeSecStatusCb m_enrolleeSecStatusCb;
+            std::shared_ptr< OC::OCResource > m_ocResource;
+            std::shared_ptr< EnrolleeResource > m_enrolleeResource;
+            std::shared_ptr< EnrolleeSecurity > m_localEnrolleeSecurity;
+            std::shared_ptr< EnrolleeSecurity > m_cloudEnrolleeSecurity;
+            std::shared_ptr< CloudResource > m_cloudResource;
+
+            std::string  m_deviceId;
+            bool m_discoveryResponse;
+
+            std::mutex m_discoverymtx;
+            std::condition_variable m_cond;
+
+            SecurityProvStatusCb m_securityProvStatusCb;
+            SecurityProvStatusCbWithOption m_securityProvStatusCbWithOption;
+            GetStatusCb m_getStatusCb;
+            GetConfigurationStatusCb m_getConfigurationStatusCb;
             SecurityPinCb m_securityPinCb;
             SecProvisioningDbPathCb m_secProvisioningDbPathCb;
-            ProvConfig m_ProvConfig;
-            WiFiOnboadingConnection m_wifiOnboardingconn;
-
-            std::shared_ptr< EnrolleeSecurity > m_enrolleeSecurity;
-            CurrentESState m_currentESState;
-            bool m_isSecured;
+            DevicePropProvStatusCb m_devicePropProvStatusCb;
+            CloudPropProvStatusCb m_cloudPropProvStatusCb;
+            ConnectRequestStatusCb m_connectRequestStatusCb;
 
-            void provisioningStatusHandler (std::shared_ptr< ProvisioningStatus > provStatus);
-            void easySetupSecurityStatusCallback(
-            std::shared_ptr< SecProvisioningResult > secProvisioningResult);
+            friend class EasySetup;
         };
     }
 }