This removes the need for using monitor_is_qmp() to check the
subclass type, which is an anti-pattern.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
Tested-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
monitor/hmp.c | 13 +++++++++++++
monitor/monitor-internal.h | 7 +++++++
monitor/monitor.c | 11 ++++-------
3 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/monitor/hmp.c b/monitor/hmp.c
index c03b91782c..f9252387c4 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -68,11 +68,18 @@ static void monitor_hmp_set_readline(Object *obj, bool val, Error **errp)
mon->use_readline = val;
}
+int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
+ G_GNUC_PRINTF(2, 0);
+
static void monitor_hmp_class_init(ObjectClass *cls, const void *data)
{
+ MonitorClass *moncls = MONITOR_CLASS(cls);
+
object_class_property_add_bool(cls, "readline",
monitor_hmp_get_readline,
monitor_hmp_set_readline);
+
+ moncls->vprintf = monitor_hmp_vprintf;
}
static void monitor_hmp_init(Object *obj)
@@ -87,6 +94,12 @@ static void monitor_hmp_init(Object *obj)
hmp->use_readline = true;
}
+int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
+{
+ g_autofree char *buf = g_strdup_vprintf(fmt, ap);
+ return monitor_puts(mon, buf);
+}
+
static void monitor_command_cb(void *opaque, const char *cmdline,
void *readline_opaque)
{
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
index 6a4c3b0f37..23cef68153 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -104,6 +104,13 @@ typedef struct HMPCommand {
struct MonitorClass {
ObjectClass parent_class;
+
+ /*
+ * If non-NULL, the monitor is able to print messages
+ * for attention of the client user
+ */
+ int (*vprintf)(Monitor *mon, const char *fmt, va_list ap)
+ G_GNUC_PRINTF(2, 0);
};
struct Monitor {
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 9fe131983d..0cb0930bf4 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -264,21 +264,18 @@ int monitor_puts(Monitor *mon, const char *str)
int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
{
- char *buf;
- int n;
+ MonitorClass *moncls;
if (!mon) {
return -1;
}
- if (monitor_is_qmp(mon)) {
+ moncls = MONITOR_GET_CLASS(mon);
+ if (!moncls->vprintf) {
return -1;
}
- buf = g_strdup_vprintf(fmt, ap);
- n = monitor_puts(mon, buf);
- g_free(buf);
- return n;
+ return moncls->vprintf(mon, fmt, ap);
}
int monitor_printf(Monitor *mon, const char *fmt, ...)
--
2.55.0