alarm_id_t dnd_end_id;
} dnd_alarm_id_s;
-static GHashTable *__event_sender_hash;
+static GList *__event_list = NULL;
typedef struct _event_sender_info {
int priv_id;
char *busname;
+ guint watcher_id;
} event_sender_info_s;
/*!
ret = notification_update_dnd_allow_exception(parameters, &reply_body, uid);
else if (g_strcmp0(method_name, "send_noti_event") == 0)
ret = notification_send_noti_event(parameters, &reply_body);
+ else if (g_strcmp0(method_name, "check_event_receiver") == 0)
+ ret = notification_check_event_receiver(parameters, &reply_body);
+ else if (g_strcmp0(method_name, "reset_event_handler") == 0)
+ ret = notification_reset_event_receiver(parameters, &reply_body, sender);
if (ret == NOTIFICATION_ERROR_NONE) {
DbgPrint("notification service success : %d", ret);
" <arg type='i' name='event_type' direction='in'/>"
" </method>"
+ " <method name='check_event_receiver'>"
+ " <arg type='i' name='priv_id' direction='in'/>"
+ " <arg type='i' name='available' direction='out'/>"
+ " </method>"
+
+ " <method name='reset_event_handler'>"
+ " <arg type='i' name='priv_id' direction='in'/>"
+ " </method>"
+
" <method name='post_toast'>"
" </method>"
" </interface>"
return service_common_register_dbus_interface(introspection_xml, _noti_interface_vtable);
}
-static void __free_event_list(gpointer data)
+static void __free_event_info(gpointer data)
{
event_sender_info_s *info = (event_sender_info_s *)data;
return ret;
}
-static int __add_sender_info(int priv_id, const char *busname, uid_t uid)
+static void __sender_name_appeared_cb(GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data)
+{
+ DbgPrint("sender name appeared name: %s, name_owner : %s", name, name_owner);
+}
+
+static void __sender_name_vanished_cb(GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ GList *delete_list = NULL;
+ event_sender_info_s *info;
+
+ if (!user_data)
+ return;
+
+ info = (event_sender_info_s *)user_data;
+
+ DbgPrint("sender name vanished name : %s, priv_id : %d, watcher_id : %d",
+ name, info->priv_id, info->watcher_id);
+
+ delete_list = g_list_find_custom(__event_list, GUINT_TO_POINTER(info->priv_id),
+ (GCompareFunc)__priv_id_compare);
+ if (delete_list) {
+ __event_list = g_list_remove(__event_list, info);
+ g_bus_unwatch_name(info->watcher_id);
+ __free_event_info(info);
+ }
+}
+
+static guint __insert_sender_watcher_id(event_sender_info_s *sender_info)
+{
+ guint watcher_id = 0;
+ watcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM,
+ sender_info->busname,
+ G_BUS_NAME_WATCHER_FLAGS_NONE,
+ __sender_name_appeared_cb,
+ __sender_name_vanished_cb,
+ sender_info,
+ NULL);
+ if (!watcher_id) {
+ ErrPrint("fail to watch sender name");
+ return 0;
+ }
+
+ DbgPrint("watch on %s success - watcher_id : %d", sender_info->busname, watcher_id);
+ return watcher_id;
+}
+
+static void __add_sender_info(int priv_id, const char *busname)
{
- GList *event_list = NULL;
GList *find_list = NULL;
event_sender_info_s *sender_info;
event_sender_info_s *tmp_info = NULL;
- if (__event_sender_hash == NULL)
- __event_sender_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
-
- event_list = g_hash_table_lookup(__event_sender_hash, GUINT_TO_POINTER(uid));
+ if (busname == NULL)
+ return;
sender_info = (event_sender_info_s *)malloc(sizeof(event_sender_info_s));
if (sender_info == NULL) {
- DbgPrint("malloc failed");
- return NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ ErrPrint("malloc failed");
+ return;
}
sender_info->priv_id = priv_id;
sender_info->busname = strdup(busname);
- if (event_list == NULL) {
- event_list = g_list_append(event_list, sender_info);
- g_hash_table_insert(__event_sender_hash, GUINT_TO_POINTER(uid), event_list);
+ if (__event_list == NULL) {
+ sender_info->watcher_id = __insert_sender_watcher_id(sender_info);
+ __event_list = g_list_append(__event_list, sender_info);
} else {
- event_list = g_list_first(event_list);
- find_list = g_list_find_custom(event_list, GUINT_TO_POINTER(priv_id),
+ __event_list = g_list_first(__event_list);
+ find_list = g_list_find_custom(__event_list, GUINT_TO_POINTER(priv_id),
(GCompareFunc)__priv_id_compare);
if (find_list == NULL) {
- event_list = g_list_append(event_list, sender_info);
+ sender_info->watcher_id = __insert_sender_watcher_id(sender_info);
+ __event_list = g_list_append(__event_list, sender_info);
} else {
tmp_info = (event_sender_info_s *)g_list_nth_data(find_list, 0);
- if (tmp_info->busname)
- free(tmp_info->busname);
- tmp_info->busname = strdup(busname);
-
- if (sender_info) {
- if (sender_info->busname)
- free(sender_info->busname);
- free(sender_info);
+ if (tmp_info->busname) {
+ if (strcmp(tmp_info->busname, busname)) {
+ free(tmp_info->busname);
+ tmp_info->busname = strdup(busname);
+ g_bus_unwatch_name(tmp_info->watcher_id);
+ tmp_info->watcher_id = __insert_sender_watcher_id(sender_info);
+ }
+ } else {
+ tmp_info->busname = strdup(busname);
+ if (!tmp_info->watcher_id)
+ g_bus_unwatch_name(tmp_info->watcher_id);
+ tmp_info->watcher_id = __insert_sender_watcher_id(tmp_info);
}
+ __free_event_info(sender_info);
}
}
-
- return NOTIFICATION_ERROR_NONE;
}
int notification_add_noti(GVariant *parameters, GVariant **reply_body, const char *sender, uid_t uid)
if (ret != NOTIFICATION_ERROR_NONE)
return ret;
- __add_sender_info(priv_id, sender, noti_uid);
+ __add_sender_info(priv_id, sender);
}
notification_free(noti);
} else {
return ret;
}
-static int __delete_sender_info(int priv_id, uid_t uid)
+static int __delete_sender_info(int priv_id)
{
int ret = NOTIFICATION_ERROR_NONE;
event_sender_info_s *info;
- GList *event_list = NULL;
GList *delete_list = NULL;
GVariant *body = NULL;
- if (__event_sender_hash == NULL)
- return NOTIFICATION_ERROR_NONE;
-
- event_list = g_hash_table_lookup(__event_sender_hash, GUINT_TO_POINTER(uid));
-
- if (event_list != NULL) {
- event_list = g_list_first(event_list);
- delete_list = g_list_find_custom(event_list, GUINT_TO_POINTER(priv_id),
+ if (__event_list != NULL) {
+ __event_list = g_list_first(__event_list);
+ delete_list = g_list_find_custom(__event_list, GUINT_TO_POINTER(priv_id),
(GCompareFunc)__priv_id_compare);
if (delete_list != NULL) {
info = (event_sender_info_s *)g_list_nth_data(delete_list, 0);
ErrPrint("failed to send event notify:%d\n", ret);
return ret;
}
- event_list = g_list_remove(g_list_first(event_list), info);
- __free_event_list(info);
- g_hash_table_replace(__event_sender_hash, GUINT_TO_POINTER(uid), event_list);
+ __event_list = g_list_remove(g_list_first(__event_list), info);
+ g_bus_unwatch_name(info->watcher_id);
+ __free_event_info(info);
+ if (g_list_length(__event_list) == 0)
+ __event_list = NULL;
}
}
return ret;
}
- ret = __delete_sender_info(priv_id, uid);
+ ret = __delete_sender_info(priv_id);
if (ret != NOTIFICATION_ERROR_NONE)
return ret;
}
}
for (i = 0; i < num_deleted; i++) {
- ret = __delete_sender_info(*(list_deleted + i), param_uid);
+ ret = __delete_sender_info(*(list_deleted + i));
if (ret != NOTIFICATION_ERROR_NONE)
return ret;
}
return ret;
}
-static char *__find_busname_by_priv_id(int priv_id, uid_t uid)
+static event_sender_info_s *__find_sender_info_by_priv_id(int priv_id)
{
- char *busname = NULL;
event_sender_info_s *event_info;
- GList *event_list;
GList *find_list;
- if (__event_sender_hash == NULL)
+ if (__event_list == NULL)
return NULL;
- event_list = g_hash_table_lookup(__event_sender_hash, GUINT_TO_POINTER(uid));
- if (event_list == NULL)
- return NULL;
-
- event_list = g_list_first(event_list);
- find_list = g_list_find_custom(event_list, GUINT_TO_POINTER(priv_id),
+ __event_list = g_list_first(__event_list);
+ find_list = g_list_find_custom(__event_list, GUINT_TO_POINTER(priv_id),
(GCompareFunc)__priv_id_compare);
- if (find_list) {
+ if (find_list)
event_info = g_list_nth_data(find_list, 0);
- busname = strdup(event_info->busname);
- } else {
+ else
return NULL;
- }
- return busname;
+ return event_info;
}
int notification_send_noti_event(GVariant *parameters, GVariant **reply_body)
int ret;
int event_type;
int priv_id;
- char *busname = NULL;
+ event_sender_info_s *info;
GVariant *coupled_body = NULL;
GVariant *body = NULL;
notification_h noti;
- uid_t noti_uid;
noti = notification_create(NOTIFICATION_TYPE_NOTI);
if (ret != NOTIFICATION_ERROR_NONE)
return ret;
- ret = notification_get_uid(noti, ¬i_uid);
- if (ret != NOTIFICATION_ERROR_NONE)
- return ret;
-
- busname = __find_busname_by_priv_id(priv_id, noti_uid);
- if (busname == NULL)
+ info = __find_sender_info_by_priv_id(priv_id);
+ if (info == NULL || info->busname == NULL)
return NOTIFICATION_ERROR_INVALID_PARAMETER;
- ret = send_event_notify_by_busname(parameters, "send_event", busname, PROVIDER_NOTI_EVENT_INTERFACE_NAME);
+ if (!info->watcher_id) {
+ if (!is_existed_busname(info->busname)) {
+ __event_list = g_list_remove(g_list_first(__event_list), info);
+ __free_event_info(info);
+ return NOTIFICATION_ERROR_IO_ERROR;
+ } else {
+ info->watcher_id = __insert_sender_watcher_id(info);
+ }
+ }
+
+ ret = send_event_notify_by_busname(parameters, "send_event", info->busname, PROVIDER_NOTI_EVENT_INTERFACE_NAME);
notification_free(noti);
- free(busname);
+
} else {
ret = NOTIFICATION_ERROR_OUT_OF_MEMORY;
}
ErrPrint("cannot make reply body");
return NOTIFICATION_ERROR_OUT_OF_MEMORY;
}
+
+ DbgPrint("notification_send_noti_event done !! %d", ret);
+
return ret;
}
+int notification_check_event_receiver(GVariant *parameters, GVariant **reply_body)
+{
+ int priv_id;
+ bool available = false;
+ GList *find_list = NULL;
+ event_sender_info_s *info = NULL;
+
+ g_variant_get(parameters, "(i)", &priv_id);
+ DbgPrint("check event sender - priv_id : %d", priv_id);
+
+ __event_list = g_list_first(__event_list);
+ find_list = g_list_find_custom(__event_list, GUINT_TO_POINTER(priv_id),
+ (GCompareFunc)__priv_id_compare);
+ if (find_list) {
+ info = g_list_nth_data(find_list, 0);
+ if (!info->watcher_id) {
+ if (!is_existed_busname(info->busname)) {
+ __event_list = g_list_remove(g_list_first(__event_list), info);
+ __free_event_info(info);
+ } else {
+ available = true;
+ info->watcher_id = __insert_sender_watcher_id(info);
+ }
+ } else {
+ available = true;
+ }
+ }
+
+ *reply_body = g_variant_new("(i)", (int)available);
+ if (*reply_body == NULL) {
+ ErrPrint("cannot make gvariant to noti");
+ return NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
+
+ DbgPrint("notification check event receiver - available[%d]", available);
+ return NOTIFICATION_ERROR_NONE;
+}
+
+int notification_reset_event_receiver(GVariant *parameters, GVariant **reply_body, const char *sender)
+{
+ int priv_id;
+
+ g_variant_get(parameters, "(i)", &priv_id);
+ DbgPrint("reset event sender - priv_id : %d", priv_id);
+
+ __add_sender_info(priv_id, sender);
+
+ *reply_body = g_variant_new("()");
+ if (*reply_body == NULL) {
+ ErrPrint("cannot make gvariant to noti");
+ return NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ }
+
+ return NOTIFICATION_ERROR_NONE;
+}
+
HAPI int notification_delete_noti_by_appid(const char *appid, uid_t uid)
{
GVariant *deleted_noti_list;
}
for (i = 0; i < num_deleted; i++) {
- ret = __delete_sender_info(*(list_deleted + i), uid);
+ ret = __delete_sender_info(*(list_deleted + i));
if (ret != NOTIFICATION_ERROR_NONE)
return ret;
}