#define LOG_TAG "STICKERD_DBUS"
static GDBusConnection *_gdbus_connection;
+extern GMainLoop *main_loop;
int stickerd_server_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler,
- GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash)
+ GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash, GList **consumer_list)
{
- GList *sender_list = NULL;
- const char *bus_name = sender;
+ int ret = STICKERD_SERVER_ERROR_NONE;
+ char *m_info_bus_name = NULL;
+ char *list_bus_name = NULL;
monitoring_info_s *m_info = NULL;
- uid_t request_uid = 0;
GList *monitoring_list = NULL;
+ int c_lib;
- if (bus_name == NULL)
- return STICKERD_SERVER_ERROR_IO_ERROR;
+ g_variant_get(parameters, "(i)", &c_lib);
- g_variant_get(parameters, "(i)", &request_uid);
- monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid));
- sender_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc) strcmp);
+ if (reply_body == NULL)
+ return STICKERD_SERVER_ERROR_INVALID_PARAMETER;
- if (sender_list == NULL) {
- LOGD("Add a new sender");
- m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s));
- if (m_info == NULL) {
- LOGE("Failed to alloc memory");
- return STICKERD_SERVER_ERROR_IO_ERROR;
- }
+ m_info_bus_name = strdup(sender);
+ list_bus_name = strdup(sender);
+ if (m_info_bus_name == NULL || list_bus_name == NULL) {
+ ret = STICKERD_SERVER_ERROR_IO_ERROR;
+ goto cleanup;
+ }
- m_info->bus_name = strdup(bus_name);
- m_info->uid = request_uid;
- m_info->watcher_id = g_bus_watch_name_on_connection(
- _gdbus_connection,
- bus_name,
- G_BUS_NAME_WATCHER_FLAGS_NONE,
- name_appeared_handler,
- name_vanished_handler,
- m_info,
- NULL);
- if (m_info->watcher_id == 0) {
- LOGE("Failed to get identifier");
- free(m_info->bus_name);
- free(m_info);
- return STICKERD_SERVER_ERROR_IO_ERROR;
- }
+ LOGD("Add a new sender");
+ m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s));
+ if (m_info == NULL) {
+ LOGE("Failed to alloc memory");
+ ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
+ goto cleanup;
+ }
- monitoring_list = g_list_append(monitoring_list, strdup(bus_name));
- LOGD("sender: %s, len: %d", sender, g_list_length(monitoring_list));
- if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)) == NULL)
- g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(request_uid), monitoring_list);
- } else {
- LOGW("Sender(%s) already exist", sender);
+ m_info->bus_name = m_info_bus_name;
+ m_info->watcher_id = g_bus_watch_name_on_connection(
+ _gdbus_connection,
+ m_info_bus_name,
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ name_appeared_handler,
+ name_vanished_handler,
+ m_info,
+ NULL);
+ if (m_info->watcher_id == 0) {
+ LOGE("Failed to get identifier");
+ ret = STICKERD_SERVER_ERROR_OPERATION_FAILED;
+ goto cleanup;
}
- *reply_body = g_variant_new("()");
+ *reply_body = g_variant_new("(i)", m_info->watcher_id);
if (*reply_body == NULL) {
- if (m_info) {
- if (m_info->bus_name)
- free(m_info->bus_name);
- free(m_info);
- }
- monitoring_list = g_list_remove(monitoring_list, bus_name);
LOGE("Failed to make reply");
- return STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
+ ret = STICKERD_SERVER_ERROR_OUT_OF_MEMORY;
+ goto cleanup;
}
+
+ if ((CLIENT_LIB)c_lib == STICKER_CLIENT_LIB_CONSUMER)
+ *consumer_list = g_list_append(*consumer_list, g_strdup((sender)));
+
+ LOGD("sender: %s, watcher: %d", sender, m_info->watcher_id);
+ monitoring_list = g_list_append(monitoring_list, list_bus_name);
+ if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id)) == NULL)
+ g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(m_info->watcher_id), monitoring_list);
+ else
+ LOGW("Sender(%s) already exist", sender);
+
+ return STICKERD_SERVER_ERROR_NONE;
+
+cleanup:
+ if (m_info_bus_name)
+ free(m_info_bus_name);
+
+ if (list_bus_name)
+ free(list_bus_name);
+
+ if (m_info) {
+ free(m_info);
+ m_info = NULL;
+ }
+
+ return ret;
+}
+
+int stickerd_server_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash, GList **consumer_list)
+{
+ int watcher_id = 0;
+ int c_lib;
+
+ g_variant_get(parameters, "(ii)", &c_lib, &watcher_id);
+
+ if ((CLIENT_LIB)c_lib == STICKER_CLIENT_LIB_CONSUMER) {
+ GList *node = g_list_find_custom(*consumer_list, sender, (GCompareFunc) strcmp);
+ if (node)
+ *consumer_list = g_list_delete_link(*consumer_list, node);
+ }
+
+ if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id)) != NULL) {
+ g_bus_unwatch_name(watcher_id);
+ delete_monitoring_list(monitoring_hash, sender, watcher_id);
+ }
+
return STICKERD_SERVER_ERROR_NONE;
}
return result;
}
-int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid)
+int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, int watcher_id)
{
GList *monitoring_list = NULL;
GList *del_list = NULL;
char *bus_name;
- monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(uid));
+ monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(watcher_id));
if (monitoring_list == NULL) {
- LOGE("The key(%d) is not found", uid);
+ LOGE("The key(%d) is not found", watcher_id);
return STICKERD_SERVER_ERROR_IO_ERROR;
}
monitoring_list = g_list_delete_link(monitoring_list, del_list);
if (monitoring_list == NULL) {
- g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(uid));
+ g_hash_table_steal(*monitoring_hash, GUINT_TO_POINTER(watcher_id));
} else {
monitoring_list = g_list_first(monitoring_list);
- g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(uid), monitoring_list);
+ g_hash_table_replace(*monitoring_hash, GUINT_TO_POINTER(watcher_id), monitoring_list);
}
}
return STICKERD_SERVER_ERROR_NONE;