replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / easy-setup / sampleapp / mediator / linux / richsdk_sample / submediator.cpp
@@ -24,6 +24,7 @@
 #include "OCPlatform.h"
 #include "OCApi.h"
 #include "OCProvisioningManager.hpp"
+#include "securevirtualresourcetypes.h"
 
 #include "EasySetup.hpp"
 #include "ESRichCommon.h"
@@ -31,7 +32,7 @@
 #define ES_SAMPLE_APP_TAG "ES_SAMPLE_APP_TAG"
 #define DECLARE_MENU(FUNC, ...) { #FUNC, FUNC }
 
-#define JSON_DB_PATH "./oic_svr_db_client.dat"
+#define JSON_DB_PATH "./oic_svr_db_subclient.dat"
 
 using namespace OC;
 using namespace OIC::Service;
@@ -51,12 +52,15 @@ int processUserInput(int min = std::numeric_limits<int>::min(),
 {
     assert(min <= max);
 
-    int input;
+    int input = 0;
 
     std::cin >> input;
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
 
-    if (!std::cin.fail() && min <= input && input <= max) return input;
+    if (!std::cin.fail() && min <= input && input <= max)
+    {
+        return input;
+    }
 
     std::cin.clear();
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
@@ -64,11 +68,10 @@ int processUserInput(int min = std::numeric_limits<int>::min(),
     throw std::runtime_error("Invalid Input, please try again");
 }
 
-void printConfiguration(EnrolleeConf conf)
+void printConfiguration(const EnrolleeConf& conf)
 {
     cout << "===========================================" << endl;
     cout << "\tDevice Name : " << conf.getDeviceName() << endl;
-    cout << "\tModel Number : " << conf.getModelNumber() << endl;
 
     for(auto it : conf.getWiFiModes())
     {
@@ -80,7 +83,7 @@ void printConfiguration(EnrolleeConf conf)
     cout << "===========================================" << endl;
 }
 
-void printStatus(EnrolleeStatus status)
+void printStatus(const EnrolleeStatus& status)
 {
     cout << "===========================================" << endl;
     cout << "\tProvStatus : " << status.getProvStatus() << endl;
@@ -88,18 +91,42 @@ void printStatus(EnrolleeStatus status)
     cout << "===========================================" << endl;
 }
 
-void provisionSecurityStatusCallback(std::shared_ptr<SecProvisioningStatus> secProvisioningStatus)
+ESOwnershipTransferData provisionSecurityStatusCallback(std::shared_ptr<SecProvisioningStatus> secProvisioningStatus)
 {
-    if(secProvisioningStatus->getESResult() != ES_OK)
+    cout << "provisionSecurityStatusCallback IN" << endl;
+    cout << "ESResult : " << secProvisioningStatus->getESResult() << std::endl;
+    cout << "Device ID : " << secProvisioningStatus->getDeviceUUID() << std::endl;
+
+    if(secProvisioningStatus->getESResult() == ES_SECURE_RESOURCE_IS_DISCOVERED)
     {
-      cout << "provisionSecurity is failed." << endl;
-      return;
+#ifdef __WITH_DTLS__
+        cout << "Owned Status : " << secProvisioningStatus->isOwnedDevice() << std::endl;
+        cout << "OT Method : " << secProvisioningStatus->getSelectedOTMethod() << std::endl;
+#ifdef MULTIPLE_OWNER
+        cout << "MOT Enabled : " << secProvisioningStatus->isMOTEnabled() << std::endl;
+
+        // TEST
+        ESOwnershipTransferData OTData;
+        OTData.setMOTMethod(OIC_PRECONFIG_PIN, "12345678");
+
+        cout << "Enter!" << std::endl;
+        getchar();
+
+        return OTData;
+#endif
+#endif
+
+    }
+    else if(secProvisioningStatus->getESResult() == ES_OK)
+    {
+        cout << "provisionSecurity is success." << std::endl;
     }
     else
     {
-      cout << "provisionSecurity is success." << endl;
-      cout << "uuid : " << secProvisioningStatus->getDeviceUUID()<< endl;
+        cout << "provisionSecurity is failed." << endl;
     }
+
+    return {};
 }
 
 void provisionSecurity()
@@ -112,7 +139,7 @@ void provisionSecurity()
 
     try
     {
-        remoteEnrollee->provisionSecurity(provisionSecurityStatusCallback);
+        remoteEnrollee->provisionSecurity((SecurityProvStatusCbWithOption)provisionSecurityStatusCallback);
     }
     catch (OCException &e)
     {
@@ -211,7 +238,6 @@ void provisionDeviceProperty()
 
     DeviceProp devProp;
     devProp.setWiFiProp("Iotivity_SSID", "Iotivity_PWD", WPA2_PSK, TKIP_AES);
-    devProp.setDevConfProp("korean", "Korea", "Location");
 
     try
     {
@@ -224,6 +250,41 @@ void provisionDeviceProperty()
     }
 }
 
+void connectRequestStatusCallback(std::shared_ptr< ConnectRequestStatus > requestStatus)
+{
+    if(requestStatus->getESResult() != ES_OK)
+    {
+      cout << "Request to connection is failed." << endl;
+      return;
+    }
+    else
+    {
+      cout << "Request to connection is success." << endl;
+    }
+}
+
+void requestToConnect()
+{
+    if(!remoteEnrollee)
+    {
+        std::cout << "RemoteEnrollee is null, retry Discovery EnrolleeResource." << endl;
+        return;
+    }
+
+    try
+    {
+        std::vector<ES_CONNECT_TYPE> types;
+        types.push_back(ES_CONNECT_WIFI);
+        types.push_back(ES_CONNECT_COAPCLOUD);
+        remoteEnrollee->requestToConnect(types, connectRequestStatusCallback);
+    }
+    catch (OCException &e)
+    {
+        std::cout << "Exception during provisionDeviceProperties call" << e.reason();
+        return;
+    }
+}
+
 void cloudProvisioningStatusCallback(std::shared_ptr< CloudPropProvisioningStatus > provStatus)
 {
     switch (provStatus->getESResult())
@@ -280,7 +341,7 @@ void foundResource(std::shared_ptr<OC::OCResource> resource)
         // Do some operations with resource object.
         if(resource &&
            !curResource &&
-           resource->getResourceTypes().at(0) == OC_RSRVD_ES_RES_TYPE_PROV)
+           resource->getResourceTypes().at(0) == OC_RSRVD_ES_RES_TYPE_EASYSETUP)
         {
             std::cout<<"DISCOVERED Resource:"<<std::endl;
             // Get the resource URI
@@ -329,30 +390,31 @@ void foundResource(std::shared_ptr<OC::OCResource> resource)
 
 void discoveryEnrolleeResource()
 {
-       try
-       {
-           std::ostringstream requestURI;
-        requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=" << OC_RSRVD_ES_RES_TYPE_PROV;
+    try
+    {
+        std::ostringstream requestURI;
+        requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=" << OC_RSRVD_ES_RES_TYPE_EASYSETUP;
         OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, &foundResource);
         std::cout<< "Finding Resource... " <<std::endl;
 
         std::unique_lock<std::mutex> lck(g_discoverymtx);
         g_cond.wait_for(lck, std::chrono::seconds(5));
-       }
-       catch (OCException& e)
-       {
-               std::cout << "Exception in discoveryEnrolleeResource: "<<e.what();
-       }
+    }
+    catch (OCException& e)
+    {
+        std::cout << "Exception in discoveryEnrolleeResource: "<<e.what();
+    }
 }
 
 void DisplayMenu()
 {
-       constexpr int DISCOVERY_ENROLLEE = 1;
+    constexpr int DISCOVERY_ENROLLEE = 1;
     constexpr int PROVISION_SECURITY = 2;
     constexpr int GET_STATUS = 3;
     constexpr int GET_CONFIGURATION = 4;
     constexpr int PROVISION_DEVICE_PROPERTY = 5;
-    constexpr int PROVISION_CLOUD_PROPERTY = 6;
+    constexpr int REQUEST_TO_CONNECT = 6;
+    constexpr int PROVISION_CLOUD_PROPERTY = 7;
 
     std::cout << "========================================================\n";
     std::cout << DISCOVERY_ENROLLEE << ". Discovery Enrollee Resource \n";
@@ -360,6 +422,7 @@ void DisplayMenu()
     std::cout << GET_STATUS << ". Get Status from Enrollee  \n";
     std::cout << GET_CONFIGURATION << ". Get Configuration from Enrollee  \n";
     std::cout << PROVISION_DEVICE_PROPERTY << ". Provision Device Property\n";
+    std::cout << REQUEST_TO_CONNECT << ". Request to Connect  \n";
     std::cout << PROVISION_CLOUD_PROPERTY << ". Provision Cloud Property  \n";
     std::cout << "========================================================\n";
 
@@ -382,6 +445,9 @@ void DisplayMenu()
         case PROVISION_DEVICE_PROPERTY:
             provisionDeviceProperty();
             break;
+        case REQUEST_TO_CONNECT:
+            requestToConnect();
+            break;
         case PROVISION_CLOUD_PROPERTY:
             provisionCloudProperty();
             break;
@@ -411,16 +477,16 @@ int main()
     {
 #ifdef __WITH_DTLS__
         //Initializing the provisioning client stack using the db path provided by the application.
-        OCStackResult result = OCSecure::provisionInit("");
+        OCStackResult result = OCSecure::provisionInit("PDM_sub.db");
 
         if (result != OC_STACK_OK)
         {
             return -1;
         }
 #endif
-    }catch(OCException& e)
+    }catch (...)
     {
-        std::cout << "Exception in main: "<<e.what();
+        std::cout << "Exception in main: " << std::endl;
     }
 
     while (true)
@@ -429,9 +495,9 @@ int main()
         {
             DisplayMenu();
         }
-        catch (const std::exception& e)
+        catch (...)
         {
-            std::cout << "Exception caught in main " << e.what() << std::endl;
+            std::cout << "Exception caught in main " << std::endl;
         }
     }