---
 src/connman.h |    3 +++
 src/network.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 src/service.c |   34 ++++++++++++++++++++++++----------
 3 files changed, 71 insertions(+), 10 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 6202db3..978a71a 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -474,6 +474,9 @@ int __connman_service_set_favorite(struct connman_service 
*service,
                                                connman_bool_t favorite);
 int __connman_service_set_immutable(struct connman_service *service,
                                                connman_bool_t immutable);
+void __connman_service_set_apn(struct connman_service *service,
+                                               const char *apn);
+const char *__connman_service_get_apn(struct connman_service *service);
 
 void __connman_service_set_string(struct connman_service *service,
                                        const char *key, const char *value);
diff --git a/src/network.c b/src/network.c
index 5bba620..8b15d6e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1268,6 +1268,50 @@ int connman_network_set_roaming(struct connman_network 
*network,
 }
 
 /**
+ * connman_network_set_apn:
+ * @network: network structure
+ * @apn: access point name
+ *
+ * Set access point name for network
+ */
+int connman_network_set_apn(struct connman_network *network, const char *apn)
+{
+       struct connman_service *service;
+
+       DBG("network %p apn %s", network, apn);
+
+       service = __connman_service_lookup_from_network(network);
+       if (service == NULL)
+               return -EINVAL;
+
+       __connman_service_set_apn(service, apn);
+
+       if (network->driver != NULL && network->driver->setup != NULL)
+               return network->driver->setup(network, "Cellular.APN");
+       else
+               return 0;
+}
+
+/**
+ * connman_network_get_apn:
+ * @network: network structure
+ *
+ * Get access point name for network
+ */
+const char *connman_network_get_apn(struct connman_network *network)
+{
+       struct connman_service *service;
+
+       DBG("network %p", network);
+
+       service = __connman_service_lookup_from_network(network);
+       if (service == NULL)
+               return NULL;
+
+       return __connman_service_get_apn(service);
+}
+
+/**
  * connman_network_set_string:
  * @network: network structure
  * @key: unique identifier
diff --git a/src/service.c b/src/service.c
index 7751dc0..56b07b0 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2119,14 +2119,8 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                dbus_message_iter_get_basic(&value, &apn);
 
-               g_free(service->apn);
-               service->apn = g_strdup(apn);
-
-               apn_changed(service);
-
                if (service->network != NULL)
-                       connman_network_set_string(service->network,
-                                               "Cellular.APN", service->apn);
+                       connman_network_set_apn(service->network, apn);
 
                __connman_storage_save_service(service);
        } else if (g_str_equal(name, "Username") == TRUE) {
@@ -3216,6 +3210,28 @@ int __connman_service_set_immutable(struct 
connman_service *service,
        return 0;
 }
 
+void __connman_service_set_apn(struct connman_service *service, const char 
*apn)
+{
+       if (service == NULL || service->immutable == TRUE)
+               return;
+
+       if (g_strcmp0(service->apn, apn) == 0)
+               return;
+
+       g_free(service->apn);
+       service->apn = g_strdup(apn);
+
+       apn_changed(service);
+}
+
+const char *__connman_service_get_apn(struct connman_service *service)
+{
+       if (service == NULL)
+               return NULL;
+
+       return service->apn;
+}
+
 void __connman_service_set_string(struct connman_service *service,
                                  const char *key, const char *value)
 {
@@ -3565,9 +3581,7 @@ static connman_bool_t prepare_network(struct 
connman_service *service)
        case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
                break;
        case CONNMAN_NETWORK_TYPE_CELLULAR:
-               connman_network_set_string(service->network,
-                                               "Cellular.APN", service->apn);
-
+               connman_network_set_apn(service->network, service->apn);
                connman_network_set_string(service->network,
                                        "Cellular.Username", service->username);
                connman_network_set_string(service->network,
-- 
1.7.0.4


_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to