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