From: "Zeeshan Ali (Khattak)" <zeeshanak(a)gnome.org>
Also provide helper function for subclasses that will have the exact
same implementation except that they'll return instances of another type
(subclasses of GVirConfigDomainCpuFeature rather than
GVirConfigDomainCpuFeature itself).
---
libvirt-gconfig/Makefile.am | 1 +
.../libvirt-gconfig-capabilities-cpu-private.h | 35 ++++++++++++++++
libvirt-gconfig/libvirt-gconfig-capabilities-cpu.c | 42 +++++++++++++++-----
libvirt-gconfig/libvirt-gconfig-capabilities-cpu.h | 4 +-
libvirt-gconfig/libvirt-gconfig-private.h | 1 +
5 files changed, 71 insertions(+), 12 deletions(-)
create mode 100644 libvirt-gconfig/libvirt-gconfig-capabilities-cpu-private.h
diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am
index 7f0ea3b..52f2d52 100644
--- a/libvirt-gconfig/Makefile.am
+++ b/libvirt-gconfig/Makefile.am
@@ -73,6 +73,7 @@ GCONFIG_HEADER_FILES = \
libvirt-gconfig-storage-vol-target.h
noinst_HEADERS = \
libvirt-gconfig-private.h \
+ libvirt-gconfig-capabilities-cpu-private.h \
libvirt-gconfig-domain-device-private.h \
libvirt-gconfig-helpers-private.h \
libvirt-gconfig-object-private.h \
diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities-cpu-private.h
b/libvirt-gconfig/libvirt-gconfig-capabilities-cpu-private.h
new file mode 100644
index 0000000..4832656
--- /dev/null
+++ b/libvirt-gconfig/libvirt-gconfig-capabilities-cpu-private.h
@@ -0,0 +1,35 @@
+/*
+ * libvirt-gconfig-capabilities-cpu-private.h: libvirt CPU capabilities
+ *
+ * Copyright (C) 2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak(a)gnome.org>
+ */
+#ifndef __LIBVIRT_GCONFIG_CAPABILITIES_CPU_PRIVATE_H__
+#define __LIBVIRT_GCONFIG_CAPABILITIES_CPU_PRIVATE_H__
+
+G_BEGIN_DECLS
+
+#include <libvirt-gconfig/libvirt-gconfig.h>
+
+GList *
+gvir_config_capabilities_cpu_get_features_with_type(GVirConfigCapabilitiesCpu *cpu,
+ GType type);
+
+G_END_DECLS
+
+#endif /* __LIBVIRT_GCONFIG_CAPABILITIES_CPU_PRIVATE_H__ */
diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.c
b/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.c
index e517a20..5b619b5 100644
--- a/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.c
+++ b/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.c
@@ -37,10 +37,14 @@ struct _GVirConfigCapabilitiesCpuPrivate
G_DEFINE_TYPE(GVirConfigCapabilitiesCpu, gvir_config_capabilities_cpu,
GVIR_CONFIG_TYPE_OBJECT);
+static GList *
+_gvir_config_capabilities_cpu_get_features(GVirConfigCapabilitiesCpu *cpu);
static void gvir_config_capabilities_cpu_class_init(GVirConfigCapabilitiesCpuClass
*klass)
{
g_type_class_add_private(klass, sizeof(GVirConfigCapabilitiesCpuPrivate));
+
+ klass->get_features = _gvir_config_capabilities_cpu_get_features;
}
static void gvir_config_capabilities_cpu_init(GVirConfigCapabilitiesCpu *cpu)
@@ -75,6 +79,7 @@ struct GetFeatureData {
GVirConfigXmlDoc *doc;
const gchar *schema;
GList *features;
+ GType type;
};
static gboolean add_feature(xmlNodePtr node, gpointer opaque)
@@ -86,7 +91,7 @@ static gboolean add_feature(xmlNodePtr node, gpointer opaque)
return TRUE;
feature = gvir_config_object_new_from_tree
- (GVIR_CONFIG_TYPE_CAPABILITIES_CPU_FEATURE,
+ (data->type,
data->doc,
data->schema,
node);
@@ -98,16 +103,9 @@ static gboolean add_feature(xmlNodePtr node, gpointer opaque)
return TRUE;
}
-/**
- * gvir_config_capabilities_cpu_get_features:
- *
- * Gets the features of this CPU.
- *
- * Returns: (element-type LibvirtGConfig.CapabilitiesCpuFeature) (transfer full):
- * a newly allocated #GList of #GVirConfigCapabilitiesCpuFeature.
- */
-GList *
-gvir_config_capabilities_cpu_get_features(GVirConfigCapabilitiesCpu *cpu)
+G_GNUC_INTERNAL GList *
+gvir_config_capabilities_cpu_get_features_with_type(GVirConfigCapabilitiesCpu *cpu,
+ GType type)
{
struct GetFeatureData data;
@@ -117,6 +115,7 @@ gvir_config_capabilities_cpu_get_features(GVirConfigCapabilitiesCpu
*cpu)
g_object_get(G_OBJECT(cpu), "doc", &data.doc, NULL);
g_return_val_if_fail(data.doc != NULL, NULL);
data.features = NULL;
+ data.type = type;
gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(cpu),
NULL,
@@ -127,6 +126,27 @@ gvir_config_capabilities_cpu_get_features(GVirConfigCapabilitiesCpu
*cpu)
return data.features;
}
+static GList *
+_gvir_config_capabilities_cpu_get_features(GVirConfigCapabilitiesCpu *cpu)
+{
+ return gvir_config_capabilities_cpu_get_features_with_type(
+ cpu, GVIR_CONFIG_TYPE_CAPABILITIES_CPU_FEATURE);
+}
+
+/**
+ * gvir_config_capabilities_cpu_get_features:
+ *
+ * Gets the features of this CPU.
+ *
+ * Returns: (element-type LibvirtGConfig.CapabilitiesCpuFeature) (transfer full):
+ * a newly allocated #GList of #GVirConfigCapabilitiesCpuFeature.
+ */
+GList *
+gvir_config_capabilities_cpu_get_features(GVirConfigCapabilitiesCpu *cpu)
+{
+ return GVIR_CONFIG_CAPABILITIES_CPU_GET_CLASS(cpu)->get_features(cpu);
+}
+
/**
* gvir_config_capabilities_cpu_get_topology:
*
diff --git a/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.h
b/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.h
index 67fe607..be6c06f 100644
--- a/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.h
+++ b/libvirt-gconfig/libvirt-gconfig-capabilities-cpu.h
@@ -57,7 +57,9 @@ struct _GVirConfigCapabilitiesCpuClass
{
GVirConfigObjectClass parent_class;
- gpointer padding[20];
+ GList *(*get_features)(GVirConfigCapabilitiesCpu *cpu);
+
+ gpointer padding[19];
};
GType gvir_config_capabilities_cpu_get_type(void);
diff --git a/libvirt-gconfig/libvirt-gconfig-private.h
b/libvirt-gconfig/libvirt-gconfig-private.h
index d4df030..ea532ad 100644
--- a/libvirt-gconfig/libvirt-gconfig-private.h
+++ b/libvirt-gconfig/libvirt-gconfig-private.h
@@ -23,6 +23,7 @@
#ifndef __LIBVIRT_GCONFIG_PRIVATE_H__
#define __LIBVIRT_GCONFIG_PRIVATE_H__
+#include <libvirt-gconfig/libvirt-gconfig-capabilities-cpu-private.h>
#include <libvirt-gconfig/libvirt-gconfig-domain-device-private.h>
#include <libvirt-gconfig/libvirt-gconfig-helpers-private.h>
#include <libvirt-gconfig/libvirt-gconfig-object-private.h>
--
1.7.10.4