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",
75 if (g_dbus_connection_flush_sync(conn, NULL, &err) == FALSE) {
76 LOGE("g_dbus_connection_flush_sync() is failed. %s",
90 int rua_dbus_signal_subscribe(rua_history_update_cb callback,
91 void *user_data, int *callback_id)
93 struct cb_data *cd = NULL;
98 s_id = g_dbus_connection_signal_subscribe(conn,
101 RUA_SIGNAL_DATA_UPDATE,
104 G_DBUS_SIGNAL_FLAGS_NONE,
110 LOGE("g_dbus_connection_signal_subscribe() is failed.");
115 if (!callback_hash_table) {
116 callback_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
118 if (!callback_hash_table) {
119 LOGE("out of memory : g_hash_table_new() is failed");
126 cd = (struct cb_data *)malloc(sizeof(struct cb_data));
128 LOGE("out of memory : malloc() is failed");
132 g_atomic_int_inc(&atomic_callback_id);
134 cd->callback = callback;
135 cd->user_data = user_data;
136 cd->callback_id = atomic_callback_id;
138 g_hash_table_insert(callback_hash_table,
139 GINT_TO_POINTER(cd->callback_id), (gpointer)cd);
141 *callback_id = cd->callback_id;
146 int rua_dbus_signal_unsubscribe(int callback_id)
148 gboolean result = FALSE;
149 guint table_size = 0;
151 result = g_hash_table_remove(callback_hash_table, GINT_TO_POINTER(callback_id));
153 LOGE("g_hash_table_remove failed(%d is wrong)", callback_id);
157 table_size = g_hash_table_size(callback_hash_table);
158 if (s_id && table_size == 0) {
159 g_dbus_connection_signal_unsubscribe(conn, s_id);
160 g_hash_table_destroy(callback_hash_table);
162 callback_hash_table = NULL;
169 static void __foreach_callback(gpointer key, gpointer value,
177 struct cb_data *cd = (struct cb_data *)value;
179 r = rua_history_load_db(&table, &nrows, &ncols);
184 cd->callback(table, nrows, ncols, cd->user_data);
186 sqlite3_free_table(table);
189 static void __signal_handler(GDBusConnection *connection,
190 const gchar *sender_name,
191 const gchar *object_path,
192 const gchar *interface_name,
193 const gchar *signal_name,
194 GVariant *parameters,
199 LOGI("__signal_handler");
200 if (g_strcmp0(signal_name, RUA_SIGNAL_DATA_UPDATE))
203 g_variant_get(parameters, "(i)", &update_type);
205 g_hash_table_foreach(callback_hash_table, __foreach_callback, NULL);
208 static void __rua_dbus_init(void)
212 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
214 LOGE("g_bus_get_sync() is failed. %s", err->message);
221 static void __rua_dbus_exit(void)
224 g_object_unref(conn);