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),
69 LOGE("g_dbus_connection_emit_signal() is failed. %s",
76 if (g_dbus_connection_flush_sync(conn, NULL, &err) == FALSE) {
77 LOGE("g_dbus_connection_flush_sync() is failed. %s",
91 int rua_dbus_signal_subscribe(rua_history_update_cb callback,
92 void *user_data, int *callback_id)
94 struct cb_data *cd = NULL;
99 s_id = g_dbus_connection_signal_subscribe(conn,
102 RUA_SIGNAL_DATA_UPDATE,
105 G_DBUS_SIGNAL_FLAGS_NONE,
111 LOGE("g_dbus_connection_signal_subscribe() is failed.");
116 if (!callback_hash_table) {
117 callback_hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
119 if (!callback_hash_table) {
120 LOGE("out of memory : g_hash_table_new() is failed");
127 cd = (struct cb_data *)malloc(sizeof(struct cb_data));
129 LOGE("out of memory : malloc() is failed");
133 g_atomic_int_inc(&atomic_callback_id);
135 cd->callback = callback;
136 cd->user_data = user_data;
137 cd->callback_id = atomic_callback_id;
139 g_hash_table_insert(callback_hash_table,
140 GINT_TO_POINTER(cd->callback_id), (gpointer)cd);
142 *callback_id = cd->callback_id;
147 int rua_dbus_signal_unsubscribe(int callback_id)
149 gboolean result = FALSE;
150 guint table_size = 0;
152 result = g_hash_table_remove(callback_hash_table, GINT_TO_POINTER(callback_id));
154 LOGE("g_hash_table_remove failed(%d is wrong)", callback_id);
158 table_size = g_hash_table_size(callback_hash_table);
159 if (s_id && table_size == 0) {
160 g_dbus_connection_signal_unsubscribe(conn, s_id);
161 g_hash_table_destroy(callback_hash_table);
163 callback_hash_table = NULL;
170 static void __foreach_callback(gpointer key, gpointer value,
178 struct cb_data *cd = (struct cb_data *)value;
180 r = rua_history_load_db(&table, &nrows, &ncols);
185 cd->callback(table, nrows, ncols, cd->user_data);
187 sqlite3_free_table(table);
190 static void __signal_handler(GDBusConnection *connection,
191 const gchar *sender_name,
192 const gchar *object_path,
193 const gchar *interface_name,
194 const gchar *signal_name,
195 GVariant *parameters,
200 LOGI("__signal_handler");
201 if (g_strcmp0(signal_name, RUA_SIGNAL_DATA_UPDATE))
204 g_variant_get(parameters, "(i)", &update_type);
206 g_hash_table_foreach(callback_hash_table, __foreach_callback, NULL);
209 static void __rua_dbus_init(void)
213 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
215 LOGE("g_bus_get_sync() is failed. %s", err->message);
222 static void __rua_dbus_exit(void)
225 g_object_unref(conn);