#include <vector>
#endif
+#include "OCPlatform.h"
#include "ocstack.h"
#include "octypes.h"
+#ifdef __WITH_DTLS__
+#include "securevirtualresourcetypes.h"
+#include "OCProvisioningManager.hpp"
+#include "ocrandom.h"
+#endif
-using namespace std;
+#include "escommon.h"
-// Defines
-#define IP_PORT 55555
-
-/**
- * Attributes used to form a proper easysetup conforming JSON message
- */
-#define OC_RSRVD_ES_PROVSTATUS "ps"
-#define OC_RSRVD_ES_LAST_ERRORCODE "lec"
-#define OC_RSRVD_ES_LINKS "links"
-#define OC_RSRVD_ES_SUPPORTEDWIFIMODE "swmt"
-#define OC_RSRVD_ES_SUPPORTEDWIFIFREQ "swf"
-#define OC_RSRVD_ES_SSID "tnn"
-#define OC_RSRVD_ES_CRED "cd"
-#define OC_RSRVD_ES_AUTHTYPE "wat"
-#define OC_RSRVD_ES_ENCTYPE "wet"
-#define OC_RSRVD_ES_AUTHCODE "ac"
-#define OC_RSRVD_ES_AUTHPROVIDER "apn"
-#define OC_RSRVD_ES_CISERVER "cis"
-#define OC_RSRVD_ES_SERVERID "sid"
-#define OC_RSRVD_ES_DEVNAME "dn"
-#define OC_RSRVD_ES_LANGUAGE "lang"
-#define OC_RSRVD_ES_COUNTRY "ctry"
-
-/**
- * Easysetup defined resoruce types and uris
- */
-#define OC_RSRVD_ES_RES_TYPE_PROV "ocf.wk.prov"
-#define OC_RSRVD_ES_URI_PROV "/ProvisioningResURI"
-#define OC_RSRVD_ES_RES_TYPE_WIFI "ocf.wk.wifi"
-#define OC_RSRVD_ES_URI_WIFI "/WiFiProvisioningResURI"
-#define OC_RSRVD_ES_RES_TYPE_CLOUDSERVER "ocf.wk.cloudserver"
-#define OC_RSRVD_ES_URI_CLOUDSERVER "/CloudServerProvisioningResURI"
-#define OC_RSRVD_ES_RES_TYPE_DEVCONF "ocf.wk.devconf"
-#define OC_RSRVD_ES_URI_DEVCONF "/DevConfProvisioningResURI"
+using namespace OC;
+using namespace std;
#ifndef WITH_ARDUINO
namespace OIC
{
namespace Service
{
- typedef enum
- {
- ES_ERROR = -1,
- ES_OK = 0,
- ES_NETWORKFOUND = 1,
- ES_NETWORKCONNECTED,
- ES_NETWORKNOTCONNECTED,
- ES_RESOURCECREATED = 11,
- ES_RECVREQOFPROVRES = 21,
- ES_RECVREQOFNETRES,
- ES_RECVUPDATEOFPROVRES,
- ES_RECVTRIGGEROFPROVRES,
- ES_UNAUTHORIZED = 31
- } ESResult;
-
/**
- * @brief WIFI Authentication tlype of the Enroller
+ * @brief Properties of easysetup resource. It includes a provisioning status and last
+ * error code.
*/
- typedef enum
+ class EnrolleeStatus
{
- NONE_AUTH = 0, /**< NO authentication **/
- WEP, /**< WEP **/
- WPA_PSK, /**< WPA-PSK **/
- WPA2_PSK /**< WPA2-PSK **/
- } WIFI_AUTHTYPE;
+ public:
- /**
- * @brief WIFI encryption type of the Enroller
- */
- typedef enum
- {
- NONE_ENC = 0, /**< NO encryption **/
- WEP_64, /**< WEP-64 **/
- WEP_128, /**< WEP-128**/
- TKIP, /**< TKIP **/
- AES, /**< AES **/
- TKIP_AES /**< TKIP-AES **/
- } WIFI_ENCTYPE;
+ /**
+ * Constructor
+ */
+ EnrolleeStatus(const OCRepresentation& rep)
+ {
+ m_rep = rep;
+ }
- /**
- * @brief Supported WIFI frequency like 2.4G and 5G
- */
- typedef enum
- {
- WIFI_24G = 0, /**< 2.4G **/
- WIFI_5G, /**< 5G **/
- WIFI_BOTH /**< 2.4G and 5G **/
- } WIFI_FREQ;
+ EnrolleeStatus(const EnrolleeStatus& enrolleeStatus) :
+ m_rep(enrolleeStatus.getRepresentation())
+ {
+ }
- /**
- * @brief Supported WIFI mode like 802.11g and 802.11n
- */
- typedef enum
- {
- WIFI_11A = 0, /**< 802.11a **/
- WIFI_11B, /**< 802.11b **/
- WIFI_11G, /**< 802.11g **/
- WIFI_11N, /**< 802.11n **/
- WIFI_11AC /**< 802.11ac **/
- } WIFI_MODE;
+ EnrolleeStatus(const EnrolleeStatus&& enrolleeStatus) :
+ m_rep(std::move(enrolleeStatus.getRepresentation()))
+ {
+ }
- /**
- * @brief Data structure stored for Cloud server property provisioning
- */
- typedef struct
- {
- string authCode; /**< Auth code issued by OAuth2.0-compatible account server **/
- string authProvider; /**< Auth provider ID **/
- string ciServer; /**< Cloud interface server URL which an Enrollee is going to registered **/
- } CloudProp;
+ /**
+ * Get a provisioning status property of Enrollee.
+ *
+ * @return a provisioning status property of Enrollee
+ */
+ ProvStatus getProvStatus() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_PROVSTATUS))
+ {
+ return static_cast<ProvStatus>(
+ m_rep.getValue<int>(OC_RSRVD_ES_PROVSTATUS));
+ }
+ return ES_STATE_INIT;
+ }
- /**
- * @brief Data structure stored for Device property provisioning which includes a WiFi
- * and device configuration provisioning
- */
- typedef struct
- {
/**
- * @brief Data structure stored for WiFi property provisioning
+ * Get a last error code property of Enrollee.
+ *
+ * @return a last error code property of Enrollee.
*/
- struct
+ ESErrorCode getLastErrCode() const
{
- string ssid; /**< Ssid of the Enroller **/
- string pwd; /**< Pwd of the Enroller **/
- WIFI_AUTHTYPE authtype; /**< Auth type of the Enroller **/
- WIFI_ENCTYPE enctype; /**< Encryption type of the Enroller **/
- } WIFI;
+ if(m_rep.hasAttribute(OC_RSRVD_ES_LAST_ERRORCODE))
+ {
+ return static_cast<ESErrorCode>(
+ m_rep.getValue<int>(OC_RSRVD_ES_LAST_ERRORCODE));
+ }
+ return ES_ERRCODE_NO_ERROR;
+ }
/**
- * @brief Data structure stored for device configuration property provisioning
+ * Get OCRepresentation object
+ *
+ * @return OCRepresentation object
*/
- struct
+ const OCRepresentation& getRepresentation() const
{
- string language; /**< IETF language tag using ISO 639X **/
- string country; /**< ISO Country Code (ISO 3166-1 Alpha-2) **/
- } Device;
- } DeviceProp;
+ return m_rep;
+ }
+ protected:
+ OCRepresentation m_rep;
+ };
/**
- * @brief Data structure for received properties of device configuration resource
+ * @brief Data class stored for provisioning of coap cloud server properties
*/
- typedef struct
+ class CloudProp
{
- string name; /**< Device's human-friendly name like device model name **/
- string language; /**< IETF language tag using ISO 639X **/
- string country; /**< ISO Country Code (ISO 3166-1 Alpha-2) **/
- } DeviceConfig;
+ public:
- /**
- * @brief Data structure for received properties of WiFi resource
- */
- typedef struct
- {
- vector<WIFI_MODE> modes; /**< Supported WIFI mode like 802.11g and 802.11n **/
- WIFI_FREQ freq; /**< Supported WIFI frequency like 2.4G and 5G **/
- } WiFiConfig;
+ /**
+ * Constructor
+ */
+ CloudProp()
+ {
+ m_cloudID = "";
+ m_credID = 0;
+ }
- /**
- * @brief Provisioning state in device property provisioning.
- */
- typedef enum
- {
- ES_PROVISIONING_ERROR = -1,
- ES_NEED_PROVISIONING,
- ES_PROVISIONED_ALREADY,
- ES_PROVISIONING_SUCCESS
- } ESDeviceProvState;
+ CloudProp(const CloudProp& cloudProp) :
+ m_rep(cloudProp.toOCRepresentation()),
+ m_cloudID(cloudProp.getCloudID()),
+ m_credID(cloudProp.getCredID())
+ {
+ }
+
+ CloudProp(const CloudProp&& cloudProp) :
+ m_rep(std::move(cloudProp.toOCRepresentation())),
+ m_cloudID(cloudProp.getCloudID()),
+ m_credID(cloudProp.getCredID())
+ {
+ }
+
+ /**
+ * Constructor with OCRepresentation object. This is used for JNI communication.
+ */
+ CloudProp(const OCRepresentation &rep)
+ {
+ m_rep = rep;
+ m_cloudID = "";
+ m_credID = 0;
+ }
+
+ /**
+ * Set CoapCloudConf resource properties to be delivered to Enrollee
+ *
+ * @param authCode Auth code issued by OAuth2.0-compatible account server
+ * @param authProvider Auth provider ID
+ * @param ciServer Cloud interface server URL which an Enrollee is going to registered
+ */
+ void setCloudProp(string authCode, string authProvider, string ciServer)
+ {
+ m_rep.setValue(OC_RSRVD_ES_AUTHCODE, authCode);
+ m_rep.setValue(OC_RSRVD_ES_AUTHPROVIDER, authProvider);
+ m_rep.setValue(OC_RSRVD_ES_CISERVER, ciServer);
+ }
+
+ /**
+ * Set CoapCloudConf resource properties with Access token to be delivered to Enrollee
+ *
+ * @param accessToken Access token which is given in a return of auth code issued by
+ * OAuth2.0-compatible account server
+ * @param tokenType Access token type, i.e. "bearer"
+ * @param authProvider Auth provider ID
+ * @param ciServer Cloud interface server URL which an Enrollee is going to registered
+ *
+ * @see OAUTH_TOKENTYPE
+ */
+ void setCloudPropWithAccessToken(string accessToken, OAUTH_TOKENTYPE tokenType,
+ string authProvider, string ciServer)
+ {
+ m_rep.setValue(OC_RSRVD_ES_ACCESSTOKEN, accessToken);
+ m_rep.setValue(OC_RSRVD_ES_ACCESSTOKEN_TYPE, tokenType);
+ m_rep.setValue(OC_RSRVD_ES_AUTHPROVIDER, authProvider);
+ m_rep.setValue(OC_RSRVD_ES_CISERVER, ciServer);
+ }
+
+ /**
+ * Set CloudServer's UUID
+ *
+ * @param cloudID Cloud Interface server's UUID
+ */
+ void setCloudID(string cloudID)
+ {
+ m_cloudID = cloudID;
+ }
+
+ /**
+ * Set CloudServer's credential ID of certificate
+ *
+ * @param credID Cloud Interface server's credential ID of certificate
+ */
+ void setCredID(int credID)
+ {
+ m_credID = credID;
+ }
+
+ /**
+ * Get an auth code to be delivered.
+ *
+ * @return an auth code to be delivered.
+ */
+ std::string getAuthCode() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_AUTHCODE))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_AUTHCODE);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get an auth provider which issued an auth code
+ *
+ * @return an auth provider which issued an auth code
+ */
+ std::string getAuthProvider() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_AUTHPROVIDER))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_AUTHPROVIDER);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get a CI server to be delivered
+ *
+ * @return a CI server to be delivered
+ */
+ std::string getCiServer() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_CISERVER))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_CISERVER);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get a CI server's Uuid to be delivered
+ *
+ * @return a CI server's Uuid to be delivered
+ */
+ std::string getCloudID() const
+ {
+ return m_cloudID;
+ }
+
+ /**
+ * Get a CI server's credential ID of certificate
+ *
+ * @return a CI server's credential ID of certificated
+ */
+ int getCredID() const
+ {
+ return m_credID;
+ }
+
+ /**
+ * Get an access token to be delivered.
+ *
+ * @return an access token to be delivered.
+ */
+ std::string getAccessToken() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_ACCESSTOKEN))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_ACCESSTOKEN);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get an access token type to be delivered.
+ *
+ * @return an access token type to be delivered.
+ */
+ OAUTH_TOKENTYPE getAccessTokenType() const
+ {
+
+ if(m_rep.hasAttribute(OC_RSRVD_ES_ACCESSTOKEN_TYPE))
+ {
+ return static_cast<OAUTH_TOKENTYPE>(
+ m_rep.getValue<int>(OC_RSRVD_ES_ACCESSTOKEN_TYPE));
+ }
+ return NONE_OAUTH_TOKENTYPE;
+ }
+
+ /**
+ * Get OCRepresentation object
+ *
+ * @return OCRepresentation object
+ */
+ const OCRepresentation &toOCRepresentation() const
+ {
+ return m_rep;
+ }
+ protected:
+ OCRepresentation m_rep;
+ std::string m_cloudID;
+ int m_credID;
+ };
/**
- * @brief Provisioning state in cloud server property provisioning.
+ * @brief Data class stored for provisioning of Device properties which includes
+ * properties of WiFiConf resource and DevConf resource
*/
- typedef enum
+ class DeviceProp
{
- ES_CLOUD_PROVISIONING_ERROR = -1, /**< An error in cloud provisioning happens **/
- ES_CLOUD_PROVISIONING_SUCCESS, /**< Cloud provisioning is successfully done **/
- ES_CLOUD_ENROLLEE_FOUND, /**< An enrollee is found in a given network **/
- ES_CLOUD_ENROLLEE_NOT_FOUND /**< NO enrollee is found in a given network **/
- }ESCloudProvState;
+ public:
+
+ /**
+ * Constructor
+ */
+ DeviceProp()
+ {
+ }
+
+ DeviceProp(const DeviceProp& deviceProp) :
+ m_rep(deviceProp.toOCRepresentation())
+ {
+ }
+
+ DeviceProp(const DeviceProp&& deviceProp) :
+ m_rep(std::move(deviceProp.toOCRepresentation()))
+ {
+ }
+
+ /**
+ * Constructor with OCRepresentation object. This is used for JNI communication.
+ */
+ DeviceProp(const OCRepresentation &rep)
+ {
+ m_rep = rep;
+ }
+
+ /**
+ * Set WiFiConf resource properties to be delivered to Enrollee
+ *
+ * @param ssid Ssid of the Enroller
+ * @param pwd Pwd of the Enrolle
+ * @param authtype Auth type of the Enroller
+ * @param enctype Encryption type of the Enroller
+ *
+ * @see WIFI_AUTHTYPE
+ * @see WIFI_ENCTYPE
+ */
+ void setWiFiProp(string ssid, string pwd, WIFI_AUTHTYPE authtype, WIFI_ENCTYPE enctype)
+ {
+ m_rep.setValue(OC_RSRVD_ES_SSID, ssid);
+ m_rep.setValue(OC_RSRVD_ES_CRED, pwd);
+ m_rep.setValue(OC_RSRVD_ES_AUTHTYPE, authtype);
+ m_rep.setValue(OC_RSRVD_ES_ENCTYPE, enctype);
+ }
+
+ /**
+ * Get a SSID of Enroller
+ *
+ * @return a SSID of enroller
+ */
+ std::string getSsid() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_SSID))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_SSID);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get a password of Enroller
+ *
+ * @return a password of enroller
+ */
+ std::string getPassword() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_CRED))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_CRED);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get an auth type of Enroller
+ *
+ * @return an auth type of enroller
+ *
+ * @see WIFI_AUTHTYPE
+ */
+ WIFI_AUTHTYPE getAuthType() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_AUTHTYPE))
+ {
+ return static_cast<WIFI_AUTHTYPE>(m_rep.getValue<int>(OC_RSRVD_ES_AUTHTYPE));
+ }
+ return NONE_AUTH;
+ }
+
+ /**
+ * Get an encryption type of Enroller
+ *
+ * @return an encryption type of enroller
+ *
+ * @see WIFI_ENCTYPE
+ */
+ WIFI_ENCTYPE getEncType() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_ENCTYPE))
+ {
+ return static_cast<WIFI_ENCTYPE>(m_rep.getValue<int>(OC_RSRVD_ES_ENCTYPE));
+ }
+ return NONE_ENC;
+ }
+
+ /**
+ * Get OCRepresentation object
+ *
+ * @return OCRepresentation object
+ */
+ const OCRepresentation &toOCRepresentation() const
+ {
+ return m_rep;
+ }
+
+ protected:
+ OCRepresentation m_rep;
+ };
/**
* Security Provisioning Status
SecProvisioningStatus(string deviceUUID, ESResult result) :
m_devUUID(deviceUUID), m_result(result)
{
+#ifdef __WITH_DTLS__
+ m_selectedOTMethod = OIC_JUST_WORKS;
+ m_isMOTEnabled = false;
+ m_isOwned = false;
+ m_ownerID = {};
+#endif
}
+#ifdef __WITH_DTLS__
+ SecProvisioningStatus(std::shared_ptr<OCSecureResource> resource, ESResult result) :
+ m_result(result)
+ {
+ m_isMOTEnabled = false;
+ if(resource.get() != nullptr)
+ {
+ m_devUUID = resource->getDeviceID();
+ m_isOwned = resource->getOwnedStatus();
+#ifdef MULTIPLE_OWNER
+ m_isMOTEnabled = resource->isMOTEnabled();
+#endif
+
+ if( OC_STACK_OK != resource->getOTMethod(&m_selectedOTMethod) )
+ {
+ m_selectedOTMethod = OIC_OXM_COUNT; // Out-of-range
+ }
- const string getDeviceUUID()
+ if(resource->getOwnedStatus())
+ {
+ char uuidString[UUID_STRING_SIZE] = {};
+ if(RAND_UUID_OK == OCConvertUuidToString(resource->getDevPtr()->doxm->owner.id, uuidString))
+ {
+ m_ownerID = uuidString;
+ }
+ else
+ {
+ m_ownerID = {};
+ }
+ }
+ }
+ }
+
+ OicSecOxm_t getSelectedOTMethod() const
{
- return m_devUUID;
+ return m_selectedOTMethod;
}
+ bool isMOTEnabled() const
+ {
+ return m_isMOTEnabled;
+ }
+
+ bool isOwnedDevice() const
+ {
+ return m_isOwned;
+ }
+
+ const std::string getOwnerID()
+ {
+ return m_ownerID;
+ }
+#endif
+ const std::string getDeviceUUID()
+ {
+ return m_devUUID;
+ }
+ /**
+ * Get a result for about security provisioning is success or not.
+ *
+ * @return ::ES_OK\n
+ * ::ES_SEC_OPERATION_IS_NOT_SUPPORTED\n
+ * ::ES_SECURE_RESOURCE_DISCOVERY_FAILURE\n
+ * ::ES_OWNERSHIP_TRANSFER_FAILURE\n
+ * ::ES_ERROR\n
+ */
ESResult getESResult()
{
return m_result;
private:
string m_devUUID;
ESResult m_result;
+#ifdef __WITH_DTLS__
+ OicSecOxm_t m_selectedOTMethod;
+ bool m_isMOTEnabled;
+ bool m_isOwned;
+ std::string m_ownerID;
+#endif
};
/**
- * It comprises sets of WiFi and device configuration properties.
- * Additionally, it provides a variable, m_cloudable, to make app know if
- * the enrollee has a preference to register IoTivity cloud server.
+ * @breif This provide a set of getter APIs from received response for getConfiguration().
+ * Received information includes a device name, WiFi supported mode, and frequency.
+ * Additionally, you can know if Enrollee can be access to cloud server with this
+ * object.
*/
class EnrolleeConf
{
public:
- EnrolleeConf()
+ /**
+ * Constructor
+ * The expected OCRepresentation is one for collection resource and has several child
+ * OCRepresentation object corresponding to WiFiConf, DevConf, and CoapCloudConf
+ * resources' representations.
+ */
+ EnrolleeConf(const OCRepresentation& rep) :
+ m_EasySetupRep(rep)
+ {
+ }
+
+ EnrolleeConf(const EnrolleeConf& enrolleeConf) :
+ m_EasySetupRep(enrolleeConf.getEasySetupRep())
+ {
+ }
+
+ EnrolleeConf(const EnrolleeConf&& enrolleeConf) :
+ m_EasySetupRep(std::move(enrolleeConf.getEasySetupRep()))
+ {
+ }
+
+ /**
+ * Get a device name of Enrollee. It is Device's human-friendly name like device model
+ * name.
+ *
+ * @return a device name of Enrollee
+ */
+ std::string getDeviceName() const
+ {
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
+ for(auto child = children.begin(); child != children.end(); ++child)
+ {
+ if(child->getUri().find(OC_RSRVD_ES_URI_DEVCONF) != std::string::npos)
+ {
+ OCRepresentation rep;
+ if(child->hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = child->getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return std::string("");
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_DEVNAME))
+ {
+ return rep.getValue<std::string>(OC_RSRVD_ES_DEVNAME);
+ }
+ }
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get a set of WiFi supported modes of Enrollee
+ *
+ * @return a set of WiFi supported modes of Enrollee
+ *
+ * @see WIFI_MODE
+ */
+ vector<WIFI_MODE> getWiFiModes() const
{
+ vector<WIFI_MODE> modes;
+ modes.clear();
+
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
+ for(auto child = children.begin(); child != children.end(); ++child)
+ {
+ if(child->getUri().find(OC_RSRVD_ES_URI_WIFICONF) != std::string::npos)
+ {
+ OCRepresentation rep;
+ if(child->hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = child->getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return modes;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIMODE))
+ {
+ for(auto it : rep.getValue
+ <std::vector<int>>(OC_RSRVD_ES_SUPPORTEDWIFIMODE))
+ {
+ modes.push_back(static_cast<WIFI_MODE>(it));
+ }
+ }
+ }
+ }
+ return modes;
}
- EnrolleeConf(DeviceConfig devConfig, WiFiConfig wifiConfig, bool cloudable) :
- m_devConfig(devConfig), m_wifiConfig(wifiConfig), m_cloudable(cloudable)
+ /**
+ * Get a WiFi supported frequency of Enrollee
+ *
+ * @return a WiFi supported frequency of Enrollee
+ *
+ * @see WIFI_FREQ
+ */
+ WIFI_FREQ getWiFiFreq() const
{
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
+ for(auto child = children.begin(); child != children.end(); ++child)
+ {
+ if(child->getUri().find(OC_RSRVD_ES_URI_WIFICONF) != std::string::npos)
+ {
+ OCRepresentation rep;
+ if(child->hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = child->getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return WIFI_FREQ_NONE;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIFREQ))
+ {
+ return static_cast<WIFI_FREQ>(
+ rep.getValue<int>(OC_RSRVD_ES_SUPPORTEDWIFIFREQ));
+ }
+ }
+ }
+ return WIFI_FREQ_NONE;
}
- const DeviceConfig& getDevConf() const
+ /**
+ * Get a provisioning status property of Enrollee.
+ *
+ * @return a provisioning status property of Enrollee
+ */
+ ProvStatus getProvStatus() const
{
- return m_devConfig;
+ OCRepresentation rep;
+ if(m_EasySetupRep.hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = m_EasySetupRep.getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return ES_STATE_INIT;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_PROVSTATUS))
+ {
+ return static_cast<ProvStatus>(
+ rep.getValue<int>(OC_RSRVD_ES_PROVSTATUS));
+ }
+ return ES_STATE_INIT;
}
- const WiFiConfig& getWiFiConf() const
+ /**
+ * Get a last error code property of Enrollee.
+ *
+ * @return a last error code property of Enrollee.
+ */
+ ESErrorCode getLastErrCode() const
{
- return m_wifiConfig;
+ OCRepresentation rep;
+ if(m_EasySetupRep.hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = m_EasySetupRep.getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return ES_ERRCODE_NO_ERROR;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_LAST_ERRORCODE))
+ {
+ return static_cast<ESErrorCode>(
+ rep.getValue<int>(OC_RSRVD_ES_LAST_ERRORCODE));
+ }
+ return ES_ERRCODE_NO_ERROR;
}
- bool isCloudable() const
+ /**
+ * Get an accessibility to cloud server of an Enrollee
+ *
+ * @return an accessibility to cloud server of an Enrollee
+ */
+ bool isCloudAccessible() const
{
- return m_cloudable;
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
+ for(auto child = children.begin(); child != children.end(); ++child)
+ {
+ for(auto rt : child->getResourceTypes())
+ {
+ if(0 == rt.compare(OC_RSRVD_ES_RES_TYPE_COAPCLOUDCONF))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Get OCRepresentation object
+ *
+ * @return OCRepresentation object
+ */
+ const OCRepresentation& getEasySetupRep() const
+ {
+ return m_EasySetupRep;
+ }
+
+ protected:
+ OCRepresentation m_EasySetupRep;
+ };
+
+ /**
+ * Status object for getStatus API. This object is given to application
+ * when a response for GET request to provisioning resource at Enrollee is arrived.
+ * It returns a result of the API and requested data delivered in the response which includes
+ * a provisioning status and last error code stored in Enrollee.
+ *
+ * @see EnrolleeStatus
+ */
+ class GetEnrolleeStatus
+ {
+ public:
+ /**
+ * Constructor
+ */
+ GetEnrolleeStatus(ESResult result, const EnrolleeStatus& status) :
+ m_result(result), m_enrolleeStatus(status)
+ {
+ }
+
+ /**
+ * Get a result of getting provisioning status and last error code of Enrollee
+ *
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
+ * @see ESResult
+ */
+ ESResult getESResult()
+ {
+ return m_result;
+ }
+
+ /**
+ * Get Enrollee's status and last error code properties
+ *
+ * @return Enrollee's status and last error code properties
+ *
+ * @see EnrolleeStatus
+ */
+ const EnrolleeStatus& getEnrolleeStatus()
+ {
+ return m_enrolleeStatus;
}
private:
- DeviceConfig m_devConfig;
- WiFiConfig m_wifiConfig;
- bool m_cloudable;
+ ESResult m_result;
+ EnrolleeStatus m_enrolleeStatus;
};
/**
* Status object for getConfiguration API. This object is given to application
* when a response for GET request to provisioning resource at Enrollee is arrived.
- * It returns a result of the API and requested data delivered in the response
+ * It returns a result of the API and requested data delivered in the response which includes
+ * WiFi configuration and device configuration stored in Enrollee.
*
* @see EnrolleeConf
*/
class GetConfigurationStatus
{
public:
+ /**
+ * Constructor
+ */
GetConfigurationStatus(ESResult result, const EnrolleeConf& conf) :
m_result(result), m_enrolleeConf(conf)
{
}
+ /**
+ * Get a result of getting preconfiguration of Enrollee
+ *
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
+ *
+ * @see ESResult
+ */
ESResult getESResult()
{
return m_result;
}
- const EnrolleeConf& getEnrolleeConf()
+ /**
+ * Get Enrollee's pre-configuration properties
+ *
+ * @return Enrollee's pre-configuration properties
+ *
+ * @see EnrolleeConf
+ */
+ EnrolleeConf& getEnrolleeConf()
{
return m_enrolleeConf;
}
class DevicePropProvisioningStatus
{
public:
+ /**
+ * Constructor
+ */
DevicePropProvisioningStatus(ESResult result) :
m_result(result)
{
}
+ /**
+ * Get a result of Device property provisioning
+ *
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
+ *
+ * @see ESResult
+ */
ESResult getESResult()
{
return m_result;
}
-
private:
ESResult m_result;
};
class CloudPropProvisioningStatus
{
public:
- CloudPropProvisioningStatus(ESResult result, ESCloudProvState state) :
- m_result(result), m_esCloudState(state)
+ /**
+ * Constructor
+ */
+ CloudPropProvisioningStatus(ESResult result) :
+ m_result(result)
{
}
+ /**
+ * Get a result of Cloud property provisioning
+ *
+ * @return ::ES_OK\n
+ * ::ES_ENROLLEE_DISCOVERY_FAILURE\n
+ * ::ES_SECURE_RESOURCE_DISCOVERY_FAILURE\n
+ * ::ES_ACL_PROVISIONING_FAILURE\n
+ * ::ES_CERT_PROVISIONING_FAILURE\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
+ *
+ * @see ESResult
+ */
ESResult getESResult()
{
return m_result;
}
- ESCloudProvState getESCloudState()
+ private:
+ ESResult m_result;
+ };
+
+ /**
+ * Status object for connect API. This object is given to application
+ * when a response for 'Connect' request from Enrollee is arrived.
+ */
+ class ConnectRequestStatus
+ {
+ public:
+ /**
+ * Constructor
+ */
+ ConnectRequestStatus(ESResult result) :
+ m_result(result)
+ {
+ }
+
+ /**
+ * Get a result of Connect request
+ *
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
+ *
+ * @see ESResult
+ */
+ ESResult getESResult()
{
- return m_esCloudState;
+ return m_result;
}
private:
ESResult m_result;
- ESCloudProvState m_esCloudState;
+ };
+
+ class ESOwnershipTransferData
+ {
+ public:
+#ifdef __WITH_DTLS__
+ ESOwnershipTransferData() :
+ m_MOTMethod(OIC_OXM_COUNT), m_preconfiguredPin("")
+ {
+ }
+
+ ESOwnershipTransferData(const ESOwnershipTransferData& data) :
+ m_MOTMethod(data.getMOTMethod()),
+ m_preconfiguredPin(data.getPreConfiguredPin())
+ {
+ }
+
+ ESResult setMOTMethod(OicSecOxm_t method)
+ {
+#ifdef MULTIPLE_OWNER
+ if(OIC_RANDOM_DEVICE_PIN != method)
+ {
+ return ES_ERROR;
+ }
+
+ m_MOTMethod = method;
+ return ES_OK;
+#else
+ (void) method;
+
+ return ES_ERROR;
+#endif
+ }
+
+ ESResult setMOTMethod(OicSecOxm_t method, const std::string& pin)
+ {
+#ifdef MULTIPLE_OWNER
+ if(OIC_PRECONFIG_PIN != method || pin.empty())
+ {
+ return ES_ERROR;
+ }
+
+ m_preconfiguredPin = pin;
+ m_MOTMethod = method;
+ return ES_OK;
+#else
+ (void) method;
+ (void) pin;
+
+ return ES_ERROR;
+#endif
+ }
+
+ OicSecOxm_t getMOTMethod() const
+ {
+ return m_MOTMethod;
+ }
+
+ std::string getPreConfiguredPin() const
+ {
+ return m_preconfiguredPin;
+ }
+
+ private:
+ OicSecOxm_t m_MOTMethod;
+ std::string m_preconfiguredPin;
+#endif
};
/**
- * Callback function definition for providing Enrollee security status
+ * Callback function definition for providing Enrollee status
+ */
+ typedef function< void(shared_ptr< GetEnrolleeStatus >) > GetStatusCb;
+
+ /**
+ * Callback function definition for providing Enrollee configuration status
*/
typedef function< void(shared_ptr< GetConfigurationStatus >) > GetConfigurationStatusCb;
/**
- * Callback function definition for providing Enrollee security status
+ * Callback function definition for providing Enrollee device property provisioning status
*/
typedef function< void(shared_ptr< DevicePropProvisioningStatus >) > DevicePropProvStatusCb;
/**
- * Callback function definition for providing Enrollee security status
+ * Callback function definition for providing Enrollee cloud property provisioning status
*/
typedef function< void(shared_ptr< CloudPropProvisioningStatus >) > CloudPropProvStatusCb;
/**
- * Callback function definition for providing Enrollee security status
+ * Callback function definition for providing 'Connect' request status
+ */
+ typedef function< void(shared_ptr< ConnectRequestStatus >) > ConnectRequestStatusCb;
+
+
+ /**
+ * Callback function definition for providing Enrollee security provisioning status
*/
typedef function< void(shared_ptr<SecProvisioningStatus>) > SecurityProvStatusCb;
/**
+ * Callback function definition for providing Enrollee security provisioning status.
+ * This callback is an overloaded version of SecurityProvStatusCb, which has
+ * ESOwnershipTransferData as a return value.
+ */
+ typedef function< ESOwnershipTransferData(shared_ptr<SecProvisioningStatus>) >
+ SecurityProvStatusCbWithOption;
+
+ /**
* Callback definition to be invoked when the security stack expects a pin from application
*/
typedef function< void(string&) > SecurityPinCb;