#define CONNMAN_API_SUBJECT_TO_CHANGE
#include <connman/plugin.h>
-#include <connman/element.h>
#include <connman/device.h>
#include <connman/network.h>
#include <connman/ipconfig.h>
connman_bool_t registered;
connman_bool_t roaming;
uint8_t strength, has_strength;
+ char *operator;
};
struct network_info {
modem_remove_device(modem);
g_free(modem->path);
+ g_free(modem->operator);
g_free(modem);
}
{
struct network_info *info = data;
+ connman_network_unregister(info->network);
connman_network_unref(info->network);
g_free(info);
static void set_connected(struct network_info *info,
connman_bool_t connected)
{
+ gboolean setip = FALSE;
+
DBG("network %p connected %d", info->network, connected);
switch (info->ipv4_method) {
case CONNMAN_IPCONFIG_METHOD_OFF:
case CONNMAN_IPCONFIG_METHOD_MANUAL:
case CONNMAN_IPCONFIG_METHOD_AUTO:
- return;
+ break;
case CONNMAN_IPCONFIG_METHOD_FIXED:
connman_network_set_ipv4_method(info->network,
info->ipv4_method);
connman_network_set_ipaddress(info->network,
&info->ipv4_address);
-
+ setip = TRUE;
break;
case CONNMAN_IPCONFIG_METHOD_DHCP:
connman_network_set_ipv4_method(info->network,
info->ipv4_method);
-
+ setip = TRUE;
break;
}
case CONNMAN_IPCONFIG_METHOD_MANUAL:
case CONNMAN_IPCONFIG_METHOD_DHCP:
case CONNMAN_IPCONFIG_METHOD_AUTO:
- return;
+ break;
case CONNMAN_IPCONFIG_METHOD_FIXED:
connman_network_set_ipv6_method(info->network,
info->ipv6_method);
connman_network_set_ipaddress(info->network,
&info->ipv6_address);
-
+ setip = TRUE;
break;
}
- connman_network_set_connected(info->network, connected);
+ if (setip == TRUE)
+ connman_network_set_connected(info->network, connected);
}
static void set_active_reply(DBusPendingCall *call, void *user_data)
struct connman_network *network;
struct network_info *info;
char *ident;
- const char *hash_path;
- char const *operator;
dbus_bool_t active = FALSE;
DBG("modem %p device %p path %s", modem, device, path);
if (network == NULL)
return -ENOMEM;
+ connman_network_register(network);
+
info = g_try_new0(struct network_info, 1);
if (info == NULL) {
+ connman_network_unregister(network);
connman_network_unref(network);
return -ENOMEM;
}
info->network = network;
connman_network_set_string(network, "Path", path);
- hash_path = connman_network_get_string(network, "Path");
- if (hash_path == NULL) {
- connman_network_unref(network);
- g_free(info);
- return -EIO;
- }
create_service(network);
- connman_network_ref(network);
- g_hash_table_insert(network_hash, (char *) hash_path, info);
+ g_hash_table_insert(network_hash, (char *) path, info);
connman_network_set_available(network, TRUE);
connman_network_set_index(network, -1);
- operator = connman_device_get_string(device, "Operator");
- if (operator)
- connman_network_set_name(network, operator);
+ if (modem->operator)
+ connman_network_set_name(network, modem->operator);
if (modem->has_strength)
connman_network_set_strength(network, modem->strength);
dbus_message_iter_get_basic(&value, &type);
if (g_strcmp0(type, "internet") != 0) {
DBG("path %p type %s", path, type);
- goto error;
+ return -EIO;
}
} else if (g_str_equal(key, "Settings"))
update_ipv4_settings(&value, info);
}
if (connman_device_add_network(device, network) != 0)
- goto error;
+ return -EIO;
/* Connect only if requested to do so */
if (active && connman_network_get_connecting(network) == TRUE)
set_connected(info, active);
return 0;
-
-error:
- connman_network_unref(network);
- g_hash_table_remove(network_hash, hash_path);
- return -EIO;
}
static void check_networks_reply(DBusPendingCall *call, void *user_data)
if (device == NULL)
return;
- connman_device_set_string(device, "Operator", name);
+ if (modem->operator != NULL)
+ g_free(modem->operator);
+ modem->operator = g_strdup(name);
for (g_hash_table_iter_init(&i, network_hash);
g_hash_table_iter_next(&i, NULL, &value);) {