This email list is read-only.  Emails sent to this list will be discarded
----------------------------------
 plugins/bluetooth.c |   79 ++++++++++++++++++++++++++++++++++++++++++
 plugins/wifi.c      |   11 +++++-
 src/connman.conf    |    4 ++
 src/connman.h       |    4 ++
 src/element.c       |   94 ++++++++++++++++++++++++++++++++++----------------
 src/error.c         |    6 +++
 src/main.c          |   12 +++---
 src/storage.c       |   18 +++++++++-
 8 files changed, 189 insertions(+), 39 deletions(-)

New commits:
commit 9703f77e6f49cf5bcf318c1f2d315a6250ae773d
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 22:11:51 2008 +0100

    Add generic failure reply

commit afc80b971146277e4befc173ef61cfcb375a3b0f
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 22:07:26 2008 +0100

    Track global connection state

commit 9a190718628f120e6a3469a7d128795c70fc1ad0
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 21:53:42 2008 +0100

    Don't store the enable status of an element

commit d58d6a1fc8aea4ac47f815d3217e3f6a19be378a
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 21:52:06 2008 +0100

    Load policy configuration from storage

commit fca9b70ed3be7b479c5949bf001d0a071802fca2
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 21:47:21 2008 +0100

    Store the policy setting

commit f7afbae29f9cb5a933890e12c16771de5bfd642f
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 21:42:10 2008 +0100

    Don't store fake or network device elements

commit 7bb1bc293ccdb0d8fb95ae8ef25080ab13656769
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 21:39:16 2008 +0100

    Do policy based enabling/disabling of devices

commit e7f9a5e40c71f267015af90cacb009eea3ee323a
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 21:03:59 2008 +0100

    Add deny policy to D-Bus access configuration

commit c4f2302710ca4e779555759418bac3babc2d953e
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 20:21:08 2008 +0100

    Fix cleanup and unregistration procedures

commit 54bdbc71afb639449aa3d64f1fd61a057c79189c
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 20:14:47 2008 +0100

    Send signal for changed device and connection lists

commit cf87ef5c131af32de16b51d47ecd55f26d2b991c
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Fri Dec 5 13:59:25 2008 +0100

    Fix detection of Bluetooth devices


Diff in this email is a maximum of 400 lines.
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index 6b0b69a..978f257 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -33,6 +33,8 @@
 
 #define BLUEZ_SERVICE "org.bluez"
 
+#define TIMEOUT 5000
+
 static int bluetooth_probe(struct connman_device *device)
 {
        DBG("device %p", device);
@@ -52,14 +54,91 @@ static struct connman_device_driver bluetooth_driver = {
        .remove = bluetooth_remove,
 };
 
+static GSList *device_list = NULL;
+
+static void adapters_reply(DBusPendingCall *call, void *user_data)
+{
+       DBusMessage *reply;
+       DBusError error;
+       char **adapters;
+       int i, num_adapters;
+
+       DBG("");
+
+       reply = dbus_pending_call_steal_reply(call);
+
+       dbus_error_init(&error);
+
+       if (dbus_message_get_args(reply, &error,
+                               DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH,
+                                               &adapters, &num_adapters,
+                                               DBUS_TYPE_INVALID) == FALSE) {
+               if (dbus_error_is_set(&error) == TRUE) {
+                       connman_error("%s", error.message);
+                       dbus_error_free(&error);
+               } else
+                       connman_error("Wrong arguments for adapter list");
+               goto done;
+       }
+
+       for (i = 0; i < num_adapters; i++) {
+               struct connman_element *device;
+
+               device = connman_element_create(NULL);
+               device->type = CONNMAN_ELEMENT_TYPE_DEVICE;
+               device->subtype = CONNMAN_ELEMENT_SUBTYPE_BLUETOOTH;
+
+               device->name = g_path_get_basename(adapters[i]);
+
+               connman_element_register(device, NULL);
+               device_list = g_slist_append(device_list, device);
+       }
+
+       g_strfreev(adapters);
+
+done:
+       dbus_message_unref(reply);
+}
+
 static void bluetooth_connect(DBusConnection *connection, void *user_data)
 {
+       DBusMessage *message;
+       DBusPendingCall *call;
+
        DBG("connection %p", connection);
+
+       message = dbus_message_new_method_call(BLUEZ_SERVICE, "/",
+                                       "org.bluez.Manager", "ListAdapters");
+       if (message == NULL)
+               return;
+
+       if (dbus_connection_send_with_reply(connection, message,
+                                               &call, TIMEOUT) == FALSE) {
+               connman_error("Failed to get Bluetooth adapters");
+               dbus_message_unref(message);
+               return;
+       }
+
+       dbus_pending_call_set_notify(call, adapters_reply, NULL, NULL);
+
+       dbus_message_unref(message);
 }
 
 static void bluetooth_disconnect(DBusConnection *connection, void *user_data)
 {
+       GSList *list;
+
        DBG("connection %p", connection);
+
+       for (list = device_list; list; list = list->next) {
+               struct connman_element *device = list->data;
+
+               connman_element_unregister(device);
+               connman_element_unref(device);
+       }
+
+       g_slist_free(device_list);
+       device_list = NULL;
 }
 
 static DBusConnection *connection;
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 5104586..0ae20f5 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -44,6 +44,7 @@
 struct wifi_data {
        GSList *list;
        gchar *identifier;
+       gboolean connected;
 };
 
 static int network_probe(struct connman_element *element)
@@ -77,6 +78,9 @@ static int network_enable(struct connman_element *element)
        if (element->parent != NULL) {
                struct wifi_data *data = 
connman_element_get_data(element->parent);
 
+               if (data->connected == TRUE)
+                       return -EBUSY;
+
                if (data != NULL) {
                        g_free(data->identifier);
                        data->identifier = g_strdup(identifier);
@@ -154,13 +158,16 @@ static void state_change(struct connman_element *parent,
        if (state == STATE_COMPLETED) {
                struct connman_element *dhcp;
 
+               data->connected = TRUE;
+
                dhcp = connman_element_create(NULL);
 
                dhcp->type = CONNMAN_ELEMENT_TYPE_DHCP;
                dhcp->index = element->index;
 
                connman_element_register(dhcp, element);
-       }
+       } else if (state == STATE_DISCONNECTED || state == STATE_INACTIVE)
+               data->connected = FALSE;
 }
 
 static void scan_result(struct connman_element *parent,
@@ -262,6 +269,8 @@ static int wifi_probe(struct connman_element *element)
        if (data == NULL)
                return -ENOMEM;
 
+       data->connected = FALSE;
+
        connman_element_set_data(element, data);
 
        return 0;
diff --git a/src/connman.conf b/src/connman.conf
index f9da151..b8846a5 100644
--- a/src/connman.conf
+++ b/src/connman.conf
@@ -10,4 +10,8 @@
         <allow send_destination="org.moblin.connman"/>
         <allow send_interface="org.moblin.connman"/>
     </policy>
+    <policy context="default">
+        <deny send_destination="org.moblin.connman"/>
+        <deny send_interface="org.moblin.connman"/>
+    </policy>
 </busconfig>
diff --git a/src/connman.h b/src/connman.h
index d7124d2..9f7c4c1 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -27,6 +27,7 @@
 #define NM_PATH       "/org/freedesktop/NetworkManager"
 #define NM_INTERFACE  NM_SERVICE
 
+DBusMessage *__connman_error_failed(DBusMessage *msg);
 DBusMessage *__connman_error_invalid_arguments(DBusMessage *msg);
 DBusMessage *__connman_error_permission_denied(DBusMessage *msg);
 
@@ -79,6 +80,9 @@ int __connman_element_count(enum connman_element_type type);
 const char *__connman_element_type2string(enum connman_element_type type);
 const char *__connman_element_subtype2string(enum connman_element_subtype 
type);
 
+const char *__connman_element_policy2string(enum connman_element_policy 
policy);
+enum connman_element_policy __connman_element_string2policy(const char 
*policy);
+
 int __connman_element_load(struct connman_element *element);
 int __connman_element_store(struct connman_element *element);
 
diff --git a/src/element.c b/src/element.c
index 72b0467..0f7cecc 100644
--- a/src/element.c
+++ b/src/element.c
@@ -148,7 +148,7 @@ static const char *subtype2string(enum 
connman_element_subtype type)
        return NULL;
 }
 
-static const char *policy2string(enum connman_element_policy policy)
+const char *__connman_element_policy2string(enum connman_element_policy policy)
 {
        switch (policy) {
        case CONNMAN_ELEMENT_POLICY_UNKNOWN:
@@ -166,6 +166,20 @@ static const char *policy2string(enum 
connman_element_policy policy)
        return NULL;
 }
 
+enum connman_element_policy __connman_element_string2policy(const char *policy)
+{
+       if (strcasecmp(policy, "off") == 0)
+               return CONNMAN_ELEMENT_POLICY_OFF;
+       else if (strcasecmp(policy, "ignore") == 0)
+               return CONNMAN_ELEMENT_POLICY_IGNORE;
+       else if (strcasecmp(policy, "auto") == 0)
+               return CONNMAN_ELEMENT_POLICY_AUTO;
+       else if (strcasecmp(policy, "ask") == 0)
+               return CONNMAN_ELEMENT_POLICY_ASK;
+       else
+               return CONNMAN_ELEMENT_POLICY_UNKNOWN;
+}
+
 static void append_property(DBusMessageIter *dict,
                                struct connman_property *property)
 {
@@ -274,11 +288,13 @@ static DBusMessage *do_update(DBusConnection *conn,
        DBG("conn %p", conn);
 
        if (element->enabled == FALSE)
-               return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+               return __connman_error_failed(msg);
 
        if (element->driver && element->driver->update) {
                DBG("Calling update callback");
-               element->driver->update(element);
+               if (element->driver->update(element) < 0)
+                       return __connman_error_failed(msg);
+
        }
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
@@ -292,12 +308,12 @@ static DBusMessage *do_enable(DBusConnection *conn,
        DBG("conn %p", conn);
 
        if (element->enabled == TRUE)
-               return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+               return __connman_error_failed(msg);
 
        if (element->driver && element->driver->enable) {
                DBG("Calling enable callback");
                if (element->driver->enable(element) < 0)
-                       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+                       return __connman_error_failed(msg);
        }
 
        element->enabled = TRUE;
@@ -320,12 +336,12 @@ static DBusMessage *do_disable(DBusConnection *conn,
        DBG("conn %p", conn);
 
        if (element->enabled == FALSE)
-               return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+               return __connman_error_failed(msg);
 
        if (element->driver && element->driver->disable) {
                DBG("Calling disable callback");
                if (element->driver->disable(element) < 0)
-                       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+                       return __connman_error_failed(msg);
        }
 
        element->enabled = FALSE;
@@ -392,7 +408,7 @@ static DBusMessage *get_device_properties(DBusConnection 
*conn,
                connman_dbus_dict_append_variant(&dict, "Type",
                                                DBUS_TYPE_STRING, &str);
 
-       str = policy2string(element->policy);
+       str = __connman_element_policy2string(element->policy);
        if (str != NULL)
                connman_dbus_dict_append_variant(&dict, "Policy",
                                                DBUS_TYPE_STRING, &str);
@@ -467,7 +483,7 @@ static DBusMessage *get_network_properties(DBusConnection 
*conn,
                        DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
                        DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
 
-       str = policy2string(element->policy);
+       str = __connman_element_policy2string(element->policy);
        if (str != NULL)
                connman_dbus_dict_append_variant(&dict, "Policy",
                                                DBUS_TYPE_STRING, &str);
@@ -795,6 +811,20 @@ static gboolean match_driver(struct connman_element 
*element,
        return FALSE;
 }
 
+static void enable_element(struct connman_element *element)
+{
+       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
+               return;
+
+       if (element->policy != CONNMAN_ELEMENT_POLICY_AUTO)
+               return;
+
+       if (element->driver && element->driver->enable) {
+               if (element->driver->enable(element) == 0)
+                       element->enabled = TRUE;
+       }
+}
+
 static gboolean probe_driver(GNode *node, gpointer data)
 {
        struct connman_element *element = node->data;
@@ -809,6 +839,8 @@ static gboolean probe_driver(GNode *node, gpointer data)
                __connman_element_lock(element);
                element->driver = driver;
                __connman_element_unlock(element);
+
+               enable_element(element);
        }
 
        return FALSE;
@@ -862,6 +894,20 @@ int connman_driver_register(struct connman_driver *driver)
        return 0;
 }
 
+static void disable_element(struct connman_element *element)
+{
+       if (element->policy != CONNMAN_ELEMENT_POLICY_AUTO)
+               return;
+
+       if (element->enabled == FALSE)
+               return;
+
+       if (element->driver && element->driver->disable) {
+               if (element->driver->disable(element) == 0)
+                       element->enabled = FALSE;
+       }
+}
+
 static gboolean remove_driver(GNode *node, gpointer data)
 {
        struct connman_element *element = node->data;
@@ -870,6 +916,8 @@ static gboolean remove_driver(GNode *node, gpointer data)
        DBG("element %p name %s", element, element->name);
 
        if (element->driver == driver) {
+               disable_element(element);
+
                if (driver->remove)
                        driver->remove(element);
 
@@ -1458,7 +1506,7 @@ static void append_devices(DBusMessageIter *entry)
        dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
                                DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
 
-       //__connman_element_list(CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
+       __connman_element_list(CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
 
        dbus_message_iter_close_container(&value, &iter);
 
@@ -1498,7 +1546,7 @@ static void append_connections(DBusMessageIter *entry)
        dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
                                DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
 
-       //__connman_element_list(CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
+       __connman_element_list(CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
 
        dbus_message_iter_close_container(&value, &iter);
 
@@ -1662,6 +1710,8 @@ static void register_element(gpointer data, gpointer 
user_data)
                        __connman_element_lock(element);
                        element->driver = driver;
                        __connman_element_unlock(element);
+
+                       enable_element(element);
                        break;
                }
        }
@@ -1775,9 +1825,8 @@ static gboolean remove_element(GNode *node, gpointer 
user_data)
        return FALSE;
 }
 
-static void unregister_element(gpointer data, gpointer user_data)
+void connman_element_unregister(struct connman_element *element)
 {
-       struct connman_element *element = data;
        GNode *node;
 
        DBG("element %p name %s", element, element->name);
@@ -1793,16 +1842,8 @@ static void unregister_element(gpointer data, gpointer 
user_data)
        g_static_rw_lock_writer_unlock(&element_lock);
 }
 
-void connman_element_unregister(struct connman_element *element)
-{
-       DBG("element %p name %s", element, element->name);
-
-       unregister_element(element, NULL);
-}
-
-static void unregister_children(gpointer data, gpointer user_data)
+void connman_element_unregister_children(struct connman_element *element)
 {
-       struct connman_element *element = data;
_______________________________________________
Commits mailing list
[email protected]
https://lists.moblin.org/mailman/listinfo/commits

Reply via email to