QDict *qmp_dispatch(QmpCommandList *cmds, QObject *request, bool allow_oob) { Error *err = NULL; QDict *dict = qobject_to(QDict, request); QObject *ret, *id = dict ? qdict_get(dict, "id") : NULL; QDict *rsp; ret = do_qmp_dispatch(cmds, request, allow_oob, &err); if (err) { rsp = qmp_error_response(err); } else if (ret) { rsp = qdict_new(); qdict_put_obj(rsp, "return", ret); } else { /* Can only happen for commands with QCO_NO_SUCCESS_RESP */ rsp = NULL; } if (rsp && id) { qdict_put_obj(rsp, "id", qobject_ref(id)); } return rsp; }
/* handle requests/control events coming in over the channel */ static void process_event(JSONMessageParser *parser, GQueue *tokens) { GAState *s = container_of(parser, GAState, parser); QDict *qdict; Error *err = NULL; int ret; g_assert(s && parser); g_debug("process_event: called"); qdict = qobject_to(QDict, json_parser_parse_err(tokens, NULL, &err)); if (err || !qdict) { qobject_unref(qdict); if (!err) { g_warning("failed to parse event: unknown error"); error_setg(&err, QERR_JSON_PARSING); } else { g_warning("failed to parse event: %s", error_get_pretty(err)); } qdict = qmp_error_response(err); } /* handle host->guest commands */ if (qdict_haskey(qdict, "execute")) { process_command(s, qdict); } else { if (!qdict_haskey(qdict, "error")) { qobject_unref(qdict); g_warning("unrecognized payload format"); error_setg(&err, QERR_UNSUPPORTED); qdict = qmp_error_response(err); } ret = send_response(s, qdict); if (ret < 0) { g_warning("error sending error response: %s", strerror(-ret)); } } qobject_unref(qdict); }
/* handle requests/control events coming in over the channel */ static void process_event(JSONMessageParser *parser, GQueue *tokens) { GAState *s = container_of(parser, GAState, parser); QObject *obj; QDict *req, *rsp; Error *err = NULL; int ret; g_assert(s && parser); g_debug("process_event: called"); obj = json_parser_parse_err(tokens, NULL, &err); if (err) { goto err; } req = qobject_to(QDict, obj); if (!req) { error_setg(&err, QERR_JSON_PARSING); goto err; } if (!qdict_haskey(req, "execute")) { g_warning("unrecognized payload format"); error_setg(&err, QERR_UNSUPPORTED); goto err; } process_command(s, req); qobject_unref(obj); return; err: g_warning("failed to parse event: %s", error_get_pretty(err)); rsp = qmp_error_response(err); ret = send_response(s, rsp); if (ret < 0) { g_warning("error sending error response: %s", strerror(-ret)); } qobject_unref(rsp); qobject_unref(obj); }