From 741e90507f53e4adefb9a109058e0fbd96556a55 Mon Sep 17 00:00:00 2001 From: Saurav Babu Date: Thu, 19 Apr 2018 14:51:32 +0530 Subject: [PATCH] comp-manager: Monitor Invited device This patch adds new method to start monitoring invited device and sends signal when device state changes Signed-off-by: Saurav Babu --- src/companion-manager/include/comp_context.h | 2 + src/companion-manager/include/comp_gdbus_group.h | 5 ++ src/companion-manager/include/comp_group.h | 2 + src/companion-manager/src/comp_gdbus.c | 5 ++ src/companion-manager/src/comp_gdbus_group.c | 21 +++++ src/companion-manager/src/comp_group.c | 102 +++++++++++++++++++++++ src/companion-manager/src/companion_gdbus.xml | 8 ++ 7 files changed, 145 insertions(+) diff --git a/src/companion-manager/include/comp_context.h b/src/companion-manager/include/comp_context.h index 3839026..db9e234 100644 --- a/src/companion-manager/include/comp_context.h +++ b/src/companion-manager/include/comp_context.h @@ -44,6 +44,8 @@ typedef struct { GList *grp_list; GList *pairwise_list; + bool monitor_started; + //sqlite3 db sqlite3 *db; } comp_context_t; diff --git a/src/companion-manager/include/comp_gdbus_group.h b/src/companion-manager/include/comp_gdbus_group.h index 6bcf0c0..2cab655 100644 --- a/src/companion-manager/include/comp_gdbus_group.h +++ b/src/companion-manager/include/comp_gdbus_group.h @@ -102,6 +102,9 @@ gboolean group_request_eject(Group *group, GDBusMethodInvocation *invocation, gboolean group_request_delete_group(Group *group, GDBusMethodInvocation *invocation, gchar *uuid, gchar *group_name, gpointer user_data); +gboolean group_start_invited_device_monitor(Group *group, + GDBusMethodInvocation *invocation, gpointer user_data); + void notify_group_found(GVariant *group_data); void notify_group_find_finish(int ret); void notify_device_found(int device_count, GVariant *device_data); @@ -114,6 +117,8 @@ void notify_group_join(int result); void notify_send_data_finish(const char *resp_data, int ret); void notify_request_result(const char *cmd, const char *requester_id, unsigned char *arg, int len, int ret); +void notify_device_monitor_result(const char *uuid, const char *group_name, + const char *status); #ifdef __cplusplus } diff --git a/src/companion-manager/include/comp_group.h b/src/companion-manager/include/comp_group.h index e5d6ac4..1bde8b3 100755 --- a/src/companion-manager/include/comp_group.h +++ b/src/companion-manager/include/comp_group.h @@ -158,6 +158,8 @@ int comp_group_request_invite(char *uuid, char *group_name, char *target_uuid, c int comp_group_request_eject(char *uuid, char *group_name, char *target_uuid); int comp_group_request_delete_group(char *uuid, char *group_name); +int comp_group_start_invited_device_monitor(); + #ifdef __cplusplus } #endif diff --git a/src/companion-manager/src/comp_gdbus.c b/src/companion-manager/src/comp_gdbus.c index 84012c2..d923c80 100644 --- a/src/companion-manager/src/comp_gdbus.c +++ b/src/companion-manager/src/comp_gdbus.c @@ -155,6 +155,11 @@ static bool __group_init(GDBusConnection *connection) G_CALLBACK(group_request_delete_group), NULL); + g_signal_connect(group_skeleton, + "handle-start-invited-device-monitor", + G_CALLBACK(group_start_invited_device_monitor), + NULL); + group = g_dbus_object_manager_server_new(COMP_DBUS_GROUP_PATH); // Set connection to 'manager' diff --git a/src/companion-manager/src/comp_gdbus_group.c b/src/companion-manager/src/comp_gdbus_group.c index 87b7b48..6636504 100644 --- a/src/companion-manager/src/comp_gdbus_group.c +++ b/src/companion-manager/src/comp_gdbus_group.c @@ -373,6 +373,20 @@ gboolean group_request_delete_group(Group *group, return TRUE; } +gboolean group_start_invited_device_monitor(Group *group, + GDBusMethodInvocation *invocation, gpointer user_data) +{ + int ret = 0; + + LOG_DEBUG("Start Myowned device monitor"); + + ret = comp_group_start_invited_device_monitor(); + + group_complete_start_invited_device_monitor(group, invocation, ret); + + return TRUE; +} + void notify_group_found(GVariant *group_data) { group_emit_group_found(group_dbus_get_object(), group_data); @@ -441,3 +455,10 @@ void notify_request_result(const char *cmd, const char *requester_id, params, ret); } +void notify_device_monitor_result(const char *uuid, const char *group_name, + const char *status) +{ + group_emit_device_monitor_result(group_dbus_get_object(), uuid, group_name, + status); +} + diff --git a/src/companion-manager/src/comp_group.c b/src/companion-manager/src/comp_group.c index 7a4665d..24f0848 100755 --- a/src/companion-manager/src/comp_group.c +++ b/src/companion-manager/src/comp_group.c @@ -29,6 +29,9 @@ GList *invited_dev_list = NULL; comp_group_invite_info_t *group_invite_info = NULL; comp_mot_device_t *my_device = NULL; +#define KEEPALIVE_MESSAGE_TIMEOUT 900 +#define CHECK_DEVICE_STATUS_TIMEOUT 3000 + /* Called when daemon is start. */ int comp_group_initialize() { @@ -586,6 +589,17 @@ void comp_group_notify_group_invite(int ret) comp_group_request_keepalive(device->uuid, device->group_name, device->host); + + comp_context_t *comp_ctx = comp_context_get_context(); + comp_check_null_ret("comp_ctx", comp_ctx); + + if (comp_ctx->monitor_started == true) { + notify_device_monitor_result(device->uuid, device->group_name, + "Added"); + + comp_group_start_invited_device_monitor(); + } + } else { g_free(device->uuid); g_free(device->group_name); @@ -1244,4 +1258,92 @@ int comp_group_request_delete_group(char *uuid, char *group_name) return ret; } +static gboolean __send_keepalive_messages(gpointer user_data) +{ + GList *iter = NULL; + + iter = invited_dev_list; + while (iter != NULL) { + comp_invited_device_t *temp = (comp_invited_device_t *)iter->data; + + comp_group_request_keepalive(temp->uuid, temp->group_name, temp->host); + + iter = g_list_next(iter); + } + + return TRUE; +} + +static gboolean __check_invited_device_status(gpointer user_data) +{ + int *t_id = (int *)user_data; + GList *iter = NULL; + + g_source_remove(*t_id); + *t_id = 0; + + iter = invited_dev_list; + while (iter != NULL) { + comp_invited_device_t *temp = (comp_invited_device_t *)iter->data; + + iter = g_list_next(iter); + + LOG_DEBUG("uuid %s count %d", temp->uuid, temp->count); + if (temp->count == 0) { + LOG_DEBUG("Remove device with uuid %s", temp->uuid); + invited_dev_list = g_list_remove(invited_dev_list, temp); + + notify_device_monitor_result(temp->uuid, temp->group_name, + "Removed"); + + g_free(temp->host); + g_free(temp->uuid); + g_free(temp->group_name); + g_free(temp); + } else { + temp->count = 0; + } + } + + comp_context_t *comp_ctx = comp_context_get_context(); + comp_check_null_ret_error("comp_ctx", comp_ctx, FALSE); + + if (comp_ctx->monitor_started == false) { + g_free(t_id); + return FALSE; + } + + if (g_list_length(invited_dev_list) == 0) { + g_free(t_id); + return FALSE; + } + + *t_id = g_timeout_add(KEEPALIVE_MESSAGE_TIMEOUT, __send_keepalive_messages, + NULL); + + return TRUE; +} + +int comp_group_start_invited_device_monitor() +{ + int *t_id; + + comp_context_t *comp_ctx = comp_context_get_context(); + comp_check_null_ret_error("comp_ctx", comp_ctx, + COMP_ERROR_INVALID_PARAMETER); + + comp_ctx->monitor_started = true; + + LOG_DEBUG("Start invited device monitor"); + + t_id = g_try_malloc0(sizeof(int)); + + *t_id = g_timeout_add(KEEPALIVE_MESSAGE_TIMEOUT, __send_keepalive_messages, + NULL); + + g_timeout_add(CHECK_DEVICE_STATUS_TIMEOUT, __check_invited_device_status, + t_id); + + return COMP_ERROR_NONE; +} diff --git a/src/companion-manager/src/companion_gdbus.xml b/src/companion-manager/src/companion_gdbus.xml index 94e1fa5..615948a 100644 --- a/src/companion-manager/src/companion_gdbus.xml +++ b/src/companion-manager/src/companion_gdbus.xml @@ -138,6 +138,9 @@ + + + @@ -178,5 +181,10 @@ + + + + + -- 2.7.4