On Thu, Mar 29, 2018 at 01:07:58PM +0200, Katerina Koukiou wrote:
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.
This should be split into two patches, one that introduces the
new macros and second one that uses them.
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"
+
There is no need to disable this warning, we can use G_GNUC_PURE for
the affected functions.
# 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)
Return type should be on a separate line, see HACKING.md and other
functions in this file.
Even though that this function is copied from libvirt where we use
vir* prefix, this package uses virtDBus* prefix and each file has
it's own prefix, so in this case the prefix is virtDBusUtil* and the
function name should be virtDBusUtilEnumToString.
+{
+ 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")
This is currently used only in event.c so it should go into top of that
file.
+
+const gchar *
+virtDBusDomainEventToString(gint event)
+{
+ const gchar *str = virtDBusDomainEventTypeToString(event);
+ return str ? str : "unknown";
+}
This one as well and the function name prefix should be fixed.
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);
Same comment for the return type and the function name.
+
+# 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);
There is no need to have the space after '#', that is used in libvirt
because the macro is in #ifndef ... #endif block.
Both macros should use also the VIRT_DBUS prefix instead of VIR.
Pavel