[libvirt] [dbus PATCH 0/3] Introduce GVariant to TypedParams helper

Pavel Hrdina (3): util: Introduce virtDBusUtilTypedParams util: Introduce virtDBusUtilGVariantToTypedParams domain: Implement SetPerfEvents method data/org.libvirt.Domain.xml | 6 +++ src/domain.c | 31 ++++++++++++++++ src/util.c | 89 +++++++++++++++++++++++++++++++++++++++++++++ src/util.h | 17 +++++++++ 4 files changed, 143 insertions(+) -- 2.14.3

Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util.c | 6 ++++++ src/util.h | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/util.c b/src/util.c index b21f2c5..ac965c4 100644 --- a/src/util.c +++ b/src/util.c @@ -20,6 +20,12 @@ virtDBusErrorQuark(void) return (GQuark) quarkVolatile; } +void +virtDBusUtilTypedParamsClear(virtDBusUtilTypedParams *params) +{ + virTypedParamsFree(params->params, params->nparams); +} + GVariant * virtDBusUtilTypedParamsToGVariant(virTypedParameterPtr params, gint nparams) diff --git a/src/util.h b/src/util.h index 7bb4ad6..4ffc15c 100644 --- a/src/util.h +++ b/src/util.h @@ -16,6 +16,17 @@ typedef enum { GQuark virtDBusErrorQuark(void); +struct _virtDBusUtilTypedParams { + virTypedParameterPtr params; + gint nparams; +}; +typedef struct _virtDBusUtilTypedParams virtDBusUtilTypedParams; + +void +virtDBusUtilTypedParamsClear(virtDBusUtilTypedParams *params); + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusUtilTypedParams, virtDBusUtilTypedParamsClear); + GVariant * virtDBusUtilTypedParamsToGVariant(virTypedParameterPtr params, gint nparams); -- 2.14.3

On Fri, 2018-04-20 at 14:17 +0200, Pavel Hrdina wrote:
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util.c | 6 ++++++ src/util.h | 11 +++++++++++ 2 files changed, 17 insertions(+)
Reviewed-by: Katerina Koukiou <kkoukiou@redhat.com>

This converts D-Bus dictionary into virTypedParameters. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/util.h | 6 +++++ 2 files changed, 89 insertions(+) diff --git a/src/util.c b/src/util.c index ac965c4..5a69c89 100644 --- a/src/util.c +++ b/src/util.c @@ -69,6 +69,89 @@ virtDBusUtilTypedParamsToGVariant(virTypedParameterPtr params, return g_variant_builder_end(&builder); } +gboolean +virtDBusUtilGVariantToTypedParams(GVariantIter *iter, + virTypedParameterPtr *params, + gint *nparams, + GError **error) +{ + g_autofree gchar *name = NULL; + g_autoptr(GVariant) value = NULL; + gint maxParams = 0; + + while (g_variant_iter_loop(iter, "{sv}", &name, &value)) { + const gchar *type = g_variant_get_type_string(value); + + switch (type[0]) { + case 'i': + if (virTypedParamsAddInt(params, nparams, &maxParams, name, + g_variant_get_int32(value)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + case 'u': + if (virTypedParamsAddUInt(params, nparams, &maxParams, name, + g_variant_get_uint32(value)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + case 'x': + if (virTypedParamsAddLLong(params, nparams, &maxParams, name, + g_variant_get_int64(value)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + case 't': + if (virTypedParamsAddULLong(params, nparams, &maxParams, name, + g_variant_get_uint64(value)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + case 'd': + if (virTypedParamsAddDouble(params, nparams, &maxParams, name, + g_variant_get_double(value)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + case 'b': + if (virTypedParamsAddBoolean(params, nparams, &maxParams, name, + g_variant_get_boolean(value)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + case 's': + if (virTypedParamsAddString(params, nparams, &maxParams, name, + g_variant_get_string(value, NULL)) < 0) { + virtDBusUtilSetLastVirtError(error); + return FALSE; + } + break; + + default: + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Invalid typed parameter '%s'.", type); + return FALSE; + } + } + + name = NULL; + value = NULL; + + return TRUE; +} + void virtDBusUtilSetLastVirtError(GError **error) { diff --git a/src/util.h b/src/util.h index 4ffc15c..86d2edc 100644 --- a/src/util.h +++ b/src/util.h @@ -31,6 +31,12 @@ GVariant * virtDBusUtilTypedParamsToGVariant(virTypedParameterPtr params, gint nparams); +gboolean +virtDBusUtilGVariantToTypedParams(GVariantIter *iter, + virTypedParameterPtr *params, + gint *nparams, + GError **error); + void virtDBusUtilSetLastVirtError(GError **error); -- 2.14.3

On Fri, 2018-04-20 at 14:17 +0200, Pavel Hrdina wrote:
This converts D-Bus dictionary into virTypedParameters.
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- src/util.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/util.h | 6 +++++ 2 files changed, 89 insertions(+)
Reviewed-by: Katerina Koukiou <kkoukiou@redhat.com>

Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 0f3d926..a57b05a 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -348,6 +348,12 @@ <arg name="uri" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="SetPerfEvents"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetPerfEvents"/> + <arg name="params" type="a{sv}" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SetUserPassword"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetUserPassword"/> diff --git a/src/domain.c b/src/domain.c index ae1b68f..7eb43f4 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1699,6 +1699,36 @@ virtDBusDomainSetMetadata(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSetPerfEvents(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autoptr(GVariantIter) iter = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + + g_variant_get(inArgs, "(a{sv}u)", &iter, &flags); + + if (!virtDBusUtilGVariantToTypedParams(iter, ¶ms.params, + ¶ms.nparams, error)) { + return; + } + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSetPerfEvents(domain, params.params, params.nparams, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainSetUserPassword(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1930,6 +1960,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "SetMemory", virtDBusDomainSetMemory }, { "SetMemoryStatsPeriod", virtDBusDomainSetMemoryStatsPeriod }, { "SetMetadata", virtDBusDomainSetMetadata }, + { "SetPerfEvents", virtDBusDomainSetPerfEvents }, { "SetTime", virtDBusDomainSetTime }, { "SetUserPassword", virtDBusDomainSetUserPassword }, { "Shutdown", virtDBusDomainShutdown }, -- 2.14.3

On Fri, 2018-04-20 at 14:17 +0200, Pavel Hrdina wrote:
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
Reviewed-by: Katerina Koukiou <kkoukiou@redhat.com>
participants (2)
-
Katerina Koukiou
-
Pavel Hrdina