libnm: add nm_setting_vpn_get_data_keys() and nm_setting_vpn_get_secret_keys() API

It's rather limiting that the only API to access *all* keys
is nm_setting_vpn_foreach_data_item() and nm_setting_vpn_foreach_secret().

API like nm_setting_vpn_get_num_secrets() is not useful, at least as
long as you cannot access the item by index.
This commit is contained in:
Thomas Haller 2017-11-20 16:57:04 +01:00
parent 0601b5d725
commit 2be6515dd0
3 changed files with 87 additions and 0 deletions

View file

@ -155,6 +155,39 @@ nm_setting_vpn_get_persistent (NMSettingVpn *setting)
return NM_SETTING_VPN_GET_PRIVATE (setting)->persistent;
}
static const char **
_get_keys (NMSettingVpn *setting,
gboolean is_secrets,
guint *out_length)
{
NMSettingVpnPrivate *priv;
GHashTable *hash;
const char **keys;
guint len;
nm_assert (NM_IS_SETTING_VPN (setting));
priv = NM_SETTING_VPN_GET_PRIVATE (setting);
hash = is_secrets ? priv->secrets : priv->data;
if (!g_hash_table_size (hash)) {
NM_SET_OUT (out_length, 0);
return NULL;
}
keys = (const char **) g_hash_table_get_keys_as_array (hash, &len);
if (len > 1) {
g_qsort_with_data (keys,
len,
sizeof (const char *),
nm_strcmp_p_with_data,
NULL);
}
NM_SET_OUT (out_length, len);
return keys;
}
/**
* nm_setting_vpn_get_num_data_items:
* @setting: the #NMSettingVpn
@ -215,6 +248,28 @@ nm_setting_vpn_get_data_item (NMSettingVpn *setting, const char *key)
return (const char *) g_hash_table_lookup (NM_SETTING_VPN_GET_PRIVATE (setting)->data, key);
}
/**
* nm_setting_vpn_get_data_keys:
* @setting: the #NMSettingVpn
* @out_length: (allow-none): (out): the length of the returned array
*
* Retrieves every data key inside @setting, as an array.
*
* Returns: (array length=out_length) (transfer container): a
* %NULL-terminated array containing each data key or %NULL if
* there are no data items.
*
* Since: 1.12
*/
const char **
nm_setting_vpn_get_data_keys (NMSettingVpn *setting,
guint *out_length)
{
g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL);
return _get_keys (setting, FALSE, out_length);
}
/**
* nm_setting_vpn_remove_data_item:
* @setting: the #NMSettingVpn
@ -347,6 +402,28 @@ nm_setting_vpn_get_secret (NMSettingVpn *setting, const char *key)
return (const char *) g_hash_table_lookup (NM_SETTING_VPN_GET_PRIVATE (setting)->secrets, key);
}
/**
* nm_setting_vpn_get_secret_keys:
* @setting: the #NMSettingVpn
* @out_length: (allow-none): (out): the length of the returned array
*
* Retrieves every secret key inside @setting, as an array.
*
* Returns: (array length=out_length) (transfer container): a
* %NULL-terminated array containing each secret key or %NULL if
* there are no secrets.
*
* Since: 1.12
*/
const char **
nm_setting_vpn_get_secret_keys (NMSettingVpn *setting,
guint *out_length)
{
g_return_val_if_fail (NM_IS_SETTING_VPN (setting), NULL);
return _get_keys (setting, TRUE, out_length);
}
/**
* nm_setting_vpn_remove_secret:
* @setting: the #NMSettingVpn

View file

@ -90,6 +90,9 @@ gboolean nm_setting_vpn_remove_data_item (NMSettingVpn *setting,
void nm_setting_vpn_foreach_data_item (NMSettingVpn *setting,
NMVpnIterFunc func,
gpointer user_data);
NM_AVAILABLE_IN_1_12
const char ** nm_setting_vpn_get_data_keys (NMSettingVpn *setting,
guint *out_length);
guint32 nm_setting_vpn_get_num_secrets (NMSettingVpn *setting);
void nm_setting_vpn_add_secret (NMSettingVpn *setting,
@ -102,6 +105,11 @@ gboolean nm_setting_vpn_remove_secret (NMSettingVpn *setting,
void nm_setting_vpn_foreach_secret (NMSettingVpn *setting,
NMVpnIterFunc func,
gpointer user_data);
NM_AVAILABLE_IN_1_12
const char ** nm_setting_vpn_get_secret_keys (NMSettingVpn *setting,
guint *out_length);
NM_AVAILABLE_IN_1_2
guint32 nm_setting_vpn_get_timeout (NMSettingVpn *setting);

View file

@ -1258,4 +1258,6 @@ global:
nm_setting_team_port_get_lacp_key;
nm_setting_team_remove_runner_tx_hash;
nm_setting_team_remove_runner_tx_hash_by_value;
nm_setting_vpn_get_data_keys;
nm_setting_vpn_get_secret_keys;
} libnm_1_10_0;