This removes the need for using monitor_is_qmp() to check the subclass type, which is an anti-pattern. Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org> 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 2bb2333da5..08055839a4 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 ae36e996e9..1ab04a19fa 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -261,21 +261,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.54.0