ecs: fix build errors
authorSeokYeon Hwang <syeon.hwang@samsung.com>
Tue, 22 Dec 2015 04:01:10 +0000 (13:01 +0900)
committerChulHo Song <ch81.song@samsung.com>
Tue, 22 Dec 2015 08:09:09 +0000 (17:09 +0900)
Change-Id: Iebe782bd96e3a16ef28ad7030ae8ce3835d71401
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com>
Signed-off-by: ChulHo Song <ch81.song@samsung.com>
qmp-commands.hx
tizen/src/ecs/ecs-json-streamer.c
tizen/src/ecs/ecs-json-streamer.h
tizen/src/ecs/ecs.h
tizen/src/ecs/ecs_mon.c

index 13f9fd38f0ad170a4fb54d181f1bdef67fbe7cef..19054c341fdf0d51e482d8dfd02c4a45cb6d9e0f 100644 (file)
@@ -1756,7 +1756,7 @@ EQMP
     {
         .name       = "get_link",
         .args_type  = "name:s",
-        .mhandler.cmd_new = qmp_marshal_input_get_link,
+        .mhandler.cmd_new = qmp_marshal_get_link,
     },
 
 SQMP
index 6a1061b8860ef4baf6ba4bf6eae55622fe1c5c33..cd4842a54e4d3bc3da27bc8b972e573fe16cca46 100644 (file)
  *
  */
 
-#include "qapi/qmp/qlist.h"
-#include "qapi/qmp/qint.h"
-#include "qapi/qmp/qdict.h"
 #include "qapi/qmp/json-lexer.h"
 #include "qemu-common.h"
 #include "ecs-json-streamer.h"
 
 #define MAX_TOKEN_SIZE (64ULL << 20)
+#define MAX_TOKEN_COUNT (2ULL << 20)
 #define MAX_NESTING (1ULL << 10)
 
-static void ecs_json_message_process_token(JSONLexer *lexer, QString *token, JSONTokenType type, int x, int y)
+static void json_message_free_tokens(JSONMessageParser *parser)
+{
+    if (parser->tokens) {
+        g_queue_free(parser->tokens);
+        parser->tokens = NULL;
+    }
+}
+
+static void ecs_json_message_process_token(JSONLexer *lexer, GString *input,
+                                       JSONTokenType type, int x, int y)
 {
     JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
-    QDict *dict;
-
-    if (type == JSON_OPERATOR) {
-        switch (qstring_get_str(token)[0]) {
-        case '{':
-            parser->brace_count++;
-            break;
-        case '}':
-            parser->brace_count--;
-            break;
-        case '[':
-            parser->bracket_count++;
-            break;
-        case ']':
-            parser->bracket_count--;
-            break;
-        default:
-            break;
-        }
+    JSONToken *token;
+
+    switch (type) {
+    case JSON_LCURLY:
+        parser->brace_count++;
+        break;
+    case JSON_RCURLY:
+        parser->brace_count--;
+        break;
+    case JSON_LSQUARE:
+        parser->bracket_count++;
+        break;
+    case JSON_RSQUARE:
+        parser->bracket_count--;
+        break;
+    default:
+        break;
     }
 
-    dict = qdict_new();
-    qdict_put(dict, "type", qint_from_int(type));
-    QINCREF(token);
-    qdict_put(dict, "token", token);
-    qdict_put(dict, "x", qint_from_int(x));
-    qdict_put(dict, "y", qint_from_int(y));
+    token = g_malloc(sizeof(JSONToken) + input->len + 1);
+    token->type = type;
+    memcpy(token->str, input->str, input->len);
+    token->str[input->len] = 0;
+    token->x = x;
+    token->y = y;
 
-    parser->token_size += token->length;
+    parser->token_size += input->len;
 
-    qlist_append(parser->tokens, dict);
+    g_queue_push_tail(parser->tokens, token);
 
     if (type == JSON_ERROR) {
         goto out_emit_bad;
@@ -64,41 +69,39 @@ static void ecs_json_message_process_token(JSONLexer *lexer, QString *token, JSO
          parser->bracket_count == 0)) {
         goto out_emit;
     } else if (parser->token_size > MAX_TOKEN_SIZE ||
-               parser->bracket_count > MAX_NESTING ||
-               parser->brace_count > MAX_NESTING) {
+               g_queue_get_length(parser->tokens) > MAX_TOKEN_COUNT ||
+               parser->bracket_count + parser->brace_count > MAX_NESTING) {
         /* Security consideration, we limit total memory allocated per object
          * and the maximum recursion depth that a message can force.
          */
-        goto out_emit;
+        goto out_emit_bad;
     }
 
     return;
 
 out_emit_bad:
-    /* clear out token list and tell the parser to emit and error
+    /*
+     * Clear out token list and tell the parser to emit an error
      * indication by passing it a NULL list
      */
-    QDECREF(parser->tokens);
-    parser->tokens = NULL;
+    json_message_free_tokens(parser);
 out_emit:
     /* send current list of tokens to parser and reset tokenizer */
     parser->brace_count = 0;
     parser->bracket_count = 0;
+    /* parser->emit takes ownership of parser->tokens.  */
     parser->emit(parser, parser->tokens, parser->opaque);
-    if (parser->tokens) {
-        QDECREF(parser->tokens);
-    }
-    parser->tokens = qlist_new();
+    parser->tokens = g_queue_new();
     parser->token_size = 0;
 }
 
 void ecs_json_message_parser_init(JSONMessageParser *parser,
-                              void (*func)(JSONMessageParser *, QList *, void *), void *opaque)
+                              void (*func)(JSONMessageParser *, GQueue *, void *), void *opaque)
 {
     parser->emit = func;
     parser->brace_count = 0;
     parser->bracket_count = 0;
-    parser->tokens = qlist_new();
+    parser->tokens = g_queue_new();
     parser->token_size = 0;
     parser->opaque = opaque;
 
@@ -119,5 +122,5 @@ int ecs_json_message_parser_flush(JSONMessageParser *parser)
 void ecs_json_message_parser_destroy(JSONMessageParser *parser)
 {
     json_lexer_destroy(&parser->lexer);
-    QDECREF(parser->tokens);
+    json_message_free_tokens(parser);
 }
index 7a93f5b48311860e0353612788fe4f5b62ccd7b6..7b86247ffa81eec721bb46579d38f015991a9129 100644 (file)
 #ifndef QEMU_JSON_STREAMER_H
 #define QEMU_JSON_STREAMER_H
 
-#include "qapi/qmp/qlist.h"
 #include "qapi/qmp/json-lexer.h"
 
+typedef struct JSONToken {
+    int type;
+    int x;
+    int y;
+    char str[];
+} JSONToken;
+
 typedef struct JSONMessageParser
 {
-    void (*emit)(struct JSONMessageParser *parser, QList *tokens, void *);
+    void (*emit)(struct JSONMessageParser *parser, GQueue *tokens, void *);
     JSONLexer lexer;
     int brace_count;
     int bracket_count;
-    QList *tokens;
+    GQueue *tokens;
     uint64_t token_size;
        void *opaque;
 } JSONMessageParser;
 
 void ecs_json_message_parser_init(JSONMessageParser *parser,
-                              void (*func)(JSONMessageParser *, QList *, void *), void *opaque);
+                              void (*func)(JSONMessageParser *, GQueue *, void *), void *opaque);
 
 int ecs_json_message_parser_feed(JSONMessageParser *parser,
                              const char *buffer, size_t size);
index c1657f9fcbaabd2850393609edb623f97095c7c6..fbfdae4864cbccf1aaecbb61387da858d472548e 100644 (file)
@@ -247,6 +247,6 @@ void req_set_sensor_accel_angle(int angle);
 void set_injector_data(const char* data);
 
 /* Monitor */
-void handle_qmp_command(JSONMessageParser *parser, QList *tokens, void *opaque);
+void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens, void *opaque);
 
 #endif /* __ECS_H__ */
index be9dde8d97ac8355a81ff9d60616451601d10572..48a12e599d92dbd0687ff2e3f335a50edc19539b 100644 (file)
@@ -37,6 +37,7 @@
 #include "qmp-commands.h"
 #include "qapi/qmp/qjson.h"
 #include "qapi/qmp/json-parser.h"
+#include "qmp-introspect.h"
 
 #include "ecs.h"
 #include "hw/virtio/maru_virtio_evdi.h"
@@ -230,6 +231,12 @@ static void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp) {
 static void qmp_capabilities(QDict *params, QObject **ret_data, Error **errp) {
 }
 
+static void qmp_query_qmp_schema(QDict *qdict, QObject **ret_data,
+                                 Error **errp)
+{
+    *ret_data = qobject_from_json(qmp_schema_json);
+}
+
 static const mon_cmd_t qmp_cmds[] = {
 #include "qmp-commands-old.h"
         { /* NULL */}, };
@@ -475,8 +482,9 @@ static const mon_cmd_t *qmp_find_cmd(const char *cmdname) {
     return search_dispatch_table(qmp_cmds, cmdname);
 }
 
-void handle_qmp_command(JSONMessageParser *parser, QList *tokens,
-        void *opaque) {
+void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens,
+        void *opaque)
+{
     Error *local_err = NULL;
     QObject *obj;
     QDict *input, *args;
@@ -533,6 +541,7 @@ void handle_qmp_command(JSONMessageParser *parser, QList *tokens,
 err_out:
     ecs_protocol_emitter(clii, NULL, NULL, local_err);
 out:
+    error_free(local_err);
     QDECREF(input);
     QDECREF(args);
 }
@@ -543,4 +552,3 @@ bool msgproc_monitor_req(ECS_Client *ccli, ECS__MonitorReq* msg)
     ecs_json_message_parser_feed(&(ccli->parser), (const char *) msg->command, strlen(msg->command));
     return true;
 }
-