JsonWriter& end(char closing_bracket) { begin_token(CLOSING); if (brackets.top() != closing_bracket) throw error("unmatched bracket"); brackets.pop(); os << closing_bracket; last_token = VALUE; return *this; }
void begin_config(const std::string& block, int *pln, int *pcode, int *cp) throw(ParserError) { string block_name(block); ConfigSection* section = g_Config.getSection(block_name); if (section == NULL) { g_throw_parser_error("unrecognized config section '", block_name.c_str(), "'"); } // Don't do config blocks in safe mode (except in RC file) GLEInterface* iface = GLEGetInterfacePointer(); if (iface->getCmdLine()->hasOption(GLE_OPT_SAFEMODE)) { GLEGlobalConfig* config = iface->getConfig(); if (!config->allowConfigBlocks()) { g_throw_parser_error("safe mode - config blocks not allowed"); } } // Start with pcode from the next line (*pln)++; begin_init(); while (true) { int st = begin_token(&pcode,cp,pln,srclin,tk,&ntk,outbuff); if (!st) { /* exit loop */ break; } int ct = 1; int mode = 0; bool plus_is = false; CmdLineOption* option = NULL; while (ct <= ntk) { skipspace; if (section != NULL) { if (mode == 0) { option = section->getOption(tk[ct]); if (option == NULL) { gprint("Not a valid setting for section '%s': {%s}\n", block_name.c_str(), tk[ct]); } } else if (mode == 1) { if (strcmp(tk[ct], "=") == 0) { plus_is = false; } else if (strcmp(tk[ct], "+=") == 0) { plus_is = true; } else { gprint("Expected '=' or '+=', not {%s}\n", tk[ct]); } } else if (option != NULL) { CmdLineOptionArg* arg = option->getArg(0); if (!plus_is) arg->reset(); arg->appendValue(tk[ct]); } mode++; } ct++; } } }
static utility_retcode_t parse_one_header(struct rtsp_response *response) { utility_retcode_t ret = UTILITY_SUCCESS; char *start_value; char *header_name = response->current_header.name; char *header_value = response->current_header.value; FUNC_ENTER; ret = utility_copy_token(header_name, MAX_HEADER_NAME_LEN, response->parsep, ": ", NULL); if (UTILITY_SUCCESS != ret) { ERRR("Failed to copy header name\n"); goto out; } start_value = begin_token(response->parsep, ": "); ret = utility_copy_token(header_value, MAX_HEADER_VALUE_LEN, start_value, "\r\n", NULL); if (UTILITY_SUCCESS != ret) { ERRR("Failed to copy header value\n"); goto out; } DEBG("Found header name: \"%s\" value: \"%s\"\n", header_name, header_value); if (0 == syscalls_strcmp(header_name, "Content-Length")) { ret = parse_content_length(response); } else if (0 == syscalls_strcmp(header_name, "Apple-Response")) { ret = parse_apple_response(response); } else if (0 == syscalls_strcmp(header_name, "Audio-Jack-Status")) { ret = parse_audio_jack_status(response); } else if (0 == syscalls_strcmp(header_name, "Session")) { ret = parse_session(response); } else if (0 == syscalls_strcmp(header_name, "Transport")) { ret = parse_transport(response); } else if (0 == syscalls_strcmp(header_name, "Public")) { ret = parse_public(response); } else { parse_unknown_header(response); } out: FUNC_RETURN; return ret; }
JsonWriter& begin(char opening_bracket) { begin_token(OPENING); char closing_bracket; if (opening_bracket == '{') closing_bracket = '}'; else if (opening_bracket == '[') closing_bracket = ']'; else throw error("invalid bracket"); brackets.push(closing_bracket); os << opening_bracket; return *this; }
static utility_retcode_t parse_transport(struct rtsp_response *response) { char *value = response->current_header.value; char *port_string; FUNC_ENTER; DEBG("value: \"%s\"\n", value); port_string = begin_token(value, "server_port="); response->session->port = syscalls_strtoul(port_string, NULL, 0); INFO("Session IP port: %d\n", response->session->port); FUNC_RETURN; return UTILITY_SUCCESS; }
static utility_retcode_t next_line(struct rtsp_response *response) { utility_retcode_t ret = UTILITY_SUCCESS; char *nextline; FUNC_ENTER; nextline = begin_token((const char *)response->parsep, "\r\n"); if (NULL == nextline) { ERRR("Could not find beginning of next line in response\n"); ret = UTILITY_FAILURE; } else { response->parsep = nextline; } FUNC_RETURN; return ret; }
static utility_retcode_t get_status_code(struct rtsp_response *response) { utility_retcode_t ret = UTILITY_SUCCESS; char *begincode; char code[4]; FUNC_ENTER; begincode = begin_token((const char *)response->parsep, " "); if (NULL == begincode) { ERRR("Could not find beginning of status " "code in status line\n"); goto failed; } ret = utility_copy_token(code, sizeof(code), begincode, " ", NULL); if (UTILITY_SUCCESS != ret) { ERRR("Could not find status code in response status line\n"); goto failed; } DEBG("status code string is \"%s\"\n", code); response->status_line.status_code = syscalls_strtoul(code, NULL, 0); INFO("response status code is: %d\n", response->status_line.status_code); ret = UTILITY_SUCCESS; goto out; failed: ret = UTILITY_FAILURE; out: FUNC_RETURN; return ret; }
JsonWriter& value(bool t) { begin_token(VALUE); if (t) os << "true"; else os << "false"; return *this; }
JsonWriter& value(double n) { begin_token(VALUE); os << n; return *this; }
JsonWriter& null_value() { begin_token(VALUE); os << "null"; return *this; }
JsonWriter& value(const char *str) { begin_token(VALUE); write_string(str); return *this; }
JsonWriter& key(const char *key) { begin_token(KEY); write_string(key); os << ':'; return *this; }