From: Saurav Babu Date: Thu, 15 Feb 2018 12:00:03 +0000 (+0530) Subject: mot-agent: Add discovery retry mechanism for disc_owned_devs X-Git-Tag: submit/tizen/20190131.065036~115 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a31f4f515da24d6d56836e7c991dbbb77bae9e6b;p=platform%2Fcore%2Fapi%2Fmulti-device-group.git mot-agent: Add discovery retry mechanism for disc_owned_devs Signed-off-by: Saurav Babu --- diff --git a/src/mot-agent/introspection/ma.xml b/src/mot-agent/introspection/ma.xml index bebece0..4c49109 100644 --- a/src/mot-agent/introspection/ma.xml +++ b/src/mot-agent/introspection/ma.xml @@ -101,6 +101,9 @@ + + + diff --git a/src/mot-agent/ma-service-interface.c b/src/mot-agent/ma-service-interface.c index 87f2a6c..59fba07 100644 --- a/src/mot-agent/ma-service-interface.c +++ b/src/mot-agent/ma-service-interface.c @@ -575,6 +575,11 @@ void ma_notify_mot_enb_dev_added(GVariant *device) net_ma_emit_mot_enb_devs_added(ma_dbus_get_object(), device); } +void ma_notify_mowned_dev_added(GVariant *device) +{ + net_ma_emit_mowned_devs_added(ma_dbus_get_object(), device); +} + static void _ma_dbus_deinit(ma_service *service) { ma_check_null_ret("service", service); diff --git a/src/mot-agent/ma-service-interface.h b/src/mot-agent/ma-service-interface.h index 438653c..ac29cc3 100644 --- a/src/mot-agent/ma-service-interface.h +++ b/src/mot-agent/ma-service-interface.h @@ -50,6 +50,7 @@ void ma_service_interface_deinit(ma_service *service); void ma_notify_mot_env_devs(GVariant *devices); void ma_notify_mowned_devs(GVariant *devices); void ma_notify_mot_enb_dev_added(GVariant *device); +void ma_notify_mowned_dev_added(GVariant *device); #ifdef __cplusplus } diff --git a/src/mot-agent/ma-subowner.c b/src/mot-agent/ma-subowner.c index 1d723b0..77edf7a 100755 --- a/src/mot-agent/ma-subowner.c +++ b/src/mot-agent/ma-subowner.c @@ -69,6 +69,7 @@ #define DEBUG_UUID static int _disc_mot_enb_devs(ma_service *service, int timeout); +static int _disc_owned_devs(ma_service *service, int timeout); /* '_' for separaing from the same constant variable in srmresourcestrings.c */ static const char* SVR_DB_FILE_NAME = "oic_svr_db_ma.dat"; @@ -140,6 +141,7 @@ typedef struct _ma_subowner { int rnd_pin_len; /**< Random PIN length */ int g_motdev_retry_cnt; /* MOT Enabled discovery retry count */ + int g_mowned_retry_cnt; /* My owned discovery retry count */ } ma_subowner_s; ma_subowner_s *g_client; @@ -873,6 +875,10 @@ static gboolean __retry_device_discovery(gpointer data) MA_LOGI("Retry to find MOT enabled devices retry count %d", g_client->g_motdev_retry_cnt); _disc_mot_enb_devs(con->userdata, con->timeout); + } else if (con->cid == MA_DISC_MOWNED_DEVS) { + MA_LOGI("Retry to find My owned devices retry count %d", + g_client->g_mowned_retry_cnt); + _disc_owned_devs(con->userdata, con->timeout); } return FALSE; @@ -937,7 +943,10 @@ static void _update_mot_dev_list(ma_req_cb_s *con, OCProvisionDev_t *list) g_variant_builder_add(&builder, "{sv}", "devStatus", g_variant_new_uint32(iter->devStatus)); - ma_notify_mot_enb_dev_added(g_variant_builder_end(&builder)); + if (con->cid == MA_DISC_MOT_ENB_DEVS) + ma_notify_mot_enb_dev_added(g_variant_builder_end(&builder)); + else + ma_notify_mowned_dev_added(g_variant_builder_end(&builder)); } else { MA_LOGD("Device %s already exist", _get_readable_uuid(uuid)); } @@ -1030,25 +1039,40 @@ static int _disc_mot_enb_devs(ma_service *service, int timeout) static gpointer _disc_owned_devs_func(gpointer data) { OCStackResult ret = OC_STACK_OK; + OCProvisionDev_t *list = NULL; ma_req_cb_s *con = (ma_req_cb_s *)data; ma_check_null_ret_error("g_client", g_client, NULL); - /* delete un/owned device lists before updating them */ - _remove_owned_client(); - MA_LOGD("Discovering Multiple Owned Devices"); + + g_client->g_mowned_retry_cnt += 1; + g_mutex_lock(&iotivity_mutex); - ret = OCDiscoverMultipleOwnedDevices(con->timeout, &g_client->g_mowned_list); + ret = OCDiscoverMultipleOwnedDevices(con->timeout, &list); g_mutex_unlock(&iotivity_mutex); if (OC_STACK_OK != ret) { MA_LOGE( "OCDiscoverMultipleOwnerEnabledDevices API error"); goto DISC_OWNED_DEVS_END; } - __notify_found_devs(con); + _update_mot_dev_list(con, list); + + if (list) + OCDeleteDiscoveredDevices(list); + + /* Notify Found Devices when first discovery try is finished */ + if (g_client->g_mowned_retry_cnt == 1) + __notify_found_devs(con); + + if (g_client->g_mowned_retry_cnt <= MAX_RETRY_COUNT) { + g_timeout_add(RETRY_INTERVAL, __retry_device_discovery, con); + + return NULL; + } DISC_OWNED_DEVS_END: + g_client->g_mowned_retry_cnt = 0; _request_cleanup(con); g_thread_exit(GINT_TO_POINTER (1)); @@ -1061,8 +1085,6 @@ static int _disc_owned_devs(ma_service *service, int timeout) 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; } @@ -2650,18 +2672,20 @@ int ma_request_disc_mot_enb_devs(ma_service *service, int timeout) int ma_request_disc_owned_devs(ma_service *service, int timeout) { - int ret =MA_ERROR_NONE; + int ret = MA_ERROR_NONE; ma_check_null_ret_error("service", service, FALSE); MA_LOGD("[IPC] Discovery Owned devices"); - /* If we are working now? */ - if (g_atomic_int_get(&service->pending)) + if (g_client->g_mowned_retry_cnt > 0) { + MA_LOGI("Previous discovery is ongoing, reset retry count"); + g_client->g_mowned_retry_cnt = 0; return MA_ERROR_IN_PROGRESS; + } - /* Set d2ds status 'pending' */ - g_atomic_int_set(&service->pending, 1); + /* delete un/owned device lists before updating them */ + _remove_owned_client(); ret = _disc_owned_devs(service, timeout); @@ -2975,14 +2999,9 @@ int ma_request_disable(ma_service *service) g_mutex_clear(&iotivity_mutex); - 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; - } + _remove_owned_client(); + + _remove_mot_client(); if (g_client->rnd_pin) { g_free(g_client->rnd_pin);