---
 include/provider.h |    5 +++
 src/provider.c     |   88 ++++++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 83 insertions(+), 10 deletions(-)

diff --git a/include/provider.h b/include/provider.h
index 4d8131a..47b3758 100644
--- a/include/provider.h
+++ b/include/provider.h
@@ -93,6 +93,9 @@ int connman_provider_set_ipaddress(struct connman_provider 
*provider,
                                        struct connman_ipaddress *ipaddress);
 int connman_provider_set_pac(struct connman_provider *provider,
                                const char *pac);
+int connman_provider_create_service(struct connman_provider *provider);
+struct connman_provider *connman_provider_get(const char *identifier);
+void connman_provider_put(struct connman_provider *provider);
 int connman_provider_set_domain(struct connman_provider *provider,
                                const char *domain);
 int connman_provider_set_nameservers(struct connman_provider *provider,
@@ -119,6 +122,8 @@ struct connman_provider_driver {
 
 int connman_provider_driver_register(struct connman_provider_driver *driver);
 void connman_provider_driver_unregister(struct connman_provider_driver 
*driver);
+void connman_provider_set_driver(struct connman_provider *provider,
+                               struct connman_provider_driver *driver);
 
 #ifdef __cplusplus
 }
diff --git a/src/provider.c b/src/provider.c
index 9d7ceb7..da0227f 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -28,15 +28,12 @@
 #include <string.h>
 #include <stdlib.h>
 #include <gdbus.h>
-#include <gweb/gresolv.h>
 
 #include "connman.h"
 
-static DBusConnection *connection = NULL;
-
-static GHashTable *provider_hash = NULL;
-
-static GSList *driver_list = NULL;
+static DBusConnection *connection;
+static GHashTable *provider_hash;
+static GSList *driver_list;
 
 struct connman_route {
        int family;
@@ -211,7 +208,10 @@ int __connman_provider_remove(const char *path)
                if (g_strcmp0(srv_path, path) == 0) {
                        DBG("Removing VPN %s", provider->identifier);
 
-                       provider_unregister(provider);
+                       if (provider->driver != NULL &&
+                                               provider->driver->remove)
+                               provider->driver->remove(provider);
+
                        g_hash_table_remove(provider_hash,
                                                provider->identifier);
                        return 0;
@@ -245,12 +245,14 @@ static int set_connected(struct connman_provider 
*provider,
                provider_indicate_state(provider,
                                        CONNMAN_SERVICE_STATE_READY);
 
+#if 0
+               // XXX:
                g_hash_table_foreach(provider->routes, provider_append_routes,
                                        provider);
 
                g_hash_table_foreach(provider->user_routes, 
provider_append_routes,
                                        provider);
-
+#endif
        } else {
                if (ipconfig != NULL) {
                        provider_indicate_state(provider,
@@ -316,7 +318,7 @@ int connman_provider_indicate_error(struct connman_provider 
*provider,
                                                        service_error);
 }
 
-static int provider_create_service(struct connman_provider *provider)
+int connman_provider_create_service(struct connman_provider *provider)
 {
        if (provider->vpn_service != NULL) {
                connman_bool_t connected;
@@ -598,8 +600,74 @@ static void provider_offline_mode(connman_bool_t enabled)
        DBG("enabled %d", enabled);
 
        if (enabled == TRUE)
-               g_hash_table_foreach(provider_hash, provider_remove_all, NULL);
+               g_hash_table_foreach(provider_hash, provider_disconnect_all,
+                                                                       NULL);
+
+}
+
+static void destroy_route(gpointer user_data)
+{
+       struct connman_route *route = user_data;
+
+       g_free(route->host);
+       g_free(route->netmask);
+       g_free(route->gateway);
+       g_free(route);
+}
+
+static void provider_initialize(struct connman_provider *provider)
+{
+       DBG("provider %p", provider);
+
+       provider->index = 0;
+       provider->identifier = NULL;
+       provider->user_networks = NULL;
+       provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+                                       NULL, destroy_route);
+       provider->user_routes = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                       g_free, destroy_route);
+}
+
+static struct connman_provider *provider_new(void)
+{
+       struct connman_provider *provider;
+
+       provider = g_try_new0(struct connman_provider, 1);
+       if (provider == NULL)
+               return NULL;
 
+       provider->refcount = 1;
+
+       DBG("provider %p", provider);
+       provider_initialize(provider);
+
+       return provider;
+}
+
+struct connman_provider *connman_provider_get(const char *identifier)
+{
+       struct connman_provider *provider;
+
+       provider = g_hash_table_lookup(provider_hash, identifier);
+       if (provider != NULL)
+               return provider;
+
+       provider = provider_new();
+       if (provider == NULL)
+               return NULL;
+
+       DBG("provider %p", provider);
+
+       provider->identifier = g_strdup(identifier);
+
+       g_hash_table_insert(provider_hash, provider->identifier, provider);
+
+       return provider;
+}
+
+void connman_provider_put(struct connman_provider *provider)
+{
+       g_hash_table_remove(provider_hash, provider->identifier);
 }
 
 static struct connman_provider *provider_get(int index)
-- 
1.7.9.5

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to