40
#include "qemu/target-info.h"
41
#include "qemu/units.h"
42
#include "qapi/error.h"
43
+#include "qom/object_interfaces.h"
44
#include "exec/gdbstub.h"
45
#include "system/block-backend.h"
46
#include "trace.h"
72
int monitor_hmp_vprintf(Monitor *mon, const char *fmt, va_list ap)
73
G_GNUC_PRINTF(2, 0);
74
static void monitor_hmp_accept_input(Monitor *mon);
75
+static void monitor_hmp_complete(UserCreatable *uc, Error **errp);
76
+static bool monitor_hmp_prepare_delete(UserCreatable *uc, Error **errp);
77
78
static void monitor_hmp_class_init(ObjectClass *cls, const void *data)
79
{
80
MonitorClass *moncls = MONITOR_CLASS(cls);
81
+ UserCreatableClass *ucc = USER_CREATABLE_CLASS(cls);
82
83
object_class_property_add_bool(cls, "readline",
84
monitor_hmp_get_readline,
86
87
moncls->vprintf = monitor_hmp_vprintf;
88
moncls->accept_input = monitor_hmp_accept_input;
89
+
90
+ ucc->complete = monitor_hmp_complete;
91
+ ucc->prepare_delete = monitor_hmp_prepare_delete;
92
}
93
94
static void monitor_hmp_init(Object *obj)
1612
void monitor_new_hmp(const char *id, const char *chardev_id,
1613
bool use_readline, Error **errp)
1614
{
1608
- ERRP_GUARD();
1609
- MonitorHMP *mon;
1615
g_autofree char *autoid = id ? NULL : monitor_compat_id();
1611
- Object *obj = object_new_with_props(TYPE_MONITOR_HMP,
1612
- object_get_objects_root(),
1613
- id ? id : autoid,
1614
- errp,
1615
- "chardev", chardev_id,
1616
- "readline", use_readline ? "yes" : "no",
1617
- NULL);
1618
-
1619
- if (!obj) {
1620
- return;
1621
- }
1616
+ object_new_with_props(TYPE_MONITOR_HMP,
1617
+ object_get_objects_root(),
1618
+ id ? id : autoid,
1619
+ errp,
1620
+ "chardev", chardev_id,
1621
+ "readline", use_readline ? "yes" : "no",
1622
+ NULL);
1623
+}
1624
1623
- mon = MONITOR_HMP(obj);
1625
+static void monitor_hmp_complete(UserCreatable *uc, Error **errp)
1626
+{
1627
+ MonitorHMP *mon = MONITOR_HMP(uc);
1628
+ UserCreatableClass *ucc_parent =
1629
+ USER_CREATABLE_CLASS(
1630
+ object_class_get_parent(
1631
+ OBJECT_CLASS(MONITOR_HMP_GET_CLASS(mon))));
1632
+ ERRP_GUARD();
1633
1625
- monitor_complete(MONITOR(mon), errp);
1634
+ ucc_parent->complete(uc, errp);
1635
if (*errp) {
1627
- object_unparent(OBJECT(mon));
1636
return;
1637
}
1638
1631
- if (mon->use_readline) {
1632
- mon->rs = readline_init(monitor_readline_printf,
1633
- monitor_readline_flush,
1634
- mon,
1635
- monitor_find_completion);
1636
- monitor_read_command(mon, 0);
1639
+ if (mon->parent_obj.chardev_id) {
1640
+ if (mon->use_readline) {
1641
+ mon->rs = readline_init(monitor_readline_printf,
1642
+ monitor_readline_flush,
1643
+ mon,
1644
+ monitor_find_completion);
1645
+ monitor_read_command(mon, 0);
1646
+ }
1647
+
1648
+ qemu_chr_fe_set_handlers(&mon->parent_obj.chr,
1649
+ monitor_can_read,
1650
+ monitor_read,
1651
+ monitor_event, NULL,
1652
+ &mon->parent_obj, NULL, true);
1653
+ monitor_list_append(&mon->parent_obj);
1654
}
1655
+}
1656
1639
- qemu_chr_fe_set_handlers(&mon->parent_obj.chr,
1640
- monitor_can_read, monitor_read, monitor_event,
1641
- NULL, &mon->parent_obj, NULL, true);
1642
- monitor_list_append(&mon->parent_obj);
1657
+static bool monitor_hmp_prepare_delete(UserCreatable *uc, Error **errp)
1658
+{
1659
+ error_setg(errp, "Deleting HMP monitors is not supported");
1660
+ return false;
1661
}
1662
1663
/**