2 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 #include "rua_private.h"
28 #define RUA_INTERFACE "org.tizen.rua"
29 #define RUA_PATH "/org/tizen/rua"
30 #define RUA_SIGNAL_DATA_UPDATE "dataupdate"
34 rua_history_update_cb callback;
38 static GDBusConnection *conn;
41 static gint atomic_callback_id;
42 static GHashTable *callback_hash_table;
44 static void __foreach_callback(gpointer key, gpointer value,
46 static void __signal_handler(GDBusConnection *connection,
47 const gchar *sender_name,
48 const gchar *object_path,
49 const gchar *interface_name,
50 const gchar *signal_name,
53 static void __rua_dbus_init(void);
54 static void __rua_dbus_exit(void);
56 int rua_dbus_send_update_signal(update_type type)
61 if (g_dbus_connection_emit_signal(conn,
65 RUA_SIGNAL_DATA_UPDATE,
66 g_variant_new("(i)", type),
68 LOGE("g_dbus_connection_emit_signal() is failed. %s",
74 if (g_dbus_connection_flush_sync(conn, NULL, &err) == FALSE) {
75 LOGE("g_dbus_connection_flush_sync() is failed. %s",
88 int rua_dbus_signal_subscribe(rua_history_update_cb callback,
89 void *user_data, int *callback_id)
91 struct cb_data *cd = NULL;
96 s_id = g_dbus_connection_signal_subscribe(conn,
99 RUA_SIGNAL_DATA_UPDATE,
102 G_DBUS_SIGNAL_FLAGS_NONE,
108 LOGE("g_dbus_connection_signal_subscribe() is failed.");
113 if (!callback_hash_table) {
114 callback_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
116 if (!callback_hash_table) {
117 LOGE("out of memory : g_hash_table_new() is failed");
124 cd = (struct cb_data *)malloc(sizeof(struct cb_data));
126 LOGE("out of memory : malloc() is failed");
130 g_atomic_int_inc(&atomic_callback_id);
132 cd->callback = callback;
133 cd->user_data = user_data;
134 cd->callback_id = atomic_callback_id;
136 g_hash_table_insert(callback_hash_table,
137 GINT_TO_POINTER(cd->callback_id), (gpointer)cd);
139 *callback_id = cd->callback_id;
144 int rua_dbus_signal_unsubscribe(int callback_id)
146 gboolean result = FALSE;
147 guint table_size = 0;
149 result = g_hash_table_remove(callback_hash_table, GINT_TO_POINTER(callback_id));
151 LOGE("g_hash_table_remove failed(%d is wrong)", callback_id);
155 table_size = g_hash_table_size(callback_hash_table);
156 if (s_id && table_size == 0) {
157 g_dbus_connection_signal_unsubscribe(conn, s_id);
158 g_hash_table_destroy(callback_hash_table);
160 callback_hash_table = NULL;
167 static void __foreach_callback(gpointer key, gpointer value,
175 struct cb_data *cd = (struct cb_data *)value;
177 r = rua_history_load_db(&table, &nrows, &ncols);
182 cd->callback(table, nrows, ncols, cd->user_data);
185 static void __signal_handler(GDBusConnection *connection,
186 const gchar *sender_name,
187 const gchar *object_path,
188 const gchar *interface_name,
189 const gchar *signal_name,
190 GVariant *parameters,
195 LOGI("__signal_handler");
196 if (g_strcmp0(signal_name, RUA_SIGNAL_DATA_UPDATE))
199 g_variant_get(parameters, "(i)", &update_type);
201 g_hash_table_foreach(callback_hash_table, __foreach_callback, NULL);
204 static void __rua_dbus_init(void)
208 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
210 LOGE("g_bus_get_sync() is failed. %s", err->message);
217 static void __rua_dbus_exit(void)
220 g_object_unref(conn);