Implement d2d-subowner
authorsaerome.kim <saerome.kim@samsung.com>
Tue, 9 Jan 2018 07:43:55 +0000 (16:43 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 2 Jul 2018 10:38:38 +0000 (19:38 +0900)
- remove MO (No Test)
- fix memory leak problem
- fix typo in README.md

Signed-off-by: saerome.kim <saerome.kim@samsung.com>
README.md
src/d2d-subowner/d2ds-service-interface.c
src/d2d-subowner/d2ds-subowner.c
src/d2d-subowner/d2ds-subowner.h
src/d2d-subowner/introspection/d2ds.xml

index c971930c8d90e7c7f6e3a3252e45f767588e0cde..2849e309aa3ab3fe2b7c2089d7e102791ad0e1e0 100644 (file)
--- a/README.md
+++ b/README.md
@@ -95,7 +95,7 @@ saerome.kim@lx:~/github_sec/d2d-manager (tizen)$ sdb dlog -v time D2D_SUBOWNER
 01-01 09:07:40.351+0900 I/D2D_SUBOWNER( 4721): d2ds-subowner.c: _disc_mot_env_devs_func(672) > Discovering Multiple Ownership Transfer enabled Devices on Network..\r
 01-01 09:07:44.358+0900 I/D2D_SUBOWNER( 4721): d2ds-subowner.c: _print_no_uuid(219) > [1] 5c7ad9ac-836b-4ac0-92a8-ca516f9e8dd4\r
 01-01 09:07:44.358+0900 I/D2D_SUBOWNER( 4721): d2ds-subowner.c: _print_no_uuid(219) > [2] e4854ed5-65d1-4cc7-8766-3fb7a35e283a\r
-01-01 09:07:44.358+0900 D/D2D_SUBOWNER( 4721): d2ds-subowner.c: __notify_found_devs(590) > Found 1 MOT enabled devices\r
+01-01 09:07:44.358+0900 D/D2D_SUBOWNER( 4721): d2ds-subowner.c: __notify_found_devs(590) > Found 2 MOT enabled devices\r
 01-01 09:07:44.359+0900 I/D2D_SUBOWNER( 4721): d2ds-subowner.c: __notify_found_devs(633) > �doxms�\r
 \r
 saerome.kim@lx:~/github_sec/d2d-manager (tizen)$ sdb shell dbus-monitor --system "sender='net.d2ds'"\r
index ead3a5a6312ae68f089985c65587378887e137d8..e4cbcc686aa40c9d1d28dd746f1fc9f2465c42bb 100644 (file)
@@ -186,6 +186,25 @@ static gboolean _d2ds_dbus_handle_mot(NetD2ds *object,
        return TRUE;\r
 }\r
 \r
+static gboolean _d2ds_dbus_handle_remove_mo(NetD2ds *object,\r
+               GDBusMethodInvocation *invocation,  gchar *arg_target, gpointer user_data)\r
+{\r
+       int ret = D2DS_ERROR_NONE;\r
+       d2ds_service *service = (d2ds_service *)user_data;\r
+\r
+       d2ds_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+       ret = d2ds_request_remove_mo(service, arg_target);\r
+       if (D2DS_ERROR_NONE != ret)\r
+               D2DS_LOGE("Failed to d2ds_request_remove_mo !");\r
+\r
+       net_d2ds_complete_remove_mo(object, invocation, ret);\r
+\r
+       return TRUE;\r
+}\r
+\r
+\r
 static gboolean _d2ds_dbus_handle_prov_acl(NetD2ds *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
@@ -266,6 +285,8 @@ static void _d2ds_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,
                        G_CALLBACK(_d2ds_dbus_handle_disc_mowned_devs), service);\r
        g_signal_connect(d2ds_dbus_object, "handle-mot",\r
                        G_CALLBACK(_d2ds_dbus_handle_mot), service);\r
+       g_signal_connect(d2ds_dbus_object, "handle-remove-mo",\r
+                       G_CALLBACK(_d2ds_dbus_handle_remove_mo), service);\r
        g_signal_connect(d2ds_dbus_object, "handle-prov-acl",\r
                        G_CALLBACK(_d2ds_dbus_handle_prov_acl), service);\r
        g_signal_connect(d2ds_dbus_object, "handle-prov-cred",\r
index 83d8b24e904ea9270d8a918331c76b4c88c7e53f..2178d05f28d8ae32d5e72612b1b7ca2d7828ad66 100644 (file)
@@ -86,11 +86,11 @@ typedef struct {
        /* To-Do : Change belows to union type */
 
        /* For MOT */
-       OCProvisionDev_t *target; /**< Target device for MOT */
+       gchar *uuid_target_str; /**< Target device*/
        gchar *pin; /**< PIN */
 
        /* For ACL provisioning */
-       OCProvisionDev_t *subject; /**< Target device for ACL */
+       gchar *uuid_subject_str;/**< Subject device for ACL */
        gchar *rsrc_uri; /**< Resource URI */
        gchar *rsrc_type; /**< Resouce Type */
        gchar *rsrc_interface; /**< Resource Interface Array To-Do : Make this as array */
@@ -208,6 +208,44 @@ static const char* _wifi_error_to_string(wifi_manager_error_e err)
                return "WIFI_MANAGER_ERROR_UNKNOWN";
        }
 }
+
+OicUuid_t* _convert_uuid(gchar *device_id)
+{
+       OicUuid_t *uuid;
+
+       if (NULL == device_id)
+               return NULL;
+
+       uuid = g_malloc0(sizeof(struct OicUuid));
+       if (NULL == uuid) {
+               D2DS_LOGE("g_malloc0() Fail(%d)", errno);
+               return NULL;
+       }
+
+       sscanf(&device_id[0], "%2hhx", &uuid->id[0]);
+       sscanf(&device_id[2], "%2hhx", &uuid->id[1]);
+       sscanf(&device_id[4], "%2hhx", &uuid->id[2]);
+       sscanf(&device_id[6], "%2hhx", &uuid->id[3]);
+       /* device_id[8] == '-' */
+       sscanf(&device_id[9], "%2hhx", &uuid->id[4]);
+       sscanf(&device_id[11], "%2hhx", &uuid->id[5]);
+       /* device_id[13] == '-' */
+       sscanf(&device_id[14], "%2hhx", &uuid->id[6]);
+       sscanf(&device_id[16], "%2hhx", &uuid->id[7]);
+       /* device_id[18] == '-' */
+       sscanf(&device_id[19], "%2hhx", &uuid->id[8]);
+       sscanf(&device_id[21], "%2hhx", &uuid->id[9]);
+       /* device_id[23] == '-' */
+       sscanf(&device_id[24], "%2hhx", &uuid->id[10]);
+       sscanf(&device_id[26], "%2hhx", &uuid->id[11]);
+       sscanf(&device_id[28], "%2hhx", &uuid->id[12]);
+       sscanf(&device_id[30], "%2hhx", &uuid->id[13]);
+       sscanf(&device_id[32], "%2hhx", &uuid->id[14]);
+       sscanf(&device_id[34], "%2hhx", &uuid->id[15]);
+
+       return uuid;
+}
+
 static void _print_no_uuid(int idx, const OicUuid_t* uuid)
 {
        char uuid_string[256] = {0};
@@ -504,27 +542,30 @@ static void _request_cleanup(gpointer data)
        con->found = FALSE;
 
        if (con->pin) {
-               free(con->pin);
+               g_free(con->pin);
                con->pin  = NULL;
        }
        if (con->rsrc_uri) {
-               free(con->rsrc_uri);
+               g_free(con->rsrc_uri);
                con->rsrc_uri = NULL;
        }
        if (con->rsrc_type) {
-               free(con->rsrc_type);
+               g_free(con->rsrc_type);
                con->rsrc_type  = NULL;
        }
        if (con->rsrc_interface) {
-               free(con->rsrc_interface);
+               g_free(con->rsrc_interface);
                con->rsrc_interface = NULL;
        }
+       if (con->uuid_target_str) {
+               g_free(con->uuid_target_str);
+       }
 
        /* Set d2ds status 'pending' */
        g_atomic_int_set(&service->pending, 0);
 
        if (con) {
-               free(con);
+               g_free(con);
                con = NULL;
        }
 }
@@ -779,16 +820,28 @@ static gpointer _mot_func(gpointer data)
        OCStackResult ret = OC_STACK_OK;
        d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
 
-       if (!con->target)       {
-               D2DS_LOGE("Target device is NULL");
+       OCProvisionDev_t *src_dev = NULL;
+       OicUuid_t *uuid_target = NULL;
+
+       if (!con->uuid_target_str) {
+               D2DS_LOGE("Target device UUID is NULL");
                goto MOT_ENDED;
        }
 
+       uuid_target = _convert_uuid(con->uuid_target_str);
+       src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_target);
+       if (!src_dev) {
+               D2DS_LOGE("We can't find in MOT dev list");
+               goto MOT_ENDED;
+       }
+       /* To MOT only one device */
+       src_dev->next = NULL;
+
        g_client->g_doneCB = false;
 
 #ifdef MULTIPLE_OWNER
        OCProvisionDev_t* dev = NULL;
-       LL_FOREACH(con->target, dev) {
+       LL_FOREACH(src_dev, dev) {
                if(OIC_PRECONFIG_PIN == dev->doxm->oxmSel) {
                        /* Pre-Configured PIN initialization */
                        const char* testPreconfigPin = con->pin;/* Ex) "12341234" */
@@ -801,7 +854,7 @@ static gpointer _mot_func(gpointer data)
                }
        }
 #endif
-       ret = OCDoMultipleOwnershipTransfer(g_client, con->target, _mot_cb);
+       ret = OCDoMultipleOwnershipTransfer(g_client, src_dev, _mot_cb);
        if (OC_STACK_OK != ret )  {
                D2DS_LOGE( "OCDoMultipleOwnershipTransfer: ret = %d (%s)", ret, _error_to_string(ret));
                goto MOT_ENDED;
@@ -809,7 +862,7 @@ static gpointer _mot_func(gpointer data)
 
        ret = _wait_cb_ret(CALLBACK_TIMEOUT_MS);
        if(ret)  {
-               D2DS_LOGE( "OCProvisionCredentials callback error = %d (%s)", ret, _error_to_string(ret));
+               D2DS_LOGE( "OCDoMultipleOwnershipTransfer callback error = %d (%s)", ret, _error_to_string(ret));
                goto MOT_ENDED;
        }
 
@@ -818,57 +871,18 @@ static gpointer _mot_func(gpointer data)
 MOT_ENDED:
 
        net_d2ds_emit_mot_done(d2ds_dbus_get_object(), (int)ret);
-
+       if (uuid_target)
+               g_free(uuid_target);
        _request_cleanup(data);
        g_thread_exit(GINT_TO_POINTER (1));
 
        return NULL;
 }
 
-OicUuid_t* _convert_uuid(const gchar *device_id)
-{
-       OicUuid_t *uuid;
-
-       if (NULL == device_id)
-               return NULL;
-
-       uuid = g_malloc0(sizeof(struct OicUuid));
-       if (NULL == uuid) {
-               D2DS_LOGE("g_malloc0() Fail(%d)", errno);
-               return NULL;
-       }
-
-       sscanf(&device_id[0], "%2hhx", &uuid->id[0]);
-       sscanf(&device_id[2], "%2hhx", &uuid->id[1]);
-       sscanf(&device_id[4], "%2hhx", &uuid->id[2]);
-       sscanf(&device_id[6], "%2hhx", &uuid->id[3]);
-       /* device_id[8] == '-' */
-       sscanf(&device_id[9], "%2hhx", &uuid->id[4]);
-       sscanf(&device_id[11], "%2hhx", &uuid->id[5]);
-       /* device_id[13] == '-' */
-       sscanf(&device_id[14], "%2hhx", &uuid->id[6]);
-       sscanf(&device_id[16], "%2hhx", &uuid->id[7]);
-       /* device_id[18] == '-' */
-       sscanf(&device_id[19], "%2hhx", &uuid->id[8]);
-       sscanf(&device_id[21], "%2hhx", &uuid->id[9]);
-       /* device_id[23] == '-' */
-       sscanf(&device_id[24], "%2hhx", &uuid->id[10]);
-       sscanf(&device_id[26], "%2hhx", &uuid->id[11]);
-       sscanf(&device_id[28], "%2hhx", &uuid->id[12]);
-       sscanf(&device_id[30], "%2hhx", &uuid->id[13]);
-       sscanf(&device_id[32], "%2hhx", &uuid->id[14]);
-       sscanf(&device_id[34], "%2hhx", &uuid->id[15]);
-
-       return uuid;
-}
-
-
 static int _d2ds_mot(d2ds_service *service, gchar *uuid_str, gchar *pin)
 {
-       OicUuid_t *uuid = NULL;
-       OCProvisionDev_t *src_dev = NULL;
-
        d2ds_req_cb_s *con = NULL;
+
        con = g_malloc0(sizeof(d2ds_req_cb_s));
        if (NULL == con) {
                D2DS_LOGE( "g_malloc0() Fail=%d", errno);
@@ -879,21 +893,7 @@ static int _d2ds_mot(d2ds_service *service, gchar *uuid_str, gchar *pin)
 
        con->userdata = service;
        con->cid = D2DS_MOT;
-
-       uuid = _convert_uuid(uuid_str);
-       src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid);
-       if (!src_dev) {
-               D2DS_LOGE("We can't find in MOT dev list");
-               g_free(uuid);
-               _request_cleanup(con);
-               return D2DS_ERROR_NO_DATA;
-       }
-       g_free(uuid);
-
-       /* Copy target device & PIN */
-       con->target = PMCloneOCProvisionDev(src_dev);
-       /* To do MOT only one */
-       con->target->next = NULL;
+       con->uuid_target_str = g_strdup(uuid_str);
 
        if (pin) {
                con->pin = g_malloc0(OXM_RANDOM_PIN_MAX_SIZE+1);
@@ -919,6 +919,103 @@ static int _d2ds_mot(d2ds_service *service, gchar *uuid_str, gchar *pin)
        return D2DS_ERROR_NONE;
 }
 
+static void _remove_mo_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
+{
+       d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
+
+       if (!has_error)  {
+               D2DS_LOGD("Remove Multiple Ownership SUCCEEDED");
+       } else {
+               D2DS_LOGD( "Remove Multiple Ownership FAILED ");
+               _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
+       }
+       client->g_doneCB = true;
+}
+
+static gpointer _remove_mo_func(gpointer data)
+{
+       OCStackResult ret = OC_STACK_OK;
+       d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
+
+       OCProvisionDev_t *src_dev = NULL;
+       OicUuid_t uuid_mowner;
+       OicUuid_t *uuid_target = NULL;
+
+       if (!con->uuid_target_str) {
+               D2DS_LOGE("Target device UUID is NULL");
+               goto MOT_ENDED;
+       }
+
+       uuid_target = _convert_uuid(con->uuid_target_str);
+       src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_target);
+       if (!src_dev) {
+               D2DS_LOGE("We can't find in MOT dev list");
+               goto MOT_ENDED;
+       }
+
+       g_client->g_doneCB = false;
+
+       ret = GetDoxmDevOwnerId(&uuid_mowner);
+       if (OC_STACK_OK  != ret) {
+               D2DS_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret));
+               goto MOT_ENDED;
+       }
+
+       ret = OCRemoveSubOwner(g_client, src_dev, &uuid_mowner, _remove_mo_cb);
+       if (OC_STACK_OK != ret )  {
+               D2DS_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret));
+               goto MOT_ENDED;
+       }
+
+       ret = _wait_cb_ret(CALLBACK_TIMEOUT_MS);
+       if(ret)  {
+               D2DS_LOGE( "OCRemoveSubOwner callback error = %d (%s)", ret, _error_to_string(ret));
+               goto MOT_ENDED;
+       }
+
+       D2DS_LOGE("Remove Multiple Ownership Done");
+
+MOT_ENDED:
+
+       net_d2ds_emit_mot_done(d2ds_dbus_get_object(), (int)ret);
+
+       if (uuid_target)
+               g_free(uuid_target);
+       _request_cleanup(data);
+       g_thread_exit(GINT_TO_POINTER (1));
+
+       return NULL;
+}
+
+static int _d2ds_remove_mo(d2ds_service *service, gchar *uuid_str)
+{
+       d2ds_req_cb_s *con = NULL;
+       con = g_malloc0(sizeof(d2ds_req_cb_s));
+       if (NULL == con) {
+               D2DS_LOGE( "g_malloc0() Fail=%d", errno);
+               /* Unset d2ds status 'pending' */
+               g_atomic_int_set(&service->pending, 0);
+               return D2DS_ERROR_OUT_OF_MEMORY;
+       }
+
+       con->userdata = service;
+       con->cid = D2DS_REMOVE_MOT;
+       con->uuid_target_str = g_strdup(uuid_str);
+
+       con->thread = g_thread_try_new("remove_mo", _remove_mo_func, con, NULL);
+       if (!con->thread) {
+               D2DS_LOGE("Failed to create thread");
+               _request_cleanup(con);
+               return D2DS_ERROR_OUT_OF_MEMORY;
+       }
+       g_thread_unref(con->thread);
+
+#ifdef TIMEOUT_USED
+       con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_S + 1, _d2ds_timeout_cb, con);
+#endif
+       return D2DS_ERROR_NONE;
+}
+
 #if 0 /* TEST */
 static int sendGetLed()
 {
@@ -1145,27 +1242,53 @@ static gpointer _provisioning_acl_func(gpointer data)
        OCStackResult ret = OC_STACK_OK;
        d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
        OicSecAcl_t* acl = NULL;
+       OicUuid_t *uuid = NULL;
+       OCProvisionDev_t *target_dev = NULL;
+       OCProvisionDev_t *subject_dev = NULL;
 
-       if (!con->subject || !con->rsrc_uri || !con->rsrc_type  || !con->rsrc_interface) {
+       if (!con->uuid_subject_str ||!con->uuid_target_str || !con->rsrc_uri || !con->rsrc_type  || !con->rsrc_interface) {
                D2DS_LOGE("Some parameters are wrong");
-               D2DS_LOGE("%p", con->subject );
+               D2DS_LOGE("%s", con->uuid_target_str );
+               D2DS_LOGE("%s", con->uuid_subject_str );
                D2DS_LOGE("%s", con->rsrc_uri );
                D2DS_LOGE("%s", con->rsrc_type );
                D2DS_LOGE("%s", con->rsrc_interface );
                goto PVACL_ERROR;
        }
 
+       uuid = _convert_uuid(con->uuid_target_str);
+       target_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+       if (!target_dev) {
+               D2DS_LOGE("We can't find target in MOWNED dev list");
+               goto PVACL_ERROR;
+       }
+       g_free(uuid);
+
+       /* To do ACL provisioning only one */
+       target_dev->next = NULL;
+
+       uuid = _convert_uuid(con->uuid_subject_str);
+       subject_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+       if (!subject_dev) {
+               D2DS_LOGE("We can't find subject in MOWNED dev list");
+               goto PVACL_ERROR;
+       }
+       g_free(uuid);
+
+       /* To do ACL provisioning only one */
+       subject_dev->next = NULL;
+
        g_client->g_doneCB = false;
        D2DS_LOGI(" Provisioning Selected ACL..");
 
-       acl = _create_target_acl(&con->target->doxm->deviceID, &con->subject->doxm->deviceID, con->rsrc_uri, con->rsrc_type,
+       acl = _create_target_acl(&target_dev->doxm->deviceID, &subject_dev->doxm->deviceID, con->rsrc_uri, con->rsrc_type,
                con->rsrc_interface, con->permission);
        if (NULL == acl) {
                D2DS_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
                goto PVACL_ERROR;
        }
 
-       ret= OCProvisionACL((void*) g_client, con->subject, acl, _provisioning_acl_cb);
+       ret= OCProvisionACL((void*) g_client, target_dev, acl, _provisioning_acl_cb);
        if (OC_STACK_OK != ret) {
                D2DS_LOGD( "OCProvisionACL API error: %d (%s)", ret, _error_to_string(ret));
                goto PVACL_ERROR;
@@ -1183,10 +1306,10 @@ PVACL_ERROR:
        /* Notify ACL result  */
        net_d2ds_emit_prov_acl_done(d2ds_dbus_get_object(), (int)ret);
 
-       if (acl) {
+       if (acl)
                OCDeleteACLList(acl);
-               acl = NULL;
-       }
+       if (uuid)
+               g_free(uuid);
        _request_cleanup(con);
        g_thread_exit(GINT_TO_POINTER (1));
        return NULL;
@@ -1195,11 +1318,6 @@ PVACL_ERROR:
 static int _provisioning_acl(d2ds_service *service, gchar *target, gchar *subject,
        gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
 {
-
-       OicUuid_t *uuid = NULL;
-       OCProvisionDev_t *target_dev = NULL;
-       OCProvisionDev_t *subject_dev = NULL;
-
        d2ds_req_cb_s *con = NULL;
        con = g_malloc0(sizeof(d2ds_req_cb_s));
        if (NULL == con) {
@@ -1211,38 +1329,11 @@ static int _provisioning_acl(d2ds_service *service, gchar *target, gchar *subjec
 
        con->userdata = service;
        con->cid = D2DS_PROV_ACL;
-
-       uuid = _convert_uuid(target);
-       target_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
-       if (!target_dev) {
-               D2DS_LOGE("We can't find target in MOWNED dev list");
-               _request_cleanup(con);
-               return D2DS_ERROR_NO_DATA;
-       }
-       g_free(uuid);
-
-       /* Copy subject device and related information */
-       con->target = PMCloneOCProvisionDev(target_dev);
-       /* To do ACL provisioning only one */
-       con->target->next = NULL;
-
-       uuid = _convert_uuid(subject);
-       subject_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
-       if (!subject_dev) {
-               D2DS_LOGE("We can't find subject in MOWNED dev list");
-               _request_cleanup(con);
-               return D2DS_ERROR_NO_DATA;
-       }
-       g_free(uuid);
-
-       /* Copy subject device and related information */
-       con->subject = PMCloneOCProvisionDev(subject_dev);
-       /* To do ACL provisioning only one */
-       con->subject->next = NULL;
-
-       con->rsrc_uri = OICStrdup(rsrc_uri);
-       con->rsrc_type = OICStrdup(rsrc_type);
-       con->rsrc_interface = OICStrdup(rsrc_interface);
+       con->uuid_target_str = g_strdup(target);
+       con->uuid_subject_str = g_strdup(subject);
+       con->rsrc_uri = g_strdup(rsrc_uri);
+       con->rsrc_type = g_strdup(rsrc_type);
+       con->rsrc_interface = g_strdup(rsrc_interface);
 
        con->thread = g_thread_try_new("prov_acl", _provisioning_acl_func, con, NULL);
        if (!con->thread) {
@@ -1459,6 +1550,31 @@ int d2ds_request_mot(d2ds_service *service, gchar* uuid_str, gchar *pin)
        return ret;
 }
 
+int d2ds_request_remove_mo(d2ds_service *service, gchar* uuid_str)
+{
+       int ret =D2DS_ERROR_NONE;
+
+       d2ds_check_null_ret_error("service", service, FALSE);
+
+       D2DS_LOGD("[IPC] Remove Mullti Ownership");
+
+       /* If we are working now? */
+       if (g_atomic_int_get(&service->pending))
+               return D2DS_ERROR_IN_PROGRESS;
+
+       if (!uuid_str) {
+               D2DS_LOGE("uuid_str = %s", uuid_str);
+               return D2DS_ERROR_INVALID_PARAMETER;
+       }
+
+       /* Set d2ds status 'pending' */
+       g_atomic_int_set(&service->pending, 1);
+
+       ret = _d2ds_remove_mo(service, uuid_str);
+
+       return ret;
+}
+
 int d2ds_request_prov_acl(d2ds_service *service, gchar *target, gchar *subject,
        gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
 {
index b3ec1ebe1cd4387d3c0dd3a47c8b45eef792bee0..fb6f564196c84afc8aa8fdc64fbfcd3a02ef4355 100644 (file)
@@ -29,9 +29,10 @@ extern "C" {
 typedef enum {
        D2DS_DISC_MOT_ENB_DEVS = 0, /**< Discover MOT enabled devices */
        D2DS_DISC_MOWNED_DEVS, /**< Discover my owned MOT enabled devices */
-       D2DS_MOT, /**< Do Multiplw Onwership Transfer */
+       D2DS_MOT, /**< Do Multiple Onwership Transfer */
        D2DS_PROV_ACL, /**< ACL Provisioning */
        D2DS_PROV_CRED, /**< CRED Provisioning */
+       D2DS_REMOVE_MOT, /**< Remove Multiple Ownership */
 } d2ds_cmd_id_e;
 
 /* ACL Permission type */
@@ -48,6 +49,7 @@ int d2ds_request_enable(d2ds_service *service);
 int d2ds_request_disc_mot_enb_devs(d2ds_service *service);
 int d2ds_request_disc_owned_devs(d2ds_service *service);
 int d2ds_request_mot(d2ds_service *service, gchar* uuid, gchar *pin);
+int d2ds_request_remove_mo(d2ds_service *service, gchar* uuid_str);
 int d2ds_request_prov_acl(d2ds_service *service, gchar *target, gchar *subject,
        gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission);
 int d2ds_request_prov_cred(d2ds_service *service, gchar *uuid_dev1, gchar *uuid_dev2);
index c2f2505042aab4505cf8e3aa8034d1d2d8729c86..a1594c11a707a9f229adc748af0e8d6ea46b77d3 100644 (file)
             <arg type="s" name="pin" direction="in"/>\r
             <arg type="i" name="result" direction="out"/>\r
             </method>\r
+        <method name="remove_mo">\r
+            <arg type="s" name="target" direction="in"/>\r
+            <arg type="i" name="result" direction="out"/>\r
+            </method>\r
         <method name="prov_acl">\r
             <arg type="s" name="target" direction="in"/>\r
             <arg type="s" name="subject" direction="in"/>\r