summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2014-10-09 09:24:05 -0400
committerDan Winship <danw@gnome.org>2014-10-09 09:24:05 -0400
commit41dd3e841cba9a8a1a79db2477ed60a7f436e45d (patch)
tree594391ccb2f43403c5197000bb23049b0c6799b7
parent695f3d010d3f9b9aeff3c3b1e22cbba6d66d0574 (diff)
downloadNetworkManager-danw/libnm-merge.tar.gz
libnm: make NMActiveConnection:connection and :master be objectsdanw/libnm-merge
NMActiveConnection:connection was an object path rather than an NMRemoteConnection because in the past the NMObject property system wasn't capable of handling NMRemoteConnection-valued properties. NMActiveConnection:master was an object path rather than an NMDevice entirely by accident. Fix both. NMActiveConnection:specific-object still has to be an object path because we don't know ahead of time what object type it is, and NMObject can't deal with that.
-rw-r--r--clients/cli/connections.c73
-rw-r--r--clients/tui/nmt-connect-connection-list.c7
-rw-r--r--libnm/nm-active-connection.c49
-rw-r--r--libnm/nm-active-connection.h30
4 files changed, 64 insertions, 95 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index cfaa669b06..b1325f26a3 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -594,7 +594,7 @@ get_ac_device_string (NMActiveConnection *active)
static NMActiveConnection *
get_ac_for_connection (const GPtrArray *active_cons, NMConnection *connection)
{
- const char *con_path;
+ const char *con_path, *ac_con_path;
int i;
NMActiveConnection *ac = NULL;
@@ -602,8 +602,11 @@ get_ac_for_connection (const GPtrArray *active_cons, NMConnection *connection)
con_path = nm_connection_get_path (connection);
for (i = 0; i < active_cons->len; i++) {
NMActiveConnection *candidate = g_ptr_array_index (active_cons, i);
+ NMRemoteConnection *con;
- if (!g_strcmp0 (nm_active_connection_get_connection (candidate), con_path)) {
+ con = nm_active_connection_get_connection (candidate);
+ ac_con_path = nm_connection_get_path (NM_CONNECTION (con));
+ if (!g_strcmp0 (ac_con_path, con_path)) {
ac = candidate;
break;
}
@@ -611,24 +614,6 @@ get_ac_for_connection (const GPtrArray *active_cons, NMConnection *connection)
return ac;
}
-static NMConnection *
-get_connection_for_active (const GSList *con_list, NMActiveConnection *active)
-{
- const GSList *iter;
- const char *path;
-
- path = nm_active_connection_get_connection (active);
- g_return_val_if_fail (path != NULL, NULL);
-
- for (iter = con_list; iter; iter = g_slist_next (iter)) {
- NMConnection *candidate = NM_CONNECTION (iter->data);
-
- if (strcmp (nm_connection_get_path (candidate), path) == 0)
- return candidate;
- }
- return NULL;
-}
-
static gboolean
nmc_connection_profile_details (NMConnection *connection, NmCli *nmc)
{
@@ -713,15 +698,15 @@ find_active_connection (const GPtrArray *active_cons,
for (i = start; i < active_cons->len; i++) {
NMActiveConnection *candidate = g_ptr_array_index (active_cons, i);
- path = nm_active_connection_get_connection (candidate);
+ con = NM_CONNECTION (nm_active_connection_get_connection (candidate));
+ id = nm_connection_get_id (con);
+
+ path = nm_connection_get_path (con);
a_path = nm_object_get_path (NM_OBJECT (candidate));
uuid = nm_active_connection_get_uuid (candidate);
path_num = path ? strrchr (path, '/') + 1 : NULL;
a_path_num = a_path ? strrchr (a_path, '/') + 1 : NULL;
- con = get_connection_for_active (cons, candidate);
- id = nm_connection_get_id (con);
-
/* When filter_type is NULL, compare connection ID (filter_val)
* against all types. Otherwise, only compare against the specific
* type. If 'path' or 'apath' filter types are specified, comparison
@@ -813,21 +798,25 @@ fill_output_active_connection (NMActiveConnection *active,
gboolean with_group,
guint32 o_flags)
{
- GSList *iter;
- const char *active_path;
+ NMConnection *con;
NMSettingConnection *s_con;
const GPtrArray *devices;
GString *dev_str;
NMActiveConnectionState state;
+ NMDevice *master;
int i;
- GSList *con_list = nmc->connections;
NmcOutputField *tmpl, *arr;
size_t tmpl_len;
int idx_start = with_group ? 0 : 1;
- active_path = nm_active_connection_get_connection (active);
+ con = NM_CONNECTION (nm_active_connection_get_connection (active));
+ s_con = nm_connection_get_setting_connection (con);
+ g_assert (s_con != NULL);
+
state = nm_active_connection_get_state (active);
+ master = nm_active_connection_get_master (active);
+
/* Get devices of the active connection */
dev_str = g_string_new (NULL);
devices = nm_active_connection_get_devices (active);
@@ -854,7 +843,7 @@ fill_output_active_connection (NMActiveConnection *active,
arr = nmc_dup_fields_array (tmpl, tmpl_len, o_flags);
if (with_group)
set_val_strc (arr, 0, nmc_fields_con_active_details_groups[0].name);
- set_val_strc (arr, 1-idx_start, _("N/A"));
+ set_val_strc (arr, 1-idx_start, nm_setting_connection_get_id (s_con));
set_val_strc (arr, 2-idx_start, nm_active_connection_get_uuid (active));
set_val_str (arr, 3-idx_start, dev_str->str);
set_val_strc (arr, 4-idx_start, active_connection_state_to_string (state));
@@ -863,26 +852,10 @@ fill_output_active_connection (NMActiveConnection *active,
set_val_strc (arr, 7-idx_start, nm_active_connection_get_specific_object (active));
set_val_strc (arr, 8-idx_start, NM_IS_VPN_CONNECTION (active) ? _("yes") : _("no"));
set_val_strc (arr, 9-idx_start, nm_object_get_path (NM_OBJECT (active)));
- set_val_strc (arr, 10-idx_start, nm_active_connection_get_connection (active));
- set_val_strc (arr, 11-idx_start, _("N/A"));
- set_val_strc (arr, 12-idx_start, nm_active_connection_get_master (active));
-
- for (iter = con_list; iter; iter = g_slist_next (iter)) {
- NMConnection *connection = (NMConnection *) iter->data;
- const char *con_path = nm_connection_get_path (connection);
+ set_val_strc (arr, 10-idx_start, nm_connection_get_path (con));
+ set_val_strc (arr, 11-idx_start, nm_setting_connection_get_zone (s_con));
+ set_val_strc (arr, 12-idx_start, master ? nm_object_get_path (NM_OBJECT (master)) : NULL);
- if (!strcmp (active_path, con_path)) {
- /* This connection is active */
- s_con = nm_connection_get_setting_connection (connection);
- g_assert (s_con != NULL);
-
- /* Fill field values that depend on NMConnection */
- set_val_strc (arr, 1-idx_start, nm_setting_connection_get_id (s_con));
- set_val_strc (arr, 11-idx_start, nm_setting_connection_get_zone (s_con));
-
- break;
- }
- }
g_ptr_array_add (nmc->output_data, arr);
g_string_free (dev_str, FALSE);
@@ -1097,7 +1070,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc)
char **vpn_data_array = NULL;
guint32 items_num;
- con = get_connection_for_active (nmc->connections, acon);
+ con = NM_CONNECTION (nm_active_connection_get_connection (acon));
s_con = nm_connection_get_setting_connection (con);
g_assert (s_con != NULL);
@@ -1350,7 +1323,7 @@ do_connections_show (NmCli *nmc, gboolean active_only, int argc, char **argv)
if (!con) {
acon = find_active_connection (active_cons, nmc->connections, selector, *argv, NULL);
if (acon)
- con = get_connection_for_active (nmc->connections, acon);
+ con = NM_CONNECTION (nm_active_connection_get_connection (acon));
}
/* Print connection details */
diff --git a/clients/tui/nmt-connect-connection-list.c b/clients/tui/nmt-connect-connection-list.c
index f4dc0cf98e..4b80a807ed 100644
--- a/clients/tui/nmt-connect-connection-list.c
+++ b/clients/tui/nmt-connect-connection-list.c
@@ -445,15 +445,14 @@ connection_find_ac (NMConnection *conn,
const GPtrArray *acs)
{
NMActiveConnection *ac;
- const char *path, *ac_path;
+ NMRemoteConnection *ac_conn;
int i;
- path = nm_connection_get_path (conn);
for (i = 0; i < acs->len; i++) {
ac = acs->pdata[i];
- ac_path = nm_active_connection_get_connection (ac);
+ ac_conn = nm_active_connection_get_connection (ac);
- if (!g_strcmp0 (path, ac_path))
+ if (conn == NM_CONNECTION (ac_conn))
return ac;
}
diff --git a/libnm/nm-active-connection.c b/libnm/nm-active-connection.c
index 80ab449355..3a21ce2ef7 100644
--- a/libnm/nm-active-connection.c
+++ b/libnm/nm-active-connection.c
@@ -35,6 +35,7 @@
#include "nm-dhcp6-config.h"
#include "nm-ip4-config.h"
#include "nm-ip6-config.h"
+#include "nm-remote-connection.h"
static GType _nm_active_connection_decide_type (GVariant *value);
@@ -48,7 +49,7 @@ G_DEFINE_TYPE_WITH_CODE (NMActiveConnection, nm_active_connection, NM_TYPE_OBJEC
#define NM_ACTIVE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionPrivate))
typedef struct {
- char *connection;
+ NMRemoteConnection *connection;
char *id;
char *uuid;
char *type;
@@ -62,7 +63,7 @@ typedef struct {
NMIP6Config *ip6_config;
NMDhcp6Config *dhcp6_config;
gboolean is_vpn;
- char *master;
+ NMDevice *master;
} NMActiveConnectionPrivate;
enum {
@@ -100,15 +101,12 @@ _nm_active_connection_decide_type (GVariant *value)
* nm_active_connection_get_connection:
* @connection: a #NMActiveConnection
*
- * Gets the #NMConnection's DBus object path. This is often used with
- * nm_remote_settings_get_connection_by_path() to retrieve the
- * #NMRemoteConnection object that describes the connection.
+ * Gets the #NMRemoteConnection associated with @connection.
*
- * Returns: the object path of the #NMConnection which this #NMActiveConnection
- * is an active instance of. This is the internal string used by the
- * connection, and must not be modified.
+ * Returns: (transfer none): the #NMRemoteConnection which this
+ * #NMActiveConnection is an active instance of.
**/
-const char *
+NMRemoteConnection *
nm_active_connection_get_connection (NMActiveConnection *connection)
{
g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL);
@@ -345,12 +343,11 @@ nm_active_connection_get_vpn (NMActiveConnection *connection)
* nm_active_connection_get_master:
* @connection: a #NMActiveConnection
*
- * Gets the path to the master #NMDevice of the connection.
+ * Gets the master #NMDevice of the connection.
*
- * Returns: the path of the master #NMDevice of the #NMActiveConnection.
- * This is the internal string used by the connection, and must not be modified.
+ * Returns: (transfer none): the master #NMDevice of the #NMActiveConnection.
**/
-const char *
+NMDevice *
nm_active_connection_get_master (NMActiveConnection *connection)
{
g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL);
@@ -370,6 +367,8 @@ dispose (GObject *object)
g_clear_pointer (&priv->devices, g_ptr_array_unref);
+ g_clear_object (&priv->connection);
+ g_clear_object (&priv->master);
g_clear_object (&priv->ip4_config);
g_clear_object (&priv->dhcp4_config);
g_clear_object (&priv->ip6_config);
@@ -383,12 +382,10 @@ finalize (GObject *object)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
- g_free (priv->connection);
g_free (priv->id);
g_free (priv->uuid);
g_free (priv->type);
g_free (priv->specific_object);
- g_free (priv->master);
G_OBJECT_CLASS (nm_active_connection_parent_class)->finalize (object);
}
@@ -403,7 +400,7 @@ get_property (GObject *object,
switch (prop_id) {
case PROP_CONNECTION:
- g_value_set_string (value, nm_active_connection_get_connection (self));
+ g_value_set_object (value, nm_active_connection_get_connection (self));
break;
case PROP_ID:
g_value_set_string (value, nm_active_connection_get_id (self));
@@ -415,7 +412,7 @@ get_property (GObject *object,
g_value_set_string (value, nm_active_connection_get_connection_type (self));
break;
case PROP_SPECIFIC_OBJECT:
- g_value_set_boxed (value, nm_active_connection_get_specific_object (self));
+ g_value_set_string (value, nm_active_connection_get_specific_object (self));
break;
case PROP_DEVICES:
g_value_take_boxed (value, _nm_utils_copy_object_array (nm_active_connection_get_devices (self)));
@@ -445,7 +442,7 @@ get_property (GObject *object,
g_value_set_boolean (value, nm_active_connection_get_vpn (self));
break;
case PROP_MASTER:
- g_value_set_string (value, nm_active_connection_get_master (self));
+ g_value_set_object (value, nm_active_connection_get_master (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -458,7 +455,7 @@ init_dbus (NMObject *object)
{
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object);
const NMPropertiesInfo property_info[] = {
- { NM_ACTIVE_CONNECTION_CONNECTION, &priv->connection },
+ { NM_ACTIVE_CONNECTION_CONNECTION, &priv->connection, NULL, NM_TYPE_REMOTE_CONNECTION },
{ NM_ACTIVE_CONNECTION_ID, &priv->id },
{ NM_ACTIVE_CONNECTION_UUID, &priv->uuid },
{ NM_ACTIVE_CONNECTION_TYPE, &priv->type },
@@ -472,7 +469,7 @@ init_dbus (NMObject *object)
{ NM_ACTIVE_CONNECTION_IP6_CONFIG, &priv->ip6_config, NULL, NM_TYPE_IP6_CONFIG },
{ NM_ACTIVE_CONNECTION_DHCP6_CONFIG, &priv->dhcp6_config, NULL, NM_TYPE_DHCP6_CONFIG },
{ NM_ACTIVE_CONNECTION_VPN, &priv->is_vpn },
- { NM_ACTIVE_CONNECTION_MASTER, &priv->master },
+ { NM_ACTIVE_CONNECTION_MASTER, &priv->master, NULL, NM_TYPE_DEVICE },
{ NULL },
};
@@ -507,12 +504,12 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class)
/**
* NMActiveConnection:connection:
*
- * The connection's path of the active connection.
+ * The connection that this is an active instance of.
**/
g_object_class_install_property
(object_class, PROP_CONNECTION,
- g_param_spec_string (NM_ACTIVE_CONNECTION_CONNECTION, "", "",
- NULL,
+ g_param_spec_object (NM_ACTIVE_CONNECTION_CONNECTION, "", "",
+ NM_TYPE_REMOTE_CONNECTION,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
@@ -678,12 +675,12 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class)
/**
* NMActiveConnection:master:
*
- * The path of the master device if one exists.
+ * The master device if one exists.
**/
g_object_class_install_property
(object_class, PROP_MASTER,
- g_param_spec_string (NM_ACTIVE_CONNECTION_MASTER, "", "",
- NULL,
+ g_param_spec_object (NM_ACTIVE_CONNECTION_MASTER, "", "",
+ NM_TYPE_DEVICE,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
}
diff --git a/libnm/nm-active-connection.h b/libnm/nm-active-connection.h
index 2b0d6821c1..d0522beddb 100644
--- a/libnm/nm-active-connection.h
+++ b/libnm/nm-active-connection.h
@@ -66,21 +66,21 @@ typedef struct {
GType nm_active_connection_get_type (void);
-const char * nm_active_connection_get_connection (NMActiveConnection *connection);
-const char * nm_active_connection_get_id (NMActiveConnection *connection);
-const char * nm_active_connection_get_uuid (NMActiveConnection *connection);
-const char * nm_active_connection_get_connection_type (NMActiveConnection *connection);
-const char * nm_active_connection_get_specific_object (NMActiveConnection *connection);
-const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection);
-NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection);
-const char * nm_active_connection_get_master (NMActiveConnection *connection);
-gboolean nm_active_connection_get_default (NMActiveConnection *connection);
-NMIP4Config * nm_active_connection_get_ip4_config (NMActiveConnection *connection);
-NMDhcp4Config *nm_active_connection_get_dhcp4_config (NMActiveConnection *connection);
-gboolean nm_active_connection_get_default6 (NMActiveConnection *connection);
-NMIP6Config * nm_active_connection_get_ip6_config (NMActiveConnection *connection);
-NMDhcp6Config *nm_active_connection_get_dhcp6_config (NMActiveConnection *connection);
-gboolean nm_active_connection_get_vpn (NMActiveConnection *connection);
+NMRemoteConnection *nm_active_connection_get_connection (NMActiveConnection *connection);
+const char *nm_active_connection_get_id (NMActiveConnection *connection);
+const char *nm_active_connection_get_uuid (NMActiveConnection *connection);
+const char *nm_active_connection_get_connection_type (NMActiveConnection *connection);
+const char *nm_active_connection_get_specific_object (NMActiveConnection *connection);
+const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection);
+NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection);
+NMDevice *nm_active_connection_get_master (NMActiveConnection *connection);
+gboolean nm_active_connection_get_default (NMActiveConnection *connection);
+NMIP4Config *nm_active_connection_get_ip4_config (NMActiveConnection *connection);
+NMDhcp4Config *nm_active_connection_get_dhcp4_config (NMActiveConnection *connection);
+gboolean nm_active_connection_get_default6 (NMActiveConnection *connection);
+NMIP6Config *nm_active_connection_get_ip6_config (NMActiveConnection *connection);
+NMDhcp6Config *nm_active_connection_get_dhcp6_config (NMActiveConnection *connection);
+gboolean nm_active_connection_get_vpn (NMActiveConnection *connection);
G_END_DECLS