The functions were copied from src/util/virutil.* files from
libvirt project.
They will be needed for other function of enum to string
as well.
Signed-off-by: Katerina Koukiou <kkoukiou(a)redhat.com>
---
m4/virt-compile-warnings.m4 | 3 +++
src/events.c | 35 +----------------------------------
src/util.c | 30 ++++++++++++++++++++++++++++++
src/util.h | 30 ++++++++++++++++++++++++++++++
test/test_connect.py | 4 ++--
test/test_domain.py | 8 ++++----
6 files changed, 70 insertions(+), 40 deletions(-)
diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4
index 6ece136..7bc49b2 100644
--- a/m4/virt-compile-warnings.m4
+++ b/m4/virt-compile-warnings.m4
@@ -123,6 +123,9 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
# but need to rewrite various areas of code first
wantwarn="$wantwarn -Wno-format-truncation"
+ # Needeed for *EventToString related functions.
+ wantwarn="$wantwarn -Wno-suggest-attribute=pure"
+
# This should be < 256 really. Currently we're down to 4096,
# but using 1024 bytes sized buffers (mostly for virStrerror)
# stops us from going down further
diff --git a/src/events.c b/src/events.c
index 62f3729..52c53ac 100644
--- a/src/events.c
+++ b/src/events.c
@@ -12,41 +12,8 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED,
gpointer opaque)
{
virtDBusConnect *connect = opaque;
- const gchar *event_type = NULL;
g_autofree gchar *path = NULL;
- switch (event) {
- case VIR_DOMAIN_EVENT_DEFINED:
- event_type = "DomainDefined";
- break;
- case VIR_DOMAIN_EVENT_UNDEFINED:
- event_type = "DomainUndefined";
- break;
- case VIR_DOMAIN_EVENT_STARTED:
- event_type = "DomainStarted";
- break;
- case VIR_DOMAIN_EVENT_SUSPENDED:
- event_type = "DomainSuspended";
- break;
- case VIR_DOMAIN_EVENT_RESUMED:
- event_type = "DomainResumed";
- break;
- case VIR_DOMAIN_EVENT_STOPPED:
- event_type = "DomainStopped";
- break;
- case VIR_DOMAIN_EVENT_SHUTDOWN:
- event_type = "DomainShutdown";
- break;
- case VIR_DOMAIN_EVENT_PMSUSPENDED:
- event_type = "DomainPMSuspended";
- break;
- case VIR_DOMAIN_EVENT_CRASHED:
- event_type = "DomainCrashed";
- break;
- default:
- return 0;
- }
-
path = virtDBusUtilBusPathForVirDomain(domain, connect->domainPath);
g_dbus_connection_emit_signal(connect->bus,
@@ -54,7 +21,7 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED,
connect->connectPath,
VIRT_DBUS_CONNECT_INTERFACE,
"Domain",
- g_variant_new("(os)", path, event_type),
+ g_variant_new("(os)", path,
virtDBusDomainEventToString(event)),
NULL);
return 0;
diff --git a/src/util.c b/src/util.c
index d6c27f3..9f645d2 100644
--- a/src/util.c
+++ b/src/util.c
@@ -124,3 +124,33 @@ virtDBusUtilVirDomainListFree(virDomainPtr *domains)
g_free(domains);
}
+
+const gchar *virEnumToString(const gchar *const*types,
+ guint ntypes,
+ gint type)
+{
+ if (type < 0 || (unsigned)type >= ntypes)
+ return NULL;
+
+ return types[type];
+}
+
+VIR_ENUM_DECL(virtDBusDomainEvent)
+VIR_ENUM_IMPL(virtDBusDomainEvent,
+ VIR_DOMAIN_EVENT_LAST,
+ "Defined",
+ "Undefined",
+ "Started",
+ "Suspended",
+ "Resumed",
+ "Stopped",
+ "Shutdown",
+ "PMSuspended",
+ "Crashed")
+
+const gchar *
+virtDBusDomainEventToString(gint event)
+{
+ const gchar *str = virtDBusDomainEventTypeToString(event);
+ return str ? str : "unknown";
+}
diff --git a/src/util.h b/src/util.h
index 4304bac..22cf25e 100644
--- a/src/util.h
+++ b/src/util.h
@@ -2,6 +2,7 @@
#include "gdbus.h"
+#define VIR_ENUM_SENTINELS
#include <libvirt/libvirt.h>
#define VIRT_DBUS_ERROR virtDBusErrorQuark()
@@ -37,3 +38,32 @@ virtDBusUtilVirDomainListFree(virDomainPtr *domains);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomain, virDomainFree);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainPtr, virtDBusUtilVirDomainListFree);
+
+gint virEnumFromString(const gchar *const*types,
+ guint ntypes,
+ const gchar *type);
+
+const gchar *virEnumToString(const gchar *const*types,
+ guint ntypes,
+ gint type);
+
+# define VIR_ENUM_IMPL(name, lastVal, ...) \
+ static const gchar *const name ## TypeList[] = { __VA_ARGS__ }; \
+ G_STATIC_ASSERT(G_N_ELEMENTS(name ## TypeList) == lastVal); \
+ const gchar *name ## TypeToString(int type) { \
+ return virEnumToString(name ## TypeList, \
+ G_N_ELEMENTS(name ## TypeList), \
+ type); \
+ } \
+ gint name ## TypeFromString(const gchar *type) { \
+ return virEnumFromString(name ## TypeList, \
+ G_N_ELEMENTS(name ## TypeList), \
+ type); \
+ }
+
+# define VIR_ENUM_DECL(name) \
+ const gchar *name ## TypeToString(gint type); \
+ gint name ## TypeFromString(const gchar*type);
+
+const gchar *
+virtDBusDomainEventToString(gint event);
diff --git a/test/test_connect.py b/test/test_connect.py
index c7830c5..8bab625 100755
--- a/test/test_connect.py
+++ b/test/test_connect.py
@@ -33,7 +33,7 @@ class TestConnect(libvirttest.BaseTestClass):
assert isinstance(path, dbus.ObjectPath)
self.loop.quit()
- self.connect.connect_to_signal('Domain', domain_started,
arg2='DomainStarted')
+ self.connect.connect_to_signal('Domain', domain_started,
arg2='Started')
path = self.connect.CreateXML(self.minimal_xml, 0)
assert isinstance(path, dbus.ObjectPath)
@@ -45,7 +45,7 @@ class TestConnect(libvirttest.BaseTestClass):
assert isinstance(path, dbus.ObjectPath)
self.loop.quit()
- self.connect.connect_to_signal('Domain', domain_defined,
arg2='DomainDefined')
+ self.connect.connect_to_signal('Domain', domain_defined,
arg2='Defined')
path = self.connect.DefineXML(self.minimal_xml)
assert isinstance(path, dbus.ObjectPath)
diff --git a/test/test_domain.py b/test/test_domain.py
index 7dbc971..4d03c4b 100755
--- a/test/test_domain.py
+++ b/test/test_domain.py
@@ -42,7 +42,7 @@ class TestDomain(libvirttest.BaseTestClass):
assert isinstance(path, dbus.ObjectPath)
self.loop.quit()
- self.connect.connect_to_signal('Domain', domain_stopped,
arg2='DomainStopped')
+ self.connect.connect_to_signal('Domain', domain_stopped,
arg2='Stopped')
obj, domain = self.domain()
domain.Shutdown(0)
@@ -57,7 +57,7 @@ class TestDomain(libvirttest.BaseTestClass):
assert isinstance(path, dbus.ObjectPath)
self.loop.quit()
- self.connect.connect_to_signal('Domain', domain_undefined,
arg2='DomainUndefined')
+ self.connect.connect_to_signal('Domain', domain_undefined,
arg2='Undefined')
_, domain = self.domain()
domain.Shutdown(0)
@@ -70,7 +70,7 @@ class TestDomain(libvirttest.BaseTestClass):
assert isinstance(path, dbus.ObjectPath)
self.loop.quit()
- self.connect.connect_to_signal('Domain', domain_suspended,
arg2='DomainSuspended')
+ self.connect.connect_to_signal('Domain', domain_suspended,
arg2='Suspended')
obj, domain = self.domain()
domain.Suspend()
@@ -85,7 +85,7 @@ class TestDomain(libvirttest.BaseTestClass):
assert isinstance(path, dbus.ObjectPath)
self.loop.quit()
- self.connect.connect_to_signal('Domain', domain_resumed,
arg2='DomainResumed')
+ self.connect.connect_to_signal('Domain', domain_resumed,
arg2='Resumed')
obj, domain = self.domain()
domain.Suspend()
--
2.15.0