/* To-Do : Change belows to union type */
/* For MOT */
- OCProvisionDev_t *target; /**< Target device for MOT */
+ gchar *uuid_target_str; /**< Target device*/
gchar *pin; /**< PIN */
/* For ACL provisioning */
- OCProvisionDev_t *subject; /**< Target device for ACL */
+ gchar *uuid_subject_str;/**< Subject device for ACL */
gchar *rsrc_uri; /**< Resource URI */
gchar *rsrc_type; /**< Resouce Type */
gchar *rsrc_interface; /**< Resource Interface Array To-Do : Make this as array */
return "WIFI_MANAGER_ERROR_UNKNOWN";
}
}
+
+OicUuid_t* _convert_uuid(gchar *device_id)
+{
+ OicUuid_t *uuid;
+
+ if (NULL == device_id)
+ return NULL;
+
+ uuid = g_malloc0(sizeof(struct OicUuid));
+ if (NULL == uuid) {
+ D2DS_LOGE("g_malloc0() Fail(%d)", errno);
+ return NULL;
+ }
+
+ sscanf(&device_id[0], "%2hhx", &uuid->id[0]);
+ sscanf(&device_id[2], "%2hhx", &uuid->id[1]);
+ sscanf(&device_id[4], "%2hhx", &uuid->id[2]);
+ sscanf(&device_id[6], "%2hhx", &uuid->id[3]);
+ /* device_id[8] == '-' */
+ sscanf(&device_id[9], "%2hhx", &uuid->id[4]);
+ sscanf(&device_id[11], "%2hhx", &uuid->id[5]);
+ /* device_id[13] == '-' */
+ sscanf(&device_id[14], "%2hhx", &uuid->id[6]);
+ sscanf(&device_id[16], "%2hhx", &uuid->id[7]);
+ /* device_id[18] == '-' */
+ sscanf(&device_id[19], "%2hhx", &uuid->id[8]);
+ sscanf(&device_id[21], "%2hhx", &uuid->id[9]);
+ /* device_id[23] == '-' */
+ sscanf(&device_id[24], "%2hhx", &uuid->id[10]);
+ sscanf(&device_id[26], "%2hhx", &uuid->id[11]);
+ sscanf(&device_id[28], "%2hhx", &uuid->id[12]);
+ sscanf(&device_id[30], "%2hhx", &uuid->id[13]);
+ sscanf(&device_id[32], "%2hhx", &uuid->id[14]);
+ sscanf(&device_id[34], "%2hhx", &uuid->id[15]);
+
+ return uuid;
+}
+
static void _print_no_uuid(int idx, const OicUuid_t* uuid)
{
char uuid_string[256] = {0};
con->found = FALSE;
if (con->pin) {
- free(con->pin);
+ g_free(con->pin);
con->pin = NULL;
}
if (con->rsrc_uri) {
- free(con->rsrc_uri);
+ g_free(con->rsrc_uri);
con->rsrc_uri = NULL;
}
if (con->rsrc_type) {
- free(con->rsrc_type);
+ g_free(con->rsrc_type);
con->rsrc_type = NULL;
}
if (con->rsrc_interface) {
- free(con->rsrc_interface);
+ g_free(con->rsrc_interface);
con->rsrc_interface = NULL;
}
+ if (con->uuid_target_str) {
+ g_free(con->uuid_target_str);
+ }
/* Set d2ds status 'pending' */
g_atomic_int_set(&service->pending, 0);
if (con) {
- free(con);
+ g_free(con);
con = NULL;
}
}
OCStackResult ret = OC_STACK_OK;
d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
- if (!con->target) {
- D2DS_LOGE("Target device is NULL");
+ OCProvisionDev_t *src_dev = NULL;
+ OicUuid_t *uuid_target = NULL;
+
+ if (!con->uuid_target_str) {
+ D2DS_LOGE("Target device UUID is NULL");
goto MOT_ENDED;
}
+ uuid_target = _convert_uuid(con->uuid_target_str);
+ src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_target);
+ if (!src_dev) {
+ D2DS_LOGE("We can't find in MOT dev list");
+ goto MOT_ENDED;
+ }
+ /* To MOT only one device */
+ src_dev->next = NULL;
+
g_client->g_doneCB = false;
#ifdef MULTIPLE_OWNER
OCProvisionDev_t* dev = NULL;
- LL_FOREACH(con->target, dev) {
+ LL_FOREACH(src_dev, dev) {
if(OIC_PRECONFIG_PIN == dev->doxm->oxmSel) {
/* Pre-Configured PIN initialization */
const char* testPreconfigPin = con->pin;/* Ex) "12341234" */
}
}
#endif
- ret = OCDoMultipleOwnershipTransfer(g_client, con->target, _mot_cb);
+ ret = OCDoMultipleOwnershipTransfer(g_client, src_dev, _mot_cb);
if (OC_STACK_OK != ret ) {
D2DS_LOGE( "OCDoMultipleOwnershipTransfer: ret = %d (%s)", ret, _error_to_string(ret));
goto MOT_ENDED;
ret = _wait_cb_ret(CALLBACK_TIMEOUT_MS);
if(ret) {
- D2DS_LOGE( "OCProvisionCredentials callback error = %d (%s)", ret, _error_to_string(ret));
+ D2DS_LOGE( "OCDoMultipleOwnershipTransfer callback error = %d (%s)", ret, _error_to_string(ret));
goto MOT_ENDED;
}
MOT_ENDED:
net_d2ds_emit_mot_done(d2ds_dbus_get_object(), (int)ret);
-
+ if (uuid_target)
+ g_free(uuid_target);
_request_cleanup(data);
g_thread_exit(GINT_TO_POINTER (1));
return NULL;
}
-OicUuid_t* _convert_uuid(const gchar *device_id)
-{
- OicUuid_t *uuid;
-
- if (NULL == device_id)
- return NULL;
-
- uuid = g_malloc0(sizeof(struct OicUuid));
- if (NULL == uuid) {
- D2DS_LOGE("g_malloc0() Fail(%d)", errno);
- return NULL;
- }
-
- sscanf(&device_id[0], "%2hhx", &uuid->id[0]);
- sscanf(&device_id[2], "%2hhx", &uuid->id[1]);
- sscanf(&device_id[4], "%2hhx", &uuid->id[2]);
- sscanf(&device_id[6], "%2hhx", &uuid->id[3]);
- /* device_id[8] == '-' */
- sscanf(&device_id[9], "%2hhx", &uuid->id[4]);
- sscanf(&device_id[11], "%2hhx", &uuid->id[5]);
- /* device_id[13] == '-' */
- sscanf(&device_id[14], "%2hhx", &uuid->id[6]);
- sscanf(&device_id[16], "%2hhx", &uuid->id[7]);
- /* device_id[18] == '-' */
- sscanf(&device_id[19], "%2hhx", &uuid->id[8]);
- sscanf(&device_id[21], "%2hhx", &uuid->id[9]);
- /* device_id[23] == '-' */
- sscanf(&device_id[24], "%2hhx", &uuid->id[10]);
- sscanf(&device_id[26], "%2hhx", &uuid->id[11]);
- sscanf(&device_id[28], "%2hhx", &uuid->id[12]);
- sscanf(&device_id[30], "%2hhx", &uuid->id[13]);
- sscanf(&device_id[32], "%2hhx", &uuid->id[14]);
- sscanf(&device_id[34], "%2hhx", &uuid->id[15]);
-
- return uuid;
-}
-
-
static int _d2ds_mot(d2ds_service *service, gchar *uuid_str, gchar *pin)
{
- OicUuid_t *uuid = NULL;
- OCProvisionDev_t *src_dev = NULL;
-
d2ds_req_cb_s *con = NULL;
+
con = g_malloc0(sizeof(d2ds_req_cb_s));
if (NULL == con) {
D2DS_LOGE( "g_malloc0() Fail=%d", errno);
con->userdata = service;
con->cid = D2DS_MOT;
-
- uuid = _convert_uuid(uuid_str);
- src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid);
- if (!src_dev) {
- D2DS_LOGE("We can't find in MOT dev list");
- g_free(uuid);
- _request_cleanup(con);
- return D2DS_ERROR_NO_DATA;
- }
- g_free(uuid);
-
- /* Copy target device & PIN */
- con->target = PMCloneOCProvisionDev(src_dev);
- /* To do MOT only one */
- con->target->next = NULL;
+ con->uuid_target_str = g_strdup(uuid_str);
if (pin) {
con->pin = g_malloc0(OXM_RANDOM_PIN_MAX_SIZE+1);
return D2DS_ERROR_NONE;
}
+static void _remove_mo_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
+{
+ d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
+
+ if (!has_error) {
+ D2DS_LOGD("Remove Multiple Ownership SUCCEEDED");
+ } else {
+ D2DS_LOGD( "Remove Multiple Ownership FAILED ");
+ _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
+ }
+ client->g_doneCB = true;
+}
+
+static gpointer _remove_mo_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
+
+ OCProvisionDev_t *src_dev = NULL;
+ OicUuid_t uuid_mowner;
+ OicUuid_t *uuid_target = NULL;
+
+ if (!con->uuid_target_str) {
+ D2DS_LOGE("Target device UUID is NULL");
+ goto MOT_ENDED;
+ }
+
+ uuid_target = _convert_uuid(con->uuid_target_str);
+ src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_target);
+ if (!src_dev) {
+ D2DS_LOGE("We can't find in MOT dev list");
+ goto MOT_ENDED;
+ }
+
+ g_client->g_doneCB = false;
+
+ ret = GetDoxmDevOwnerId(&uuid_mowner);
+ if (OC_STACK_OK != ret) {
+ D2DS_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ ret = OCRemoveSubOwner(g_client, src_dev, &uuid_mowner, _remove_mo_cb);
+ if (OC_STACK_OK != ret ) {
+ D2DS_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_MS);
+ if(ret) {
+ D2DS_LOGE( "OCRemoveSubOwner callback error = %d (%s)", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ D2DS_LOGE("Remove Multiple Ownership Done");
+
+MOT_ENDED:
+
+ net_d2ds_emit_mot_done(d2ds_dbus_get_object(), (int)ret);
+
+ if (uuid_target)
+ g_free(uuid_target);
+ _request_cleanup(data);
+ g_thread_exit(GINT_TO_POINTER (1));
+
+ return NULL;
+}
+
+static int _d2ds_remove_mo(d2ds_service *service, gchar *uuid_str)
+{
+ d2ds_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(d2ds_req_cb_s));
+ if (NULL == con) {
+ D2DS_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return D2DS_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = D2DS_REMOVE_MOT;
+ con->uuid_target_str = g_strdup(uuid_str);
+
+ con->thread = g_thread_try_new("remove_mo", _remove_mo_func, con, NULL);
+ if (!con->thread) {
+ D2DS_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return D2DS_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_S + 1, _d2ds_timeout_cb, con);
+#endif
+ return D2DS_ERROR_NONE;
+}
+
#if 0 /* TEST */
static int sendGetLed()
{
OCStackResult ret = OC_STACK_OK;
d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
OicSecAcl_t* acl = NULL;
+ OicUuid_t *uuid = NULL;
+ OCProvisionDev_t *target_dev = NULL;
+ OCProvisionDev_t *subject_dev = NULL;
- if (!con->subject || !con->rsrc_uri || !con->rsrc_type || !con->rsrc_interface) {
+ if (!con->uuid_subject_str ||!con->uuid_target_str || !con->rsrc_uri || !con->rsrc_type || !con->rsrc_interface) {
D2DS_LOGE("Some parameters are wrong");
- D2DS_LOGE("%p", con->subject );
+ D2DS_LOGE("%s", con->uuid_target_str );
+ D2DS_LOGE("%s", con->uuid_subject_str );
D2DS_LOGE("%s", con->rsrc_uri );
D2DS_LOGE("%s", con->rsrc_type );
D2DS_LOGE("%s", con->rsrc_interface );
goto PVACL_ERROR;
}
+ uuid = _convert_uuid(con->uuid_target_str);
+ target_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+ if (!target_dev) {
+ D2DS_LOGE("We can't find target in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+ g_free(uuid);
+
+ /* To do ACL provisioning only one */
+ target_dev->next = NULL;
+
+ uuid = _convert_uuid(con->uuid_subject_str);
+ subject_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+ if (!subject_dev) {
+ D2DS_LOGE("We can't find subject in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+ g_free(uuid);
+
+ /* To do ACL provisioning only one */
+ subject_dev->next = NULL;
+
g_client->g_doneCB = false;
D2DS_LOGI(" Provisioning Selected ACL..");
- acl = _create_target_acl(&con->target->doxm->deviceID, &con->subject->doxm->deviceID, con->rsrc_uri, con->rsrc_type,
+ acl = _create_target_acl(&target_dev->doxm->deviceID, &subject_dev->doxm->deviceID, con->rsrc_uri, con->rsrc_type,
con->rsrc_interface, con->permission);
if (NULL == acl) {
D2DS_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
goto PVACL_ERROR;
}
- ret= OCProvisionACL((void*) g_client, con->subject, acl, _provisioning_acl_cb);
+ ret= OCProvisionACL((void*) g_client, target_dev, acl, _provisioning_acl_cb);
if (OC_STACK_OK != ret) {
D2DS_LOGD( "OCProvisionACL API error: %d (%s)", ret, _error_to_string(ret));
goto PVACL_ERROR;
/* Notify ACL result */
net_d2ds_emit_prov_acl_done(d2ds_dbus_get_object(), (int)ret);
- if (acl) {
+ if (acl)
OCDeleteACLList(acl);
- acl = NULL;
- }
+ if (uuid)
+ g_free(uuid);
_request_cleanup(con);
g_thread_exit(GINT_TO_POINTER (1));
return NULL;
static int _provisioning_acl(d2ds_service *service, gchar *target, gchar *subject,
gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
{
-
- OicUuid_t *uuid = NULL;
- OCProvisionDev_t *target_dev = NULL;
- OCProvisionDev_t *subject_dev = NULL;
-
d2ds_req_cb_s *con = NULL;
con = g_malloc0(sizeof(d2ds_req_cb_s));
if (NULL == con) {
con->userdata = service;
con->cid = D2DS_PROV_ACL;
-
- uuid = _convert_uuid(target);
- target_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
- if (!target_dev) {
- D2DS_LOGE("We can't find target in MOWNED dev list");
- _request_cleanup(con);
- return D2DS_ERROR_NO_DATA;
- }
- g_free(uuid);
-
- /* Copy subject device and related information */
- con->target = PMCloneOCProvisionDev(target_dev);
- /* To do ACL provisioning only one */
- con->target->next = NULL;
-
- uuid = _convert_uuid(subject);
- subject_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
- if (!subject_dev) {
- D2DS_LOGE("We can't find subject in MOWNED dev list");
- _request_cleanup(con);
- return D2DS_ERROR_NO_DATA;
- }
- g_free(uuid);
-
- /* Copy subject device and related information */
- con->subject = PMCloneOCProvisionDev(subject_dev);
- /* To do ACL provisioning only one */
- con->subject->next = NULL;
-
- con->rsrc_uri = OICStrdup(rsrc_uri);
- con->rsrc_type = OICStrdup(rsrc_type);
- con->rsrc_interface = OICStrdup(rsrc_interface);
+ con->uuid_target_str = g_strdup(target);
+ con->uuid_subject_str = g_strdup(subject);
+ con->rsrc_uri = g_strdup(rsrc_uri);
+ con->rsrc_type = g_strdup(rsrc_type);
+ con->rsrc_interface = g_strdup(rsrc_interface);
con->thread = g_thread_try_new("prov_acl", _provisioning_acl_func, con, NULL);
if (!con->thread) {
return ret;
}
+int d2ds_request_remove_mo(d2ds_service *service, gchar* uuid_str)
+{
+ int ret =D2DS_ERROR_NONE;
+
+ d2ds_check_null_ret_error("service", service, FALSE);
+
+ D2DS_LOGD("[IPC] Remove Mullti Ownership");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return D2DS_ERROR_IN_PROGRESS;
+
+ if (!uuid_str) {
+ D2DS_LOGE("uuid_str = %s", uuid_str);
+ return D2DS_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _d2ds_remove_mo(service, uuid_str);
+
+ return ret;
+}
+
int d2ds_request_prov_acl(d2ds_service *service, gchar *target, gchar *subject,
gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
{