mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-27 03:30:09 +01:00
Embed a @meta_type structure in NMMetaSettingInfoEditor and NMMetaPropertyInfo. This allows to make the NMMeta*Info instances themself to become generic and they can be passed around as generic NMMetaAbstractInfo types. For one, the embedded NMMetaType pointer can be used to determine of which type a NMMetaAbstractInfo instance is. On the other hand, the NMMetaType struct can be extended to be a VTable to provide generic access to the type. In the end, both NMMetaSettingInfoEditor and NMMetaPropertyInfo are conceptionally very similar: the describe a certain type and provide accessors. In nmcli we have yet another NMMetaAbstractInfo type: NmcOutputField will be modified to become another implementation of meta data (it already is, it just cannot be used interchangable with the other types). Also, embed the NMMetaSettingInfoEditor in the NMMetaPropertyInfo instance. This allows from a given NMMetaPropertyInfo to retrieve it's parent NMMetaSettingInfoEditor.
142 lines
4.4 KiB
C
142 lines
4.4 KiB
C
/* NetworkManager
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Copyright 2010 - 2017 Red Hat, Inc.
|
|
*/
|
|
|
|
#include "nm-default.h"
|
|
|
|
#include "nm-meta-setting-access.h"
|
|
|
|
/*****************************************************************************/
|
|
|
|
const NMMetaSettingInfoEditor *
|
|
nm_meta_setting_info_editor_find_by_name (const char *setting_name)
|
|
{
|
|
const NMMetaSettingInfo *meta_setting_info;
|
|
const NMMetaSettingInfoEditor *setting_info;
|
|
|
|
g_return_val_if_fail (setting_name, NULL);
|
|
|
|
meta_setting_info = nm_meta_setting_infos_by_name (setting_name);
|
|
|
|
if (!meta_setting_info)
|
|
return NULL;
|
|
|
|
g_return_val_if_fail (nm_streq0 (meta_setting_info->setting_name, setting_name), NULL);
|
|
|
|
if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor))
|
|
return NULL;
|
|
|
|
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
|
|
|
|
g_return_val_if_fail (setting_info->general == meta_setting_info, NULL);
|
|
|
|
return setting_info;
|
|
}
|
|
|
|
const NMMetaSettingInfoEditor *
|
|
nm_meta_setting_info_editor_find_by_gtype (GType gtype)
|
|
{
|
|
const NMMetaSettingInfo *meta_setting_info;
|
|
const NMMetaSettingInfoEditor *setting_info;
|
|
|
|
meta_setting_info = nm_meta_setting_infos_by_gtype (gtype);
|
|
|
|
if (!meta_setting_info)
|
|
return NULL;
|
|
|
|
g_return_val_if_fail (meta_setting_info->get_setting_gtype, NULL);
|
|
g_return_val_if_fail (meta_setting_info->get_setting_gtype () == gtype, NULL);
|
|
|
|
if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor))
|
|
return NULL;
|
|
|
|
setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type];
|
|
|
|
g_return_val_if_fail (setting_info->general == meta_setting_info, NULL);
|
|
|
|
return setting_info;
|
|
}
|
|
|
|
static const NMMetaSettingInfoEditor *
|
|
nm_meta_setting_info_editor_find_by_setting (NMSetting *setting)
|
|
{
|
|
const NMMetaSettingInfoEditor *setting_info;
|
|
|
|
g_return_val_if_fail (NM_IS_SETTING (setting), NULL);
|
|
|
|
setting_info = nm_meta_setting_info_editor_find_by_gtype (G_OBJECT_TYPE (setting));
|
|
|
|
if (!setting_info)
|
|
return NULL;
|
|
|
|
g_return_val_if_fail (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting)), NULL);
|
|
|
|
return setting_info;
|
|
}
|
|
|
|
const NMMetaPropertyInfo *
|
|
nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *setting_info, const char *property_name)
|
|
{
|
|
guint i;
|
|
|
|
g_return_val_if_fail (setting_info, NULL);
|
|
g_return_val_if_fail (property_name, NULL);
|
|
|
|
for (i = 0; i < setting_info->properties_num; i++) {
|
|
nm_assert (setting_info->properties[i].property_name);
|
|
nm_assert (setting_info->properties[i].setting_info == setting_info);
|
|
if (nm_streq (setting_info->properties[i].property_name, property_name))
|
|
return &setting_info->properties[i];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
const NMMetaPropertyInfo *
|
|
nm_meta_property_info_find_by_name (const char *setting_name, const char *property_name)
|
|
{
|
|
const NMMetaSettingInfoEditor *setting_info;
|
|
const NMMetaPropertyInfo *property_info;
|
|
|
|
setting_info = nm_meta_setting_info_editor_find_by_name (setting_name);
|
|
if (!setting_info)
|
|
return NULL;
|
|
|
|
property_info = nm_meta_setting_info_editor_get_property_info (setting_info, property_name);
|
|
|
|
nm_assert (property_info->setting_info == setting_info);
|
|
|
|
return property_info;
|
|
}
|
|
|
|
const NMMetaPropertyInfo *
|
|
nm_meta_property_info_find_by_setting (NMSetting *setting, const char *property_name)
|
|
{
|
|
const NMMetaSettingInfoEditor *setting_info;
|
|
const NMMetaPropertyInfo *property_info;
|
|
|
|
setting_info = nm_meta_setting_info_editor_find_by_setting (setting);
|
|
if (!setting_info)
|
|
return NULL;
|
|
property_info = nm_meta_setting_info_editor_get_property_info (setting_info, property_name);
|
|
|
|
nm_assert (property_info->setting_info == setting_info);
|
|
nm_assert (property_info == nm_meta_property_info_find_by_name (nm_setting_get_name (setting), property_name));
|
|
|
|
return property_info;
|
|
}
|