#ifndef _wsd_parser_h #define _wsd_parser_h #include #include #include "constants.h" #include "extensions.h" #include "message.h" #include "observer.h" #include "stream_reader.h" #include "util.h" typedef struct wsd_Parser wsd_Parser; wsd_Parser * wsd_Parser_create(wsd_Extensions *extensions, wsd_Observer *observer, int require_masking); void wsd_Parser_destroy(wsd_Parser *parser); int wsd_Parser_parse(wsd_Parser *parser, size_t length, uint8_t *data); void wsd_Parser_parse_head(wsd_Parser *parser, wsd_Chunk *chunk); int wsd_Parser_valid_opcode(int opcode); int wsd_Parser_control_opcode(int opcode); int wsd_Parser_message_opcode(int opcode); int wsd_Parser_opening_opcode(int opcode); void wsd_Parser_parse_extended_length(wsd_Parser *parser, wsd_Chunk *chunk); int wsd_Parser_check_frame_length(wsd_Parser *parser); size_t wsd_Parser_parse_payload(wsd_Parser *parser); void wsd_Parser_emit_frame(wsd_Parser *parser); int wsd_Parser_valid_close_code(int code); void wsd_Parser_emit_message(wsd_Parser *parser); #define WSD_PARSER_ERROR(P, C, M, ...) \ if (P->error_code == 0) { \ P->stage = 0; \ P->error_code = C; \ asprintf(&P->error_reason, M, ##__VA_ARGS__); \ wsd_Observer_on_error(P->observer, P->error_code, P->error_reason); \ } #endif