From: Daniel Wagner <[email protected]>

---
 src/provider.c |   68 +++++++++++++++++++++++++++++++------------------------
 1 files changed, 38 insertions(+), 30 deletions(-)

diff --git a/src/provider.c b/src/provider.c
index e123fe7..fb236e8 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -44,8 +44,9 @@ struct connman_route {
 };
 
 struct connman_provider {
-       struct connman_element element;
+       gint refcount;
        struct connman_service *vpn_service;
+       int index;
        char *identifier;
        char *name;
        char *type;
@@ -55,6 +56,7 @@ struct connman_provider {
        GHashTable *routes;
        struct connman_provider_driver *driver;
        void *driver_data;
+       GHashTable *setting_strings;
 };
 
 void __connman_provider_append_properties(struct connman_provider *provider,
@@ -86,17 +88,36 @@ struct connman_provider *connman_provider_ref(struct 
connman_provider *provider)
 {
        DBG("provider %p", provider);
 
-       if (connman_element_ref(&provider->element) == NULL)
-               return NULL;
+       g_atomic_int_inc(&provider->refcount);
 
        return provider;
 }
 
+static void provider_destruct(struct connman_provider *provider)
+{
+       DBG("provider %p", provider);
+
+       g_free(provider->name);
+       g_free(provider->type);
+       g_free(provider->domain);
+       g_free(provider->identifier);
+       g_hash_table_destroy(provider->routes);
+       g_hash_table_destroy(provider->setting_strings);
+}
+
 void connman_provider_unref(struct connman_provider *provider)
 {
        DBG("provider %p", provider);
 
-       connman_element_unref(&provider->element);
+       if (g_atomic_int_dec_and_test(&provider->refcount) == FALSE)
+               return;
+
+       if (provider->driver) {
+               provider->driver->remove(provider);
+               provider->driver = NULL;
+       }
+
+       provider_destruct(provider);
 }
 
 static gboolean match_driver(struct connman_provider *provider,
@@ -232,7 +253,7 @@ static void provider_append_routes(gpointer key, gpointer 
value,
 {
        struct connman_route *route = value;
        struct connman_provider *provider = user_data;
-       int index = provider->element.index;
+       int index = provider->index;
 
        if (route->family == AF_INET6) {
                unsigned char prefix_len = atoi(route->netmask);
@@ -349,23 +370,9 @@ static void unregister_provider(gpointer data)
        provider->vpn_service = NULL;
        __connman_service_put(service);
 
-       connman_element_unregister(&provider->element);
        connman_provider_unref(provider);
 }
 
-static void provider_destruct(struct connman_element *element)
-{
-       struct connman_provider *provider = element->private;
-
-       DBG("provider %p", provider);
-
-       g_free(provider->name);
-       g_free(provider->type);
-       g_free(provider->domain);
-       g_free(provider->identifier);
-       g_hash_table_destroy(provider->routes);
-}
-
 static void destroy_route(gpointer user_data)
 {
        struct connman_route *route = user_data;
@@ -380,17 +387,15 @@ static void provider_initialize(struct connman_provider 
*provider)
 {
        DBG("provider %p", provider);
 
-       __connman_element_initialize(&provider->element);
-
-       provider->element.private = provider;
-       provider->element.destruct = provider_destruct;
-
+       provider->index = 0;
        provider->name = NULL;
        provider->type = NULL;
        provider->domain = NULL;
        provider->identifier = NULL;
        provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
                                        NULL, destroy_route);
+       provider->setting_strings = g_hash_table_new_full(g_str_hash, 
g_str_equal,
+                                                       g_free, g_free);
 }
 
 static struct connman_provider *connman_provider_new(void)
@@ -401,6 +406,8 @@ static struct connman_provider *connman_provider_new(void)
        if (provider == NULL)
                return NULL;
 
+       provider->refcount = 1;
+
        DBG("provider %p", provider);
        provider_initialize(provider);
 
@@ -425,8 +432,7 @@ static struct connman_provider *connman_provider_get(const 
char *identifier)
 
        g_hash_table_insert(provider_hash, provider->identifier, provider);
 
-       provider->element.name = g_strdup(identifier);
-       connman_element_register(&provider->element, NULL);
+       provider->name = g_strdup(identifier);
 
        return provider;
 }
@@ -606,7 +612,9 @@ int connman_provider_set_string(struct connman_provider 
*provider,
                provider->name = g_strdup(value);
        }
 
-       return connman_element_set_string(&provider->element, key, value);
+       g_hash_table_replace(provider->setting_strings,
+                               g_strdup(key), g_strdup(value));
+       return 0;
 }
 
 const char *connman_provider_get_string(struct connman_provider *provider,
@@ -619,7 +627,7 @@ const char *connman_provider_get_string(struct 
connman_provider *provider,
        else if (g_str_equal(key, "Name") == TRUE)
                return provider->name;
 
-       return connman_element_get_string(&provider->element, key);
+       return g_hash_table_lookup(provider->setting_strings, key);
 }
 
 void *connman_provider_get_data(struct connman_provider *provider)
@@ -674,12 +682,12 @@ void connman_provider_set_index(struct connman_provider 
*provider, int index)
        __connman_ipconfig_set_index(ipconfig, index);
 
 done:
-       provider->element.index = index;
+       provider->index = index;
 }
 
 int connman_provider_get_index(struct connman_provider *provider)
 {
-       return provider->element.index;
+       return provider->index;
 }
 
 int connman_provider_set_ipaddress(struct connman_provider *provider,
-- 
1.7.5.2

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

Reply via email to