From: Marcel Holtmann Date: Wed, 26 Dec 2007 09:13:30 +0000 (+0100) Subject: Add basic methods and signals for manager interface X-Git-Tag: 0.1~466 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e5ea9b79443b759f6d3086d40b57a94213604352;p=platform%2Fupstream%2Fconnman.git Add basic methods and signals for manager interface --- diff --git a/src/connman.h b/src/connman.h index cff8f8f..b5f0e48 100644 --- a/src/connman.h +++ b/src/connman.h @@ -47,6 +47,8 @@ void __connman_plugin_cleanup(void); int __connman_iface_init(DBusConnection *conn); void __connman_iface_cleanup(void); +void __connman_iface_list(DBusMessageIter *iter); + #include int __connman_rtnl_init(void); diff --git a/src/iface.c b/src/iface.c index 9dc0c80..6825c51 100644 --- a/src/iface.c +++ b/src/iface.c @@ -53,8 +53,22 @@ void connman_iface_unregister(struct connman_iface_driver *driver) static GSList *interfaces = NULL; +void __connman_iface_list(DBusMessageIter *iter) +{ + GSList *list; + + DBG(""); + + for (list = interfaces; list; list = list->next) { + struct connman_iface *iface = list->data; + + dbus_message_iter_append_basic(iter, + DBUS_TYPE_OBJECT_PATH, &iface->path); + } +} + int connman_iface_update(struct connman_iface *iface, - enum connman_iface_state state) + enum connman_iface_state state) { switch (state) { case CONNMAN_IFACE_STATE_ACTIVE: @@ -158,6 +172,12 @@ static int probe_device(LibHalContext *ctx, DBG("address %s", inet_ntoa(iface->ipv4.address)); } + g_dbus_emit_signal(conn, CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, + "InterfaceAdded", + DBUS_TYPE_OBJECT_PATH, &iface->path, + DBUS_TYPE_INVALID); + if (driver->activate) driver->activate(iface); @@ -197,6 +217,11 @@ static void device_removed(LibHalContext *ctx, const char *udi) struct connman_iface *iface = list->data; if (strcmp(udi, iface->udi) == 0) { + g_dbus_emit_signal(conn, CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, + "InterfaceRemoved", + DBUS_TYPE_OBJECT_PATH, &iface->path, + DBUS_TYPE_INVALID); interfaces = g_slist_remove(interfaces, iface); g_dbus_unregister_object(conn, iface->path); break; @@ -293,6 +318,12 @@ static void hal_cleanup(void *data) DBG("path %s", iface->path); + g_dbus_emit_signal(conn, CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, + "InterfaceRemoved", + DBUS_TYPE_OBJECT_PATH, &iface->path, + DBUS_TYPE_INVALID); + g_dbus_unregister_object(conn, iface->path); } diff --git a/src/manager.c b/src/manager.c index 5fa60cc..1afecc8 100644 --- a/src/manager.c +++ b/src/manager.c @@ -27,6 +27,41 @@ #include "connman.h" +static DBusMessage *list_interfaces(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusMessage *reply; + DBusMessageIter array, iter; + + DBG("conn %p", conn); + + reply = dbus_message_new_method_return(msg); + if (reply == NULL) + return NULL; + + dbus_message_iter_init_append(reply, &array); + + dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY, + DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter); + + __connman_iface_list(&iter); + + dbus_message_iter_close_container(&array, &iter); + + return reply; +} + +static GDBusMethodTable manager_methods[] = { + { "ListInterfaces", "", "ao", list_interfaces }, + { }, +}; + +static GDBusSignalTable manager_signals[] = { + { "InterfaceAdded", "o" }, + { "InterfaceRemoved", "o" }, + { }, +}; + static DBusConnection *connection = NULL; int __connman_manager_init(DBusConnection *conn) @@ -39,6 +74,11 @@ int __connman_manager_init(DBusConnection *conn) g_dbus_register_object(connection, CONNMAN_MANAGER_PATH, NULL, NULL); + g_dbus_register_interface(connection, CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, + manager_methods, + manager_signals, NULL); + return 0; } @@ -46,6 +86,9 @@ void __connman_manager_cleanup(void) { DBG("conn %p", connection); + g_dbus_unregister_interface(connection, CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE); + g_dbus_unregister_object(connection, CONNMAN_MANAGER_PATH); dbus_connection_unref(connection);