From: Marcel Holtmann Date: Tue, 30 Dec 2008 02:45:08 +0000 (+0100) Subject: Add initial support for Network interface X-Git-Tag: 0.6~84 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fd24c47b801a63ff9a16384adcf3c73f8e3a77d8;p=platform%2Fupstream%2Fconnman.git Add initial support for Network interface --- diff --git a/include/network.h b/include/network.h index 292dd9f..6d2f3b7 100644 --- a/include/network.h +++ b/include/network.h @@ -22,6 +22,9 @@ #ifndef __CONNMAN_NETWORK_H #define __CONNMAN_NETWORK_H +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -35,6 +38,7 @@ extern "C" { enum connman_network_type { CONNMAN_NETWORK_TYPE_UNKNOWN = 0, CONNMAN_NETWORK_TYPE_WIFI = 1, + CONNMAN_NETWORK_TYPE_HSO = 23, }; struct connman_network; @@ -46,6 +50,8 @@ extern void connman_network_unref(struct connman_network *network); extern const char *connman_network_get_identifier(struct connman_network *network); +extern struct connman_device *connman_network_get_device(struct connman_network *network); + extern void *connman_network_get_data(struct connman_network *network); extern void connman_network_set_data(struct connman_network *network, void *data); @@ -55,6 +61,8 @@ struct connman_network_driver { int priority; int (*probe) (struct connman_network *network); void (*remove) (struct connman_network *network); + int (*connect) (struct connman_network *network); + int (*disconnect) (struct connman_network *network); }; extern int connman_network_driver_register(struct connman_network_driver *driver); diff --git a/src/connman.h b/src/connman.h index 55f78c0..45cb191 100644 --- a/src/connman.h +++ b/src/connman.h @@ -124,6 +124,9 @@ void __connman_device_cleanup(void); int __connman_network_init(void); void __connman_network_cleanup(void); +void __connman_network_set_device(struct connman_network *network, + struct connman_device *device); + #include int __connman_rtnl_init(void); diff --git a/src/device.c b/src/device.c index 07129ba..e466c0c 100644 --- a/src/device.c +++ b/src/device.c @@ -836,6 +836,8 @@ int connman_device_add_network(struct connman_device *device, if (err < 0) return err; + __connman_network_set_device(network, device); + g_hash_table_insert(device->networks, g_strdup(identifier), network); diff --git a/src/network.c b/src/network.c index 3e35a38..d244895 100644 --- a/src/network.c +++ b/src/network.c @@ -23,6 +23,8 @@ #include #endif +#include + #include "connman.h" struct connman_network { @@ -32,8 +34,118 @@ struct connman_network { struct connman_network_driver *driver; void *driver_data; + + struct connman_device *device; }; +static DBusMessage *get_properties(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusMessage *reply; + DBusMessageIter array, dict; + + 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_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); + + dbus_message_iter_close_container(&array, &dict); + + return reply; +} + +static DBusMessage *set_property(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusMessageIter iter, value; + const char *name; + + DBG("conn %p", conn); + + if (dbus_message_iter_init(msg, &iter) == FALSE) + return __connman_error_invalid_arguments(msg); + + dbus_message_iter_get_basic(&iter, &name); + dbus_message_iter_next(&iter); + dbus_message_iter_recurse(&iter, &value); + + if (__connman_security_check_privileges(msg) < 0) + return __connman_error_permission_denied(msg); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); +} + +static DBusMessage *do_connect(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBG("conn %p", conn); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); +} + +static DBusMessage *do_disconnect(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBG("conn %p", conn); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); +} + +static GDBusMethodTable network_methods[] = { + { "GetProperties", "", "a{sv}", get_properties }, + { "SetProperty", "sv", "", set_property }, + { "Connect", "", "", do_connect }, + { "Disconnect", "", "", do_disconnect }, + { }, +}; + +static GDBusSignalTable network_signals[] = { + { "PropertyChanged", "sv" }, + { }, +}; + +static DBusConnection *connection; + +static void emit_networks_signal(void) +{ +} + +static int register_interface(struct connman_element *element) +{ + struct connman_network *network = element->network; + + g_dbus_unregister_interface(connection, element->path, + CONNMAN_NETWORK_INTERFACE); + + if (g_dbus_register_interface(connection, element->path, + CONNMAN_NETWORK_INTERFACE, + network_methods, network_signals, + NULL, network, NULL) == FALSE) { + connman_error("Failed to register %s network", element->path); + return -EIO; + } + + emit_networks_signal(); + + return 0; +} + +static void unregister_interface(struct connman_element *element) +{ + emit_networks_signal(); + + g_dbus_unregister_interface(connection, element->path, + CONNMAN_NETWORK_INTERFACE); +} + static GSList *driver_list = NULL; static gint compare_priority(gconstpointer a, gconstpointer b) @@ -156,6 +268,23 @@ const char *connman_network_get_identifier(struct connman_network *network) return network->identifier; } +void __connman_network_set_device(struct connman_network *network, + struct connman_device *device) +{ + network->device = device; +} + +/** + * connman_network_get_device: + * @network: network structure + * + * Get parent device of network + */ +struct connman_device *connman_network_get_device(struct connman_network *network) +{ + return network->device; +} + /** * connman_network_get_data: * @network: network structure @@ -193,6 +322,7 @@ static int network_probe(struct connman_element *element) { struct connman_network *network = element->network; GSList *list; + int err; DBG("element %p name %s", element, element->name); @@ -216,6 +346,13 @@ static int network_probe(struct connman_element *element) if (!network->driver) return -ENODEV; + err = register_interface(element); + if (err < 0) { + if (network->driver->remove) + network->driver->remove(network); + return err; + } + return 0; } @@ -231,6 +368,8 @@ static void network_remove(struct connman_element *element) if (!network->driver) return; + unregister_interface(element); + if (network->driver->remove) network->driver->remove(network); } @@ -247,6 +386,8 @@ int __connman_network_init(void) { DBG(""); + connection = connman_dbus_get_connection(); + return connman_driver_register(&network_driver); } @@ -255,4 +396,6 @@ void __connman_network_cleanup(void) DBG(""); connman_driver_unregister(&network_driver); + + dbus_connection_unref(connection); }