};
struct connman_provider {
- struct connman_element element;
+ gint refcount;
struct connman_service *vpn_service;
+ int index;
char *identifier;
char *name;
char *type;
GHashTable *routes;
struct connman_provider_driver *driver;
void *driver_data;
+ GHashTable *setting_strings;
};
void __connman_provider_append_properties(struct connman_provider *provider,
return provider;
}
-struct connman_provider *connman_provider_ref(struct connman_provider *provider)
-{
- DBG("provider %p", provider);
-
- if (connman_element_ref(&provider->element) == NULL)
- return NULL;
-
- return provider;
-}
-
-void connman_provider_unref(struct connman_provider *provider)
-{
- DBG("provider %p", provider);
-
- connman_element_unref(&provider->element);
-}
-
static gboolean match_driver(struct connman_provider *provider,
struct connman_provider_driver *driver)
{
return 0;
}
+static void provider_remove(struct connman_provider *provider)
+{
+ if (provider->driver != NULL) {
+ provider->driver->remove(provider);
+ provider->driver = NULL;
+ }
+}
+
+static int provider_register(struct connman_provider *provider)
+{
+ return provider_probe(provider);
+}
+
+static void provider_unregister(struct connman_provider *provider)
+{
+ provider_remove(provider);
+}
+
+struct connman_provider *connman_provider_ref(struct connman_provider *provider)
+{
+ DBG("provider %p", provider);
+
+ 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);
+
+ if (g_atomic_int_dec_and_test(&provider->refcount) == FALSE)
+ return;
+
+ provider_remove(provider);
+
+ provider_destruct(provider);
+}
+
static int provider_indicate_state(struct connman_provider *provider,
enum connman_service_state state)
{
if (g_strcmp0(srv_path, path) == 0) {
DBG("Removing VPN %s", provider->identifier);
+
+ provider_unregister(provider);
g_hash_table_remove(provider_hash,
provider->identifier);
return 0;
{
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);
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;
{
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)
if (provider == NULL)
return NULL;
+ provider->refcount = 1;
+
DBG("provider %p", provider);
provider_initialize(provider);
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;
}
provider->name = g_strdup(name);
provider->type = g_strdup(type);
}
+
+ provider_register(provider);
}
if (provider == NULL) {
goto failed;
}
- if (created == TRUE)
- provider_probe(provider);
-
if (provider->vpn_service == NULL)
provider->vpn_service =
__connman_service_create_from_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,
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)
__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,
driver_list = g_slist_remove(driver_list, driver);
}
-static void provider_remove(gpointer key, gpointer value,
+static void provider_remove_all(gpointer key, gpointer value,
gpointer user_data)
{
struct connman_provider *provider = value;
- g_hash_table_remove(provider_hash, provider->identifier);
+ __connman_provider_remove(provider->identifier);
}
static void provider_offline_mode(connman_bool_t enabled)
DBG("enabled %d", enabled);
if (enabled == TRUE)
- g_hash_table_foreach(provider_hash, provider_remove, NULL);
+ g_hash_table_foreach(provider_hash, provider_remove_all, NULL);
}