#define AMB_BUS_NAME "org.automotive.message.broker"
#define AMB_INTERFACE_NAME "org.automotive.Manager"
+#define AMB_OBJ_PATH "/Org/Automotive/Manager"
+#define AMB_SIGNAL_RESTART "Restart"
+
#define DBUS_INTERFACE_NAME "org.freedesktop.DBus.Properties"
+
struct callback_item {
AMB_PROPERTY_CHANGED_CALLBACK callback;
void *user_data;
GDBusProxy *obj;
GList *cb_list;
guint32 next_cid;
+ gchar *objname;
+ ZoneType zone;
};
+static guint signalid;
+static GDBusConnection* conn = NULL;
+
/******************************************************************************
* internal
*****************************************************************************/
return ;
}
+static void signal_handler(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ GHashTable *htable;
+ GHashTableIter iter;
+ GDBusProxy *proxy;
+ GDBusProxy *objproxy;
+ gchar *objpath;
+ struct signal_item *item;
+
+ DEBUGOUT("DBus Signal catch: %s\n", signal_name);
+
+ if (g_strcmp0(signal_name, AMB_SIGNAL_RESTART))
+ return ;
+
+ htable = get_htable();
+ if (!htable) {
+ DEBUGOUT("Error: get_htable() returns NULL\n");
+ return ;
+ }
+
+ proxy = get_manager();
+ if (!proxy) {
+ DEBUGOUT("Error: get_manager() returns NULL\n");
+ return ;
+ }
+
+ g_hash_table_iter_init(&iter, htable);
+ while (g_hash_table_iter_next(&iter, (gpointer*)&objpath, (gpointer*)&item)) {
+ DEBUGOUT("objpath: %s\n", objpath);
+ GDBusProxy *retobj = find_objects_with_zone(proxy, item->objname, item->zone);
+ if (!retobj) {
+ DEBUGOUT("Error: find_objects_with_zone() returns NULL\n");
+ }
+ }
+}
+
+static int subscribe_dbus_signal()
+{
+ static int is_subscribe = 0;
+ GError *error;
+
+ DEBUGOUT("%s: Enter subscribe_dbus_signal()\n", __func__);
+
+ if (is_subscribe)
+ return 0;
+
+ error = NULL;
+ conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (conn == NULL) {
+ DEBUGOUT("%s: %s\n", __func__, error->message);
+ return -1;
+ }
+
+ signalid = g_dbus_connection_signal_subscribe(conn,
+ NULL,
+ AMB_INTERFACE_NAME,
+ AMB_SIGNAL_RESTART,
+ AMB_OBJ_PATH,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ signal_handler,
+ NULL,
+ NULL);
+
+ if (!signalid) {
+ DEBUGOUT("%s: Fail to g_dbus_connection_signal_subscribe()\n", __func__);
+ g_object_unref(conn);
+ return -1;
+ }
+ is_subscribe = 1;
+ return 0;
+}
+
+
/******************************************************************************
* higher APIs
*****************************************************************************/
struct callback_item *citem;
GHashTable *htable;
+ if (subscribe_dbus_signal()) {
+ DEBUGOUT("Error: fail to subscribe_dbus_signal()\n");
+ return -100;
+ }
+
if (callback == NULL)
return -EINVAL;
item->id = sid;
item->next_cid = 0;
item->obj = objproxy;
+ item->zone = zone;
+ item->objname = g_strdup(objname);
g_hash_table_insert(htable, item->key, item);
}