4 * Copyright (C) 2009 Red Hat Inc.
9 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
10 * See the COPYING.LIB file in the top-level directory.
16 #include "qemu-common.h"
18 static void qerror_destroy_obj(QObject *obj);
20 static const QType qerror_type = {
22 .destroy = qerror_destroy_obj,
26 * qerror_new(): Create a new QError
28 * Return strong reference.
30 static QError *qerror_new(void)
34 qerr = g_malloc0(sizeof(*qerr));
35 QOBJECT_INIT(qerr, &qerror_type);
41 * qerror_from_info(): Create a new QError from error information
43 * Return strong reference.
45 static QError *qerror_from_info(ErrorClass err_class, const char *fmt,
53 qerr->err_msg = g_strdup_vprintf(fmt, *va);
54 qerr->err_class = err_class;
60 * qerror_human(): Format QError data into human-readable string.
62 QString *qerror_human(const QError *qerror)
64 return qstring_from_str(qerror->err_msg);
68 * qerror_print(): Print QError data
70 * This function will print the member 'desc' of the specified QError object,
71 * it uses error_report() for this, so that the output is routed to the right
72 * place (ie. stderr or Monitor's device).
74 static void qerror_print(QError *qerror)
76 QString *qstring = qerror_human(qerror);
77 loc_push_restore(&qerror->loc);
78 error_report("%s", qstring_get_str(qstring));
79 loc_pop(&qerror->loc);
83 void qerror_report(ErrorClass eclass, const char *fmt, ...)
89 qerror = qerror_from_info(eclass, fmt, &va);
92 if (monitor_cur_is_qmp()) {
93 monitor_set_error(cur_mon, qerror);
104 ErrorClass err_class;
107 void qerror_report_err(Error *err)
112 loc_save(&qerr->loc);
113 qerr->err_msg = g_strdup(err->msg);
114 qerr->err_class = err->err_class;
116 if (monitor_cur_is_qmp()) {
117 monitor_set_error(cur_mon, qerr);
124 void assert_no_error(Error *err)
127 qerror_report_err(err);
133 * qobject_to_qerror(): Convert a QObject into a QError
135 static QError *qobject_to_qerror(const QObject *obj)
137 if (qobject_type(obj) != QTYPE_QERROR) {
141 return container_of(obj, QError, base);
145 * qerror_destroy_obj(): Free all memory allocated by a QError
147 static void qerror_destroy_obj(QObject *obj)
152 qerr = qobject_to_qerror(obj);
154 g_free(qerr->err_msg);