diff options
author | Martin Xu <martin.xu@intel.com> | 2010-01-28 22:38:46 +0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-01-29 08:12:52 +0100 |
commit | 27c7fd4ec4582769b1164be1daaf56e8f070f0f5 (patch) | |
tree | 52e206500fe0c92f43661f43760ef7e5d4be3a9b | |
parent | 1e3def632f54af8437080f8fe6db7f1d833f606d (diff) | |
download | connman-27c7fd4ec4582769b1164be1daaf56e8f070f0f5.tar.gz connman-27c7fd4ec4582769b1164be1daaf56e8f070f0f5.tar.bz2 connman-27c7fd4ec4582769b1164be1daaf56e8f070f0f5.zip |
Add network->driver->setup() callback function
After string value has been set in function connman_network_set_string()
call network->driver->setup() to let network driver handle the value.
ofono network driver setup call back function handles "Cellular.APN" to
set up APN.
-rw-r--r-- | include/network.h | 1 | ||||
-rw-r--r-- | plugins/ofono.c | 13 | ||||
-rw-r--r-- | src/network.c | 14 |
3 files changed, 25 insertions, 3 deletions
diff --git a/include/network.h b/include/network.h index 6ab109da..e0b1cc39 100644 --- a/include/network.h +++ b/include/network.h @@ -141,6 +141,7 @@ struct connman_network_driver { void (*remove) (struct connman_network *network); int (*connect) (struct connman_network *network); int (*disconnect) (struct connman_network *network); + int (*setup) (struct connman_network *network, const char *key); }; int connman_network_driver_register(struct connman_network_driver *driver); diff --git a/plugins/ofono.c b/plugins/ofono.c index 571b9749..e454ddee 100644 --- a/plugins/ofono.c +++ b/plugins/ofono.c @@ -570,8 +570,6 @@ static int network_connect(struct connman_network *network) if (connman_network_get_index(network) >= 0) return -EISCONN; - set_apn(network); - return set_network_active(network, TRUE); } @@ -588,6 +586,16 @@ static void network_remove(struct connman_network *network) DBG("network %p", network); } +static int network_setup(struct connman_network *network, const char *key) +{ + DBG(""); + + if (g_strcmp0(key, "Cellular.APN") == 0) + set_apn(network); + + return 0; +} + static struct connman_network_driver network_driver = { .name = "network", .type = CONNMAN_NETWORK_TYPE_CELLULAR, @@ -595,6 +603,7 @@ static struct connman_network_driver network_driver = { .remove = network_remove, .connect = network_connect, .disconnect = network_disconnect, + .setup = network_setup, }; static void add_network(struct connman_device *device, const char *path) diff --git a/src/network.c b/src/network.c index c233c8f5..5698809b 100644 --- a/src/network.c +++ b/src/network.c @@ -1017,6 +1017,8 @@ int connman_network_set_roaming(struct connman_network *network, int connman_network_set_string(struct connman_network *network, const char *key, const char *value) { + int err; + DBG("network %p key %s value %s", network, key, value); if (g_strcmp0(key, "Name") == 0) @@ -1060,7 +1062,17 @@ int connman_network_set_string(struct connman_network *network, network->wifi.phase2_auth = g_strdup(value); } - return connman_element_set_string(&network->element, key, value); + err = connman_element_set_string(&network->element, key, value); + if (err < 0) + return err; + + if (network->driver == NULL) + return 0; + + if (network->driver->setup) + return network->driver->setup(network, key); + + return 0; } /** |