@@ -40,7 +40,7 @@ void qmp_register_command(QmpCommandList *cmds, const char *name,
QmpCommandFunc *fn, QmpCommandOptions options);
void qmp_unregister_command(QmpCommandList *cmds, const char *name);
QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name);
-QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request);
+QDict *qmp_dispatch(QmpCommandList *cmds, QDict *request);
void qmp_disable_command(QmpCommandList *cmds, const char *name);
void qmp_enable_command(QmpCommandList *cmds, const char *name);
@@ -3900,17 +3900,17 @@ static int monitor_can_read(void *opaque)
}
/* take the ownership of rsp & id */
-static void monitor_qmp_respond(Monitor *mon, QObject *rsp, QObject *id)
+static void monitor_qmp_respond(Monitor *mon, QDict *rsp, QObject *id)
{
if (!rsp) {
return;
}
if (id) {
- qdict_put_obj(qobject_to(QDict, rsp), "id", id);
+ qdict_put_obj(rsp, "id", id);
}
if (mon->qmp.commands == &qmp_cap_negotiation_commands) {
- QDict *qdict = qdict_get_qdict(qobject_to(QDict, rsp), "error");
+ QDict *qdict = qdict_get_qdict(rsp, "error");
if (qdict
&& !g_strcmp0(qdict_get_try_str(qdict, "class"),
QapiErrorClass_str(ERROR_CLASS_COMMAND_NOT_FOUND))) {
@@ -3919,8 +3919,8 @@ static void monitor_qmp_respond(Monitor *mon, QObject *rsp, QObject *id)
" negotiation with 'qmp_capabilities'");
}
}
- monitor_json_emitter(mon, rsp);
- qobject_decref(rsp);
+ monitor_json_emitter(mon, QOBJECT(rsp));
+ QDECREF(rsp);
}
struct QMPRequest {
@@ -3929,7 +3929,7 @@ struct QMPRequest {
/* "id" field of the request */
QObject *id;
/* Request object to be handled */
- QObject *req;
+ QDict *req;
};
typedef struct QMPRequest QMPRequest;
@@ -3940,7 +3940,8 @@ typedef struct QMPRequest QMPRequest;
static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
{
Monitor *mon, *old_mon;
- QObject *req, *rsp = NULL, *id;
+ QDict *req, *rsp = NULL;
+ QObject *id;
req = req_obj->req;
mon = req_obj->mon;
@@ -3949,7 +3950,7 @@ static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
g_free(req_obj);
if (trace_event_get_state_backends(TRACE_HANDLE_QMP_COMMAND)) {
- QString *req_json = qobject_to_json(req);
+ QString *req_json = qobject_to_json(QOBJECT(req));
trace_handle_qmp_command(mon, qstring_get_str(req_json));
QDECREF(req_json);
}
@@ -3964,7 +3965,8 @@ static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
/* Respond if necessary */
monitor_qmp_respond(mon, rsp, id);
- qobject_decref(req);
+
+ QDECREF(req);
}
/*
@@ -4064,7 +4066,7 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
req_obj = g_new0(QMPRequest, 1);
req_obj->mon = mon;
req_obj->id = id;
- req_obj->req = req;
+ req_obj->req = qdict;
if (qmp_is_oob(qdict)) {
/* Out-Of-Band (OOB) requests are executed directly in parser. */
@@ -4115,7 +4117,7 @@ err:
qdict = qdict_new();
qdict_put_obj(qdict, "error", qmp_build_error_object(err));
error_free(err);
- monitor_qmp_respond(mon, QOBJECT(qdict), id);
+ monitor_qmp_respond(mon, qdict, id);
qobject_decref(req);
}
@@ -74,20 +74,15 @@ QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp)
return dict;
}
-static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
+static QObject *do_qmp_dispatch(QmpCommandList *cmds, QDict *dict,
Error **errp)
{
Error *local_err = NULL;
const char *command;
- QDict *args, *dict;
+ QDict *args;
QmpCommand *cmd;
QObject *ret = NULL;
- dict = qmp_dispatch_check_obj(request, errp);
- if (!dict) {
- return NULL;
- }
-
command = qdict_get_str(dict, "execute");
cmd = qmp_find_command(cmds, command);
if (cmd == NULL) {
@@ -151,13 +146,13 @@ bool qmp_is_oob(QDict *dict)
return qbool_get_bool(bool_obj);
}
-QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request)
+QDict *qmp_dispatch(QmpCommandList *cmds, QDict *req)
{
Error *err = NULL;
QObject *ret;
QDict *rsp;
- ret = do_qmp_dispatch(cmds, request, &err);
+ ret = do_qmp_dispatch(cmds, req, &err);
rsp = qdict_new();
if (err) {
@@ -170,5 +165,5 @@ QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request)
return NULL;
}
- return QOBJECT(rsp);
+ return rsp;
}
@@ -583,7 +583,8 @@ static int send_response(GAState *s, QObject *payload)
static void process_event(JSONMessageParser *parser, GQueue *tokens)
{
GAState *s = container_of(parser, GAState, parser);
- QObject *req, *rsp = NULL;
+ QObject *obj;
+ QDict *req, *rsp = NULL;
Error *err = NULL;
int ret;
@@ -591,12 +592,12 @@ static void process_event(JSONMessageParser *parser, GQueue *tokens)
g_debug("process_event: called");
- req = json_parser_parse_err(tokens, NULL, &err);
+ obj = json_parser_parse_err(tokens, NULL, &err);
if (err) {
goto end;
}
- qmp_dispatch_check_obj(req, &err);
+ req = qmp_dispatch_check_obj(obj, &err);
if (err) {
goto end;
}
@@ -606,19 +607,18 @@ static void process_event(JSONMessageParser *parser, GQueue *tokens)
end:
if (err) {
- QDict *qdict = qdict_new();
- qdict_put_obj(qdict, "error", qmp_build_error_object(err));
+ rsp = qdict_new();
+ qdict_put_obj(rsp, "error", qmp_build_error_object(err));
error_free(err);
- rsp = QOBJECT(qdict);
}
if (rsp) {
- ret = send_response(s, rsp);
+ ret = send_response(s, QOBJECT(rsp));
if (ret < 0) {
g_warning("error sending error response: %s", strerror(-ret));
}
- qobject_decref(rsp);
+ QDECREF(rsp);
}
- qobject_decref(req);
+ qobject_decref(obj);
}
/* false return signals GAChannel to close the current client connection */
@@ -97,16 +97,15 @@ __org_qemu_x_Union1 *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
/* test commands with no input and no return value */
static void test_dispatch_cmd(void)
{
- QDict *req = qdict_new();
- QObject *resp;
+ QDict *resp, *req = qdict_new();
qdict_put_str(req, "execute", "user_def_cmd");
- resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+ resp = qmp_dispatch(&qmp_commands, req);
assert(resp != NULL);
- assert(!qdict_haskey(qobject_to(QDict, resp), "error"));
+ assert(!qdict_haskey(resp, "error"));
- qobject_decref(resp);
+ QDECREF(resp);
QDECREF(req);
}
@@ -114,16 +113,15 @@ static void test_dispatch_cmd(void)
static void test_dispatch_cmd_failure(void)
{
QDict *req = qdict_new();
- QDict *args = qdict_new();
- QObject *resp;
+ QDict *resp, *args = qdict_new();
qdict_put_str(req, "execute", "user_def_cmd2");
- resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+ resp = qmp_dispatch(&qmp_commands, req);
assert(resp != NULL);
- assert(qdict_haskey(qobject_to(QDict, resp), "error"));
+ assert(qdict_haskey(resp, "error"));
- qobject_decref(resp);
+ QDECREF(resp);
QDECREF(req);
/* check that with extra arguments it throws an error */
@@ -133,39 +131,35 @@ static void test_dispatch_cmd_failure(void)
qdict_put_str(req, "execute", "user_def_cmd");
- resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+ resp = qmp_dispatch(&qmp_commands, req);
assert(resp != NULL);
- assert(qdict_haskey(qobject_to(QDict, resp), "error"));
+ assert(qdict_haskey(resp, "error"));
- qobject_decref(resp);
+ QDECREF(resp);
QDECREF(req);
}
static void test_dispatch_cmd_success_response(void)
{
- QDict *req = qdict_new();
- QObject *resp;
+ QDict *resp, *req = qdict_new();
qdict_put_str(req, "execute", "cmd-success-response");
- resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+ resp = qmp_dispatch(&qmp_commands, req);
assert(resp == NULL);
QDECREF(req);
}
static QObject *test_qmp_dispatch(QDict *req)
{
- QObject *resp_obj;
QDict *resp;
QObject *ret;
- resp_obj = qmp_dispatch(&qmp_commands, QOBJECT(req));
- assert(resp_obj);
- resp = qobject_to(QDict, resp_obj);
+ resp = qmp_dispatch(&qmp_commands, req);
assert(resp && !qdict_haskey(resp, "error"));
ret = qdict_get(resp, "return");
assert(ret);
qobject_incref(ret);
- qobject_decref(resp_obj);
+ QDECREF(resp);
return ret;
}
qmp_dispatch_check_obj() now must be called before calling qmp_dispatch() and returns a dict. Change qmp_dispatch() arguments, clarifying the expected qobject types, and simplifying a bit the rest of the code. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- include/qapi/qmp/dispatch.h | 2 +- monitor.c | 24 +++++++++++++----------- qapi/qmp-dispatch.c | 15 +++++---------- qga/main.c | 18 +++++++++--------- tests/test-qmp-cmds.c | 36 +++++++++++++++--------------------- 5 files changed, 43 insertions(+), 52 deletions(-)