Add APIs for provisioning tool 57/71957/18
authoryoungman <yman.jung@samsung.com>
Mon, 30 May 2016 02:06:15 +0000 (11:06 +0900)
committeryoungman <yman.jung@samsung.com>
Wed, 22 Jun 2016 08:08:20 +0000 (17:08 +0900)
Change-Id: I7590663eade9b8f4d8e1cbdbac73b82452068ad2

20 files changed:
common/ic-ioty-types.c
lib/icl-ioty.c
lib/icl-ioty.h
lib/icl-provisioning-struct.c [new file with mode: 0644]
lib/icl-provisioning-struct.h [new file with mode: 0644]
lib/icl-provisioning.c [new file with mode: 0644]
lib/icl.c
lib/icl.h
lib/include/iotcon-errors.h
lib/include/iotcon-internal.h [new file with mode: 0644]
lib/include/iotcon-provisioning.h [new file with mode: 0644]
test/CMakeLists.txt
test/iotcon-test-basic-client.c
test/iotcon-test-basic-server.c
test/iotcon-test-encap-client.c
test/iotcon-test-encap-server.c
test/iotcon-test-iface-client.c
test/iotcon-test-iface-server.c
test/iotcon-test-svr-db-client.dat [new file with mode: 0644]
test/iotcon-test-svr-db-server.dat [new file with mode: 0644]

index 3bb6f1343e173d73247c452d455c7a4395af0939..eb16e01d4203644a83a4012c2b2eebed3b0eca62 100644 (file)
@@ -184,10 +184,16 @@ uint8_t ic_ioty_parse_oic_policies(uint8_t oic_policies)
 iotcon_error_e ic_ioty_parse_oic_error(OCStackResult ret)
 {
        switch (ret) {
+       case OC_STACK_OK:
+       case OC_STACK_RESOURCE_CREATED: /* for Provisioning Tool */
+       case OC_STACK_RESOURCE_DELETED:
+               return IOTCON_ERROR_NONE;
        case OC_STACK_NO_MEMORY:
                return IOTCON_ERROR_OUT_OF_MEMORY;
        case OC_STACK_NO_RESOURCE:
                return IOTCON_ERROR_NO_DATA;
+       case OC_STACK_AUTHENTICATION_FAILURE:
+               return IOTCON_ERROR_AUTHENTICATION_FAILURE;
        default:
                WARN("Unknown result(%d)", ret);
        }
index 0ffb25e2a5c844c19fb477b4987779807d1bb977..1c911e11b6f55aacd4c5fb471e67857ccebce9ac 100644 (file)
@@ -24,6 +24,7 @@
 #include <ocstack.h>
 #include <ocpayload.h>
 #include <system_settings.h>
+#include <pinoxmcommon.h>
 
 #include "iotcon.h"
 #include "ic-utils.h"
@@ -76,7 +77,7 @@ static FILE* _icl_ioty_ps_fopen(const char *path, const char *mode)
        return fopen(icl_svr_db_file, mode);
 }
 
-int icl_ioty_set_persistent_storage(const char *file_path)
+int icl_ioty_set_persistent_storage(const char *file_path, bool is_pt)
 {
        FN_CALL;
        int ret;
@@ -85,10 +86,18 @@ int icl_ioty_set_persistent_storage(const char *file_path)
        RETV_IF(NULL == file_path, IOTCON_ERROR_INVALID_PARAMETER);
 
        if (-1 == access(file_path, F_OK)) {
-               ret = icl_cbor_create_svr_db(file_path);
-               if (IOTCON_ERROR_NONE != ret) {
-                       ERR("icl_cbor_create_svr_db() Fail(%d)", ret);
-                       return ret;
+               if (true == is_pt) {
+                       ret = icl_cbor_create_pt_svr_db(file_path);
+                       if (IOTCON_ERROR_NONE != ret) {
+                               ERR("icl_cbor_create_pt_svr_db() Fail(%d)", ret);
+                               return ret;
+                       }
+               } else {
+                       ret = icl_cbor_create_svr_db(file_path);
+                       if (IOTCON_ERROR_NONE != ret) {
+                               ERR("icl_cbor_create_svr_db() Fail(%d)", ret);
+                               return ret;
+                       }
                }
        } else if (-1 == access(file_path, R_OK | W_OK)) {
                ERR("access() Fail(%d)", errno);
@@ -113,6 +122,22 @@ int icl_ioty_set_persistent_storage(const char *file_path)
        return IOTCON_ERROR_NONE;
 }
 
+void show_pin(char *pin, size_t length)
+{
+       FN_CALL;
+
+       INFO("PIN : %s", pin);
+}
+
+int icl_ioty_set_generate_pin_cb()
+{
+       FN_CALL;
+
+       SetGeneratePinCB(&show_pin);
+
+       return IOTCON_ERROR_NONE;
+}
+
 int icl_ioty_init(pthread_t *out_thread)
 {
        FN_CALL;
@@ -128,6 +153,9 @@ int icl_ioty_init(pthread_t *out_thread)
                return ic_ioty_parse_oic_error(result);
        }
 
+       // TODO: temp code
+       icl_ioty_set_generate_pin_cb();
+
        icl_ioty_ocprocess_start();
 
        pthread_attr_init(&attr);
index d34ccf52d87056d6977ded24e8327d59814144ed..e93494d25410b2966c9373a013cbb4c6354d6320 100644 (file)
@@ -42,7 +42,7 @@ typedef struct {
 void icl_ioty_deinit(pthread_t thread);
 int icl_ioty_init(pthread_t *out_thread);
 
-int icl_ioty_set_persistent_storage(const char *file_path);
+int icl_ioty_set_persistent_storage(const char *file_path, bool is_pt);
 
 int icl_ioty_set_device_info(const char *device_name);
 int icl_ioty_set_platform_info();
diff --git a/lib/icl-provisioning-struct.c b/lib/icl-provisioning-struct.c
new file mode 100644 (file)
index 0000000..665c2a3
--- /dev/null
@@ -0,0 +1,859 @@
+/*
+ * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+#include <glib.h>
+#include <octypes.h>
+#include <ocstack.h>
+#include <ocprovisioningmanager.h>
+#include <oxmjustworks.h>
+#include <oxmrandompin.h>
+#include <pmutility.h>
+
+#include "iotcon.h"
+#include "iotcon-provisioning.h"
+#include "ic-utils.h"
+#include "ic-ioty-types.h"
+#include "icl.h"
+#include "icl-ioty.h"
+#include "icl-provisioning-struct.h"
+
+#define ICL_PROVISIONING_TIMEOUT_MAX 10
+
+struct icl_provisioning_device {
+       bool is_found;
+       OCProvisionDev_t *device;
+       char *host_address;
+       int connectivity_type;
+       char *device_id;
+};
+
+struct icl_provisioning_devices {
+       bool is_found;
+       OCProvisionDev_t *dev_list;
+};
+
+struct icl_provisioning_acl {
+       OCProvisionDev_t *device;
+       GList *resource_list;
+       int permission;
+};
+
+
+static char* _provisioning_parse_uuid(OicUuid_t *uuid)
+{
+       char uuid_string[256] = {0};
+
+       snprintf(uuid_string, sizeof(uuid_string),
+                       "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                       (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+                       (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+                       (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+                       (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
+
+       return strdup(uuid_string);
+}
+
+
+static OCProvisionDev_t* _provisioning_device_clone(OCProvisionDev_t *src)
+{
+       FN_CALL;
+
+       OCProvisionDev_t *clone;
+
+       clone = PMCloneOCProvisionDev(src);
+       if (NULL == clone) {
+               ERR("PMCloneOCProvisionDev() Fail");
+               return NULL;
+       }
+
+       if (clone->pstat) {
+               if (src->pstat->sm) {
+                       clone->pstat->sm = calloc(1, sizeof(OicSecDpom_t));
+                       if (NULL == clone->pstat->sm) {
+                               ERR("calloc() Fail(%d)", errno);
+                               return NULL;
+                       }
+                       memcpy(clone->pstat->sm, src->pstat->sm, sizeof(OicSecDpom_t));
+               }
+       }
+
+       if (clone->doxm) {
+               if (src->doxm->oxmType) {
+                       clone->doxm->oxmType = calloc(1, sizeof(OicUrn_t));
+                       if (NULL == clone->doxm->oxmType) {
+                               ERR("calloc() Fail(%d)", errno);
+                               return NULL;
+                       }
+                       memcpy(clone->doxm->oxmType, src->doxm->oxmType, sizeof(OicUrn_t));
+               }
+               if (src->doxm->oxm) {
+                       clone->doxm->oxm = calloc(1, sizeof(OicSecOxm_t));
+                       if (NULL == clone->doxm->oxm) {
+                               ERR("calloc() Fail(%d)", errno);
+                               return NULL;
+                       }
+                       memcpy(clone->doxm->oxm, src->doxm->oxm, sizeof(OicSecOxm_t));
+               }
+       }
+
+       return clone;
+}
+
+/*
+void icl_provisioning_device_destroy(OCProvisionDev_t *src)
+{
+       FN_CALL;
+
+       OCDeleteDiscoveredDevices(src);
+}
+*/
+
+
+static int _provisioning_device_get_host_address(OCProvisionDev_t *device,
+               char **host_address, int *connectivity_type)
+{
+       FN_CALL;
+       char host[PATH_MAX] = {0};
+       int temp_connectivity_type = CT_DEFAULT;
+
+       if (device->connType & CT_ADAPTER_IP) {
+               if (device->connType & CT_IP_USE_V4) {
+                       temp_connectivity_type = IOTCON_CONNECTIVITY_IPV4;
+               } else if (device->connType & CT_IP_USE_V6) {
+                       temp_connectivity_type = IOTCON_CONNECTIVITY_IPV6;
+               } else {
+                       ERR("Invalid Connectivity Type(%d)", device->connType);
+                       return IOTCON_ERROR_IOTIVITY;
+               }
+       } else {
+               ERR("Invalid Connectivity Type(%d)", device->connType);
+               return IOTCON_ERROR_IOTIVITY;
+       }
+
+       switch (temp_connectivity_type) {
+       case IOTCON_CONNECTIVITY_IPV6:
+               snprintf(host, sizeof(host), "[%s]:%d", device->endpoint.addr,
+                               device->endpoint.port);
+               break;
+       case IOTCON_CONNECTIVITY_IPV4:
+               snprintf(host, sizeof(host), "%s:%d", device->endpoint.addr,
+                               device->endpoint.port);
+               break;
+       default:
+               ERR("Invalid Connectivity Type(%d)", device->connType);
+               return IOTCON_ERROR_IOTIVITY;
+       }
+
+       *host_address = strdup(host);
+       *connectivity_type = temp_connectivity_type;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static int _provisioning_device_create(OCProvisionDev_t *device,
+               iotcon_provisioning_device_h *ret_device)
+{
+       FN_CALL;
+       int ret;
+       iotcon_provisioning_device_h temp;
+
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+
+       temp = calloc(1, sizeof(struct icl_provisioning_device));
+       if (NULL == temp) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       temp->device = _provisioning_device_clone(device);
+       if (NULL == temp->device) {
+               ERR("_provisioning_device_clone() Fail");
+               free(temp);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = _provisioning_device_get_host_address(device, &temp->host_address,
+                       &temp->connectivity_type);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisioning_device_get_host_address() Fail(%d)", ret);
+               OCDeleteDiscoveredDevices(temp->device);
+               free(temp);
+               return ret;
+       }
+
+       temp->device_id = _provisioning_parse_uuid(&device->doxm->deviceID);
+
+       *ret_device = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_device_clone(iotcon_provisioning_device_h device,
+               iotcon_provisioning_device_h *cloned_device)
+{
+       FN_CALL;
+       int ret;
+       iotcon_provisioning_device_h temp;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cloned_device, IOTCON_ERROR_INVALID_PARAMETER);
+
+       ret = _provisioning_device_create(device->device, &temp);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisioning_device_create() Fail(%d)", ret);
+               return ret;
+       }
+
+       *cloned_device = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_device_destroy(iotcon_provisioning_device_h device)
+{
+       FN_CALL;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+
+       if (true == device->is_found) {
+               ERR("It can't be destroyed by user.");
+               return IOTCON_ERROR_INVALID_PARAMETER;
+       }
+
+       free(device->host_address);
+       free(device->device_id);
+
+       OCDeleteDiscoveredDevices(device->device);
+
+       free(device);
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+void icl_provisioning_device_set_found(iotcon_provisioning_device_h device)
+{
+       if (NULL == device)
+               return;
+
+       device->is_found = true;
+}
+
+
+void icl_provisioning_device_unset_found(iotcon_provisioning_device_h device)
+{
+       if (NULL == device)
+               return;
+
+       device->is_found = false;
+}
+
+
+OCProvisionDev_t* icl_provisioning_device_get_device(
+               iotcon_provisioning_device_h device)
+{
+       FN_CALL;
+       RETV_IF(NULL == device, NULL);
+
+       return device->device;
+}
+
+
+API int iotcon_provisioning_device_get_host_address(iotcon_provisioning_device_h device,
+               char **host_address)
+{
+       FN_CALL;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
+
+       *host_address = device->host_address;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_device_get_connectivity_type(
+               iotcon_provisioning_device_h device,
+               iotcon_connectivity_type_e *connectivity_type)
+{
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == connectivity_type, IOTCON_ERROR_INVALID_PARAMETER);
+
+       *connectivity_type = device->connectivity_type;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_device_get_id(iotcon_provisioning_device_h device,
+               char **device_id)
+{
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device_id, IOTCON_ERROR_INVALID_PARAMETER);
+
+       *device_id = device->device_id;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static int _provisioning_parse_oxm(OicSecOxm_t oic_oxm, iotcon_provisioning_oxm_e *oxm)
+{
+       iotcon_provisioning_oxm_e temp;
+
+       switch (oic_oxm) {
+       case OIC_JUST_WORKS:
+               temp = IOTCON_OXM_JUST_WORKS;
+               break;
+       case OIC_RANDOM_DEVICE_PIN:
+               temp = IOTCON_OXM_RANDOM_PIN;
+               break;
+       case OIC_MANUFACTURER_CERTIFICATE:
+       default:
+               ERR("Invalid oxm(%d)", oic_oxm);
+               return IOTCON_ERROR_INVALID_PARAMETER;
+       }
+
+       *oxm = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_device_get_oxm(iotcon_provisioning_device_h device,
+               iotcon_provisioning_oxm_e *oxm)
+{
+       int ret;
+       iotcon_provisioning_oxm_e temp;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == oxm, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device->device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device->device->doxm, IOTCON_ERROR_INVALID_PARAMETER);
+
+       ret = _provisioning_parse_oxm(device->device->doxm->oxmSel, &temp);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisioning_parse_oxm() Fail(%d)", ret);
+               return IOTCON_ERROR_INVALID_PARAMETER;
+       }
+
+       *oxm = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+int icl_provisioning_devices_create(OCProvisionDev_t *dev_list,
+               iotcon_provisioning_devices_h *devices)
+{
+       FN_CALL;
+       iotcon_provisioning_devices_h temp;
+
+       RETV_IF(NULL == devices, IOTCON_ERROR_INVALID_PARAMETER);
+
+       temp = calloc(1, sizeof(struct icl_provisioning_devices));
+       if (NULL == temp) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       temp->dev_list = dev_list;
+
+       *devices = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_devices_create(iotcon_provisioning_devices_h *devices)
+{
+       FN_CALL;
+       int ret;
+       iotcon_provisioning_devices_h temp;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == devices, IOTCON_ERROR_INVALID_PARAMETER);
+
+       ret = icl_provisioning_devices_create(NULL, &temp);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("icl_provisioning_devices_create() Fail(%d)", ret);
+               return ret;
+       }
+
+       *devices = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_devices_destroy(iotcon_provisioning_devices_h devices)
+{
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == devices, IOTCON_ERROR_INVALID_PARAMETER);
+
+       if (true == devices->is_found) {
+               ERR("It can't be destroyed by user.");
+               return IOTCON_ERROR_INVALID_PARAMETER;
+       }
+
+       if (devices->dev_list)
+               OCDeleteDiscoveredDevices(devices->dev_list);
+
+       free(devices);
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+OCProvisionDev_t* icl_provisioning_devices_clone(OCProvisionDev_t *src)
+{
+       OCProvisionDev_t *clone;
+       OCProvisionDev_t *current;
+
+       if (NULL == src)
+               return NULL;
+
+       clone = _provisioning_device_clone(src);
+       if (NULL == clone) {
+               ERR("_provisioning_device_clone() Fail");
+               return NULL;
+       }
+
+       current = clone;
+       src = src->next;
+
+       for (; src; src = src->next, current = current->next) {
+               current->next = _provisioning_device_clone(src);
+               if (NULL == current->next) {
+                       ERR("_provisioning_device_clone() Fail");
+                       OCDeleteDiscoveredDevices(clone);
+                       return NULL;
+               }
+       }
+
+       return clone;
+}
+
+
+API int iotcon_provisioning_devices_clone(iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_devices_h *cloned_devices)
+{
+       int ret;
+       iotcon_provisioning_devices_h temp;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == devices, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == devices->dev_list, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cloned_devices, IOTCON_ERROR_INVALID_PARAMETER);
+
+       ret = iotcon_provisioning_devices_create(&temp);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_devices_create() Fail(%d)", ret);
+               return ret;
+       }
+
+       temp->dev_list = icl_provisioning_devices_clone(devices->dev_list);
+       if (NULL == temp->dev_list) {
+               ERR("icl_provisioning_devices_clone() Fail");
+               free(temp);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       *cloned_devices = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+void icl_provisioning_devices_set_found(iotcon_provisioning_devices_h devices)
+{
+       if (NULL == devices)
+               return;
+
+       devices->is_found = true;
+}
+
+
+void icl_provisioning_devices_unset_found(iotcon_provisioning_devices_h devices)
+{
+       if (NULL == devices)
+               return;
+
+       devices->is_found = false;
+}
+
+
+API int iotcon_provisioning_devices_foreach(iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_devices_foreach_cb cb, void *user_data)
+{
+       int ret;
+       OCProvisionDev_t *current;
+       iotcon_provisioning_device_h device;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == devices, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       current = devices->dev_list;
+
+       for (; current; current = current->next) {
+               ret = _provisioning_device_create(current, &device);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("_provisioning_device_create() Fail(%d)", ret);
+                       return ret;
+               }
+
+               if (IOTCON_FUNC_STOP == cb(devices, device, user_data)) {
+                       iotcon_provisioning_device_destroy(device);
+                       break;
+               }
+               iotcon_provisioning_device_destroy(device);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+OCProvisionDev_t* icl_provisioning_devices_get_devices(
+               iotcon_provisioning_devices_h devices)
+{
+       FN_CALL;
+       RETV_IF(NULL == devices, NULL);
+
+       icl_provisioning_devices_print_uuid(devices);
+
+       return devices->dev_list;
+}
+
+
+bool icl_provisioning_compare_oic_uuid(OicUuid_t *a, OicUuid_t *b)
+{
+       int i;
+       bool ret = true;
+
+       RETV_IF(NULL == a, false);
+       RETV_IF(NULL == b, false);
+
+       for (i = 0; i < UUID_LENGTH; i++) {
+               if ((*a).id[i] != (*b).id[i]) {
+                       ret = false;
+                       break;
+               }
+       }
+       return ret;
+}
+
+
+int icl_provisioning_devices_move_device(OicUuid_t *a,
+               iotcon_provisioning_devices_h unowned_devices,
+               iotcon_provisioning_devices_h owned_devices)
+{
+       FN_CALL;
+       OCProvisionDev_t *owned_dev_list = owned_devices->dev_list;
+       OCProvisionDev_t *previous;
+       OCProvisionDev_t *current;
+
+       previous = NULL;
+       current = icl_provisioning_devices_get_devices(unowned_devices);
+
+       for (; current; previous = current, current = current->next) {
+               if (false == icl_provisioning_compare_oic_uuid(a, &current->doxm->deviceID))
+                       continue;
+
+               if (previous)
+                       previous->next = current->next;
+               else
+                       unowned_devices->dev_list = current->next;
+
+               current->next = owned_dev_list;
+               owned_devices->dev_list = current;
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_devices_add_device(iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_device_h device)
+{
+       FN_CALL;
+       OCProvisionDev_t *current;
+       OCProvisionDev_t *dev_list = devices->dev_list;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+
+       current = icl_provisioning_devices_get_devices(devices);
+       for (; current; current = current->next) {
+               if (true == icl_provisioning_compare_oic_uuid(&current->doxm->deviceID,
+                                       &device->device->doxm->deviceID)) {
+                       ERR("%s is already contained.", device->device_id);
+                       return IOTCON_ERROR_ALREADY;
+               }
+       }
+
+       current = _provisioning_device_clone(device->device);
+       if (NULL == current) {
+               ERR("_provisioning_device_clone() Fail");
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       while (dev_list->next)
+               dev_list = dev_list->next;
+
+       dev_list->next = current;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_print_uuid(OicUuid_t *uuid)
+{
+       DBG("Device ID : %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                       (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+                       (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+                       (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+                       (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
+}
+
+
+void icl_provisioning_devices_print_uuid(iotcon_provisioning_devices_h devices)
+{
+       OCProvisionDev_t *dev_list;
+
+       if (NULL == devices)
+               return;
+
+       for (dev_list = devices->dev_list; dev_list; dev_list = dev_list->next)
+               _provisioning_print_uuid(&dev_list->doxm->deviceID);
+}
+
+
+API int iotcon_provisioning_acl_create(iotcon_provisioning_acl_h *acl)
+{
+       iotcon_provisioning_acl_h temp;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+
+       temp = calloc(1, sizeof(struct icl_provisioning_acl));
+       if (NULL == temp) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       *acl = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static gpointer _provisioning_acl_resource_list_clone(gconstpointer src,
+               gpointer data)
+{
+       return ic_utils_strdup(src);
+}
+
+
+int icl_provisioning_acl_clone(iotcon_provisioning_acl_h acl,
+               iotcon_provisioning_acl_h *cloned_acl)
+{
+       int ret;
+       iotcon_provisioning_acl_h temp;
+
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cloned_acl, IOTCON_ERROR_INVALID_PARAMETER);
+
+       ret = iotcon_provisioning_acl_create(&temp);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_acl_create() Fail(%d)", ret);
+               return ret;
+       }
+
+       temp->device = _provisioning_device_clone(acl->device);
+       if (NULL == temp->device) {
+               ERR("_provisioning_device_clone() Fail");
+               iotcon_provisioning_acl_destroy(temp);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       temp->resource_list = g_list_copy_deep(acl->resource_list,
+                       _provisioning_acl_resource_list_clone, NULL);
+
+       temp->permission = acl->permission;
+
+       *cloned_acl = temp;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_acl_set_subject(iotcon_provisioning_acl_h acl,
+               iotcon_provisioning_device_h device)
+{
+       OCProvisionDev_t *dev;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+
+       dev = _provisioning_device_clone(device->device);
+       if (NULL == dev) {
+               ERR("_provisioning_device_clone() Fail");
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       OCDeleteDiscoveredDevices(acl->device);
+
+       acl->device = dev;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_acl_set_all_subject(iotcon_provisioning_acl_h acl)
+{
+       OCProvisionDev_t *dev;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+
+       dev = calloc(1, sizeof(OCProvisionDev_t));
+       if (NULL == dev) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       dev->doxm = calloc(1, sizeof(OicSecDoxm_t));
+       if (NULL == dev->doxm) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       memcpy(&dev->doxm->deviceID, "*", 2);
+
+       OCDeleteDiscoveredDevices(acl->device);
+
+       acl->device = dev;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+OCProvisionDev_t* icl_provisioning_acl_get_subject(iotcon_provisioning_acl_h acl)
+{
+       RETV_IF(NULL == acl, NULL);
+
+       return acl->device;
+}
+
+
+API int iotcon_provisioning_acl_add_resource(iotcon_provisioning_acl_h acl,
+               const char *uri_path)
+{
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == uri_path, IOTCON_ERROR_INVALID_PARAMETER);
+
+       acl->resource_list = g_list_append(acl->resource_list, ic_utils_strdup(uri_path));
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_acl_set_permission(iotcon_provisioning_acl_h acl,
+               int permission)
+{
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(permission <= 0 || IOTCON_PERMISSION_FULL_CONTROL < permission,
+                       IOTCON_ERROR_INVALID_PARAMETER);
+
+       acl->permission = permission;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+int icl_provisioning_acl_get_resource_count(iotcon_provisioning_acl_h acl)
+{
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+
+       return g_list_length(acl->resource_list);
+}
+
+
+char* icl_provisioning_acl_get_nth_resource(iotcon_provisioning_acl_h acl, int index)
+{
+       RETV_IF(NULL == acl, NULL);
+
+       return g_list_nth_data(acl->resource_list, index);
+}
+
+
+API int iotcon_provisioning_acl_destroy(iotcon_provisioning_acl_h acl)
+{
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+
+       OCDeleteDiscoveredDevices(acl->device);
+       g_list_free_full(acl->resource_list, free);
+       free(acl);
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+int icl_provisioning_acl_convert_permission(int permission)
+{
+       int oic_permission = 0;
+
+       if (permission & IOTCON_PERMISSION_CREATE)
+               oic_permission |= PERMISSION_CREATE;
+       if (permission & IOTCON_PERMISSION_READ)
+               oic_permission |= PERMISSION_READ;
+       if (permission & IOTCON_PERMISSION_WRITE)
+               oic_permission |= PERMISSION_WRITE;
+       if (permission & IOTCON_PERMISSION_DELETE)
+               oic_permission |= PERMISSION_DELETE;
+       if (permission & IOTCON_PERMISSION_NOTIFY)
+               oic_permission |= PERMISSION_NOTIFY;
+
+       DBG("permission : %d", oic_permission);
+
+       return oic_permission;
+}
+
+
+int icl_provisioning_acl_get_permission(iotcon_provisioning_acl_h acl)
+{
+       RETV_IF(NULL == acl, 0);
+
+       return acl->permission;
+}
+
diff --git a/lib/icl-provisioning-struct.h b/lib/icl-provisioning-struct.h
new file mode 100644 (file)
index 0000000..350120b
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __IOT_CONNECTIVITY_LIBRARY_PROVISIONING_STRUCT_H__
+#define __IOT_CONNECTIVITY_LIBRARY_PROVISIONING_STRUCT_H__
+
+#include <ocprovisioningmanager.h>
+
+void icl_provisioning_device_set_found(iotcon_provisioning_device_h device);
+void icl_provisioning_device_unset_found(iotcon_provisioning_device_h device);
+
+OCProvisionDev_t* icl_provisioning_device_get_device(
+               iotcon_provisioning_device_h devices);
+
+void icl_provisioning_devices_set_found(iotcon_provisioning_devices_h devices);
+void icl_provisioning_devices_unset_found(iotcon_provisioning_devices_h devices);
+
+int icl_provisioning_devices_create(OCProvisionDev_t *dev_list,
+               iotcon_provisioning_devices_h *devices);
+
+OCProvisionDev_t* icl_provisioning_devices_get_devices(
+               iotcon_provisioning_devices_h devices);
+
+int icl_provisioning_devices_move_device(OicUuid_t *a,
+               iotcon_provisioning_devices_h unowned_devices,
+               iotcon_provisioning_devices_h owned_devices);
+
+OCProvisionDev_t* icl_provisioning_devices_clone(OCProvisionDev_t *src);
+
+void icl_provisioning_device_print_uuid(iotcon_provisioning_device_h device);
+void icl_provisioning_devices_print_uuid(iotcon_provisioning_devices_h devices);
+bool icl_provisioning_compare_oic_uuid(OicUuid_t *a, OicUuid_t *b);
+
+int icl_provisioning_acl_clone(iotcon_provisioning_acl_h acl,
+               iotcon_provisioning_acl_h *cloned_acl);
+OCProvisionDev_t* icl_provisioning_acl_get_subject(
+               iotcon_provisioning_acl_h acl);
+int icl_provisioning_acl_get_resource_count(iotcon_provisioning_acl_h acl);
+char* icl_provisioning_acl_get_nth_resource(iotcon_provisioning_acl_h acl, int index);
+int icl_provisioning_acl_convert_permission(int permission);
+int icl_provisioning_acl_get_permission(iotcon_provisioning_acl_h acl);
+
+#endif /* __IOT_CONNECTIVITY_LIBRARY_PROVISIONING_STRUCT_H__ */
diff --git a/lib/icl-provisioning.c b/lib/icl-provisioning.c
new file mode 100644 (file)
index 0000000..e6c8e41
--- /dev/null
@@ -0,0 +1,1426 @@
+/*
+ * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+#include <glib.h>
+#include <octypes.h>
+#include <ocstack.h>
+#include <ocprovisioningmanager.h>
+#include <oxmjustworks.h>
+#include <oxmrandompin.h>
+#include <pmutility.h>
+
+#include "iotcon.h"
+#include "iotcon-provisioning.h"
+#include "ic-utils.h"
+#include "ic-ioty-types.h"
+#include "icl.h"
+#include "icl-ioty.h"
+#include "icl-provisioning-struct.h"
+
+#define ICL_PROVISIONING_TIMEOUT_MAX 10
+
+typedef enum {
+       ICL_PROVISIONING_DISCOVER_ALL_DEVICES,
+       ICL_PROVISIONING_DISCOVER_OWNED_DEVICES,
+       ICL_PROVISIONING_DISCOVER_UNOWNED_DEVICES,
+       ICL_PROVISIONING_REMOVE_DEVICE,
+} icl_provisioning_discover_e;
+
+struct icl_provisioning_randompins_cb_container {
+       iotcon_provisioning_randompins_cb cb;
+       void *user_data;
+};
+
+struct icl_provisioning_discover_cb_container {
+       int timeout;
+       iotcon_provisioning_found_devices_cb cb;
+       void *user_data;
+       iotcon_provisioning_devices_h owned_devices;
+       iotcon_provisioning_devices_h unowned_devices;
+};
+
+struct icl_provisioning_ownership_transfer_cb_container {
+       int count;
+       OCProvisionResult_t *result_list;
+       iotcon_provisioning_devices_h devices;
+       iotcon_provisioning_ownership_transfer_cb cb;
+       void *user_data;
+};
+
+struct icl_provisioning_provision_cred_cb_container {
+       iotcon_provisioning_device_h device1;
+       iotcon_provisioning_device_h device2;
+       iotcon_error_e result;
+       iotcon_provisioning_provision_cred_cb cb;
+       void *user_data;
+};
+
+struct icl_provisioning_provision_acl_cb_container {
+       iotcon_provisioning_device_h device;
+       iotcon_provisioning_acl_h acl;
+       iotcon_error_e result;
+       iotcon_provisioning_provision_acl_cb cb;
+       void *user_data;
+};
+
+struct icl_provisioning_pairwise_devices_cb_container {
+       iotcon_provisioning_device_h device1;
+       iotcon_provisioning_acl_h acl1;
+       iotcon_provisioning_device_h device2;
+       iotcon_provisioning_acl_h acl2;
+       iotcon_error_e result;
+       iotcon_provisioning_pairwise_devices_cb cb;
+       void *user_data;
+};
+
+struct icl_provisioning_unlink_pairwise_cb_container {
+       iotcon_provisioning_device_h device1;
+       iotcon_provisioning_device_h device2;
+       iotcon_error_e result;
+       iotcon_provisioning_unlink_pairwise_cb cb;
+       void *user_data;
+};
+
+struct icl_provisioning_remove_device_cb_container {
+       int timeout;
+       iotcon_provisioning_device_h device;
+       iotcon_error_e result;
+       iotcon_provisioning_remove_device_cb cb;
+       void *user_data;
+};
+
+static OTMCallbackData_t icl_justworks_otmcb;
+static OTMCallbackData_t icl_pinbased_otmcb;
+static struct icl_provisioning_randompins_cb_container icl_randompins_cb_container;
+
+static iotcon_provisioning_devices_h icl_owned_devices;
+static iotcon_provisioning_devices_h icl_unowned_devices;
+
+static void* _provisioning_remove_device_thread(void *user_data);
+
+static void _provisioning_set_justworks()
+{
+       icl_justworks_otmcb.loadSecretCB = LoadSecretJustWorksCallback;
+       icl_justworks_otmcb.createSecureSessionCB = CreateSecureSessionJustWorksCallback;
+       icl_justworks_otmcb.createSelectOxmPayloadCB = CreateJustWorksSelectOxmPayload;
+       icl_justworks_otmcb.createOwnerTransferPayloadCB = CreateJustWorksOwnerTransferPayload;
+}
+
+
+static void _provisioning_set_randompins()
+{
+       icl_pinbased_otmcb.loadSecretCB = InputPinCodeCallback;
+       icl_pinbased_otmcb.createSecureSessionCB = CreateSecureSessionRandomPinCallback;
+       icl_pinbased_otmcb.createSelectOxmPayloadCB = CreatePinBasedSelectOxmPayload;
+       icl_pinbased_otmcb.createOwnerTransferPayloadCB = CreatePinBasedOwnerTransferPayload;
+}
+
+
+API int iotcon_provisioning_initialize(const char *file_path, const char *db_path)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(false == ic_utils_check_permission((IC_PERMISSION_INTERNET
+                                       |IC_PERMISSION_NETWORK_GET)), IOTCON_ERROR_PERMISSION_DENIED);
+       RETV_IF(NULL == file_path, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == db_path, IOTCON_ERROR_INVALID_PARAMETER);
+
+       ret = icl_initialize(file_path, true);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("icl_initialize() Fail(%d)", ret);
+               return ret;
+       }
+
+       ret = access(db_path, R_OK | W_OK);
+       if (-1 != ret)
+               DBG("Provisioning DB File already exists.");
+       else
+               DBG("No provisioning DB File, creating new.");
+
+       result = OCInitPM(db_path);
+       if (OC_STACK_OK != result) {
+               ERR("OCInitPM() Fail(%d)", result);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       _provisioning_set_justworks();
+       result = OCSetOwnerTransferCallbackData(OIC_JUST_WORKS, &icl_justworks_otmcb);
+       if (OC_STACK_OK != result) {
+               ERR("OCSetOwnerTransferCallbackData() Fail(%d)", result);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_input_pin_cb(char *pin, size_t len)
+{
+       FN_CALL;
+       char *temp;
+
+       RET_IF(NULL == icl_randompins_cb_container.cb);
+       RET_IF(NULL == pin);
+       RET_IF(len <= OXM_RANDOM_PIN_SIZE);
+
+       temp = icl_randompins_cb_container.cb(icl_randompins_cb_container.user_data);
+       if ((NULL == temp) || (len <= strlen(temp))) {
+               ERR("Invalid Pin Number");
+               return;
+       }
+
+       strncpy(pin, temp, len);
+}
+
+
+API int iotcon_provisioning_set_randompins(iotcon_provisioning_randompins_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       OCStackResult result;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       _provisioning_set_randompins();
+       result = OCSetOwnerTransferCallbackData(OIC_RANDOM_DEVICE_PIN, &icl_pinbased_otmcb);
+       if (OC_STACK_OK != result) {
+               ERR("OCSetOwnerTransferCallbackData() Fail(%d)", result);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       icl_randompins_cb_container.cb = cb;
+       icl_randompins_cb_container.user_data = user_data;
+
+       SetInputPinCB(_provisioning_input_pin_cb);
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_get_devices(iotcon_provisioning_devices_h *owned_devices,
+               iotcon_provisioning_devices_h *unowned_devices)
+{
+       FN_CALL;
+
+       if (owned_devices)
+               *owned_devices = icl_owned_devices;
+
+       if (unowned_devices)
+               *unowned_devices = icl_unowned_devices;
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_discover_cb_container_destroy(
+               struct icl_provisioning_discover_cb_container *container)
+{
+       FN_CALL;
+
+       if (container->owned_devices) {
+               iotcon_provisioning_devices_destroy(container->owned_devices);
+               container->owned_devices = NULL;
+       }
+
+       if (container->unowned_devices) {
+               iotcon_provisioning_devices_destroy(container->unowned_devices);
+               container->unowned_devices = NULL;
+       }
+
+       free(container);
+}
+
+
+static gboolean _provisioning_discover_idle_cb(gpointer p)
+{
+       FN_CALL;
+       struct icl_provisioning_discover_cb_container *container = p;
+
+       DBG("discovered owned devices");
+       icl_provisioning_devices_print_uuid(container->owned_devices);
+       DBG("discovered unowned devices");
+       icl_provisioning_devices_print_uuid(container->unowned_devices);
+
+       icl_provisioning_devices_set_found(container->owned_devices);
+       icl_provisioning_devices_set_found(container->unowned_devices);
+
+       if (container->cb)
+               container->cb(container->owned_devices, container->unowned_devices,
+                               container->user_data);
+
+       icl_provisioning_devices_unset_found(container->unowned_devices);
+       icl_provisioning_devices_unset_found(container->owned_devices);
+
+       _provisioning_discover_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void* _provisioning_discover_all_thread(void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+       OCProvisionDev_t *owned_list = NULL;
+       OCProvisionDev_t *unowned_list = NULL;
+       iotcon_provisioning_devices_h temp_devices;
+       struct icl_provisioning_discover_cb_container *container = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCGetDevInfoFromNetwork(container->timeout, &owned_list, &unowned_list);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCGetDevInfoFromNetwork() Fail(%d)", result);
+               _provisioning_discover_cb_container_destroy(container);
+               return NULL;
+       }
+
+       if (owned_list) {
+               ret = icl_provisioning_devices_create(owned_list, &container->owned_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("icl_provisioning_devices_create() Fail(%d)", ret);
+                       _provisioning_discover_cb_container_destroy(container);
+                       return NULL;
+               }
+
+               ret = iotcon_provisioning_devices_clone(container->owned_devices, &temp_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("iotcon_provisioning_devices_clone() Fail(%d)", ret);
+                       return NULL;
+               }
+
+               if (icl_owned_devices) {
+                       icl_provisioning_devices_unset_found(icl_owned_devices);
+                       iotcon_provisioning_devices_destroy(icl_owned_devices);
+               }
+               icl_owned_devices = temp_devices;
+               icl_provisioning_devices_set_found(icl_owned_devices);
+       }
+
+       if (unowned_list) {
+               ret = icl_provisioning_devices_create(unowned_list, &container->unowned_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("icl_provisioning_devices_create() Fail(%d)", ret);
+                       _provisioning_discover_cb_container_destroy(container);
+                       return NULL;
+               }
+
+               ret = iotcon_provisioning_devices_clone(container->unowned_devices, &temp_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("iotcon_provisioning_devices_clone() Fail(%d)", ret);
+                       return NULL;
+               }
+
+               if (icl_unowned_devices) {
+                       icl_provisioning_devices_unset_found(icl_unowned_devices);
+                       iotcon_provisioning_devices_destroy(icl_unowned_devices);
+               }
+               icl_unowned_devices = temp_devices;
+               icl_provisioning_devices_set_found(icl_unowned_devices);
+       }
+
+       g_idle_add(_provisioning_discover_idle_cb, container);
+
+       return NULL;
+}
+
+
+static void* _provisioning_discover_unowned_thread(void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+       OCProvisionDev_t *unowned_list = NULL;
+       iotcon_provisioning_devices_h temp_devices;
+       struct icl_provisioning_discover_cb_container *container = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCDiscoverUnownedDevices(container->timeout, &unowned_list);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCDiscoverUnownedDevices() Fail(%d)", result);
+               _provisioning_discover_cb_container_destroy(container);
+               return NULL;
+       }
+
+       if (unowned_list) {
+               ret = icl_provisioning_devices_create(unowned_list, &container->unowned_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("icl_provisioning_devices_create() Fail(%d)", ret);
+                       _provisioning_discover_cb_container_destroy(container);
+                       return NULL;
+               }
+
+               ret = iotcon_provisioning_devices_clone(container->unowned_devices, &temp_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("iotcon_provisioning_devices_clone() Fail(%d)", ret);
+                       return NULL;
+               }
+
+               if (icl_unowned_devices) {
+                       icl_provisioning_devices_unset_found(icl_unowned_devices);
+                       iotcon_provisioning_devices_destroy(icl_unowned_devices);
+               }
+               icl_unowned_devices = temp_devices;
+               icl_provisioning_devices_set_found(icl_unowned_devices);
+       }
+
+       g_idle_add(_provisioning_discover_idle_cb, container);
+
+       return NULL;
+}
+
+
+static void* _provisioning_discover_owned_thread(void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+       OCProvisionDev_t *owned_list = NULL;
+       iotcon_provisioning_devices_h temp_devices;
+       struct icl_provisioning_discover_cb_container *container = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCDiscoverOwnedDevices(container->timeout, &owned_list);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCDiscoverOwnedDevices() Fail(%d)", result);
+               _provisioning_discover_cb_container_destroy(container);
+               return NULL;
+       }
+
+       if (owned_list) {
+               ret = icl_provisioning_devices_create(owned_list, &container->owned_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("icl_provisioning_devices_create() Fail(%d)", ret);
+                       _provisioning_discover_cb_container_destroy(container);
+                       return NULL;
+               }
+
+               ret = iotcon_provisioning_devices_clone(container->owned_devices, &temp_devices);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("iotcon_provisioning_devices_clone() Fail(%d)", ret);
+                       return NULL;
+               }
+
+               if (icl_owned_devices) {
+                       icl_provisioning_devices_unset_found(icl_owned_devices);
+                       iotcon_provisioning_devices_destroy(icl_owned_devices);
+               }
+               icl_owned_devices = temp_devices;
+               icl_provisioning_devices_set_found(icl_owned_devices);
+       }
+
+       g_idle_add(_provisioning_discover_idle_cb, container);
+
+       return NULL;
+}
+
+
+static int _provisioning_thread(int type, void *user_data)
+{
+       int ret;
+       pthread_t thread;
+       void *thread_routine;
+
+       switch (type) {
+       case ICL_PROVISIONING_DISCOVER_ALL_DEVICES:
+               thread_routine = _provisioning_discover_all_thread;
+               break;
+       case ICL_PROVISIONING_DISCOVER_OWNED_DEVICES:
+               thread_routine = _provisioning_discover_owned_thread;
+               break;
+       case ICL_PROVISIONING_DISCOVER_UNOWNED_DEVICES:
+               thread_routine = _provisioning_discover_unowned_thread;
+               break;
+       case ICL_PROVISIONING_REMOVE_DEVICE:
+               thread_routine = _provisioning_remove_device_thread;
+               break;
+       default:
+               ERR("Invalid Type(%d)", type);
+               return IOTCON_ERROR_INVALID_TYPE;
+       }
+
+       ret = pthread_create(&thread, NULL, thread_routine, user_data);
+       if (0 != ret) {
+               ERR("pthread_create() Fail(%d)", ret);
+               return IOTCON_ERROR_SYSTEM;
+       }
+       pthread_detach(thread);
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_find_all_devices(int timeout,
+               iotcon_provisioning_found_devices_cb cb, void *user_data)
+{
+       FN_CALL;
+       int ret;
+       struct icl_provisioning_discover_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(timeout < 0 || ICL_PROVISIONING_TIMEOUT_MAX < timeout,
+                       IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       INFO("Discover All Devices");
+
+       container = calloc(1, sizeof(struct icl_provisioning_discover_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       container->timeout = timeout;
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ret = _provisioning_thread(ICL_PROVISIONING_DISCOVER_ALL_DEVICES, container);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisioning_thread() Fail(%d)", ret);
+               _provisioning_discover_cb_container_destroy(container);
+               return ret;
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_find_unowned_devices(int timeout,
+               iotcon_provisioning_found_devices_cb cb, void *user_data)
+{
+       FN_CALL;
+       int ret;
+       struct icl_provisioning_discover_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(timeout < 0 || ICL_PROVISIONING_TIMEOUT_MAX < timeout,
+                       IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       INFO("Discover Unowned Devices");
+
+       container = calloc(1, sizeof(struct icl_provisioning_discover_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       container->timeout = timeout;
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ret = _provisioning_thread(ICL_PROVISIONING_DISCOVER_UNOWNED_DEVICES,
+                       container);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisioning_thread() Fail(%d)", ret);
+               _provisioning_discover_cb_container_destroy(container);
+               return ret;
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_find_owned_devices(int timeout,
+               iotcon_provisioning_found_devices_cb cb, void *user_data)
+{
+       FN_CALL;
+       int ret;
+       struct icl_provisioning_discover_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(timeout < 0 || ICL_PROVISIONING_TIMEOUT_MAX < timeout,
+                       IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       INFO("Discover Owned Devices");
+
+       container = calloc(1, sizeof(struct icl_provisioning_discover_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       container->timeout = timeout;
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ret = _provisioning_thread(ICL_PROVISIONING_DISCOVER_OWNED_DEVICES,
+                       container);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisioning_thread() Fail(%d)", ret);
+               _provisioning_discover_cb_container_destroy(container);
+               return ret;
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_ownership_transfer_cb_container_destroy(
+               struct icl_provisioning_ownership_transfer_cb_container *container)
+{
+       if (container->devices) {
+               iotcon_provisioning_devices_destroy(container->devices);
+               container->devices = NULL;
+       }
+
+       free(container->result_list);
+       free(container);
+}
+
+
+static int _provisioning_ownership_transfer_get_result(
+               iotcon_provisioning_device_h device, OCProvisionResult_t *result_list, int count)
+{
+       int i;
+       OCProvisionDev_t *oic_device;
+
+       oic_device = icl_provisioning_device_get_device(device);
+
+       for (i = 0; i < count; i++) {
+               if (true == icl_provisioning_compare_oic_uuid(&oic_device->doxm->deviceID,
+                                       (OicUuid_t*)&result_list[i].deviceId))
+                       return ic_ioty_parse_oic_error(result_list[i].res);
+       }
+
+       return IOTCON_ERROR_IOTIVITY;
+}
+
+
+static bool _provisioning_ownership_transfer_foreach_cb(
+               iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_device_h device,
+               void *user_data)
+{
+       int result;
+       struct icl_provisioning_ownership_transfer_cb_container *container = user_data;
+
+       result = _provisioning_ownership_transfer_get_result(device, container->result_list,
+                       container->count);
+
+       icl_provisioning_device_set_found(device);
+
+       if (container->cb)
+               container->cb(device, result, container->user_data);
+
+       icl_provisioning_device_unset_found(device);
+
+       return IOTCON_FUNC_CONTINUE;
+}
+
+
+static gboolean _provisioning_ownership_transfer_idle_cb(gpointer p)
+{
+       int ret;
+       struct icl_provisioning_ownership_transfer_cb_container *container = p;
+
+       ret = iotcon_provisioning_devices_foreach(container->devices,
+                       _provisioning_ownership_transfer_foreach_cb, container);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_devices_foreach() Fail(%d)", ret);
+               if (container->cb)
+                       container->cb(NULL, ret, container->user_data);
+       }
+
+       _provisioning_ownership_transfer_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void _provisioning_ownership_transfer_cb(void *ctx, int n_of_res,
+               OCProvisionResult_t *arr, bool has_error)
+{
+       FN_CALL;
+       struct icl_provisioning_ownership_transfer_cb_container *container;
+       OCProvisionResult_t *result_list;
+
+       container = ctx;
+       container->count = n_of_res;
+
+       result_list = calloc(n_of_res + 1, sizeof(OCProvisionResult_t));
+       if (NULL == result_list) {
+               ERR("calloc() Fail(%d)", errno);
+               return;
+       }
+       memcpy(result_list, arr, n_of_res * sizeof(OCProvisionResult_t));
+
+       container->result_list = result_list;
+
+       if (true == has_error)
+               DBG("ownership transfer has error");
+
+       g_idle_add(_provisioning_ownership_transfer_idle_cb, container);
+
+       return;
+}
+
+
+API int iotcon_provisioning_register_unowned_devices(
+               iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_ownership_transfer_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+       OCProvisionDev_t *dev_list;
+       struct icl_provisioning_ownership_transfer_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == devices, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       container = calloc(1, sizeof(struct icl_provisioning_ownership_transfer_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = iotcon_provisioning_devices_clone(devices, &container->devices);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_devices_clone() Fail(%d)", ret);
+               _provisioning_ownership_transfer_cb_container_destroy(container);
+               return ret;
+       }
+
+       container->cb = cb;
+       container->user_data = user_data;
+
+       dev_list = icl_provisioning_devices_get_devices(devices);
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCDoOwnershipTransfer(container, dev_list, _provisioning_ownership_transfer_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCDoOwnershipTransfer() Fail(%d)", result);
+               _provisioning_ownership_transfer_cb_container_destroy(container);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_provisioning_register_unowned_device(
+               iotcon_provisioning_device_h device,
+               iotcon_provisioning_ownership_transfer_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+       OCProvisionDev_t *dev_list, *cloned_list;
+       struct icl_provisioning_ownership_transfer_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       container = calloc(1, sizeof(struct icl_provisioning_ownership_transfer_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       container->cb = cb;
+       container->user_data = user_data;
+
+       dev_list = icl_provisioning_device_get_device(device);
+       cloned_list = icl_provisioning_devices_clone(dev_list);
+
+       ret = icl_provisioning_devices_create(cloned_list, &container->devices);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("icl_provisioning_devices_create() Fail(%d)", ret);
+               return ret;
+       }
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCDoOwnershipTransfer(container, cloned_list, _provisioning_ownership_transfer_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCDoOwnershipTransfer() Fail(%d)", result);
+               _provisioning_ownership_transfer_cb_container_destroy(container);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_provision_cred_cb_container_destroy(
+               struct icl_provisioning_provision_cred_cb_container *container)
+{
+       FN_CALL;
+
+       if (container->device1) {
+               iotcon_provisioning_device_destroy(container->device1);
+               container->device1 = NULL;
+       }
+       if (container->device2) {
+               iotcon_provisioning_device_destroy(container->device2);
+               container->device2 = NULL;
+       }
+
+       free(container);
+}
+
+
+static gboolean _provisioning_provision_cred_idle_cb(gpointer p)
+{
+       struct icl_provisioning_provision_cred_cb_container *container = p;
+
+       if (container->cb) {
+               container->cb(container->device1, container->device2, container->result,
+                               container->user_data);
+       }
+
+       _provisioning_provision_cred_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void _provisioning_provision_cred_cb(void *ctx, int n_of_res,
+               OCProvisionResult_t *arr, bool has_error)
+{
+       FN_CALL;
+       int i;
+       struct icl_provisioning_provision_cred_cb_container *container = ctx;
+
+       if (true == has_error)
+               DBG("provision cred has error");
+
+       container->result = IOTCON_ERROR_NONE;
+
+       for (i = 0; i < n_of_res; i++) {
+               DBG("arr[%d].res : %d", i, arr[i].res);
+               if (OC_STACK_OK != arr[i].res)
+                       container->result = ic_ioty_parse_oic_error(arr[i].res);
+       }
+       g_idle_add(_provisioning_provision_cred_idle_cb, container);
+}
+
+
+API int iotcon_provisioning_provision_cred(iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_provisioning_provision_cred_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       int ret;
+       size_t key_size;
+       OCStackResult result;
+       struct icl_provisioning_provision_cred_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device1, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device2, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       key_size = OWNER_PSK_LENGTH_256; /* or OWNER_PSK_LENGTH_128 */
+
+       container = calloc(1, sizeof(struct icl_provisioning_provision_cred_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = iotcon_provisioning_device_clone(device1, &container->device1);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_provision_cred_cb_container_destroy(container);
+               return ret;
+       }
+       ret = iotcon_provisioning_device_clone(device2, &container->device2);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_provision_cred_cb_container_destroy(container);
+               return ret;
+       }
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCProvisionCredentials(container,
+                       SYMMETRIC_PAIR_WISE_KEY,
+                       key_size,
+                       icl_provisioning_device_get_device(container->device1),
+                       icl_provisioning_device_get_device(container->device2),
+                       _provisioning_provision_cred_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCProvisionCredentails() Fail(%d)", result);
+               _provisioning_provision_cred_cb_container_destroy(container);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_provision_acl_cb_container_destroy(
+               struct icl_provisioning_provision_acl_cb_container *container)
+{
+       FN_CALL;
+
+       if (container->device) {
+               iotcon_provisioning_device_destroy(container->device);
+               container->device = NULL;
+       }
+
+       free(container);
+}
+
+
+
+static char* _provisioning_parse_uuid(OicUuid_t *uuid)
+{
+       char uuid_string[256] = {0};
+
+       snprintf(uuid_string, sizeof(uuid_string),
+                       "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                       (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+                       (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+                       (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+                       (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
+
+       DBG("uuid : %s", uuid_string);
+
+       return strdup(uuid_string);
+}
+
+
+static OicSecAcl_t* _provisioning_convert_acl(iotcon_provisioning_device_h device,
+               iotcon_provisioning_acl_h acl)
+{
+       int i;
+       int permission;
+       char *uri_path;
+       OicSecAcl_t *oic_acl;
+       OCProvisionDev_t *subject, *oic_device;
+
+       oic_acl = calloc(1, sizeof(OicSecAcl_t));
+       if (NULL == oic_acl) {
+               ERR("calloc() Fail(%d)", errno);
+               return NULL;
+       }
+
+       subject = icl_provisioning_acl_get_subject(acl);
+
+       memcpy(&oic_acl->subject, &subject->doxm->deviceID, 128/8);
+       memcpy(&oic_acl->rownerID, &subject->doxm->deviceID, sizeof(OicUuid_t));
+
+       _provisioning_parse_uuid(&oic_acl->subject);
+
+       oic_acl->resourcesLen = icl_provisioning_acl_get_resource_count(acl);
+
+       oic_acl->resources = calloc(oic_acl->resourcesLen, sizeof(char *));
+       if (NULL == oic_acl->resources) {
+               ERR("calloc() Fail(%d)", errno);
+               OCDeleteACLList(oic_acl);
+               return NULL;
+       }
+       DBG("resource num : %d", oic_acl->resourcesLen);
+
+       for (i = 0; i < oic_acl->resourcesLen; i++) {
+               uri_path = icl_provisioning_acl_get_nth_resource(acl, i);
+               if (NULL == uri_path) {
+                       ERR("icl_provisioning_acl_get_nth_resource() Fail(%d)", errno);
+                       OCDeleteACLList(oic_acl);
+                       return NULL;
+               }
+               oic_acl->resources[i] = ic_utils_strdup(uri_path);
+               DBG("resource : (%s)", oic_acl->resources[i]);
+       }
+
+       permission = icl_provisioning_acl_get_permission(acl);
+       oic_acl->permission = icl_provisioning_acl_convert_permission(permission);
+
+       oic_device = icl_provisioning_device_get_device(device);
+
+       memcpy(&oic_acl->rownerID, &oic_device->doxm->deviceID, sizeof(OicUuid_t));
+
+       _provisioning_parse_uuid(&oic_acl->rownerID);
+
+       return oic_acl;
+}
+
+
+static gboolean _provisioning_provision_acl_idle_cb(void *p)
+{
+       struct icl_provisioning_provision_acl_cb_container *container = p;
+
+       if (container->cb) {
+               container->cb(container->device, container->acl, container->result,
+                               container->user_data);
+       }
+
+       _provisioning_provision_acl_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void _provisioning_provision_acl_cb(void *ctx, int n_of_res,
+               OCProvisionResult_t *arr, bool has_error)
+{
+       FN_CALL;
+       int i;
+       struct icl_provisioning_provision_acl_cb_container *container = ctx;
+
+       if (true == has_error)
+               DBG("provision acl has error");
+
+       container->result = IOTCON_ERROR_NONE;
+
+       for (i = 0; i < n_of_res; i++) {
+               DBG("arr[%d].res : %d", i, arr[i].res);
+               if (OC_STACK_OK != arr[i].res)
+                       container->result = ic_ioty_parse_oic_error(arr[i].res);
+       }
+       g_idle_add(_provisioning_provision_acl_idle_cb, container);
+}
+
+
+API int iotcon_provisioning_provision_acl(iotcon_provisioning_device_h device,
+               iotcon_provisioning_acl_h acl,
+               iotcon_provisioning_provision_acl_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OicSecAcl_t *oic_acl;
+       OCStackResult result;
+       struct icl_provisioning_provision_acl_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == acl, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       container = calloc(1, sizeof(struct icl_provisioning_provision_acl_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = iotcon_provisioning_device_clone(device, &container->device);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_provision_acl_cb_container_destroy(container);
+               return ret;
+       }
+
+       ret = icl_provisioning_acl_clone(acl, &container->acl);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("icl_provisioning_acl_clone() Fail(%d)", ret);
+               _provisioning_provision_acl_cb_container_destroy(container);
+               return ret;
+       }
+
+       container->cb = cb;
+       container->user_data = user_data;
+
+       oic_acl = _provisioning_convert_acl(device, acl);
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCProvisionACL(container,
+                       icl_provisioning_device_get_device(container->device),
+                       oic_acl,
+                       _provisioning_provision_acl_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCProvisionACL() Fail(%d)", result);
+               _provisioning_provision_acl_cb_container_destroy(container);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_pairwise_devices_cb_container_destroy(
+               struct icl_provisioning_pairwise_devices_cb_container *container)
+{
+       FN_CALL;
+
+       if (container->device1) {
+               iotcon_provisioning_device_destroy(container->device1);
+               container->device1 = NULL;
+       }
+       if (container->acl1) {
+               iotcon_provisioning_acl_destroy(container->acl1);
+               container->acl1 = NULL;
+       }
+       if (container->device2) {
+               iotcon_provisioning_device_destroy(container->device2);
+               container->device2 = NULL;
+       }
+       if (container->acl2) {
+               iotcon_provisioning_acl_destroy(container->acl2);
+               container->acl2 = NULL;
+       }
+
+       free(container);
+}
+
+
+static gboolean _provisioning_pairwise_devices_idle_cb(void *p)
+{
+       struct icl_provisioning_pairwise_devices_cb_container *container = p;
+
+       if (container->cb) {
+               container->cb(container->device1, container->device2, container->result,
+                               container->user_data);
+       }
+
+       _provisioning_pairwise_devices_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void _provisioning_pairwise_devices_cb(void *ctx, int n_of_res,
+               OCProvisionResult_t *arr, bool has_error)
+{
+       FN_CALL;
+       int i;
+       struct icl_provisioning_pairwise_devices_cb_container *container = ctx;
+
+       if (true == has_error)
+               DBG("pairwise devices has error");
+
+       container->result = IOTCON_ERROR_NONE;
+
+       for (i = 0; i < n_of_res; i++) {
+               DBG("arr[%d].res : %d", i, arr[i].res);
+               if (OC_STACK_OK != arr[i].res)
+                       container->result = ic_ioty_parse_oic_error(arr[i].res);
+       }
+       g_idle_add(_provisioning_pairwise_devices_idle_cb, container);
+}
+
+
+API int iotcon_provisioning_pairwise_devices(iotcon_provisioning_device_h device1,
+               iotcon_provisioning_acl_h acl1,
+               iotcon_provisioning_device_h device2,
+               iotcon_provisioning_acl_h acl2,
+               iotcon_provisioning_pairwise_devices_cb cb,
+               void *user_data)
+
+{
+       FN_CALL;
+       int ret;
+       size_t key_size;
+       OCStackResult result;
+       OicSecAcl_t *oic_acl1 = NULL;
+       OicSecAcl_t *oic_acl2 = NULL;
+       struct icl_provisioning_pairwise_devices_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device1, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device2, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       key_size = OWNER_PSK_LENGTH_256; /* or OWNER_PSK_LENGTH_256 */
+
+       container = calloc(1, sizeof(struct icl_provisioning_pairwise_devices_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = iotcon_provisioning_device_clone(device1, &container->device1);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_pairwise_devices_cb_container_destroy(container);
+               return ret;
+       }
+
+       if (acl1) {
+               ret = icl_provisioning_acl_clone(acl1, &container->acl1);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("icl_provisioning_acl_clone() Fail(%d)", ret);
+                       _provisioning_pairwise_devices_cb_container_destroy(container);
+                       return ret;
+               }
+               oic_acl1 = _provisioning_convert_acl(container->device1, container->acl1);
+       }
+
+       ret = iotcon_provisioning_device_clone(device2, &container->device2);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_pairwise_devices_cb_container_destroy(container);
+               return ret;
+       }
+
+       if (acl2) {
+               ret = icl_provisioning_acl_clone(acl2, &container->acl2);
+               if (IOTCON_ERROR_NONE != ret) {
+                       ERR("icl_provisioning_acl_clone() Fail(%d)", ret);
+                       _provisioning_pairwise_devices_cb_container_destroy(container);
+                       return ret;
+               }
+               oic_acl2 = _provisioning_convert_acl(container->device2, container->acl2);
+       }
+
+
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCProvisionPairwiseDevices(container,
+                       SYMMETRIC_PAIR_WISE_KEY,
+                       key_size,
+                       icl_provisioning_device_get_device(container->device1),
+                       oic_acl1,
+                       icl_provisioning_device_get_device(container->device2),
+                       oic_acl2,
+                       _provisioning_pairwise_devices_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCProvisionPairwiseDevces() Fail(%d)", result);
+               _provisioning_pairwise_devices_cb_container_destroy(container);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_unlink_pairwise_cb_container_destroy(
+               struct icl_provisioning_unlink_pairwise_cb_container *container)
+{
+       if (container->device1) {
+               iotcon_provisioning_device_destroy(container->device1);
+               container->device1 = NULL;
+       }
+       if (container->device2) {
+               iotcon_provisioning_device_destroy(container->device2);
+               container->device2 = NULL;
+       }
+
+       free(container);
+}
+
+
+static gboolean _provisioning_unlink_pairwise_idle_cb(gpointer p)
+{
+       struct icl_provisioning_unlink_pairwise_cb_container *container = p;
+
+       if (container->cb) {
+               container->cb(container->device1, container->device2, container->result,
+                               container->user_data);
+       }
+
+       _provisioning_unlink_pairwise_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void _provisioning_unlink_pairwise_cb(void *ctx, int n_of_res,
+               OCProvisionResult_t *arr, bool has_error)
+{
+       FN_CALL;
+       int i;
+       struct icl_provisioning_unlink_pairwise_cb_container *container = ctx;
+
+       if (true == has_error)
+               DBG("unlink pairwise has error");
+
+       for (i = 0; i < n_of_res; i++) {
+               DBG("arr[%d].res : %d", i, arr[i].res);
+               if (OC_STACK_OK != arr[i].res)
+                       container->result = ic_ioty_parse_oic_error(arr[i].res);
+       }
+
+       g_idle_add(_provisioning_unlink_pairwise_idle_cb, container);
+}
+
+
+API int iotcon_provisioning_unlink_pairwise(iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_provisioning_unlink_pairwise_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       int ret;
+       OCStackResult result;
+       struct icl_provisioning_unlink_pairwise_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(NULL == device1, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device2, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       container = calloc(1, sizeof(struct icl_provisioning_unlink_pairwise_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       ret = iotcon_provisioning_device_clone(device1, &container->device1);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_unlink_pairwise_cb_container_destroy(container);
+               return ret;
+       }
+
+       ret = iotcon_provisioning_device_clone(device2, &container->device2);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_unlink_pairwise_cb_container_destroy(container);
+               return ret;
+       }
+
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCUnlinkDevices(container,
+                       icl_provisioning_device_get_device(container->device1),
+                       icl_provisioning_device_get_device(container->device2),
+                       _provisioning_unlink_pairwise_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCUnlinkDevices() Fail(%d)", result);
+               _provisioning_unlink_pairwise_cb_container_destroy(container);
+               return ic_ioty_parse_oic_error(result);
+       }
+
+       return IOTCON_ERROR_NONE;
+}
+
+
+static void _provisioning_remove_cb_container_destroy(
+               struct icl_provisioning_remove_device_cb_container *container)
+{
+       if (container->device) {
+               iotcon_provisioning_device_destroy(container->device);
+               container->device = NULL;
+       }
+
+       free(container);
+}
+
+
+static gboolean _provisioning_remove_device_idle_cb(gpointer p)
+{
+       FN_CALL;
+       struct icl_provisioning_remove_device_cb_container *container = p;
+
+       if (container->cb)
+               container->cb(container->device, container->result, container->user_data);
+
+       _provisioning_remove_cb_container_destroy(container);
+
+       return G_SOURCE_REMOVE;
+}
+
+
+static void _provisioning_remove_device_cb(void *ctx, int n_of_res,
+               OCProvisionResult_t *arr, bool has_error)
+{
+       FN_CALL;
+       struct icl_provisioning_remove_device_cb_container *container = ctx;
+
+       container->result = IOTCON_ERROR_NONE;
+
+       if (true == has_error) {
+               DBG("remove device has error");
+               container->result = IOTCON_ERROR_IOTIVITY;
+       }
+
+       g_idle_add(_provisioning_remove_device_idle_cb, container);
+}
+
+
+static void* _provisioning_remove_device_thread(void *user_data)
+{
+       FN_CALL;
+       OCStackResult result;
+       struct icl_provisioning_remove_device_cb_container *container = user_data;
+
+       ic_utils_mutex_lock(IC_UTILS_MUTEX_IOTY);
+       result = OCRemoveDevice(container,
+                       container->timeout,
+                       icl_provisioning_device_get_device(container->device),
+                       _provisioning_remove_device_cb);
+       ic_utils_mutex_unlock(IC_UTILS_MUTEX_IOTY);
+       if (OC_STACK_OK != result) {
+               ERR("OCRemoveDevice() Fail(%d)", result);
+               _provisioning_remove_cb_container_destroy(container);
+               return NULL;
+       }
+
+       return NULL;
+}
+
+
+API int iotcon_provisioning_remove_device(int timeout,
+               iotcon_provisioning_device_h device,
+               iotcon_provisioning_remove_device_cb cb,
+               void *user_data)
+{
+       FN_CALL;
+       int ret;
+       struct icl_provisioning_remove_device_cb_container *container;
+
+       RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED);
+       RETV_IF(timeout < 0 || ICL_PROVISIONING_TIMEOUT_MAX < timeout,
+                       IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == device, IOTCON_ERROR_INVALID_PARAMETER);
+       RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+       container = calloc(1, sizeof(struct icl_provisioning_remove_device_cb_container));
+       if (NULL == container) {
+               ERR("calloc() Fail(%d)", errno);
+               return IOTCON_ERROR_OUT_OF_MEMORY;
+       }
+
+       container->timeout = timeout;
+       container->cb = cb;
+       container->user_data = user_data;
+
+       ret = iotcon_provisioning_device_clone(device, &container->device);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon_provisioning_device_clone() Fail(%d)", ret);
+               _provisioning_remove_cb_container_destroy(container);
+               return ret;
+       }
+
+       ret = _provisioning_thread(ICL_PROVISIONING_REMOVE_DEVICE, container);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_provisinoing_discover_thread() Fail(%d)", ret);
+               _provisioning_remove_cb_container_destroy(container);
+               return ret;
+       }
+
+       return IOTCON_ERROR_NONE;
+}
index a25fdaa94a4fdb8f1c7785b5c663673e9cab5c71..dbb0dbba6030fd7b11d5da95716e297f936ddf32 100644 (file)
--- a/lib/icl.c
+++ b/lib/icl.c
@@ -27,7 +27,7 @@ static pthread_t icl_thread;
 static int icl_timeout_seconds = ICL_TIMEOUT_DEFAULT;
 static int icl_init_count;
 
-API int iotcon_initialize(const char *file_path)
+int icl_initialize(const char *file_path, bool is_pt)
 {
        int ret;
 
@@ -35,15 +35,12 @@ API int iotcon_initialize(const char *file_path)
        RETV_IF(false == ic_utils_check_permission((IC_PERMISSION_INTERNET|IC_PERMISSION_NETWORK_GET)),
                        IOTCON_ERROR_PERMISSION_DENIED);
 
-       // TODO: Fixme
-       //RETV_IF(NULL == file_path, IOTCON_ERROR_INVALID_PARAMETER);
-
 #if !GLIB_CHECK_VERSION(2, 35, 0)
        g_type_init();
 #endif
 
        if (file_path && *file_path) {
-               ret = icl_ioty_set_persistent_storage(file_path);
+               ret = icl_ioty_set_persistent_storage(file_path, is_pt);
                if (IOTCON_ERROR_NONE != ret) {
                        ERR("icl_set_persistent_storage() Fail(%d)", ret);
                        return ret;
@@ -73,6 +70,11 @@ API int iotcon_initialize(const char *file_path)
        return IOTCON_ERROR_NONE;
 }
 
+API int iotcon_initialize(const char *file_path)
+{
+       return icl_initialize(file_path, false);
+}
+
 API void iotcon_deinitialize(void)
 {
        ic_utils_mutex_lock(IC_UTILS_MUTEX_INIT);
index 460ccc63dd6063c00c0275cabaf04a232b7d088c..544263c86a691e24bc890ed03b8b295c2fa457e0 100644 (file)
--- a/lib/icl.h
+++ b/lib/icl.h
@@ -25,4 +25,6 @@
 #endif
 #define API __attribute__((visibility("default")))
 
+int icl_initialize(const char *file_path, bool is_pt);
+
 #endif /* __IOT_CONNECTIVITY_LIBRARY_H__ */
index 18256a1dd981e28b3366bcca854a43640e13df04..d9041f4f161abe1b28eafa82c24cc60943476332 100644 (file)
@@ -47,6 +47,7 @@ typedef enum {
        IOTCON_ERROR_INVALID_TYPE = TIZEN_ERROR_IOTCON | 0x03, /**< Invalid type */
        IOTCON_ERROR_ALREADY = TIZEN_ERROR_IOTCON | 0x04, /**< Already */
        IOTCON_ERROR_SYSTEM = TIZEN_ERROR_IOTCON | 0x06, /**< System errors */
+       IOTCON_ERROR_AUTHENTICATION_FAILURE = TIZEN_ERROR_IOTCON | 0x05,
 } iotcon_error_e;
 
 /**
diff --git a/lib/include/iotcon-internal.h b/lib/include/iotcon-internal.h
new file mode 100644 (file)
index 0000000..be7e51f
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __IOT_CONNECTIVITY_INTERNAL_H__
+#define __IOT_CONNECTIVITY_INTERNAL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <iotcon-provisioning.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IOT_CONNECTIVITY_INTERNAL_H__ */
diff --git a/lib/include/iotcon-provisioning.h b/lib/include/iotcon-provisioning.h
new file mode 100644 (file)
index 0000000..84b752e
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __IOT_CONNECTIVITY_PROVISIONING_H__
+#define __IOT_CONNECTIVITY_PROVISIONING_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// -> iotcon-types.h
+typedef struct icl_provisioning_devices* iotcon_provisioning_devices_h;
+typedef struct icl_provisioning_device* iotcon_provisioning_device_h;
+typedef struct icl_provisioning_acl* iotcon_provisioning_acl_h;
+
+// -> iotcon-constant.h
+typedef enum {
+       IOTCON_PERMISSION_CREATE = (1 << 0),
+       IOTCON_PERMISSION_READ = (1 << 1),
+       IOTCON_PERMISSION_WRITE = (1 << 2),
+       IOTCON_PERMISSION_DELETE = (1 << 3),
+       IOTCON_PERMISSION_NOTIFY = (1 << 4),
+       IOTCON_PERMISSION_FULL_CONTROL = (IOTCON_PERMISSION_CREATE | IOTCON_PERMISSION_READ
+                       | IOTCON_PERMISSION_WRITE | IOTCON_PERMISSION_DELETE | IOTCON_PERMISSION_NOTIFY),
+} iotcon_provisioning_permission_e;
+
+typedef enum {
+       IOTCON_OXM_JUST_WORKS,
+       IOTCON_OXM_RANDOM_PIN,
+} iotcon_provisioning_oxm_e;
+
+/* initialize */
+int iotcon_provisioning_initialize(const char *file_path, const char *db_path);
+
+typedef char* (*iotcon_provisioning_randompins_cb)(void *user_data);
+
+int iotcon_provisioning_set_randompins(iotcon_provisioning_randompins_cb cb,
+               void *user_data);
+
+/* discover */
+int iotcon_provisioning_get_devices(iotcon_provisioning_devices_h *owned_devices,
+               iotcon_provisioning_devices_h *unowned_devices);
+
+typedef void (*iotcon_provisioning_found_devices_cb)(
+               iotcon_provisioning_devices_h owned_devices,
+               iotcon_provisioning_devices_h unowned_devices,
+               void *user_data);
+
+int iotcon_provisioning_find_all_devices(int timeout,
+               iotcon_provisioning_found_devices_cb cb, void *user_data);
+
+int iotcon_provisioning_find_unowned_devices(int timeout,
+               iotcon_provisioning_found_devices_cb cb, void *user_data);
+
+int iotcon_provisioning_find_owned_devices(int timeout,
+               iotcon_provisioning_found_devices_cb cb, void *user_data);
+
+/* register */
+typedef void (*iotcon_provisioning_ownership_transfer_cb)(
+               iotcon_provisioning_device_h device,
+               iotcon_error_e result,
+               void *user_data);
+
+int iotcon_provisioning_register_unowned_devices(
+               iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_ownership_transfer_cb cb,
+               void *user_data);
+
+int iotcon_provisioning_register_unowned_device(
+               iotcon_provisioning_device_h device,
+               iotcon_provisioning_ownership_transfer_cb cb,
+               void *user_data);
+
+/* cred */
+typedef void (*iotcon_provisioning_provision_cred_cb)(
+               iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_error_e result,
+               void *user_data);
+
+int iotcon_provisioning_provision_cred(iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_provisioning_provision_cred_cb cb,
+               void *user_data);
+
+/* acl */
+typedef void (*iotcon_provisioning_provision_acl_cb)(
+               iotcon_provisioning_device_h device,
+               iotcon_provisioning_acl_h acl,
+               iotcon_error_e result,
+               void *user_data);
+
+int iotcon_provisioning_provision_acl(iotcon_provisioning_device_h device,
+               iotcon_provisioning_acl_h acl,
+               iotcon_provisioning_provision_acl_cb cb,
+               void *user_data);
+
+/* pairwise */
+typedef void (*iotcon_provisioning_pairwise_devices_cb)(
+               iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_error_e result,
+               void *user_data);
+
+int iotcon_provisioning_pairwise_devices(iotcon_provisioning_device_h device1,
+               iotcon_provisioning_acl_h acl1,
+               iotcon_provisioning_device_h device2,
+               iotcon_provisioning_acl_h acl2,
+               iotcon_provisioning_pairwise_devices_cb cb,
+               void *user_data);
+
+/* unlink */
+typedef void (*iotcon_provisioning_unlink_pairwise_cb)(
+               iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_error_e result,
+               void *user_data);
+
+int iotcon_provisioning_unlink_pairwise(iotcon_provisioning_device_h device1,
+               iotcon_provisioning_device_h device2,
+               iotcon_provisioning_unlink_pairwise_cb cb,
+               void *user_data);
+
+/* remove */
+typedef void (*iotcon_provisioning_remove_device_cb)(iotcon_provisioning_device_h device,
+               iotcon_error_e result, void *user_data);
+
+int iotcon_provisioning_remove_device(int timeout,
+               iotcon_provisioning_device_h device,
+               iotcon_provisioning_remove_device_cb cb,
+               void *user_data);
+
+/* struct */
+int iotcon_provisioning_device_clone(iotcon_provisioning_device_h device,
+               iotcon_provisioning_device_h *cloned_device);
+int iotcon_provisioning_device_destroy(iotcon_provisioning_device_h device);
+int iotcon_provisioning_device_get_host_address(iotcon_provisioning_device_h device,
+               char **host_address);
+int iotcon_provisioning_device_get_connectivity_type(iotcon_provisioning_device_h device,
+               iotcon_connectivity_type_e *connectivity_type);
+int iotcon_provisioning_device_get_id(iotcon_provisioning_device_h device,
+               char **device_id);
+int iotcon_provisioning_device_get_oxm(iotcon_provisioning_device_h device,
+               iotcon_provisioning_oxm_e *oxm);
+
+int iotcon_provisioning_devices_create(iotcon_provisioning_devices_h *devices);
+int iotcon_provisioning_devices_destroy(iotcon_provisioning_devices_h devices);
+int iotcon_provisioning_devices_clone(iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_devices_h *cloned_devices);
+
+typedef bool (*iotcon_provisioning_devices_foreach_cb)(
+               iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_device_h device,
+               void *user_data);
+int iotcon_provisioning_devices_foreach(iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_devices_foreach_cb cb, void *user_data);
+
+int iotcon_provisioning_devices_add_device(iotcon_provisioning_devices_h devices,
+               iotcon_provisioning_device_h device);
+
+int iotcon_provisioning_acl_create(iotcon_provisioning_acl_h *acl);
+int iotcon_provisioning_acl_set_all_subject(iotcon_provisioning_acl_h acl);
+int iotcon_provisioning_acl_set_subject(iotcon_provisioning_acl_h acl,
+               iotcon_provisioning_device_h subject);
+int iotcon_provisioning_acl_add_resource(iotcon_provisioning_acl_h acl,
+               const char *uri_path);
+int iotcon_provisioning_acl_set_permission(iotcon_provisioning_acl_h acl,
+               int permission);
+int iotcon_provisioning_acl_destroy(iotcon_provisioning_acl_h acl);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IOT_CONNECTIVITY_PROVISIONING_H__ */
index 9b3e65d64e314101c7691240f60896e58ee1ba2b..e99b3866368e7d2038b428f87181ca4bfafef9f9 100644 (file)
@@ -22,6 +22,9 @@ SET(IOTCON_TEST_ENCAP_SERVER_SRCS "iotcon-test-encap-server.c")
 SET(IOTCON_TEST_WIFI "iotcon-test-wifi")
 SET(IOTCON_TEST_WIFI_SRCS "iotcon-test-wifi.c")
 
+SET(IOTCON_TEST_PROVISIONING_DAT "iotcon-test-svr-db-client.dat"
+       "iotcon-test-svr-db-server.dat")
+
 pkg_check_modules(test_pkgs REQUIRED dlog glib-2.0 capi-network-wifi)
 INCLUDE_DIRECTORIES(${test_pkgs_INCLUDE_DIRS})
 LINK_DIRECTORIES(${test_pkgs_LIBRARY_DIRS})
@@ -57,3 +60,5 @@ INSTALL(TARGETS ${IOTCON_TEST_ENCAP_SERVER} DESTINATION ${BIN_INSTALL_DIR})
 ADD_EXECUTABLE(${IOTCON_TEST_WIFI} ${IOTCON_TEST_WIFI_SRCS})
 TARGET_LINK_LIBRARIES(${IOTCON_TEST_WIFI} ${test_pkgs_LIBRARIES} ${CLIENT})
 INSTALL(TARGETS ${IOTCON_TEST_WIFI} DESTINATION ${BIN_INSTALL_DIR})
+
+INSTALL(FILES ${IOTCON_TEST_PROVISIONING_DAT} DESTINATION ${BIN_INSTALL_DIR})
index f0ce27d7becb724d57c372d36c4109b8c300e85b..d9c4b59b6eb89a62acb1593c5ca4b6d0aae52471 100644 (file)
@@ -599,7 +599,7 @@ int main(int argc, char **argv)
        loop = g_main_loop_new(NULL, FALSE);
 
        /* initialize iotcon */
-       ret = iotcon_initialize(NULL);
+       ret = iotcon_initialize("/usr/bin/iotcon-test-svr-db-client.dat");
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_initialize() Fail(%d)", ret);
                return -1;
@@ -607,7 +607,7 @@ int main(int argc, char **argv)
 
        /* find door typed resources */
        ret = iotcon_find_resource(IOTCON_MULTICAST_ADDRESS, IOTCON_CONNECTIVITY_ALL,
-                       DOOR_RESOURCE_TYPE, false, _found_resource, NULL);
+                       DOOR_RESOURCE_TYPE, true, _found_resource, NULL);
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_find_resource() Fail(%d)", ret);
                iotcon_deinitialize();
index 1cdebf273199afc16f613325dbe24ecd85c34d31..9d02dd67f50a00b62244c50c15e183e9e61ac7fa 100644 (file)
@@ -77,7 +77,8 @@ static int _set_door_resource(door_resource_s *door)
                return -1;
        }
 
-       door->policies = IOTCON_RESOURCE_DISCOVERABLE;
+       door->policies = IOTCON_RESOURCE_DISCOVERABLE | IOTCON_RESOURCE_OBSERVABLE
+               | IOTCON_RESOURCE_SECURE;
 
        ret = iotcon_observers_create(&door->observers);
        if (IOTCON_ERROR_NONE != ret) {
@@ -372,7 +373,7 @@ static int _request_handler_post(door_resource_s *door, iotcon_request_h request
        }
 
        new_door_handle = _create_door_resource(DOOR_RESOURCE_URI2, door->type,
-                       door->ifaces, IOTCON_RESOURCE_NO_POLICY, door);
+                       door->ifaces, IOTCON_RESOURCE_SECURE, door);
        if (NULL == new_door_handle) {
                ERR("_create_door_resource() Fail");
                return -1;
@@ -564,7 +565,7 @@ int main(int argc, char **argv)
        loop = g_main_loop_new(NULL, FALSE);
 
        /* initialize iotcon */
-       ret = iotcon_initialize(NULL);
+       ret = iotcon_initialize("/usr/bin/iotcon-test-svr-db-server.dat");
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_initialize() Fail(%d)", ret);
                return -1;
@@ -594,7 +595,6 @@ int main(int argc, char **argv)
                iotcon_deinitialize();
                return -1;
        }
-       my_door.policies |= IOTCON_RESOURCE_OBSERVABLE;
 
        /* add presence */
        g_timeout_add_seconds(10, _presence_timer, NULL);
index 66517e04ec63b8f058b046ef4f81716b9c72ef23..19408e187bbb01c2c27a745be6bdcf5bb8bb1187 100644 (file)
@@ -239,7 +239,7 @@ int main(int argc, char **argv)
        loop = g_main_loop_new(NULL, FALSE);
 
        /* initialize iotcon */
-       ret = iotcon_initialize(NULL);
+       ret = iotcon_initialize("/usr/bin/iotcon-test-svr-db-client.dat");
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_initialize() Fail(%d)", ret);
                return -1;
@@ -247,7 +247,7 @@ int main(int argc, char **argv)
 
        /* find door typed resources */
        ret = iotcon_find_resource(IOTCON_MULTICAST_ADDRESS, IOTCON_CONNECTIVITY_ALL,
-                       DOOR_RESOURCE_TYPE, false, _found_resource, &resource);
+                       DOOR_RESOURCE_TYPE, true, _found_resource, &resource);
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_find_resource() Fail(%d)", ret);
                iotcon_deinitialize();
index 32fb68e875e8ff5bdcdb7b06823e36d581b0f76b..9f1da5b217118d7538141ff7488774c3e233dba2 100644 (file)
@@ -49,7 +49,8 @@ static int _set_door_resource(door_resource_s *door)
                return -1;
        }
 
-       door->policies = IOTCON_RESOURCE_DISCOVERABLE;
+       door->policies = IOTCON_RESOURCE_DISCOVERABLE | IOTCON_RESOURCE_OBSERVABLE
+               | IOTCON_RESOURCE_SECURE;
 
        return 0;
 }
@@ -197,7 +198,7 @@ int main(int argc, char **argv)
        loop = g_main_loop_new(NULL, FALSE);
 
        /* initialize iotcon */
-       ret = iotcon_initialize(NULL);
+       ret = iotcon_initialize("/usr/bin/iotcon-test-svr-db-server.dat");
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_initialize() Fail(%d)", ret);
                return -1;
@@ -218,9 +219,6 @@ int main(int argc, char **argv)
                return -1;
        }
 
-       /* add resource options */
-       my_door.policies |= IOTCON_RESOURCE_OBSERVABLE;
-
        /* create new door resource */
        my_door.handle = _create_door_resource(my_door.uri_path, my_door.type,
                        my_door.policies, &my_door);
index d051c2ccfa12b97d9c08627e5e74064c97163690..9e6ac772a376d9f4b976b0ef68b9ebdd4aa1385f 100644 (file)
@@ -404,7 +404,7 @@ int main(int argc, char **argv)
        loop = g_main_loop_new(NULL, FALSE);
 
        /* initialize iotcon */
-       ret = iotcon_initialize(NULL);
+       ret = iotcon_initialize("/usr/bin/iotcon-test-svr-db-client.dat");
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_initialize() Fail(%d)", ret);
                return -1;
@@ -412,7 +412,7 @@ int main(int argc, char **argv)
 
        /* find room typed resources */
        ret = iotcon_find_resource(IOTCON_MULTICAST_ADDRESS, IOTCON_CONNECTIVITY_ALL,
-                       ROOM_RESOURCE_TYPE, false, _found_resource, NULL);
+                       ROOM_RESOURCE_TYPE, true, _found_resource, NULL);
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_find_resource() Fail(%d)", ret);
                iotcon_deinitialize();
index b26098b8e8e476bfe30691fb6573408addef253c..70c99725f81284da8e9cb4b67c45dd6ef1c99a41 100644 (file)
@@ -120,7 +120,8 @@ static int _set_room_resource(room_resource_s *room)
                return -1;
        }
 
-       room->policies = IOTCON_RESOURCE_DISCOVERABLE | IOTCON_RESOURCE_OBSERVABLE;
+       room->policies = IOTCON_RESOURCE_DISCOVERABLE | IOTCON_RESOURCE_OBSERVABLE
+               | IOTCON_RESOURCE_SECURE;
 
        return 0;
 }
@@ -169,7 +170,7 @@ static int _set_light_resource(light_resource_s *light)
                return -1;
        }
 
-       light->policies = IOTCON_RESOURCE_NO_POLICY;
+       light->policies = IOTCON_RESOURCE_SECURE;
 
        return 0;
 }
@@ -217,7 +218,7 @@ static int _set_fan_resource(fan_resource_s *fan)
                return -1;
        }
 
-       fan->policies = IOTCON_RESOURCE_NO_POLICY;
+       fan->policies = IOTCON_RESOURCE_SECURE;
 
        return 0;
 }
@@ -746,7 +747,7 @@ int main(int argc, char **argv)
        loop = g_main_loop_new(NULL, FALSE);
 
        /* initialize iotcon */
-       ret = iotcon_initialize(NULL);
+       ret = iotcon_initialize("/usr/bin/iotcon-test-svr-db-server.dat");
        if (IOTCON_ERROR_NONE != ret) {
                ERR("iotcon_initialize() Fail(%d)", ret);
                return -1;
diff --git a/test/iotcon-test-svr-db-client.dat b/test/iotcon-test-svr-db-client.dat
new file mode 100644 (file)
index 0000000..39e731e
Binary files /dev/null and b/test/iotcon-test-svr-db-client.dat differ
diff --git a/test/iotcon-test-svr-db-server.dat b/test/iotcon-test-svr-db-server.dat
new file mode 100644 (file)
index 0000000..8492511
Binary files /dev/null and b/test/iotcon-test-svr-db-server.dat differ