From: saerome.kim Date: Tue, 23 Jan 2018 05:56:02 +0000 (+0900) Subject: d2d-manager: Reduce working time of 'Invite/Eject' scenarios X-Git-Tag: submit/tizen/20190131.065036~172 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=14095b4708afd4077b09dd9824a6964eed961ccb;p=platform%2Fcore%2Fapi%2Fmulti-device-group.git d2d-manager: Reduce working time of 'Invite/Eject' scenarios Signed-off-by: saerome.kim --- diff --git a/src/companion-manager/include/comp_mot_agent.h b/src/companion-manager/include/comp_mot_agent.h index f4ac031..2463c8a 100755 --- a/src/companion-manager/include/comp_mot_agent.h +++ b/src/companion-manager/include/comp_mot_agent.h @@ -36,9 +36,13 @@ int agent_mot_device(char* uuid_str, char *pin); int agent_pairwise(char* target1, char *subject1, char *uri1, char *rt1, char *interface1, int permission1, char* target2, char *subject2, char *uri2, char *rt2, char *interface2, int permission2); +int agent_unlink(char* uuid_str1, char *uuid_str2); int agent_remove_mo_at_device(char* uuid_str); int agent_remove_cred_at_local(char* uuid_str); -int agent_remove_myowned_device(char* uuid_str1, char *uuid_str2); +int agent_pair(char *pin, char* target1, char *subject1, char *uri1, + char *rt1, char *interface1, int permission1, char* target2, char *subject2, char *uri2, + char *rt2, char *interface2, int permission2); +int agent_unpair(char* uuid_str1, char *uuid_str2); #ifdef __cplusplus } diff --git a/src/companion-manager/src/comp_group.c b/src/companion-manager/src/comp_group.c index 709164d..99b6c8a 100644 --- a/src/companion-manager/src/comp_group.c +++ b/src/companion-manager/src/comp_group.c @@ -337,6 +337,9 @@ int comp_group_invite(gchar *uuid_dev1, gchar *uuid_dev2, gchar *pin, LOG_BEGIN(); + ret = agent_pair(pin, uuid_dev1, uuid_dev2, uri_1, rt_1, interface_1, permission_1, + uuid_dev2, uuid_dev1, uri_2, rt_2, interface_2, permission_2); +#if 0 /* * 1. Perform MOT * 2. Discover Mowned devices @@ -361,7 +364,7 @@ int comp_group_invite(gchar *uuid_dev1, gchar *uuid_dev2, gchar *pin, LOG_DEBUG("Group Invite Information created %p", group_invite_info); } - +#endif LOG_END(); return ret; @@ -386,7 +389,7 @@ int comp_group_dismiss(gchar *uuid_dev1, gchar *uuid_dev2) * 2. Remove MOT at device #2 * 3. Remove cred at local (device #1) * */ - ret = agent_remove_myowned_device(uuid_dev1, uuid_dev2); + ret = agent_unpair(uuid_dev1, uuid_dev2); LOG_END(); @@ -415,7 +418,7 @@ int comp_group_unpair_resource(gchar *uuid_dev1, gchar *uuid_dev2) LOG_BEGIN(); - ret = agent_remove_myowned_device(uuid_dev1, uuid_dev2); + ret = agent_unlink(uuid_dev1, uuid_dev2); LOG_END(); diff --git a/src/companion-manager/src/comp_mot_agent.c b/src/companion-manager/src/comp_mot_agent.c index 7dfd5eb..85403c4 100644 --- a/src/companion-manager/src/comp_mot_agent.c +++ b/src/companion-manager/src/comp_mot_agent.c @@ -47,9 +47,12 @@ struct agent_s { GList *dbus_sub_ids; }; struct agent_s agent; + +#ifdef EJECT_DEVICE_BY_MULTI_RUN static bool mot_dev2 = false; static char *device_uuid1 = NULL; static char *device_uuid2 = NULL; +#endif int agent_get_ownerid(char* deviceid) { @@ -181,6 +184,37 @@ int agent_pairwise(char* target1, char *subject1, char *uri1, return result; } +int agent_unlink(char* uuid_str1, char *uuid_str2) +{ + GVariant *variant = NULL; + int result = COMP_ERROR_NONE; + GError *error = NULL; + + if (NULL == agent.dbus_connection || NULL == agent.gproxy_agent_service) { + LOG_ERR("I/O error"); + return COMP_ERROR_IO_ERROR; + } + + variant = g_dbus_proxy_call_sync(agent.gproxy_agent_service, "unlink", + g_variant_new("(ss)", uuid_str1, uuid_str2), G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &error); + if (variant) { + g_variant_get(variant, "(i)", &result); + LOGD("remove_mo status 0x%x", result); + } else if (error) { + LOGE("Failed DBus call [%s]", error->message); + g_error_free(error); + return COMP_ERROR_IO_ERROR; + } +#ifdef EJECT_DEVICE_BY_MULTI_RUN + if (result == COMP_ERROR_NONE) { + device_uuid1 = g_strdup(uuid_str1); + device_uuid2 = g_strdup(uuid_str2); + } +#endif + return result; +} + int agent_remove_mo_at_device(char* uuid_str) { GVariant *variant = NULL; @@ -231,7 +265,37 @@ int agent_remove_cred_at_local(char* uuid_str) return result; } -int agent_remove_myowned_device(char* uuid_str1, char *uuid_str2) +int agent_pair(char *pin, char* target1, char *subject1, char *uri1, + char *rt1, char *interface1, int permission1, char* target2, char *subject2, char *uri2, + char *rt2, char *interface2, int permission2) +{ + GVariant *variant = NULL; + int result = COMP_ERROR_NONE; + GError *error = NULL; + + if (NULL == agent.dbus_connection || NULL == agent.gproxy_agent_service) { + LOG_ERR("I/O error"); + return COMP_ERROR_IO_ERROR; + } + + variant = g_dbus_proxy_call_sync(agent.gproxy_agent_service, "pair", + g_variant_new("(ssssssisssssi)", pin, + target1, subject1, uri1, rt1, interface1, permission1, + target2, subject2, uri2, rt2, interface2, permission2), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); + if (variant) { + g_variant_get(variant, "(i)", &result); + LOGD("pair status 0x%x", result); + } else if (error) { + LOGE("Failed DBus call [%s]", error->message); + g_error_free(error); + return COMP_ERROR_IO_ERROR; + } + + return result; +} + +int agent_unpair(char* uuid_str1, char *uuid_str2) { GVariant *variant = NULL; int result = COMP_ERROR_NONE; @@ -254,11 +318,6 @@ int agent_remove_myowned_device(char* uuid_str1, char *uuid_str2) return COMP_ERROR_IO_ERROR; } - if (result == COMP_ERROR_NONE) { - device_uuid1 = g_strdup(uuid_str1); - device_uuid2 = g_strdup(uuid_str2); - } - return result; } @@ -381,6 +440,7 @@ static GDBusProxy *_get_proxy_service() return proxy; } +#ifdef EJECT_DEVICE_BY_MULTI_RUN static gboolean __perform_agent_pairwise(gpointer data) { int ret; @@ -415,7 +475,6 @@ static gboolean __perform_remove_mot_dev2(gpointer data) int ret; ret = agent_remove_mo_at_device(device_uuid2); -#if 0 if (ret != COMP_ERROR_NONE) { comp_group_notify_group_dismiss(ret); g_free(device_uuid1); @@ -423,7 +482,6 @@ static gboolean __perform_remove_mot_dev2(gpointer data) g_free(device_uuid2); device_uuid1 = NULL; } -#endif return FALSE; } @@ -433,7 +491,6 @@ static gboolean __perform_remove_cred_at_local(gpointer data) int ret; ret = agent_remove_cred_at_local(device_uuid2); -#if 0 if (ret != COMP_ERROR_NONE) { comp_group_notify_group_dismiss(ret); g_free(device_uuid1); @@ -441,9 +498,9 @@ static gboolean __perform_remove_cred_at_local(gpointer data) g_free(device_uuid2); device_uuid1 = NULL; } -#endif return FALSE; } +#endif static gboolean __perform_mot_me(gpointer data) { @@ -675,6 +732,7 @@ static void _agent_signal_handler(GDBusConnection *connection, g_variant_get(parameters, "(i)", &result); LOG_DEBUG("Result : %d", result); } else if (0 == g_strcmp0(signal_name, "mot_done")) { +#ifdef EJECT_DEVICE_BY_MULTI_RUN comp_mot_device_t *device; comp_context_t *comp_ctx = comp_context_get_context(); @@ -688,31 +746,33 @@ static void _agent_signal_handler(GDBusConnection *connection, if (comp_ctx && (TRUE == comp_ctx->mot_me) ) { g_timeout_add(10, __perform_agent_pairwise, NULL); } +#endif } else if (0 == g_strcmp0(signal_name, "remove_mo_done")) { g_variant_get(parameters, "(i)", &result); LOG_DEBUG("Result : %d", result); - +#ifdef EJECT_DEVICE_BY_MULTI_RUN g_timeout_add(10, __perform_remove_cred_at_local, NULL); - +#endif } else if (0 == g_strcmp0(signal_name, "remove_cred_local_done")) { g_variant_get(parameters, "(i)", &result); LOG_DEBUG("Result : %d", result); - +#ifdef EJECT_DEVICE_BY_MULTI_RUN comp_group_notify_group_dismiss(result); g_free(device_uuid1); device_uuid1 = NULL; g_free(device_uuid2); device_uuid1 = NULL; +#endif } else if (0 == g_strcmp0(signal_name, "pairwise_done")) { g_variant_get(parameters, "(i)", &result); LOG_DEBUG("Result : %d", result); if (comp_group_get_invite_info() != NULL) comp_group_notify_group_invite(result); - } else if (0 == g_strcmp0(signal_name, "unpair_done")) { + } else if (0 == g_strcmp0(signal_name, "unlink_done")) { g_variant_get(parameters, "(i)", &result); LOG_DEBUG("Result : %d", result); -#if 0 +#ifdef EJECT_DEVICE_BY_MULTI_RUN if (result != 0) { comp_group_notify_group_dismiss(result); g_free(device_uuid1); @@ -720,8 +780,21 @@ static void _agent_signal_handler(GDBusConnection *connection, g_free(device_uuid2); device_uuid1 = NULL; } -#endif + g_timeout_add(10, __perform_remove_mot_dev2, NULL); +#endif + } else if (0 == g_strcmp0(signal_name, "pair_done")) { + + g_variant_get(parameters, "(i)", &result); + LOG_DEBUG("Result : %d", result); + + comp_group_notify_group_invite(result); + }else if (0 == g_strcmp0(signal_name, "unpair_done")) { + + g_variant_get(parameters, "(i)", &result); + LOG_DEBUG("Result : %d", result); + + comp_group_notify_group_dismiss(result); } } static int _subscribe_event() @@ -773,71 +846,93 @@ static int _subscribe_event() h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); LOG_DEBUG("subscribed for (mot_done) signal %d", id); - /* remove_mo_done */ + /* acl_done */ id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, - "remove_mo_done", AGENT_OBJECT_PATH, NULL, + "acl_done", AGENT_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); if (0 == id) { - LOG_ERR("g_dbus_connection_signal_subscribe(remove_mo_done) Fail(%d)", errno); + LOG_ERR("g_dbus_connection_signal_subscribe(acl_done) Fail(%d)", errno); return -1; } h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - LOG_DEBUG("subscribed for (remove_mo_done) signal %d", id); + LOG_DEBUG("subscribed for (acl_done) signal %d", id); - /* remove_cred_local_done */ + /*cred_done */ id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, - "remove_cred_local_done", AGENT_OBJECT_PATH, NULL, + "cred_done", AGENT_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); if (0 == id) { - LOG_ERR("g_dbus_connection_signal_subscribe(remove_cred_local_done) Fail(%d)", errno); + LOG_ERR("g_dbus_connection_signal_subscribe(cred_done) Fail(%d)", errno); return -1; } h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - LOG_DEBUG("subscribed for (remove_cred_local_done) signal %d", id); + LOG_DEBUG("subscribed for (cred_done) signal %d", id); - /* acl_done */ + /*pairwise_done */ id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, - "acl_done", AGENT_OBJECT_PATH, NULL, + "pairwise_done", AGENT_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); if (0 == id) { - LOG_ERR("g_dbus_connection_signal_subscribe(acl_done) Fail(%d)", errno); + LOG_ERR("g_dbus_connection_signal_subscribe(pairwise_done) Fail(%d)", errno); return -1; } h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - LOG_DEBUG("subscribed for (acl_done) signal %d", id); + LOG_DEBUG("subscribed for (pairwise_done) signal %d", id); - /*cred_done */ + /*unlink_done */ id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, - "cred_done", AGENT_OBJECT_PATH, NULL, + "unlink_done", AGENT_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); if (0 == id) { - LOG_ERR("g_dbus_connection_signal_subscribe(cred_done) Fail(%d)", errno); + LOG_ERR("g_dbus_connection_signal_subscribe(unlink_done) Fail(%d)", errno); return -1; } h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - LOG_DEBUG("subscribed for (cred_done) signal %d", id); + LOG_DEBUG("subscribed for (unlink_done) signal %d", id); - /*unpair_done */ + /* remove_mo_done */ id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, - "unpair_done", AGENT_OBJECT_PATH, NULL, + "remove_mo_done", AGENT_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); if (0 == id) { - LOG_ERR("g_dbus_connection_signal_subscribe(unpair_done) Fail(%d)", errno); + LOG_ERR("g_dbus_connection_signal_subscribe(remove_mo_done) Fail(%d)", errno); return -1; } h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - LOG_DEBUG("subscribed for (unpair_done) signal %d", id); + LOG_DEBUG("subscribed for (remove_mo_done) signal %d", id); - /*pairwise_done */ + /* remove_cred_local_done */ id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, - "pairwise_done", AGENT_OBJECT_PATH, NULL, + "remove_cred_local_done", AGENT_OBJECT_PATH, NULL, G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); if (0 == id) { - LOG_ERR("g_dbus_connection_signal_subscribe(pairwise_done) Fail(%d)", errno); + LOG_ERR("g_dbus_connection_signal_subscribe(remove_cred_local_done) Fail(%d)", errno); return -1; } h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); - LOG_DEBUG("subscribed for (pairwise_done) signal %d", id); + LOG_DEBUG("subscribed for (remove_cred_local_done) signal %d", id); + + /*pair_done */ + id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, + "pair_done", AGENT_OBJECT_PATH, NULL, + G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); + if (0 == id) { + LOG_ERR("g_dbus_connection_signal_subscribe(pair_done) Fail(%d)", errno); + return -1; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + LOG_DEBUG("subscribed for (pair_done) signal %d", id); + + /*unpair_done */ + id = g_dbus_connection_signal_subscribe(h->dbus_connection, NULL, AGENT_SERVER_NAME, + "unpair_done", AGENT_OBJECT_PATH, NULL, + G_DBUS_CALL_FLAGS_NONE, _agent_signal_handler, h, NULL); + if (0 == id) { + LOG_ERR("g_dbus_connection_signal_subscribe(unpair_done) Fail(%d)", errno); + return -1; + } + h->dbus_sub_ids = g_list_append(h->dbus_sub_ids, GUINT_TO_POINTER(id)); + LOG_DEBUG("subscribed for (unpair_done) signal %d", id); return 0; } diff --git a/src/mot-agent/introspection/ma.xml b/src/mot-agent/introspection/ma.xml index 6165439..003702c 100644 --- a/src/mot-agent/introspection/ma.xml +++ b/src/mot-agent/introspection/ma.xml @@ -7,6 +7,10 @@ + + + + @@ -40,10 +44,6 @@ - - - - @@ -59,11 +59,32 @@ - + + + + + + + + + + + + + + + + + + + + + + @@ -90,10 +111,16 @@ - + - + + + + + + + diff --git a/src/mot-agent/ma-service-interface.c b/src/mot-agent/ma-service-interface.c index c021b22..c048eca 100644 --- a/src/mot-agent/ma-service-interface.c +++ b/src/mot-agent/ma-service-interface.c @@ -130,6 +130,27 @@ static int _ma_dbus_subscribe_name_owner_changed(GDBusConnection *conn) return MA_ERROR_NONE; } +static gboolean _ma_dbus_handle_get_ownerid(NetMa *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + gchar *uuid_str = NULL; + int ret = MA_ERROR_NONE; + ma_service *service = (ma_service *)user_data; + + ma_check_null_ret_error("service", service, FALSE); + + ret = ma_request_get_ownerid(service, &uuid_str); + if (MA_ERROR_NONE != ret) + MA_LOGE("Failed to ma_request_get_ownerid = %d", ret); + + net_ma_complete_get_ownerid(object, invocation, uuid_str, ret); + + if (uuid_str) + g_free(uuid_str); + + return TRUE; +} static gboolean _ma_dbus_handle_disc_mot_enb_devs(NetMa *object, GDBusMethodInvocation *invocation, @@ -186,8 +207,9 @@ static gboolean _ma_dbus_handle_mot(NetMa *object, return TRUE; } -static gboolean _ma_dbus_handle_remove_mo(NetMa *object, - GDBusMethodInvocation *invocation, gchar *arg_target, gpointer user_data) +static gboolean _ma_dbus_handle_acl(NetMa *object, + GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_subject, gchar *arg_uri, + gchar *arg_rt, gchar *arg_interface, gint arg_permission, gpointer user_data) { int ret = MA_ERROR_NONE; ma_service *service = (ma_service *)user_data; @@ -195,17 +217,17 @@ static gboolean _ma_dbus_handle_remove_mo(NetMa *object, ma_check_null_ret_error("service", service, FALSE); - ret = ma_request_remove_mo(service, arg_target); + ret = ma_request_prov_acl(service, arg_target, arg_subject, arg_uri, arg_rt, arg_interface, arg_permission); if (MA_ERROR_NONE != ret) - MA_LOGE("Failed to ma_request_remove_mo !"); + MA_LOGE("Failed to ma_request_prov_acl !"); - net_ma_complete_remove_mo(object, invocation, ret); + net_ma_complete_acl(object, invocation, ret); return TRUE; } -static gboolean _ma_dbus_handle_remove_cred_local(NetMa *object, - GDBusMethodInvocation *invocation, gchar *arg_target, gpointer user_data) +static gboolean _ma_dbus_handle_cred(NetMa *object, + GDBusMethodInvocation *invocation, gchar *arg_dev1, gchar *arg_dev2, gpointer user_data) { int ret = MA_ERROR_NONE; ma_service *service = (ma_service *)user_data; @@ -213,18 +235,21 @@ static gboolean _ma_dbus_handle_remove_cred_local(NetMa *object, ma_check_null_ret_error("service", service, FALSE); - ret = ma_request_remove_cred_local(service, arg_target); + ret = ma_request_prov_cred(service, arg_dev1, arg_dev2); if (MA_ERROR_NONE != ret) - MA_LOGE("Failed to ma_request_remove_mo !"); + MA_LOGE("Failed to ma_request_prov_cred !"); - net_ma_complete_remove_cred_local(object, invocation, ret); + net_ma_complete_cred(object, invocation, ret); return TRUE; } -static gboolean _ma_dbus_handle_acl(NetMa *object, - GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_subject, gchar *arg_uri, - gchar *arg_rt, gchar *arg_interface, gint arg_permission, gpointer user_data) +static gboolean _ma_dbus_handle_pairwise(NetMa *object, + GDBusMethodInvocation *invocation, gchar *target_1, + gchar *subject_1, gchar *uri_1, gchar *rt_1, + gchar *interface_1, int permission_1, gchar *target_2, + gchar *subject_2, gchar *uri_2, gchar *rt_2, + gchar *interface_2, int permission_2, gpointer user_data) { int ret = MA_ERROR_NONE; ma_service *service = (ma_service *)user_data; @@ -232,61 +257,76 @@ static gboolean _ma_dbus_handle_acl(NetMa *object, ma_check_null_ret_error("service", service, FALSE); - ret = ma_request_prov_acl(service, arg_target, arg_subject, arg_uri, arg_rt, arg_interface, arg_permission); + ret = ma_request_pairwise(service, target_1, subject_1, uri_1, rt_1, + interface_1, permission_1, target_2, subject_2, uri_2, + rt_2, interface_2, permission_2); if (MA_ERROR_NONE != ret) - MA_LOGE("Failed to ma_request_prov_acl !"); + MA_LOGE("Failed to ma_request_pairwise = %d", ret); - net_ma_complete_acl(object, invocation, ret); + net_ma_complete_pairwise(object, invocation, ret); return TRUE; } -static gboolean _ma_dbus_handle_cred(NetMa *object, - GDBusMethodInvocation *invocation, gchar *arg_dev1, gchar *arg_dev2, gpointer user_data) +static gboolean _ma_dbus_handle_unlink(NetMa *object, + GDBusMethodInvocation *invocation, gchar *uuid_dev1, gchar *uuid_dev2, + gpointer user_data) { int ret = MA_ERROR_NONE; ma_service *service = (ma_service *)user_data; ma_check_null_ret_error("service", service, FALSE); - - ret = ma_request_prov_cred(service, arg_dev1, arg_dev2); + ret = ma_request_unlink(service, uuid_dev1, uuid_dev2); if (MA_ERROR_NONE != ret) - MA_LOGE("Failed to ma_request_prov_cred !"); + MA_LOGE("Failed to ma_request_unpair = %d", ret); - net_ma_complete_cred(object, invocation, ret); + net_ma_complete_unpair(object, invocation, ret); return TRUE; } -static gboolean _ma_dbus_handle_get_ownerid(NetMa *object, - GDBusMethodInvocation *invocation, - gpointer user_data) +static gboolean _ma_dbus_handle_remove_mo(NetMa *object, + GDBusMethodInvocation *invocation, gchar *arg_target, gpointer user_data) { - gchar *uuid_str = NULL; int ret = MA_ERROR_NONE; ma_service *service = (ma_service *)user_data; ma_check_null_ret_error("service", service, FALSE); - ret = ma_request_get_ownerid(service, &uuid_str); + + ret = ma_request_remove_mo(service, arg_target); if (MA_ERROR_NONE != ret) - MA_LOGE("Failed to ma_request_get_ownerid = %d", ret); + MA_LOGE("Failed to ma_request_remove_mo !"); - net_ma_complete_get_ownerid(object, invocation, uuid_str, ret); + net_ma_complete_remove_mo(object, invocation, ret); - if (uuid_str) - g_free(uuid_str); + return TRUE; +} + +static gboolean _ma_dbus_handle_remove_cred_local(NetMa *object, + GDBusMethodInvocation *invocation, gchar *arg_target, gpointer user_data) +{ + int ret = MA_ERROR_NONE; + ma_service *service = (ma_service *)user_data; + + ma_check_null_ret_error("service", service, FALSE); + + + ret = ma_request_remove_cred_local(service, arg_target); + if (MA_ERROR_NONE != ret) + MA_LOGE("Failed to ma_request_remove_mo !"); + + net_ma_complete_remove_cred_local(object, invocation, ret); return TRUE; } -static gboolean _ma_dbus_handle_pairwise(NetMa *object, - GDBusMethodInvocation *invocation, gchar *target_1, - gchar *subject_1, gchar *uri_1, gchar *rt_1, - gchar *interface_1, int permission_1, gchar *target_2, - gchar *subject_2, gchar *uri_2, gchar *rt_2, - gchar *interface_2, int permission_2, gpointer user_data) +static gboolean _ma_dbus_handle_pair(NetMa *object, + GDBusMethodInvocation *invocation, gchar *pin, + gchar *target_1, gchar *subject_1, gchar *uri_1, gchar *rt_1, gchar *interface_1, int permission_1, + gchar *target_2, gchar *subject_2, gchar *uri_2, gchar *rt_2, gchar *interface_2, int permission_2, + gpointer user_data) { int ret = MA_ERROR_NONE; ma_service *service = (ma_service *)user_data; @@ -294,19 +334,19 @@ static gboolean _ma_dbus_handle_pairwise(NetMa *object, ma_check_null_ret_error("service", service, FALSE); - ret = ma_request_pairwise(service, target_1, subject_1, uri_1, rt_1, + ret = ma_request_pair(service, pin, target_1, subject_1, uri_1, rt_1, interface_1, permission_1, target_2, subject_2, uri_2, rt_2, interface_2, permission_2); if (MA_ERROR_NONE != ret) - MA_LOGE("Failed to ma_request_pairwise = %d", ret); + MA_LOGE("Failed to ma_request_pair = %d", ret); - net_ma_complete_pairwise(object, invocation, ret); + net_ma_complete_pair(object, invocation, ret); return TRUE; } static gboolean _ma_dbus_handle_unpair(NetMa *object, - GDBusMethodInvocation *invocation, gchar *uuid_dev1, gchar *uuid_dev2, + GDBusMethodInvocation *invocation, gchar *uuid_owner, gchar *uuid_owned, gpointer user_data) { int ret = MA_ERROR_NONE; @@ -314,7 +354,7 @@ static gboolean _ma_dbus_handle_unpair(NetMa *object, ma_check_null_ret_error("service", service, FALSE); - ret = ma_request_unpair(service, uuid_dev1, uuid_dev2); + ret = ma_request_unpair(service, uuid_owner, uuid_owned); if (MA_ERROR_NONE != ret) MA_LOGE("Failed to ma_request_unpair = %d", ret); @@ -337,13 +377,18 @@ static void _ma_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name, MA_LOGE("net_ma_skeleton_new() Fail"); return; } - + g_signal_connect(ma_dbus_object, "handle-get-ownerid", + G_CALLBACK(_ma_dbus_handle_get_ownerid), service); g_signal_connect(ma_dbus_object, "handle-disc-mot-enb-devs", G_CALLBACK(_ma_dbus_handle_disc_mot_enb_devs), service); g_signal_connect(ma_dbus_object, "handle-disc-mowned-devs", G_CALLBACK(_ma_dbus_handle_disc_mowned_devs), service); g_signal_connect(ma_dbus_object, "handle-mot", G_CALLBACK(_ma_dbus_handle_mot), service); + g_signal_connect(ma_dbus_object, "handle-pairwise", + G_CALLBACK(_ma_dbus_handle_pairwise), service); + g_signal_connect(ma_dbus_object, "handle-unlink", + G_CALLBACK(_ma_dbus_handle_unlink), service); g_signal_connect(ma_dbus_object, "handle-remove-mo", G_CALLBACK(_ma_dbus_handle_remove_mo), service); g_signal_connect(ma_dbus_object, "handle-remove-cred-local", @@ -352,10 +397,8 @@ static void _ma_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name, G_CALLBACK(_ma_dbus_handle_acl), service); g_signal_connect(ma_dbus_object, "handle-cred", G_CALLBACK(_ma_dbus_handle_cred), service); - g_signal_connect(ma_dbus_object, "handle-get-ownerid", - G_CALLBACK(_ma_dbus_handle_get_ownerid), service); - g_signal_connect(ma_dbus_object, "handle-pairwise", - G_CALLBACK(_ma_dbus_handle_pairwise), service); + g_signal_connect(ma_dbus_object, "handle-pair", + G_CALLBACK(_ma_dbus_handle_pair), service); g_signal_connect(ma_dbus_object, "handle-unpair", G_CALLBACK(_ma_dbus_handle_unpair), service); diff --git a/src/mot-agent/ma-subowner.c b/src/mot-agent/ma-subowner.c index 82fbb53..f78d3e6 100644 --- a/src/mot-agent/ma-subowner.c +++ b/src/mot-agent/ma-subowner.c @@ -737,17 +737,23 @@ static gboolean _ma_timeout_cb(gpointer data) case MA_PROV_CRED: net_ma_emit_cred_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); break; + case MA_PROV_PAIRWISE: + net_ma_emit_pairwise_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); + break; case MA_REMOVE_MOT: net_ma_emit_remove_mo_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); break; case MA_REMOVE_CRED_LOCAL: net_ma_emit_remove_cred_local_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); break; - case MA_UNPAIR: + case MA_UNLINK: net_ma_emit_unpair_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); break; - case MA_PROV_PAIRWISE: - net_ma_emit_pairwise_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); + case MA_PAIR: + net_ma_emit_pair_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); + break; + case MA_UNPAIR: + net_ma_emit_unpair_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED); break; } @@ -979,31 +985,6 @@ static gpointer _mot_func(gpointer data) MOT_ENDED: net_ma_emit_mot_done(ma_dbus_get_object(), (int)ret); -#if 0 -#ifdef MULTIPLE_OWN_AT_ONCE - OCProvisionDev_t* dev = NULL; - LL_FOREACH(g_client->g_motdev_list, dev) { - if(OIC_PRECONFIG_PIN == dev->doxm->oxmSel) { - /* Pre-Configured PIN initialization */ - const char* testPreconfigPin = "00000000";/* Ex) "00000000" */ - ret = OCAddPreconfigPin(dev, testPreconfigPin, strlen(testPreconfigPin)); - if(OC_STACK_OK != ret) { - MA_LOGE("Failed to save the pre-configured PIN"); - MA_LOGE("You can't use the pre-configured PIN OxM for MOT"); - goto MOT_ENDED; - } - } - } -#else - { - const char* testPreconfigPin = "00000000";/* Ex) "00000000" */ - ret = OCAddPreconfigPin(src_dev, testPreconfigPin, strlen(testPreconfigPin)); - if(OC_STACK_OK != ret) { - MA_LOGE("Reset pre-configured PIN OxM for MOT"); - } - } -#endif -#endif if (uuid_target) g_free(uuid_target); @@ -1054,211 +1035,6 @@ static int _ma_mot(ma_service *service, gchar *uuid_str, gchar *pin) return MA_ERROR_NONE; } -static void _remove_mo_cb(void* ctx, int num, OCProvisionResult_t* arr, bool has_error) -{ - ma_subowner_s *client = (ma_subowner_s *)ctx; - - if (!has_error) { - MA_LOGD("Remove Multiple Ownership SUCCEEDED"); - } else { - MA_LOGD( "Remove Multiple Ownership FAILED "); - _print_result_list((const OCProvisionResult_t*) arr, num); - } - client->g_doneCB = true; -} - -static gpointer _remove_mo_func(gpointer data) -{ - OCStackResult ret = MA_ERROR_OPERATION_FAILED; - ma_req_cb_s *con = (ma_req_cb_s *)data; - - OCProvisionDev_t *src_dev = NULL; - OicUuid_t uuid_mowner; - OicUuid_t *uuid_target = NULL; - - if (!g_client) { - ret = OC_STACK_INVALID_PARAM; - MA_LOGE("mot agent is not initialized"); - goto REMOVE_MO_ENDED; - } - - if (!con->uuid_target_str) { - MA_LOGE("Target device UUID is NULL"); - goto REMOVE_MO_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) { - MA_LOGE("We can't find in MOT dev list"); - goto REMOVE_MO_ENDED; - } - - g_client->g_doneCB = false; - - ret = GetDoxmDevOwnerId(&uuid_mowner); - if (OC_STACK_OK != ret) { - MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret)); - goto REMOVE_MO_ENDED; - } -#ifdef MANIPULATE_LOCAL_PDM - ret = ma_open_db(); - if (OC_STACK_OK != ret) - MA_LOGE( "openDB: ret = %d (%s)", ret, _error_to_string(ret)); - ret = ma_delete_device((const OicUuid_t*) uuid_target); - if (OC_STACK_OK != ret) - MA_LOGE( "delete_mowned_device_db: ret = %d (%s)", ret, _error_to_string(ret)); - ret = ma_close_db(); - if (OC_STACK_OK != ret) - MA_LOGE( "closeDB: ret = %d (%s)", ret, _error_to_string(ret)); -#endif - ret = OCRemoveSubOwner(g_client, src_dev, &uuid_mowner, _remove_mo_cb); - if (OC_STACK_OK != ret ) { - MA_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret)); - goto REMOVE_MO_ENDED; - } - - ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); - if(ret) { - MA_LOGE( "OCRemoveSubOwner callback error = %d (%s)", ret, _error_to_string(ret)); - goto REMOVE_MO_ENDED; - } - - MA_LOGE("Remove Multiple Ownership Done"); - -REMOVE_MO_ENDED: - - net_ma_emit_remove_mo_done(ma_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 _ma_remove_mo(ma_service *service, gchar *uuid_str) -{ - ma_req_cb_s *con = NULL; - con = g_malloc0(sizeof(ma_req_cb_s)); - if (NULL == con) { - MA_LOGE( "g_malloc0() Fail=%d", errno); - /* Unset d2ds status 'pending' */ - g_atomic_int_set(&service->pending, 0); - return MA_ERROR_OUT_OF_MEMORY; - } - - con->userdata = service; - con->cid = MA_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) { - MA_LOGE("Failed to create thread"); - _request_cleanup(con); - return MA_ERROR_OUT_OF_MEMORY; - } - g_thread_unref(con->thread); - -#ifdef TIMEOUT_USED - con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S * 2, _ma_timeout_cb, con); -#endif - return MA_ERROR_NONE; -} - -static void _remove_remove_cred_local_cb(void* ctx, int num, - OCProvisionResult_t* arr, bool has_error) -{ - ma_subowner_s *client = (ma_subowner_s *)ctx; - - if (!has_error) { - MA_LOGD("Remove CRED for mowned device SUCCEEDED"); - } else { - MA_LOGD( "Remove CRED for mowned device FAILED "); - _print_result_list((const OCProvisionResult_t*) arr, num); - } - client->g_doneCB = true; -} - -static gpointer _remove_cred_local_func(gpointer data) -{ - OCStackResult ret = OC_STACK_OK; - ma_req_cb_s *con = (ma_req_cb_s *)data; - - OicUuid_t *uuid = NULL; - - if (!g_client) { - ret = OC_STACK_INVALID_PARAM; - MA_LOGE("mot agent is not initialized"); - goto REMOVE_LOCAL_CRED_ERROR; - } - - if (!con->target_to_revoke) { - MA_LOGE("Some parameters are wrong"); - MA_LOGE("%s", con->target_to_revoke ); - goto REMOVE_LOCAL_CRED_ERROR; - } - - uuid = _convert_uuid(con->target_to_revoke); - - g_client->g_doneCB = false; - MA_LOGI(" Removing CRED for remote device at local SVR DB"); - - ret = OCRemoveDeviceWithUuid((void*) g_client, CALLBACK_TIMEOUT_5S, uuid, - _remove_remove_cred_local_cb ); - if (OC_STACK_OK != ret) { - MA_LOGD( "OCRemoveDeviceWithUuid API error: %d (%s)", ret, _error_to_string(ret)); - goto REMOVE_LOCAL_CRED_ERROR; - } - - ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); - if (ret) { - MA_LOGE( "OCRemoveDeviceWithUuid Faild = %d", errno); - goto REMOVE_LOCAL_CRED_ERROR; - } - /* Disaply result result */ - MA_LOGI(" Removing CRED info. at local SVR DB - Done"); - -REMOVE_LOCAL_CRED_ERROR: - /* Notify ACL result */ - net_ma_emit_remove_cred_local_done(ma_dbus_get_object(), (int)ret); - if (uuid) - g_free(uuid); - _request_cleanup(con); - g_thread_exit(GINT_TO_POINTER (1)); - return NULL; -} - -static int _ma_remove_cred_local(ma_service *service, gchar *uuid_str) -{ - ma_req_cb_s *con = NULL; - con = g_malloc0(sizeof(ma_req_cb_s)); - if (NULL == con) { - MA_LOGE( "g_malloc0() Fail=%d", errno); - /* Unset d2ds status 'pending' */ - g_atomic_int_set(&service->pending, 0); - return MA_ERROR_OUT_OF_MEMORY; - } - - con->userdata = service; - con->cid = MA_REMOVE_CRED_LOCAL; - con->target_to_revoke = g_strdup(uuid_str); - - con->thread = g_thread_try_new("remove_mowned_dev_cred", _remove_cred_local_func, con, NULL); - if (!con->thread) { - MA_LOGE("Failed to create thread"); - _request_cleanup(con); - return MA_ERROR_OUT_OF_MEMORY; - } - g_thread_unref(con->thread); - -#ifdef TIMEOUT_USED - con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S * 2, _ma_timeout_cb, con); -#endif - return MA_ERROR_NONE; -} - #if 0 /* TEST */ static int sendGetLed() { @@ -1470,7 +1246,7 @@ CREATE_ACL_ERROR: return NULL; } -static void _provisioning_acl_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) +static void _acl_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) { ma_subowner_s *client = (ma_subowner_s *)ctx; @@ -1482,7 +1258,7 @@ static void _provisioning_acl_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr } client->g_doneCB = true; } -static gpointer _provisioning_acl_func(gpointer data) +static gpointer _acl_func(gpointer data) { OCStackResult ret = OC_STACK_OK; ma_req_cb_s *con = (ma_req_cb_s *)data; @@ -1498,7 +1274,8 @@ static gpointer _provisioning_acl_func(gpointer data) goto PVACL_ERROR; } - if (!con->uuid_subject_str ||!con->uuid_target_str || !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) { MA_LOGE("Some parameters are wrong"); MA_LOGE("%s", con->uuid_target_str ); MA_LOGE("%s", con->uuid_subject_str ); @@ -1532,7 +1309,7 @@ static gpointer _provisioning_acl_func(gpointer data) goto PVACL_ERROR; } - ret= OCProvisionACL((void*) g_client, target_dev, acl, _provisioning_acl_cb); + ret= OCProvisionACL((void*) g_client, target_dev, acl, _acl_cb); if (OC_STACK_OK != ret) { MA_LOGD( "OCProvisionACL API error: %d (%s)", ret, _error_to_string(ret)); goto PVACL_ERROR; @@ -1561,7 +1338,7 @@ PVACL_ERROR: return NULL; } -static int _provisioning_acl(ma_service *service, gchar *target, gchar *subject, +static int _acl(ma_service *service, gchar *target, gchar *subject, gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission) { ma_req_cb_s *con = NULL; @@ -1581,7 +1358,7 @@ static int _provisioning_acl(ma_service *service, gchar *target, gchar *subject, 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); + con->thread = g_thread_try_new("prov_acl", _acl_func, con, NULL); if (!con->thread) { MA_LOGE("Failed to create thread"); _request_cleanup(con); @@ -1594,7 +1371,7 @@ static int _provisioning_acl(ma_service *service, gchar *target, gchar *subject, return MA_ERROR_NONE; } -static void _provision_cred_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) +static void _cred_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) { ma_subowner_s *client = (ma_subowner_s *)ctx; @@ -1607,7 +1384,7 @@ static void _provision_cred_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, client->g_doneCB = true; } -static gpointer _cred_provisioning_func(gpointer data) +static gpointer _cred_func(gpointer data) { OCStackResult ret = OC_STACK_OK; ma_req_cb_s *con = (ma_req_cb_s *)data; @@ -1657,7 +1434,7 @@ static gpointer _cred_provisioning_func(gpointer data) MA_LOGI("Provisioning Selected Pairwise Devices.."); ret = OCProvisionCredentials((void*) g_client, SYMMETRIC_PAIR_WISE_KEY, OWNER_PSK_LENGTH_256, - dev1, dev2, _provision_cred_cb); + dev1, dev2, _cred_cb); if (OC_STACK_OK != ret) { MA_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret, _error_to_string(ret)); goto PVCRED_ERROR; @@ -1687,7 +1464,7 @@ PVCRED_ERROR: return NULL; } -static int _provisioning_cred(ma_service *service, +static int _cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2) { ma_req_cb_s *con = NULL; @@ -1711,7 +1488,7 @@ static int _provisioning_cred(ma_service *service, con->uuid_dev1 = g_strdup(uuid_dev1); con->uuid_dev2 = g_strdup(uuid_dev2); - con->thread = g_thread_try_new("prov_cred", _cred_provisioning_func, con, NULL); + con->thread = g_thread_try_new("prov_cred", _cred_func, con, NULL); if (!con->thread) { MA_LOGE("Failed to create thread"); _request_cleanup(con); @@ -1724,7 +1501,7 @@ static int _provisioning_cred(ma_service *service, return MA_ERROR_NONE; } -static void _provisioning_pairwise_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) +static void _pairwise_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) { ma_subowner_s *client = (ma_subowner_s *)ctx; @@ -1737,7 +1514,7 @@ static void _provisioning_pairwise_cb(void* ctx, int nOfRes, OCProvisionResult_t client->g_doneCB = true; } -static gpointer _provisioning_pairwise_func(gpointer data) +static gpointer _pairwise_func(gpointer data) { OCStackResult ret = OC_STACK_OK; ma_req_cb_s *con = (ma_req_cb_s *)data; @@ -1827,7 +1604,7 @@ static gpointer _provisioning_pairwise_func(gpointer data) ret = OCProvisionPairwiseDevices((void*) g_client, SYMMETRIC_PAIR_WISE_KEY, OWNER_PSK_LENGTH_256, target_dev_1, acl_1, - target_dev_2, acl_2, _provisioning_pairwise_cb); + target_dev_2, acl_2, _pairwise_cb); if (OC_STACK_OK != ret) { MA_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret, _error_to_string(ret)); @@ -1864,8 +1641,7 @@ PVPAIRWIE_ERROR: return NULL; } - -static int _provisioning_pairwise_link(ma_service *service, gchar *target_1, gchar *subject_1, +static int _pairwise(ma_service *service, gchar *target_1, gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1, gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2) { @@ -1895,7 +1671,7 @@ static int _provisioning_pairwise_link(ma_service *service, gchar *target_1, gch con->rsrc_interface_2 = g_strdup(rsrc_interface_2); con->permission_2 = permission_2; - con->thread = g_thread_try_new("prov_pairwise", _provisioning_pairwise_func, + con->thread = g_thread_try_new("prov_pairwise", _pairwise_func, con, NULL); if (!con->thread) { MA_LOGE("Failed to create thread"); @@ -1910,7 +1686,6 @@ static int _provisioning_pairwise_link(ma_service *service, gchar *target_1, gch return MA_ERROR_NONE; } - static void _unlink_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error) { ma_subowner_s *client = (ma_subowner_s *)ctx; @@ -1924,7 +1699,7 @@ static void _unlink_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has client->g_doneCB = true; } -static gpointer _unlink_provisioning_func(gpointer data) +static gpointer _unlink_func(gpointer data) { OCStackResult ret = OC_STACK_OK; ma_req_cb_s *con = (ma_req_cb_s *)data; @@ -1965,7 +1740,7 @@ static gpointer _unlink_provisioning_func(gpointer data) g_client->g_doneCB = false; - MA_LOGI("Provisioning Selected Pairwise Devices.."); + MA_LOGI("Unlink Selected Pairwise Devices.."); ret = OCUnlinkDevices((void*) g_client, dev1, dev2, _unlink_cb ); if (OC_STACK_OK != ret) { MA_LOGD( "OCUnlinkDevices API error: %d (%s)", ret, _error_to_string(ret)); @@ -1996,7 +1771,7 @@ PVUNLINKPAIRWISE_ERROR: return NULL; } -static int _provisioning_unlink(ma_service *service, +static int _unlink(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2) { ma_req_cb_s *con = NULL; @@ -2009,7 +1784,7 @@ static int _provisioning_unlink(ma_service *service, } con->userdata = service; - con->cid = MA_UNPAIR; + con->cid = MA_UNLINK; if (!uuid_dev1 ||!uuid_dev2) { MA_LOGE( "Invaild Prameters"); @@ -2020,7 +1795,7 @@ static int _provisioning_unlink(ma_service *service, con->uuid_dev1 = g_strdup(uuid_dev1); con->uuid_dev2 = g_strdup(uuid_dev2); - con->thread = g_thread_try_new("prov_unlink", _unlink_provisioning_func, + con->thread = g_thread_try_new("prov_unlink", _unlink_func, con, NULL); if (!con->thread) { MA_LOGE("Failed to create thread"); @@ -2035,15 +1810,597 @@ static int _provisioning_unlink(ma_service *service, return MA_ERROR_NONE; } -int ma_request_enable(ma_service *service) +static void _remove_mo_cb(void* ctx, int num, OCProvisionResult_t* arr, bool has_error) { - int ret = MA_ERROR_NONE; - ma_check_null_ret_error("service", service, FALSE); - ret = _init_provision_client(); - return ret; + ma_subowner_s *client = (ma_subowner_s *)ctx; + + if (!has_error) { + MA_LOGD("Remove Multiple Ownership SUCCEEDED"); + } else { + MA_LOGD( "Remove Multiple Ownership FAILED "); + _print_result_list((const OCProvisionResult_t*) arr, num); + } + client->g_doneCB = true; } -int ma_request_disc_mot_enb_devs(ma_service *service) +static gpointer _remove_mo_func(gpointer data) +{ + OCStackResult ret = MA_ERROR_OPERATION_FAILED; + ma_req_cb_s *con = (ma_req_cb_s *)data; + + OCProvisionDev_t *src_dev = NULL; + OicUuid_t uuid_mowner; + OicUuid_t *uuid_target = NULL; + + if (!g_client) { + ret = OC_STACK_INVALID_PARAM; + MA_LOGE("mot agent is not initialized"); + goto REMOVE_MO_ENDED; + } + + if (!con->uuid_target_str) { + MA_LOGE("Target device UUID is NULL"); + goto REMOVE_MO_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) { + MA_LOGE("We can't find in MOT dev list"); + goto REMOVE_MO_ENDED; + } + + g_client->g_doneCB = false; + + ret = GetDoxmDevOwnerId(&uuid_mowner); + if (OC_STACK_OK != ret) { + MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret)); + goto REMOVE_MO_ENDED; + } +#ifdef MANIPULATE_LOCAL_PDM + ret = ma_open_db(); + if (OC_STACK_OK != ret) + MA_LOGE( "openDB: ret = %d (%s)", ret, _error_to_string(ret)); + ret = ma_delete_device((const OicUuid_t*) uuid_target); + if (OC_STACK_OK != ret) + MA_LOGE( "delete_mowned_device_db: ret = %d (%s)", ret, _error_to_string(ret)); + ret = ma_close_db(); + if (OC_STACK_OK != ret) + MA_LOGE( "closeDB: ret = %d (%s)", ret, _error_to_string(ret)); +#endif + ret = OCRemoveSubOwner(g_client, src_dev, &uuid_mowner, _remove_mo_cb); + if (OC_STACK_OK != ret ) { + MA_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret)); + goto REMOVE_MO_ENDED; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if(ret) { + MA_LOGE( "OCRemoveSubOwner callback error = %d (%s)", ret, _error_to_string(ret)); + goto REMOVE_MO_ENDED; + } + + MA_LOGE("Remove Multiple Ownership Done"); + +REMOVE_MO_ENDED: + + net_ma_emit_remove_mo_done(ma_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 _ma_remove_mo(ma_service *service, gchar *uuid_str) +{ + ma_req_cb_s *con = NULL; + con = g_malloc0(sizeof(ma_req_cb_s)); + if (NULL == con) { + MA_LOGE( "g_malloc0() Fail=%d", errno); + /* Unset d2ds status 'pending' */ + g_atomic_int_set(&service->pending, 0); + return MA_ERROR_OUT_OF_MEMORY; + } + + con->userdata = service; + con->cid = MA_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) { + MA_LOGE("Failed to create thread"); + _request_cleanup(con); + return MA_ERROR_OUT_OF_MEMORY; + } + g_thread_unref(con->thread); + +#ifdef TIMEOUT_USED + con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S * 2, _ma_timeout_cb, con); +#endif + return MA_ERROR_NONE; +} + +static void _remove_remove_cred_local_cb(void* ctx, int num, + OCProvisionResult_t* arr, bool has_error) +{ + ma_subowner_s *client = (ma_subowner_s *)ctx; + + if (!has_error) { + MA_LOGD("Remove CRED for mowned device SUCCEEDED"); + } else { + MA_LOGD( "Remove CRED for mowned device FAILED "); + _print_result_list((const OCProvisionResult_t*) arr, num); + } + client->g_doneCB = true; +} + +static gpointer _remove_cred_local_func(gpointer data) +{ + OCStackResult ret = OC_STACK_OK; + ma_req_cb_s *con = (ma_req_cb_s *)data; + + OicUuid_t *uuid = NULL; + + if (!g_client) { + ret = OC_STACK_INVALID_PARAM; + MA_LOGE("mot agent is not initialized"); + goto REMOVE_LOCAL_CRED_ERROR; + } + + if (!con->target_to_revoke) { + MA_LOGE("Some parameters are wrong"); + MA_LOGE("%s", con->target_to_revoke ); + goto REMOVE_LOCAL_CRED_ERROR; + } + + uuid = _convert_uuid(con->target_to_revoke); + + g_client->g_doneCB = false; + MA_LOGI(" Removing CRED for remote device at local SVR DB"); + + ret = OCRemoveDeviceWithUuid((void*) g_client, CALLBACK_TIMEOUT_5S, uuid, + _remove_remove_cred_local_cb ); + if (OC_STACK_OK != ret) { + MA_LOGD( "OCRemoveDeviceWithUuid API error: %d (%s)", ret, _error_to_string(ret)); + goto REMOVE_LOCAL_CRED_ERROR; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if (ret) { + MA_LOGE( "OCRemoveDeviceWithUuid Faild = %d", errno); + goto REMOVE_LOCAL_CRED_ERROR; + } + /* Disaply result result */ + MA_LOGI(" Removing CRED info. at local SVR DB - Done"); + +REMOVE_LOCAL_CRED_ERROR: + /* Notify ACL result */ + net_ma_emit_remove_cred_local_done(ma_dbus_get_object(), (int)ret); + if (uuid) + g_free(uuid); + _request_cleanup(con); + g_thread_exit(GINT_TO_POINTER (1)); + return NULL; +} + +static int _ma_remove_cred_local(ma_service *service, gchar *uuid_str) +{ + ma_req_cb_s *con = NULL; + con = g_malloc0(sizeof(ma_req_cb_s)); + if (NULL == con) { + MA_LOGE( "g_malloc0() Fail=%d", errno); + /* Unset d2ds status 'pending' */ + g_atomic_int_set(&service->pending, 0); + return MA_ERROR_OUT_OF_MEMORY; + } + + con->userdata = service; + con->cid = MA_REMOVE_CRED_LOCAL; + con->target_to_revoke = g_strdup(uuid_str); + + con->thread = g_thread_try_new("remove_mowned_dev_cred", _remove_cred_local_func, con, NULL); + if (!con->thread) { + MA_LOGE("Failed to create thread"); + _request_cleanup(con); + return MA_ERROR_OUT_OF_MEMORY; + } + g_thread_unref(con->thread); + +#ifdef TIMEOUT_USED + con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S * 2, _ma_timeout_cb, con); +#endif + return MA_ERROR_NONE; +} + +static gpointer _pair_func(gpointer data) +{ + OCStackResult ret = OC_STACK_OK; + ma_req_cb_s *con = (ma_req_cb_s *)data; + + OicUuid_t *uuid_1 = NULL; + OicUuid_t *uuid_2 = NULL; + OicUuid_t *uuid_3 = NULL; + OicUuid_t *uuid_4 = NULL; + + OicSecAcl_t* acl_1 = NULL; + OicSecAcl_t* acl_2 = NULL; + + OCProvisionDev_t *target_dev_1 = NULL; + OCProvisionDev_t *target_dev_2 = NULL; + OCProvisionDev_t *subject_dev_1 = NULL; + OCProvisionDev_t *subject_dev_2 = NULL; + + OCProvisionDev_t *src_dev = NULL; + OCProvisionDev_t *next_dev = NULL; + + if (!g_client) { + ret = OC_STACK_INVALID_PARAM; + MA_LOGE("mot agent is not initialized"); + goto PVPAIR_ERROR; + } + + if (!con->subject_1 || !con->rsrc_uri_1 || !con->rsrc_type_1 || !con->rsrc_interface_1 || + !con->subject_2 || !con->rsrc_uri_2 || !con->rsrc_type_2 || !con->rsrc_interface_2) { + MA_LOGE("Some parameters are wrong"); + MA_LOGE("%s", con->subject_1 ); + MA_LOGE("%s", con->rsrc_uri_1 ); + MA_LOGE("%s", con->rsrc_type_1 ); + MA_LOGE("%s", con->rsrc_interface_1 ); + MA_LOGE("%s", con->subject_2 ); + MA_LOGE("%s", con->rsrc_uri_2 ); + MA_LOGE("%s", con->rsrc_type_2 ); + MA_LOGE("%s", con->rsrc_interface_2 ); + + goto PVPAIR_ERROR; + } + + uuid_1 = _convert_uuid(con->target_1); + target_dev_1 = _get_dev_by_uuid(g_client->g_motdev_list, uuid_1); + if (!target_dev_1) { + MA_LOGE("We can't find target in MOT enabled dev list"); + goto PVPAIR_ERROR; + } + + uuid_2 = _convert_uuid(con->target_2); + target_dev_2 = _get_dev_by_uuid(g_client->g_motdev_list, uuid_2); + if (!target_dev_2) { + MA_LOGE("We can't find target in MOT enabled dev list"); + goto PVPAIR_ERROR; + } + + uuid_3 = _convert_uuid(con->subject_1); + subject_dev_1 = _get_dev_by_uuid(g_client->g_motdev_list, uuid_3); + if (!subject_dev_1) { + MA_LOGE("We can't find subject in MOWNED dev list"); + goto PVPAIR_ERROR; + } + + uuid_4 = _convert_uuid(con->subject_2); + subject_dev_2 = _get_dev_by_uuid(g_client->g_motdev_list, uuid_4); + if (!subject_dev_2) { + MA_LOGE("We can't find subject in MOWNED dev list"); + goto PVPAIR_ERROR; + } + + src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_2); + if (!src_dev) { + MA_LOGE("We can't find in MOT dev list"); + goto PVPAIR_ERROR; + } + /* Copy next MOT enabled device pointer temporally */ + next_dev = src_dev->next; + /* Next MOT enabled device set NULL to MOT a single device */ + src_dev->next = NULL; + + g_client->g_doneCB = false; + + if(OIC_PRECONFIG_PIN == src_dev->doxm->oxmSel) { + /* Pre-Configured PIN initialization */ + const char* testPreconfigPin = con->pin;/* Ex) "12341234" */ + ret = OCAddPreconfigPin(src_dev, testPreconfigPin, strlen(testPreconfigPin)); + if(OC_STACK_OK != ret) { + MA_LOGE("Failed to save the pre-configured PIN"); + MA_LOGE("You can't use the pre-configured PIN OxM for MOT"); + goto PVPAIR_ERROR; + } + } + ret = OCDoMultipleOwnershipTransfer(g_client, src_dev, _mot_cb); + if (OC_STACK_OK != ret ) { + MA_LOGE( "OCDoMultipleOwnershipTransfer: ret = %d (%s)", ret, _error_to_string(ret)); + goto PVPAIR_ERROR; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if (OC_STACK_OK != ret ) { + MA_LOGE( "OCDoMultipleOwnershipTransfer callback error = %d (%s)", ret, _error_to_string(ret)); + goto PVPAIR_ERROR; + } + /* Restore MOT enabled devices */ + src_dev->next = next_dev ; + + MA_LOGE("Registered Discovered Devices"); + + g_client->g_doneCB = false; + + MA_LOGI(" Provisioning Selected Pairwise.."); + + acl_1 = _create_target_acl(&target_dev_1->doxm->deviceID, + &subject_dev_1->doxm->deviceID, con->rsrc_uri_1, + con->rsrc_type_1, + con->rsrc_interface_1, con->permission_1); + if (NULL == acl_1) { + MA_LOGE( "Failed to create ACL for %s", con->rsrc_uri); + goto PVPAIR_ERROR; + } + + acl_2 = _create_target_acl(&target_dev_2->doxm->deviceID, + &subject_dev_2->doxm->deviceID, con->rsrc_uri_2, + con->rsrc_type_2, + con->rsrc_interface_2, con->permission_2); + if (NULL == acl_2) { + MA_LOGE( "Failed to create ACL for %s", con->rsrc_uri); + goto PVPAIR_ERROR; + } + + ret = OCProvisionPairwiseDevices((void*) g_client, SYMMETRIC_PAIR_WISE_KEY, + OWNER_PSK_LENGTH_256, target_dev_1, acl_1, + target_dev_2, acl_2, _pairwise_cb); + if (OC_STACK_OK != ret) { + MA_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret, + _error_to_string(ret)); + goto PVPAIR_ERROR; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if (ret) { + MA_LOGE( "OCProvisionPairwise Faild = %d", errno); + goto PVPAIR_ERROR; + } + /* display the pairwise-provisioned result */ + MA_LOGI(" Provision pairwise Done"); + +PVPAIR_ERROR: + /* Notify pair result */ + net_ma_emit_pair_done(ma_dbus_get_object(), (int)ret); + + if (uuid_1) + g_free(uuid_1); + if (uuid_2) + g_free(uuid_2); + if (uuid_3) + g_free(uuid_3); + if (uuid_4) + g_free(uuid_4); + if (acl_1) + OCDeleteACLList(acl_1); + if (acl_2) + OCDeleteACLList(acl_2); + + _request_cleanup(con); + + g_thread_exit(GINT_TO_POINTER (1)); + return NULL; +} + +static int _pair(ma_service *service, gchar *pin, gchar *target_1, gchar *subject_1, + gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1, + gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2) +{ + ma_req_cb_s *con = NULL; + con = g_malloc0(sizeof(ma_req_cb_s)); + if (NULL == con) { + MA_LOGE( "g_malloc0() Fail=%d", errno); + /* Unset d2ds status 'pending' */ + g_atomic_int_set(&service->pending, 0); + return MA_ERROR_OUT_OF_MEMORY; + } + + con->userdata = service; + con->cid = MA_PAIR; + + con->pin = g_strdup(pin); + con->target_1 = g_strdup(target_1); + con->subject_1 = g_strdup(subject_1); + con->rsrc_uri_1 = g_strdup(rsrc_uri_1); + con->rsrc_type_1 = g_strdup(rsrc_type_1); + con->rsrc_interface_1 = g_strdup(rsrc_interface_1); + con->permission_1 = permission_1; + + con->target_2 = g_strdup(target_2); + con->subject_2 = g_strdup(subject_2); + con->rsrc_uri_2 = g_strdup(rsrc_uri_2); + con->rsrc_type_2 = g_strdup(rsrc_type_2); + con->rsrc_interface_2 = g_strdup(rsrc_interface_2); + con->permission_2 = permission_2; + + con->thread = g_thread_try_new("pair", _pair_func, con, NULL); + if (!con->thread) { + MA_LOGE("Failed to create thread"); + _request_cleanup(con); + return MA_ERROR_OUT_OF_MEMORY; + } + g_thread_unref(con->thread); +#ifdef TIMEOUT_USED + con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S * 2, _ma_timeout_cb, con); +#endif + return MA_ERROR_NONE; +} + +static gpointer _unpair_func(gpointer data) +{ + OCStackResult ret = OC_STACK_OK; + ma_req_cb_s *con = (ma_req_cb_s *)data; + + OicUuid_t uuid_mowner; + OicUuid_t *owner_uuid = NULL; + OicUuid_t *owned_uuid = NULL; + OCProvisionDev_t *owner_dev = NULL; + OCProvisionDev_t *owned_dev = NULL; + + if (NULL == g_client) { + ret = OC_STACK_INVALID_PARAM; + MA_LOGE("mot agent is not initialized"); + goto PVUNPAIR_ERROR; + } + + if (NULL == con->uuid_dev1 ) { + MA_LOGE("dev1 is NULL"); + goto PVUNPAIR_ERROR; + } + if (NULL == con->uuid_dev2) { + MA_LOGE("dev2 is NULL"); + goto PVUNPAIR_ERROR; + } + + owner_uuid = _convert_uuid(con->uuid_dev1); + owner_dev = _get_dev_by_uuid(g_client->g_motdev_list, owner_uuid); + if (!owner_dev) { + MA_LOGE("We can't find in MOWNED dev list"); + goto PVUNPAIR_ERROR; + } + + owned_uuid = _convert_uuid(con->uuid_dev2); + owned_dev = _get_dev_by_uuid(g_client->g_motdev_list, owned_uuid); + if (!owned_dev) { + MA_LOGE("We can't find in MOWNED dev list"); + goto PVUNPAIR_ERROR; + } + + g_client->g_doneCB = false; + + MA_LOGI("Unlink Selected Pairwise Devices.."); + ret = OCUnlinkDevices((void*) g_client, owner_dev, owned_dev, _unlink_cb ); + if (OC_STACK_OK != ret) { + MA_LOGD( "OCUnlinkDevices API error = %d (%s)", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if (OC_STACK_OK != ret) { + MA_LOGD( "OCUnlinkDevices Timeout = %d (%s)", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + + /* display the pairwise-provisioned result */ + MA_LOGI("Unlink Devices Done"); + + g_client->g_doneCB = false; + + ret = GetDoxmDevOwnerId(&uuid_mowner); + if (OC_STACK_OK != ret) { + MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + + ret = OCRemoveSubOwner(g_client, owned_dev, &uuid_mowner, _remove_mo_cb); + if (OC_STACK_OK != ret ) { + MA_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if (OC_STACK_OK != ret) { + MA_LOGE( "OCRemoveSubOwner Timeout = %d (%s)", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + + MA_LOGE("Remove Multiple Ownership Done"); + + g_client->g_doneCB = false; + + MA_LOGI(" Removing CRED for remote device at local SVR DB"); + + ret = OCRemoveDeviceWithUuid((void*) g_client, CALLBACK_TIMEOUT_5S, owned_uuid, + _remove_remove_cred_local_cb ); + if (OC_STACK_OK != ret) { + MA_LOGD( "OCRemoveDeviceWithUuid API error = %d (%s)", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + + ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S); + if (OC_STACK_OK != ret) { + MA_LOGD( "OCRemoveDeviceWithUuid Timeout = %d (%s)", ret, _error_to_string(ret)); + goto PVUNPAIR_ERROR; + } + /* Disaply result result */ + MA_LOGI(" Removing CRED info. at local SVR DB - Done"); + +PVUNPAIR_ERROR: + /* Notify unpair result */ + net_ma_emit_unpair_done(ma_dbus_get_object(), (int)ret); + + if (owner_uuid) + g_free(owner_uuid); + if (owned_uuid) + g_free(owned_uuid); + + _request_cleanup(con); + + g_thread_exit(GINT_TO_POINTER (1)); + + return NULL; +} + +static int _unpair(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2) +{ + ma_req_cb_s *con = NULL; + con = g_malloc0(sizeof(ma_req_cb_s)); + if (!con) { + MA_LOGE( "g_malloc0() Fail=%d", errno); + /* Unset d2ds status 'pending' */ + g_atomic_int_set(&service->pending, 0); + return MA_ERROR_OUT_OF_MEMORY; + } + + con->userdata = service; + con->cid = MA_UNPAIR; + + if (!uuid_dev1 ||!uuid_dev2) { + MA_LOGE( "Invaild Prameters"); + _request_cleanup(con); + return MA_ERROR_INVALID_PARAMETER; + } + + con->uuid_dev1 = g_strdup(uuid_dev1); + con->uuid_dev2 = g_strdup(uuid_dev2); + + con->thread = g_thread_try_new("prov_unlink", _unpair_func, con, NULL); + if (!con->thread) { + MA_LOGE("Failed to create thread"); + _request_cleanup(con); + return MA_ERROR_OUT_OF_MEMORY; + } + g_thread_unref(con->thread); +#ifdef TIMEOUT_USED + con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S * 2, _ma_timeout_cb, con); +#endif + return MA_ERROR_NONE; +} + +int ma_request_get_ownerid(ma_service *service, gchar **uuid_str) +{ + int ret =MA_ERROR_NONE; + OicUuid_t uuid; + + ma_check_null_ret_error("service", service, FALSE); + + MA_LOGD("[IPC] Get Device ID"); + + ret = GetDoxmDevOwnerId(&uuid); + if (OC_STACK_OK != ret) + MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret)); + + ret = ConvertUuidToStr(&uuid, uuid_str); + if (OC_STACK_OK != ret) + MA_LOGE("ConvertUuidToStr faild = [%d][%s]", ret, _error_to_string(ret)); + + return ret; +} + +int ma_request_disc_mot_enb_devs(ma_service *service) { int ret =MA_ERROR_NONE; @@ -2109,93 +2466,115 @@ int ma_request_mot(ma_service *service, gchar* uuid_str, gchar *pin) return ret; } -int ma_request_remove_mo(ma_service *service, gchar* uuid_str) +int ma_request_prov_acl(ma_service *service, gchar *target, gchar *subject, + gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission) { int ret =MA_ERROR_NONE; ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Remove Mulltiple Ownership"); + MA_LOGD("[IPC] Provisioning ACL"); /* If we are working now? */ if (g_atomic_int_get(&service->pending)) return MA_ERROR_IN_PROGRESS; - if (!uuid_str) { - MA_LOGE("uuid_str = %s", uuid_str); + if (!target || !subject || !rsrc_uri || !rsrc_type || !rsrc_interface) { + MA_LOGE("target = %s", target); + MA_LOGE("subject = %s", subject); + MA_LOGE("rsrc_uri = %s", rsrc_uri); + MA_LOGE("rsrc_type = %s", rsrc_type); + MA_LOGE("rsrc_interface = %s", rsrc_interface); return MA_ERROR_INVALID_PARAMETER; } /* Set d2ds status 'pending' */ g_atomic_int_set(&service->pending, 1); - ret = _ma_remove_mo(service, uuid_str); + ret = _acl(service, target, subject, rsrc_uri, rsrc_type, rsrc_interface, permission); return ret; } -int ma_request_remove_cred_local(ma_service *service, gchar* uuid_str) +int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2) { int ret =MA_ERROR_NONE; ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Remove CRED for Owned Dev in my SVR DB"); + MA_LOGD("[IPC] Provisioning Credential"); /* If we are working now? */ if (g_atomic_int_get(&service->pending)) return MA_ERROR_IN_PROGRESS; - if (!uuid_str) { - MA_LOGE("uuid_str = %s", uuid_str); + if (!uuid_dev1 || !uuid_dev2) { + MA_LOGE("uuid_dev1 = %s", uuid_dev1); + MA_LOGE("uuid_dev2 = %s", uuid_dev2); return MA_ERROR_INVALID_PARAMETER; } /* Set d2ds status 'pending' */ g_atomic_int_set(&service->pending, 1); - ret = _ma_remove_cred_local(service, uuid_str); + ret = _cred(service, uuid_dev1, uuid_dev2); return ret; } -int ma_request_prov_acl(ma_service *service, gchar *target, gchar *subject, - gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission) +int ma_request_pairwise(ma_service *service, gchar *target_1, + gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1, + gchar *rsrc_interface_1, int permission_1, + gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, + gchar *rsrc_type_2, gchar *rsrc_interface_2, + int permission_2) { - int ret =MA_ERROR_NONE; + int ret = MA_ERROR_NONE; ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Provisioning ACL"); + MA_LOGD("[IPC] Link Pairwise"); /* If we are working now? */ if (g_atomic_int_get(&service->pending)) return MA_ERROR_IN_PROGRESS; - if (!target || !subject || !rsrc_uri || !rsrc_type || !rsrc_interface) { - MA_LOGE("target = %s", target); - MA_LOGE("subject = %s", subject); - MA_LOGE("rsrc_uri = %s", rsrc_uri); - MA_LOGE("rsrc_type = %s", rsrc_type); - MA_LOGE("rsrc_interface = %s", rsrc_interface); + if (!target_1 || !subject_1 || !rsrc_uri_1 || !rsrc_type_1 || + !rsrc_interface_1 || !target_2 || !subject_2 || !rsrc_uri_2 || + !rsrc_type_2 || !rsrc_interface_2) { + MA_LOGE("target_1 = %s", target_1); + MA_LOGE("subject_1 = %s", subject_1); + MA_LOGE("rsrc_uri_1 = %s", rsrc_uri_1); + MA_LOGE("rsrc_type_1 = %s", rsrc_type_1); + MA_LOGE("rsrc_interface_1 = %s", rsrc_interface_1); + MA_LOGE("target_2 = %s", target_2); + MA_LOGE("subject_2 = %s", subject_2); + MA_LOGE("rsrc_uri_2 = %s", rsrc_uri_2); + MA_LOGE("rsrc_type_2 = %s", rsrc_type_2); + MA_LOGE("rsrc_interface_2 = %s", rsrc_interface_2); return MA_ERROR_INVALID_PARAMETER; } /* Set d2ds status 'pending' */ g_atomic_int_set(&service->pending, 1); - ret = _provisioning_acl(service, target, subject, rsrc_uri, rsrc_type, rsrc_interface, permission); + ret = _pairwise(service, target_1, subject_1, rsrc_uri_1, + rsrc_type_1, rsrc_interface_1, permission_1, target_2, + subject_2, rsrc_uri_2, rsrc_type_2, rsrc_interface_2, + permission_2); return ret; + } -int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2) +int ma_request_unlink(ma_service *service, gchar *uuid_dev1, + gchar *uuid_dev2) { - int ret =MA_ERROR_NONE; + int ret = MA_ERROR_NONE; ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Provisioning Credential"); + MA_LOGD("[IPC] Unlink devices"); /* If we are working now? */ if (g_atomic_int_get(&service->pending)) @@ -2210,65 +2589,62 @@ int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2 /* Set d2ds status 'pending' */ g_atomic_int_set(&service->pending, 1); - ret = _provisioning_cred(service, uuid_dev1, uuid_dev2); + ret = _unlink(service, uuid_dev1, uuid_dev2); return ret; } -int ma_request_get_ownerid(ma_service *service, gchar **uuid_str) +int ma_request_remove_mo(ma_service *service, gchar* uuid_str) { int ret =MA_ERROR_NONE; - OicUuid_t uuid; ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Get Device ID"); + MA_LOGD("[IPC] Remove Mulltiple Ownership"); - ret = GetDoxmDevOwnerId(&uuid); - if (OC_STACK_OK != ret) - MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret)); + /* If we are working now? */ + if (g_atomic_int_get(&service->pending)) + return MA_ERROR_IN_PROGRESS; - ret = ConvertUuidToStr(&uuid, uuid_str); - if (OC_STACK_OK != ret) - MA_LOGE("ConvertUuidToStr faild = [%d][%s]", ret, _error_to_string(ret)); + if (!uuid_str) { + MA_LOGE("uuid_str = %s", uuid_str); + return MA_ERROR_INVALID_PARAMETER; + } + + /* Set d2ds status 'pending' */ + g_atomic_int_set(&service->pending, 1); + + ret = _ma_remove_mo(service, uuid_str); return ret; } -int ma_request_disable(ma_service *service) +int ma_request_remove_cred_local(ma_service *service, gchar* uuid_str) { - NOTUSED(service); + int ret =MA_ERROR_NONE; - if (!g_client) - return MA_ERROR_NONE; + ma_check_null_ret_error("service", service, FALSE); - if (OC_STACK_OK != OCStop()) { - MA_LOGE( "OCStack stop error"); - } + MA_LOGD("[IPC] Remove CRED for Owned Dev in my SVR DB"); - OCTerminatePM(); + /* If we are working now? */ + if (g_atomic_int_get(&service->pending)) + return MA_ERROR_IN_PROGRESS; - if (g_client->g_mowned_list) { - OCDeleteDiscoveredDevices(g_client->g_mowned_list); - g_client->g_mowned_list = NULL; - } - if (g_client->g_motdev_list) { - OCDeleteDiscoveredDevices(g_client->g_motdev_list); - g_client->g_motdev_list= NULL; + if (!uuid_str) { + MA_LOGE("uuid_str = %s", uuid_str); + return MA_ERROR_INVALID_PARAMETER; } - if (g_client->rnd_pin) { - g_free(g_client->rnd_pin); - g_client->rnd_pin = NULL; - } + /* Set d2ds status 'pending' */ + g_atomic_int_set(&service->pending, 1); - g_free(g_client); - g_client = NULL; + ret = _ma_remove_cred_local(service, uuid_str); - return MA_ERROR_NONE; + return ret; } -int ma_request_pairwise(ma_service *service, gchar *target_1, +int ma_request_pair(ma_service *service, gchar *pin, gchar *target_1, gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1, gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, @@ -2279,15 +2655,16 @@ int ma_request_pairwise(ma_service *service, gchar *target_1, ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Link Pairwise"); + MA_LOGD("[IPC] Pair both device"); /* If we are working now? */ if (g_atomic_int_get(&service->pending)) return MA_ERROR_IN_PROGRESS; - if (!target_1 || !subject_1 || !rsrc_uri_1 || !rsrc_type_1 || + if (!pin || !target_1 || !subject_1 || !rsrc_uri_1 || !rsrc_type_1 || !rsrc_interface_1 || !target_2 || !subject_2 || !rsrc_uri_2 || !rsrc_type_2 || !rsrc_interface_2) { + MA_LOGE("pin = %s", pin); MA_LOGE("target_1 = %s", target_1); MA_LOGE("subject_1 = %s", subject_1); MA_LOGE("rsrc_uri_1 = %s", rsrc_uri_1); @@ -2304,10 +2681,10 @@ int ma_request_pairwise(ma_service *service, gchar *target_1, /* Set d2ds status 'pending' */ g_atomic_int_set(&service->pending, 1); - ret = _provisioning_pairwise_link(service, target_1, subject_1, rsrc_uri_1, - rsrc_type_1, rsrc_interface_1, permission_1, target_2, - subject_2, rsrc_uri_2, rsrc_type_2, rsrc_interface_2, - permission_2); + ret = _pair(service, pin, target_1, subject_1, rsrc_uri_1, + rsrc_type_1, rsrc_interface_1, permission_1, target_2, + subject_2, rsrc_uri_2, rsrc_type_2, rsrc_interface_2, + permission_2); return ret; @@ -2320,7 +2697,7 @@ int ma_request_unpair(ma_service *service, gchar *uuid_dev1, ma_check_null_ret_error("service", service, FALSE); - MA_LOGD("[IPC] Unlink devices"); + MA_LOGD("[IPC] Unpair both devices"); /* If we are working now? */ if (g_atomic_int_get(&service->pending)) @@ -2335,7 +2712,49 @@ int ma_request_unpair(ma_service *service, gchar *uuid_dev1, /* Set d2ds status 'pending' */ g_atomic_int_set(&service->pending, 1); - ret = _provisioning_unlink(service, uuid_dev1, uuid_dev2); + ret = _unpair(service, uuid_dev1, uuid_dev2); + + return ret; +} +int ma_request_enable(ma_service *service) +{ + int ret = MA_ERROR_NONE; + ma_check_null_ret_error("service", service, FALSE); + ret = _init_provision_client(); return ret; } + +int ma_request_disable(ma_service *service) +{ + NOTUSED(service); + + if (!g_client) + return MA_ERROR_NONE; + + if (OC_STACK_OK != OCStop()) { + MA_LOGE( "OCStack stop error"); + } + + OCTerminatePM(); + + if (g_client->g_mowned_list) { + OCDeleteDiscoveredDevices(g_client->g_mowned_list); + g_client->g_mowned_list = NULL; + } + if (g_client->g_motdev_list) { + OCDeleteDiscoveredDevices(g_client->g_motdev_list); + g_client->g_motdev_list= NULL; + } + + if (g_client->rnd_pin) { + g_free(g_client->rnd_pin); + g_client->rnd_pin = NULL; + } + + g_free(g_client); + g_client = NULL; + + return MA_ERROR_NONE; +} + diff --git a/src/mot-agent/ma-subowner.h b/src/mot-agent/ma-subowner.h index 3c5c1ac..a89b082 100644 --- a/src/mot-agent/ma-subowner.h +++ b/src/mot-agent/ma-subowner.h @@ -32,8 +32,10 @@ typedef enum { MA_MOT, /**< Do Multiple Onwership Transfer */ MA_PROV_ACL, /**< ACL Provisioning */ MA_PROV_CRED, /**< CRED Provisioning */ + MA_UNLINK, /**< Unlink */ MA_REMOVE_MOT, /**< Remove Multiple Ownership */ MA_REMOVE_CRED_LOCAL, /**< Remove CRED my owned device in MOT agent's SVR DB */ + MA_PAIR, /**< Unpair */ MA_UNPAIR, /**< Unpair */ MA_PROV_PAIRWISE, /** < Pairwise Provisioning */ } ma_cmd_id_e; @@ -49,24 +51,30 @@ typedef enum { } ma_permission_e; int ma_request_enable(ma_service *service); +int ma_request_disable(ma_service *service); +int ma_request_get_ownerid(ma_service *service, gchar **uuid_str); int ma_request_disc_mot_enb_devs(ma_service *service); int ma_request_disc_owned_devs(ma_service *service); int ma_request_mot(ma_service *service, gchar* uuid, gchar *pin); -int ma_request_remove_mo(ma_service *service, gchar* uuid_str); -int ma_request_remove_cred_local(ma_service *service, gchar* uuid_str); int ma_request_prov_acl(ma_service *service, gchar *target, gchar *subject, gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission); -int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, - gchar *uuid_dev2); -int ma_request_unpair(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2); -int ma_request_get_ownerid(ma_service *service, gchar **uuid_str); -int ma_request_disable(ma_service *service); +int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2); int ma_request_pairwise(ma_service *service, gchar *target_1, gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1, gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2); +int ma_request_unlink(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2); +int ma_request_remove_mo(ma_service *service, gchar* uuid_str); +int ma_request_remove_cred_local(ma_service *service, gchar* uuid_str); +int ma_request_pair(ma_service *service, gchar *pin, gchar *target_1, + gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1, + gchar *rsrc_interface_1, int permission_1, + gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, + gchar *rsrc_type_2, gchar *rsrc_interface_2, + int permission_2); +int ma_request_unpair(ma_service *service, gchar *uuid_owner, gchar *uuid_owned); #ifdef __cplusplus }