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.
27 #include "rua_private.h"
29 #define RUA_INTERFACE "org.tizen.rua"
30 #define RUA_PATH "/org/tizen/rua"
31 #define RUA_SIGNAL_DATA_UPDATE "dataupdate"
35 rua_history_update_cb callback;
39 static GDBusConnection *conn;
42 static gint atomic_callback_id;
43 static GHashTable *callback_hash_table;
45 static void __foreach_callback(gpointer key, gpointer value,
47 static void __signal_handler(GDBusConnection *connection,
48 const gchar *sender_name,
49 const gchar *object_path,
50 const gchar *interface_name,
51 const gchar *signal_name,
54 static void __rua_dbus_init(void);
55 static void __rua_dbus_exit(void);
57 int rua_dbus_send_update_signal(update_type type)
62 if (g_dbus_connection_emit_signal(conn,
66 RUA_SIGNAL_DATA_UPDATE,
67 g_variant_new("(i)", type),
70 LOGE("g_dbus_connection_emit_signal() is failed. %s",
74 LOGE("g_dbus_connection_emit_signal() is failed");
80 if (g_dbus_connection_flush_sync(conn, NULL, &err) == FALSE) {
82 LOGE("g_dbus_connection_flush_sync() is failed. %s",
86 LOGE("g_dbus_connection_emit_signal() is failed");
99 int rua_dbus_signal_subscribe(rua_history_update_cb callback,
100 void *user_data, int *callback_id)
102 struct cb_data *cd = NULL;
107 s_id = g_dbus_connection_signal_subscribe(conn,
110 RUA_SIGNAL_DATA_UPDATE,
113 G_DBUS_SIGNAL_FLAGS_NONE,
119 LOGE("g_dbus_connection_signal_subscribe() is failed.");
124 if (!callback_hash_table) {
125 callback_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
127 if (!callback_hash_table) {
128 LOGE("out of memory : g_hash_table_new() is failed");
135 cd = (struct cb_data *)malloc(sizeof(struct cb_data));
137 LOGE("out of memory : malloc() is failed");
141 g_atomic_int_inc(&atomic_callback_id);
143 cd->callback = callback;
144 cd->user_data = user_data;
145 cd->callback_id = atomic_callback_id;
147 g_hash_table_insert(callback_hash_table,
148 GINT_TO_POINTER(cd->callback_id), (gpointer)cd);
150 *callback_id = cd->callback_id;
155 int rua_dbus_signal_unsubscribe(int callback_id)
157 gboolean result = FALSE;
158 guint table_size = 0;
160 result = g_hash_table_remove(callback_hash_table, GINT_TO_POINTER(callback_id));
162 LOGE("g_hash_table_remove failed(%d is wrong)", callback_id);
166 table_size = g_hash_table_size(callback_hash_table);
167 if (s_id && table_size == 0) {
168 g_dbus_connection_signal_unsubscribe(conn, s_id);
169 g_hash_table_destroy(callback_hash_table);
171 callback_hash_table = NULL;
178 static void __foreach_callback(gpointer key, gpointer value,
186 struct cb_data *cd = (struct cb_data *)value;
188 r = rua_history_load_db(&table, &nrows, &ncols);
193 cd->callback(table, nrows, ncols, cd->user_data);
195 sqlite3_free_table(table);
198 static void __signal_handler(GDBusConnection *connection,
199 const gchar *sender_name,
200 const gchar *object_path,
201 const gchar *interface_name,
202 const gchar *signal_name,
203 GVariant *parameters,
208 LOGI("__signal_handler");
209 if (g_strcmp0(signal_name, RUA_SIGNAL_DATA_UPDATE))
212 g_variant_get(parameters, "(i)", &update_type);
214 g_hash_table_foreach(callback_hash_table, __foreach_callback, NULL);
217 static void __rua_dbus_init(void)
224 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
229 LOGE("g_bus_get_sync() is failed. %s", err->message);
232 LOGE("g_bus_get_sync() is failed.");
236 static void __rua_dbus_exit(void)
239 g_object_unref(conn);