manager: Add session mode
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 31 Mar 2011 08:02:26 +0000 (10:02 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Thu, 31 Mar 2011 10:28:51 +0000 (12:28 +0200)
This also disables the auto connect feature.

doc/manager-api.txt
src/connman.h
src/manager.c
src/service.c
src/session.c

index c92c295..f07e185 100644 (file)
@@ -277,3 +277,10 @@ Properties string State [readonly]
                        itself. It is just provided here for convenience of
                        applications only dealing with the current active
                        profile.
+
+               boolean SessionMode [readwrite]
+
+                       This disables the auto connect feature. It should be
+                       enabled when the Session API is used.
+
+                       The default value is false.
index d597340..4196127 100644 (file)
@@ -608,6 +608,8 @@ unsigned int __connman_rtnl_update_interval_remove(unsigned int interval);
 int __connman_rtnl_request_update(void);
 int __connman_rtnl_send(const void *buf, size_t len);
 
+connman_bool_t __connman_session_mode();
+void __connman_session_set_mode(connman_bool_t enable);
 int __connman_session_release(const char *owner);
 struct connman_service *__connman_session_request(const char *bearer, const char *owner);
 int __connman_session_init(void);
index 0a11f5d..198875d 100644 (file)
@@ -32,7 +32,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
 {
        DBusMessage *reply;
        DBusMessageIter array, dict;
-       connman_bool_t offlinemode;
+       connman_bool_t offlinemode, sessionmode;
        const char *str;
 
        DBG("conn %p", conn);
@@ -82,6 +82,11 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_append_array(&dict, "EnabledDebugs",
                        DBUS_TYPE_STRING, __connman_debug_list_enabled, NULL);
 
+       sessionmode = __connman_session_mode();
+       connman_dbus_dict_append_basic(&dict, "SessionMode",
+                                       DBUS_TYPE_BOOLEAN,
+                                       &sessionmode);
+
        connman_dbus_dict_close(&array, &dict);
 
        return reply;
@@ -122,6 +127,15 @@ static DBusMessage *set_property(DBusConnection *conn,
                dbus_message_iter_get_basic(&value, &str);
 
                return __connman_error_not_supported(msg);
+       } else if (g_str_equal(name, "SessionMode") == TRUE) {
+               connman_bool_t sessionmode;
+
+               if (type != DBUS_TYPE_BOOLEAN)
+                       return __connman_error_invalid_arguments(msg);
+
+               dbus_message_iter_get_basic(&value, &sessionmode);
+
+               __connman_session_set_mode(sessionmode);
        } else
                return __connman_error_invalid_property(msg);
 
@@ -442,6 +456,13 @@ static DBusMessage *connect_service(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
+       if (__connman_session_mode() == TRUE) {
+               connman_info("Session mode enabled: "
+                               "direct service connect disabled");
+
+               return __connman_error_failed(msg, -EINVAL);
+       }
+
        err = __connman_service_create_and_connect(msg);
        if (err < 0) {
                if (err == -EINPROGRESS) {
@@ -463,6 +484,13 @@ static DBusMessage *connect_provider(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
+       if (__connman_session_mode() == TRUE) {
+               connman_info("Session mode enabled: "
+                               "direct provider connect disabled");
+
+               return __connman_error_failed(msg, -EINVAL);
+       }
+
        err = __connman_provider_create_and_connect(msg);
        if (err < 0) {
                if (err == -EINPROGRESS) {
index 7a9185d..d07cead 100644 (file)
@@ -2484,6 +2484,11 @@ void __connman_service_auto_connect(void)
 
        DBG("");
 
+       if (__connman_session_mode() == TRUE) {
+               DBG("Session mode enabled: auto connect disabled");
+               return;
+       }
+
        iter = g_sequence_get_begin_iter(service_list);
 
        while (g_sequence_iter_is_end(iter) == FALSE) {
index b192350..391899f 100644 (file)
@@ -32,6 +32,7 @@
 static DBusConnection *connection;
 static GHashTable *session_hash;
 static GHashTable *bearer_hash;
+static connman_bool_t sessionmode;
 
 struct connman_bearer {
        gint refcount;
@@ -262,6 +263,24 @@ failed_connect:
        return NULL;
 }
 
+connman_bool_t __connman_session_mode()
+{
+       return sessionmode;
+}
+
+void __connman_session_set_mode(connman_bool_t enable)
+{
+       DBG("enable %d", enable);
+
+       if (sessionmode == enable)
+               return;
+
+       sessionmode = enable;
+
+       if (sessionmode == TRUE)
+               __connman_service_disconnect_all();
+}
+
 int __connman_session_init(void)
 {
        DBG("");
@@ -276,6 +295,7 @@ int __connman_session_init(void)
        bearer_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                NULL, remove_bearer);
 
+       sessionmode = FALSE;
        return 0;
 }