- struct connman_provider *provider;
- DBusMessageIter iter, array;
- const char *type = NULL, *name = NULL, *service_path = NULL;
- const char *host = NULL, *domain = NULL;
- char *ident;
- gboolean created = FALSE;
- int err;
-
- dbus_message_iter_init(msg, &iter);
- dbus_message_iter_recurse(&iter, &array);
-
- while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter entry, value;
- const char *key;
-
- dbus_message_iter_recurse(&array, &entry);
- dbus_message_iter_get_basic(&entry, &key);
-
- dbus_message_iter_next(&entry);
- dbus_message_iter_recurse(&entry, &value);
-
- switch (dbus_message_iter_get_arg_type(&value)) {
- case DBUS_TYPE_STRING:
- if (g_str_equal(key, "Type") == TRUE)
- dbus_message_iter_get_basic(&value, &type);
- else if (g_str_equal(key, "Name") == TRUE)
- dbus_message_iter_get_basic(&value, &name);
- else if (g_str_equal(key, "Host") == TRUE)
- dbus_message_iter_get_basic(&value, &host);
- else if (g_str_equal(key, "VPN.Domain") == TRUE)
- dbus_message_iter_get_basic(&value, &domain);
- break;
- }
-
- dbus_message_iter_next(&array);
- }
-
- if (host == NULL || domain == NULL) {
- err = -EINVAL;
- goto failed;
- }
-
- DBG("Type %s name %s", type, name);
-
- if (type == NULL || name == NULL) {
- err = -EOPNOTSUPP;
- goto failed;
- }
-
- ident = g_strdup_printf("%s_%s", host, domain);
- provider_dbus_ident(ident);
-
- DBG("ident %s", ident);
-
- provider = connman_provider_lookup(ident);
-
- if (provider == NULL) {
- created = TRUE;
- provider = connman_provider_get(ident);
- if (provider) {
- provider->host = g_strdup(host);
- provider->domain = g_strdup(domain);
- provider->name = g_strdup(name);
- provider->type = g_strdup(type);
- }
- }
-
- if (provider == NULL) {
- DBG("can not create provider");
- err = -EOPNOTSUPP;
- goto failed;
- }
- dbus_message_iter_init(msg, &iter);
- dbus_message_iter_recurse(&iter, &array);
-
- while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter entry, value;
- const char *key, *str;
-
- dbus_message_iter_recurse(&array, &entry);
- dbus_message_iter_get_basic(&entry, &key);