Add initial support for Network interface
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 30 Dec 2008 02:45:08 +0000 (03:45 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 30 Dec 2008 02:45:08 +0000 (03:45 +0100)
include/network.h
src/connman.h
src/device.c
src/network.c

index 292dd9f..6d2f3b7 100644 (file)
@@ -22,6 +22,9 @@
 #ifndef __CONNMAN_NETWORK_H
 #define __CONNMAN_NETWORK_H
 
+#include <connman/types.h>
+#include <connman/device.h>
+
 #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);
index 55f78c0..45cb191 100644 (file)
@@ -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 <connman/rtnl.h>
 
 int __connman_rtnl_init(void);
index 07129ba..e466c0c 100644 (file)
@@ -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);
 
index 3e35a38..d244895 100644 (file)
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#include <gdbus.h>
+
 #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);
 }