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);
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
}
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);
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);
+}
+
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()
{
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);
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;
+}
<arg type="s" name="group_name" direction="in" />
<arg type="i" name="result" direction="out" />
</method>
+ <method name="StartInvitedDeviceMonitor">
+ <arg type="i" name="result" direction="out" />
+ </method>
<!-- Signal (D-Bus) definitions -->
<signal name="GroupFound">
<arg type="a{sv}" name="group_info" direction="out" />
<arg type="(iay)" name="arg" direction="out" />
<arg type="i" name="result" direction="out" />
</signal>
+ <signal name="DeviceMonitorResult">
+ <arg type="s" name="uuid" direct="out" />
+ <arg type="s" name="group_name" direct="out" />
+ <arg type="s" name="status" direct="out" />
+ </signal>
</interface>
</node>