1 /* 2 * JSON streaming support 3 * 4 * Copyright IBM, Corp. 2009 5 * 6 * Authors: 7 * Anthony Liguori <aliguori (at) us.ibm.com> 8 * 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. 11 * 12 */ 13 14 #include "qlist.h" 15 #include "qint.h" 16 #include "qdict.h" 17 #include "qemu-common.h" 18 #include "json-lexer.h" 19 #include "json-streamer.h" 20 21 static void json_message_process_token(JSONLexer *lexer, QString *token, JSONTokenType type, int x, int y) 22 { 23 JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer); 24 QDict *dict; 25 26 if (type == JSON_OPERATOR) { 27 switch (qstring_get_str(token)[0]) { 28 case '{': 29 parser->brace_count++; 30 break; 31 case '}': 32 parser->brace_count--; 33 break; 34 case '[': 35 parser->bracket_count++; 36 break; 37 case ']': 38 parser->bracket_count--; 39 break; 40 default: 41 break; 42 } 43 } 44 45 dict = qdict_new(); 46 qdict_put(dict, "type", qint_from_int(type)); 47 QINCREF(token); 48 qdict_put(dict, "token", token); 49 qdict_put(dict, "x", qint_from_int(x)); 50 qdict_put(dict, "y", qint_from_int(y)); 51 52 qlist_append(parser->tokens, dict); 53 54 if (parser->brace_count == 0 && 55 parser->bracket_count == 0) { 56 parser->emit(parser, parser->tokens); 57 QDECREF(parser->tokens); 58 parser->tokens = qlist_new(); 59 } 60 } 61 62 void json_message_parser_init(JSONMessageParser *parser, 63 void (*func)(JSONMessageParser *, QList *)) 64 { 65 parser->emit = func; 66 parser->brace_count = 0; 67 parser->bracket_count = 0; 68 parser->tokens = qlist_new(); 69 70 json_lexer_init(&parser->lexer, json_message_process_token); 71 } 72 73 int json_message_parser_feed(JSONMessageParser *parser, 74 const char *buffer, size_t size) 75 { 76 return json_lexer_feed(&parser->lexer, buffer, size); 77 } 78 79 int json_message_parser_flush(JSONMessageParser *parser) 80 { 81 return json_lexer_flush(&parser->lexer); 82 } 83 84 void json_message_parser_destroy(JSONMessageParser *parser) 85 { 86 json_lexer_destroy(&parser->lexer); 87 QDECREF(parser->tokens); 88 } 89