[libvirt] [libvirt-glib 2/3] Add host capabilities API
Zeeshan Ali (Khattak)
zeeshanak at gnome.org
Wed May 2 15:35:07 UTC 2012
On Wed, May 2, 2012 at 5:25 PM, Christophe Fergeau <cfergeau at redhat.com> wrote:
> On Tue, May 01, 2012 at 08:30:39PM +0300, Zeeshan Ali (Khattak) wrote:
>> +{
>> + g_debug("Init GVirConfigCapabilitiesCPUFeature=%p", conn);
>> +
>> + conn->priv = GVIR_CONFIG_CAPABILITIES_CPU_FEATURE_GET_PRIVATE(conn);
>> +}
>> +
>> +G_GNUC_INTERNAL GVirConfigCapabilitiesCPUFeature *
>> +gvir_config_capabilities_cpu_feature_new_from_tree(GVirConfigXmlDoc *doc,
>> + xmlNodePtr tree)
>> +{
>> + GVirConfigObject *object;
>> +
>> + object = gvir_config_object_new_from_tree(GVIR_CONFIG_TYPE_CAPABILITIES_CPU_FEATURE,
>> + doc,
>> + NULL,
>> + tree);
>> +
>> + return GVIR_CONFIG_CAPABILITIES_CPU_FEATURE(object);
>> +}
>> +
>> +const gchar *
>> +gvir_config_capabilities_cpu_feature_get_name(GVirConfigCapabilitiesCPUFeature *caps)
>> +{
>> + xmlNodePtr node;
>> +
>> + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(caps));
>> +
>> + if (g_strcmp0((const gchar *)node->name, "feature") == 0)
>> + return gvir_config_xml_get_attribute_content(node, "name");
>> + else
>> + return (const gchar *)node->name;
>
> This "if" is needed because we can have <features><foo/></features> VS
> <feature name="foo">? This deserves a comment explaining why we do this
> test.
Yup!
> Having a per-feature GVirConfigObject seems overkill since it will
> only be a string wrapper, and a GVirConfigObject wrapping just a string
> with no node name identifying the type of the node is unusual.
Thats only because I haven't added 2 possible getters of this object.
We don't need them right now but they could be added when needed
later. I have discussed this with Daniel and he and I both think this
'feature' deserves a separate class.
>> +
>> +struct GetFeatureData {
>> + GVirConfigXmlDoc *doc;
>> + GList *features;
>> +};
>> +
>> +static gboolean add_feature(xmlNodePtr node, gpointer opaque)
>> +{
>> + struct GetFeatureData* data = (struct GetFeatureData*)opaque;
>> + GVirConfigCapabilitiesCPUFeature *feature;
>> +
>> + if (g_strcmp0((const gchar *)node->name, "feature") != 0)
>> + return TRUE;
>
> Is it expected that "features" nodes are ignored?
? Its the other way around: We ignore other nodes and create objects
for 'feature' nodes.
> Are the 2 kind of nodes
> (feature/features) two different things that we want to expose differently
> in the API?
I don't think we need separate classes for both. They both represent
the same concept, just that libvirt capabilties xml is a bit
inconsistent AFAICT.
>> + node = gvir_config_xml_get_element(node, "cpu", NULL);
>> + g_return_val_if_fail(node != NULL, NULL);
>
> Is it a mandatory element in the capabilities XML?
According to RNG, it is mandatory.
>> +GVirConfigCapabilitiesHost *
>> +gvir_config_capabilities_get_host(GVirConfigCapabilities *caps)
>> +{
>> + GVirConfigXmlDoc *doc;
>> + xmlNodePtr node;
>> +
>> + g_return_val_if_fail(GVIR_CONFIG_IS_CAPABILITIES(caps), NULL);
>> +
>> + g_object_get(G_OBJECT(caps), "doc", &doc, NULL);
>> +
>> + node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(caps));
>> + g_return_val_if_fail(node != NULL, NULL);
>> +
>> + node = gvir_config_xml_get_element(node, "host", NULL);
>> + g_return_val_if_fail(node != NULL, NULL);
>> +
>> + return gvir_config_capabilities_host_new_from_tree(doc, node);
>> +}
>
> This is the same code as gvir_config_capabilities_host_get_cpu, if this
> pattern gets repeated often, it will be worth trying to factor it in a
> helper function.
True and since we'll need to use g_object_new() instead in that
helper, we can just ditch all these new private headers.
--
Regards,
Zeeshan Ali (Khattak)
FSF member#5124
More information about the libvir-list
mailing list