Patchwork [v1,18/23] qapi: add base declaration/types for QMP

login
register
mail settings
Submitter Michael Roth
Date May 18, 2011, 12:52 a.m.
Message ID <1305679930-4215-19-git-send-email-mdroth@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/96112/
State New
Headers show

Comments

Michael Roth - May 18, 2011, 12:52 a.m.
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 qapi/qmp-core.h |   90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 90 insertions(+), 0 deletions(-)
 create mode 100644 qapi/qmp-core.h

Patch

diff --git a/qapi/qmp-core.h b/qapi/qmp-core.h
new file mode 100644
index 0000000..c4a20a8
--- /dev/null
+++ b/qapi/qmp-core.h
@@ -0,0 +1,90 @@ 
+#ifndef QMP_CORE_H
+#define QMP_CORE_H
+
+#include "monitor.h"
+#include "error_int.h"
+#include "qapi/qapi-types-core.h"
+
+struct QmpCommandState
+{
+    QmpState *state;
+    QObject *tag;
+};
+
+typedef struct DefaultQmpConnection
+{
+    QmpSignal *obj;
+    int handle;
+    QTAILQ_ENTRY(DefaultQmpConnection) node;
+} DefaultQmpConnection;
+
+typedef void (QmpCommandFunc)(QmpState *qmp__sess, QDict *, QObject **, Error **);
+typedef void (QmpAsyncCommandFunc)(const QDict *, Error **, QmpCommandState *);
+typedef void (QmpProxyCommandFunc)(QDict *args, Error **errp, QmpCommandState *s);
+typedef void (QmpProxyCompletionFunc)(QmpCommandState *s, QDict *ret, Error **errp);
+
+typedef enum QmpCommandType
+{
+    QCT_NORMAL,
+    QCT_ASYNC,
+    QCT_PROXY,
+} QmpCommandType;
+
+typedef struct QmpCommand
+{
+    const char *name;
+    QmpCommandType type;
+    QmpCommandFunc *fn;
+    QmpAsyncCommandFunc *afn;
+    QmpProxyCommandFunc *pfn;
+    QTAILQ_ENTRY(QmpCommand) node;
+} QmpCommand;
+
+void qmp_register_command(const char *name, QmpCommandFunc *fn);
+void qmp_register_proxy_command(const char *name, QmpProxyCommandFunc *fn, QmpProxyCompletionFunc *cb);
+QmpCommand *qmp_find_command(const char *name);
+void qmp_async_complete_command(QmpCommandState *cmd, QObject *retval, Error *err);
+
+typedef void (SignalFunc)(void);
+
+typedef struct QmpSlot
+{
+    int handle;
+    SignalFunc *func;
+    void *opaque;
+    QTAILQ_ENTRY(QmpSlot) node;
+} QmpSlot;
+
+struct QmpSignal
+{
+    int max_handle;
+    int ref;
+    QTAILQ_HEAD(, QmpSlot) slots;
+};
+
+typedef struct QmpConnection
+{
+    QmpState *state;
+    const char *event_name;
+    QmpSignal *signal;
+    int handle;
+    int global_handle;
+    QTAILQ_ENTRY(QmpConnection) node;
+} QmpConnection;
+
+struct QmpState
+{
+    int (*add_connection)(QmpState *s, QmpConnection *conn);
+    void (*del_connection)(QmpState *s, int global_handle, Error **errp);
+    void (*event)(QmpState *s, QObject *data);
+    int (*get_fd)(QmpState *s);
+
+    QTAILQ_HEAD(, DefaultQmpConnection) default_connections;
+};
+
+
+QObject *qmp_dispatch(QmpState *state, QObject *request);
+void qmp_proxy_dispatch(const char *name, QDict *args, Error **errp, QmpCommandState *s);
+
+#endif
+