d2d-manager: Reduce working time of 'Invite/Eject' scenarios
authorsaerome.kim <saerome.kim@samsung.com>
Tue, 23 Jan 2018 05:56:02 +0000 (14:56 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 2 Jul 2018 10:38:47 +0000 (19:38 +0900)
Signed-off-by: saerome.kim <saerome.kim@samsung.com>
src/companion-manager/include/comp_mot_agent.h
src/companion-manager/src/comp_group.c
src/companion-manager/src/comp_mot_agent.c
src/mot-agent/introspection/ma.xml
src/mot-agent/ma-service-interface.c
src/mot-agent/ma-subowner.c
src/mot-agent/ma-subowner.h

index f4ac03139afee1de436f37fe974fe1bb62e9f37e..2463c8ac71c3690b767e7039f11bb0fba6099564 100755 (executable)
@@ -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
 }
index 709164d886c4c4b5803ffb2ec177f920009b729e..99b6c8a0559b713d850ae2952f5af404bd6df398 100644 (file)
@@ -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();
 
index 7dfd5ebccf3ab93cee60741d7e1c6f3d2a64aa3f..85403c4c9a6c653b0604b966f986bbdfddcf60a7 100644 (file)
@@ -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;
 }
index 6165439f3d7f3e6d08b7cd16c013f69494bd639d..003702c7dbb875bb302429a7c4330182dae3fa97 100644 (file)
@@ -7,6 +7,10 @@
 <node>\r
     <interface name="net.ma">\r
         <!-- Method definitions -->\r
+        <method name="get_ownerid">\r
+            <arg type="s" name="devownerid" direction="out"/>\r
+            <arg type="i" name="result" direction="out"/>\r
+        </method>\r
         <method name="disc_mot_enb_devs">\r
             <arg type="i" name="result" direction="out"/>\r
         </method>\r
             <arg type="s" name="dev2" direction="in"/>\r
             <arg type="i" name="result" direction="out"/>\r
         </method>\r
-        <method name="get_ownerid">\r
-            <arg type="s" name="devownerid" direction="out"/>\r
-            <arg type="i" name="result" direction="out"/>\r
-        </method>\r
         <method name="pairwise">\r
             <arg type="s" name="target_1" direction="in"/>\r
             <arg type="s" name="subject_1" direction="in"/>\r
             <arg type="i" name="permission_2" direction="in"/>\r
             <arg type="i" name="result" direction="out"/>\r
         </method>\r
-        <method name="unpair">\r
+         <method name="unlink">\r
             <arg type="s" name="uuid_dev1" direction="in"/>\r
             <arg type="s" name="uuid_dev2" direction="in"/>\r
             <arg type="i" name="result" direction="out"/>\r
         </method>\r
+        <method name="pair">\r
+           <arg type="s" name="pin" direction="in"/>\r
+            <arg type="s" name="target_1" direction="in"/>\r
+            <arg type="s" name="subject_1" direction="in"/>\r
+            <arg type="s" name="uri_1" direction="in"/>\r
+            <arg type="s" name="rt_1" direction="in"/>\r
+            <arg type="s" name="interface_1" direction="in"/>\r
+            <arg type="i" name="permission_1" direction="in"/>\r
+            <arg type="s" name="target_2" direction="in"/>\r
+            <arg type="s" name="subject_2" direction="in"/>\r
+            <arg type="s" name="uri_2" direction="in"/>\r
+            <arg type="s" name="rt_2" direction="in"/>\r
+            <arg type="s" name="interface_2" direction="in"/>\r
+            <arg type="i" name="permission_2" direction="in"/>\r
+            <arg type="i" name="result" direction="out"/>\r
+        </method>\r
+        <method name="unpair">\r
+            <arg type="s" name="owner_uuid" direction="in"/>\r
+            <arg type="s" name="owned_uuid" direction="in"/>\r
+            <arg type="i" name="result" direction="out"/>\r
+        </method>\r
 \r
         <!-- Signal (D-Bus) definitions -->\r
         <signal name="subowner_enabled">\r
         <signal name="cred_done">\r
             <arg type="i" name="result" direction="out"/>\r
         </signal>\r
-        <signal name="unpair_done">\r
+        <signal name="pairwise_done">\r
             <arg type="i" name="result" direction="out"/>\r
         </signal>\r
-        <signal name="pairwise_done">\r
+        <signal name="unlink_done">\r
+            <arg type="i" name="result" direction="out"/>\r
+        </signal>\r
+        <signal name="pair_done">\r
+            <arg type="i" name="result" direction="out"/>\r
+        </signal>\r
+        <signal name="unpair_done">\r
             <arg type="i" name="result" direction="out"/>\r
         </signal>\r
     </interface>\r
index c021b22d5beeffe16c69f73c76ad68f08ca8aeee..c048eca55e73837a5f35fc4a3874fc8540f91db4 100644 (file)
@@ -130,6 +130,27 @@ static int _ma_dbus_subscribe_name_owner_changed(GDBusConnection *conn)
        return MA_ERROR_NONE;\r
 }\r
 \r
+static gboolean _ma_dbus_handle_get_ownerid(NetMa *object,\r
+               GDBusMethodInvocation *invocation,\r
+               gpointer user_data)\r
+{\r
+       gchar *uuid_str = NULL;\r
+       int ret = MA_ERROR_NONE;\r
+       ma_service *service = (ma_service *)user_data;\r
+\r
+       ma_check_null_ret_error("service", service, FALSE);\r
+\r
+       ret = ma_request_get_ownerid(service, &uuid_str);\r
+       if (MA_ERROR_NONE != ret)\r
+               MA_LOGE("Failed to ma_request_get_ownerid = %d", ret);\r
+\r
+       net_ma_complete_get_ownerid(object, invocation, uuid_str, ret);\r
+\r
+       if (uuid_str)\r
+               g_free(uuid_str);\r
+\r
+       return TRUE;\r
+}\r
 \r
 static gboolean _ma_dbus_handle_disc_mot_enb_devs(NetMa *object,\r
                GDBusMethodInvocation *invocation,\r
@@ -186,8 +207,9 @@ static gboolean _ma_dbus_handle_mot(NetMa *object,
        return TRUE;\r
 }\r
 \r
-static gboolean _ma_dbus_handle_remove_mo(NetMa *object,\r
-               GDBusMethodInvocation *invocation,  gchar *arg_target, gpointer user_data)\r
+static gboolean _ma_dbus_handle_acl(NetMa *object,\r
+               GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_subject, gchar *arg_uri,\r
+               gchar *arg_rt, gchar *arg_interface, gint arg_permission, gpointer user_data)\r
 {\r
        int ret = MA_ERROR_NONE;\r
        ma_service *service = (ma_service *)user_data;\r
@@ -195,17 +217,17 @@ static gboolean _ma_dbus_handle_remove_mo(NetMa *object,
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
 \r
-       ret = ma_request_remove_mo(service, arg_target);\r
+       ret = ma_request_prov_acl(service, arg_target, arg_subject, arg_uri, arg_rt, arg_interface, arg_permission);\r
        if (MA_ERROR_NONE != ret)\r
-               MA_LOGE("Failed to ma_request_remove_mo !");\r
+               MA_LOGE("Failed to ma_request_prov_acl !");\r
 \r
-       net_ma_complete_remove_mo(object, invocation, ret);\r
+       net_ma_complete_acl(object, invocation, ret);\r
 \r
        return TRUE;\r
 }\r
 \r
-static gboolean _ma_dbus_handle_remove_cred_local(NetMa *object,\r
-               GDBusMethodInvocation *invocation,  gchar *arg_target, gpointer user_data)\r
+static gboolean _ma_dbus_handle_cred(NetMa *object,\r
+               GDBusMethodInvocation *invocation, gchar *arg_dev1, gchar *arg_dev2, gpointer user_data)\r
 {\r
        int ret = MA_ERROR_NONE;\r
        ma_service *service = (ma_service *)user_data;\r
@@ -213,18 +235,21 @@ static gboolean _ma_dbus_handle_remove_cred_local(NetMa *object,
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
 \r
-       ret = ma_request_remove_cred_local(service, arg_target);\r
+       ret = ma_request_prov_cred(service, arg_dev1, arg_dev2);\r
        if (MA_ERROR_NONE != ret)\r
-               MA_LOGE("Failed to ma_request_remove_mo !");\r
+               MA_LOGE("Failed to ma_request_prov_cred !");\r
 \r
-       net_ma_complete_remove_cred_local(object, invocation, ret);\r
+       net_ma_complete_cred(object, invocation, ret);\r
 \r
        return TRUE;\r
 }\r
 \r
-static gboolean _ma_dbus_handle_acl(NetMa *object,\r
-               GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_subject, gchar *arg_uri,\r
-               gchar *arg_rt, gchar *arg_interface, gint arg_permission, gpointer user_data)\r
+static gboolean _ma_dbus_handle_pairwise(NetMa *object,\r
+                                         GDBusMethodInvocation *invocation, gchar *target_1,\r
+                                         gchar *subject_1, gchar *uri_1, gchar *rt_1,\r
+                                         gchar *interface_1, int permission_1, gchar *target_2,\r
+                                         gchar *subject_2, gchar *uri_2, gchar *rt_2,\r
+                                         gchar *interface_2, int permission_2, gpointer user_data)\r
 {\r
        int ret = MA_ERROR_NONE;\r
        ma_service *service = (ma_service *)user_data;\r
@@ -232,61 +257,76 @@ static gboolean _ma_dbus_handle_acl(NetMa *object,
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
 \r
-       ret = ma_request_prov_acl(service, arg_target, arg_subject, arg_uri, arg_rt, arg_interface, arg_permission);\r
+       ret = ma_request_pairwise(service, target_1, subject_1, uri_1, rt_1,\r
+                                       interface_1, permission_1, target_2, subject_2, uri_2,\r
+                                       rt_2, interface_2, permission_2);\r
        if (MA_ERROR_NONE != ret)\r
-               MA_LOGE("Failed to ma_request_prov_acl !");\r
+               MA_LOGE("Failed to ma_request_pairwise = %d", ret);\r
 \r
-       net_ma_complete_acl(object, invocation, ret);\r
+       net_ma_complete_pairwise(object, invocation, ret);\r
 \r
        return TRUE;\r
 }\r
 \r
-static gboolean _ma_dbus_handle_cred(NetMa *object,\r
-               GDBusMethodInvocation *invocation, gchar *arg_dev1, gchar *arg_dev2, gpointer user_data)\r
+static gboolean _ma_dbus_handle_unlink(NetMa *object,\r
+               GDBusMethodInvocation *invocation, gchar *uuid_dev1, gchar *uuid_dev2,\r
+               gpointer user_data)\r
 {\r
        int ret = MA_ERROR_NONE;\r
        ma_service *service = (ma_service *)user_data;\r
 \r
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
-\r
-       ret = ma_request_prov_cred(service, arg_dev1, arg_dev2);\r
+       ret = ma_request_unlink(service, uuid_dev1, uuid_dev2);\r
        if (MA_ERROR_NONE != ret)\r
-               MA_LOGE("Failed to ma_request_prov_cred !");\r
+               MA_LOGE("Failed to ma_request_unpair = %d", ret);\r
 \r
-       net_ma_complete_cred(object, invocation, ret);\r
+       net_ma_complete_unpair(object, invocation, ret);\r
 \r
        return TRUE;\r
 }\r
 \r
-static gboolean _ma_dbus_handle_get_ownerid(NetMa *object,\r
-               GDBusMethodInvocation *invocation,\r
-               gpointer user_data)\r
+static gboolean _ma_dbus_handle_remove_mo(NetMa *object,\r
+               GDBusMethodInvocation *invocation,  gchar *arg_target, gpointer user_data)\r
 {\r
-       gchar *uuid_str = NULL;\r
        int ret = MA_ERROR_NONE;\r
        ma_service *service = (ma_service *)user_data;\r
 \r
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
-       ret = ma_request_get_ownerid(service, &uuid_str);\r
+\r
+       ret = ma_request_remove_mo(service, arg_target);\r
        if (MA_ERROR_NONE != ret)\r
-               MA_LOGE("Failed to ma_request_get_ownerid = %d", ret);\r
+               MA_LOGE("Failed to ma_request_remove_mo !");\r
 \r
-       net_ma_complete_get_ownerid(object, invocation, uuid_str, ret);\r
+       net_ma_complete_remove_mo(object, invocation, ret);\r
 \r
-       if (uuid_str)\r
-               g_free(uuid_str);\r
+       return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_remove_cred_local(NetMa *object,\r
+               GDBusMethodInvocation *invocation,  gchar *arg_target, gpointer user_data)\r
+{\r
+       int ret = MA_ERROR_NONE;\r
+       ma_service *service = (ma_service *)user_data;\r
+\r
+       ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+       ret = ma_request_remove_cred_local(service, arg_target);\r
+       if (MA_ERROR_NONE != ret)\r
+               MA_LOGE("Failed to ma_request_remove_mo !");\r
+\r
+       net_ma_complete_remove_cred_local(object, invocation, ret);\r
 \r
        return TRUE;\r
 }\r
 \r
-static gboolean _ma_dbus_handle_pairwise(NetMa *object,\r
-                                         GDBusMethodInvocation *invocation, gchar *target_1,\r
-                                         gchar *subject_1, gchar *uri_1, gchar *rt_1,\r
-                                         gchar *interface_1, int permission_1, gchar *target_2,\r
-                                         gchar *subject_2, gchar *uri_2, gchar *rt_2,\r
-                                         gchar *interface_2, int permission_2, gpointer user_data)\r
+static gboolean _ma_dbus_handle_pair(NetMa *object,\r
+         GDBusMethodInvocation *invocation, gchar *pin,\r
+         gchar *target_1, gchar *subject_1, gchar *uri_1, gchar *rt_1, gchar *interface_1, int permission_1,\r
+         gchar *target_2, gchar *subject_2, gchar *uri_2, gchar *rt_2, gchar *interface_2, int permission_2,\r
+         gpointer user_data)\r
 {\r
        int ret = MA_ERROR_NONE;\r
        ma_service *service = (ma_service *)user_data;\r
@@ -294,19 +334,19 @@ static gboolean _ma_dbus_handle_pairwise(NetMa *object,
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
 \r
-       ret = ma_request_pairwise(service, target_1, subject_1, uri_1, rt_1,\r
+       ret = ma_request_pair(service, pin, target_1, subject_1, uri_1, rt_1,\r
                                        interface_1, permission_1, target_2, subject_2, uri_2,\r
                                        rt_2, interface_2, permission_2);\r
        if (MA_ERROR_NONE != ret)\r
-               MA_LOGE("Failed to ma_request_pairwise = %d", ret);\r
+               MA_LOGE("Failed to ma_request_pair = %d", ret);\r
 \r
-       net_ma_complete_pairwise(object, invocation, ret);\r
+       net_ma_complete_pair(object, invocation, ret);\r
 \r
        return TRUE;\r
 }\r
 \r
 static gboolean _ma_dbus_handle_unpair(NetMa *object,\r
-               GDBusMethodInvocation *invocation, gchar *uuid_dev1, gchar *uuid_dev2,\r
+               GDBusMethodInvocation *invocation, gchar *uuid_owner, gchar *uuid_owned,\r
                gpointer user_data)\r
 {\r
        int ret = MA_ERROR_NONE;\r
@@ -314,7 +354,7 @@ static gboolean _ma_dbus_handle_unpair(NetMa *object,
 \r
        ma_check_null_ret_error("service", service, FALSE);\r
 \r
-       ret = ma_request_unpair(service, uuid_dev1, uuid_dev2);\r
+       ret = ma_request_unpair(service, uuid_owner, uuid_owned);\r
        if (MA_ERROR_NONE != ret)\r
                MA_LOGE("Failed to ma_request_unpair = %d", ret);\r
 \r
@@ -337,13 +377,18 @@ static void _ma_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,
                MA_LOGE("net_ma_skeleton_new() Fail");\r
                return;\r
        }\r
-\r
+       g_signal_connect(ma_dbus_object, "handle-get-ownerid",\r
+                       G_CALLBACK(_ma_dbus_handle_get_ownerid), service);\r
        g_signal_connect(ma_dbus_object, "handle-disc-mot-enb-devs",\r
                        G_CALLBACK(_ma_dbus_handle_disc_mot_enb_devs), service);\r
        g_signal_connect(ma_dbus_object, "handle-disc-mowned-devs",\r
                        G_CALLBACK(_ma_dbus_handle_disc_mowned_devs), service);\r
        g_signal_connect(ma_dbus_object, "handle-mot",\r
                        G_CALLBACK(_ma_dbus_handle_mot), service);\r
+       g_signal_connect(ma_dbus_object, "handle-pairwise",\r
+                       G_CALLBACK(_ma_dbus_handle_pairwise), service);\r
+       g_signal_connect(ma_dbus_object, "handle-unlink",\r
+                       G_CALLBACK(_ma_dbus_handle_unlink), service);\r
        g_signal_connect(ma_dbus_object, "handle-remove-mo",\r
                        G_CALLBACK(_ma_dbus_handle_remove_mo), service);\r
        g_signal_connect(ma_dbus_object, "handle-remove-cred-local",\r
@@ -352,10 +397,8 @@ static void _ma_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,
                        G_CALLBACK(_ma_dbus_handle_acl), service);\r
        g_signal_connect(ma_dbus_object, "handle-cred",\r
                        G_CALLBACK(_ma_dbus_handle_cred), service);\r
-       g_signal_connect(ma_dbus_object, "handle-get-ownerid",\r
-                       G_CALLBACK(_ma_dbus_handle_get_ownerid), service);\r
-       g_signal_connect(ma_dbus_object, "handle-pairwise",\r
-                       G_CALLBACK(_ma_dbus_handle_pairwise), service);\r
+       g_signal_connect(ma_dbus_object, "handle-pair",\r
+                       G_CALLBACK(_ma_dbus_handle_pair), service);\r
        g_signal_connect(ma_dbus_object, "handle-unpair",\r
                        G_CALLBACK(_ma_dbus_handle_unpair), service);\r
 \r
index 82fbb530caba7a2b6d49e317251d1a50994f1548..f78d3e602ab168aca8b2272cdcf957a1ddb8fb5a 100644 (file)
@@ -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;
+}
+
index 3c5c1ac6f5fb1e0917c1de8e35f2a324dafa6ff9..a89b08223de9c659f3c4bf71aa5ef6b7ec3deaca 100644 (file)
@@ -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
 }