diff options
author | Mamadou DIOP <bossiel@yahoo.fr> | 2015-08-17 01:56:35 +0200 |
---|---|---|
committer | Mamadou DIOP <bossiel@yahoo.fr> | 2015-08-17 01:56:35 +0200 |
commit | 631fffee8a28b1bec5ed1f1d26a20e0135967f99 (patch) | |
tree | 74afe3bf3efe15aa82bcd0272b2b0f4d48c2d837 /tinyMSRP/ragel | |
parent | 7908865936604036e6f200f1b5e069f8752f3a3a (diff) | |
download | doubango-631fffee8a28b1bec5ed1f1d26a20e0135967f99.zip doubango-631fffee8a28b1bec5ed1f1d26a20e0135967f99.tar.gz |
-
Diffstat (limited to 'tinyMSRP/ragel')
18 files changed, 2810 insertions, 0 deletions
diff --git a/tinyMSRP/ragel/tmsrp_machine_utils.rl b/tinyMSRP/ragel/tmsrp_machine_utils.rl new file mode 100644 index 0000000..6f8de96 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_machine_utils.rl @@ -0,0 +1,118 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +/**@file tsip_machine_utils.rl + * @brief Ragel file. + * + * @author Mamadou Diop <diopmamadou(at)doubango.org> + * + + */ +%%{ + + machine tmsrp_machine_utils; + + OCTET = "0x"[0-9A-Fa-f]+; + CHAR = 0x01..0x7f; + VCHAR = 0x21..0x7e; + ALPHA = 0x41..0x5a | 0x61..0x7a; + DIGIT = 0x30..0x39; + CTL = 0x00..0x1f | 0x7f; + HTAB = "\t"; + LF = "\n"; + CR = "\r"; + SP = " "; + DQUOTE = "\""; + BIT = "0" | "1"; + HEXDIG = DIGIT | "A"i | "B"i | "C"i | "D"i | "E"i | "F"i; + CRLF = CR LF; + WSP = SP | HTAB; + LWSP = ( WSP | ( CRLF WSP ) )*; + LWS = ( WSP* CRLF )? WSP+; + SWS = LWS?; + EQUAL = SWS "=" SWS; + LHEX = DIGIT | 0x61..0x66; + HCOLON = ( SP | HTAB )* ":" SWS; + separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | DQUOTE | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HTAB; + STAR = SWS "*" SWS; + SLASH = SWS "/" SWS; + LPAREN = SWS "(" SWS; + RPAREN = SWS ")" SWS; + COMMA = SWS "," SWS; + SEMI = SWS ";" SWS; + COLON = SWS ":" SWS; + LAQUOT = SWS "<"; + LDQUOT = SWS DQUOTE; + RAQUOT = ">" SWS; + RDQUOT = DQUOTE SWS; + UTF8_CONT = 0x80..0xbf; + ##### FIXME: UTF8_NONASCII up to 2bytes will fail on Android + UTF8_NONASCII = ( 0x80..0xff ); + #UTF8_NONASCII = ( 0xc0..0xdf UTF8_CONT ) | ( 0xe0..0xef UTF8_CONT{2} ) | ( 0xf0..0xf7 UTF8_CONT{3} ) | ( 0xf8..0xfb UTF8_CONT{4} ) | ( 0xfc..0xfd UTF8_CONT{5} ); ctext = 0x21..0x27 | 0x2a..0x5b | 0x5d..0x7e | UTF8_NONASCII | LWS; + qvalue = ( "0" ( "." DIGIT{,3} )? ) | ( "1" ( "." "0"{,3} )? ); + alphanum = ALPHA | DIGIT; + token = ( alphanum | "-" | "." | "!" | "%" | "*" | "_" | "+" | "`" | "'" | "~" )+; + ietf_token = token; + x_token = "x-"i token; + iana_token = token; + token_nodot = ( alphanum | "-" | "!" | "%" | "*" | "_" | "+" | "`" | "'" | "~" )+; + word = ( alphanum | "-" | "." | "!" | "%" | "*" | "_" | "+" | "`" | "'" | "~" | "(" | ")" | "<" | ">" | ":" | "\\" | DQUOTE | "/" | "[" | "]" | "?" | "{" | "}" )+; + domainlabel = alphanum | ( alphanum ( alphanum | "-" )* alphanum ); + toplabel = ALPHA | ( ALPHA ( alphanum | "-" )* alphanum ); + hostname = ( domainlabel "." )* toplabel "."?; + IPv4address = DIGIT{1,3} "." DIGIT{1,3} "." DIGIT{1,3} "." DIGIT{1,3}; + hex4 = HEXDIG{1,4}; + hexseq = hex4 ( ":" hex4 )*; + hexpart = hexseq | ( hexseq "::" hexseq? ) | ( "::" hexseq? ); + IPv6address = hexpart ( ":" IPv4address )?; + IPv6reference = "[" IPv6address "]"; + host = hostname | IPv4address | IPv6reference; + qdtext = LWS | "!" | 0x23..0x5b | 0x5d..0x7e | UTF8_NONASCII; + quoted_pair = "\\" ( 0x00..0x09 | 0x0b..0x0c | 0x0e..0x7f ); + quoted_string = SWS DQUOTE ( qdtext | quoted_pair )* DQUOTE; + gen_value = token | host | quoted_string; + generic_param = token ( EQUAL gen_value )?; + accept_param = ( "q"i EQUAL qvalue ) | generic_param; + mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"; + unreserved = alphanum | mark; + escaped = "%" HEXDIG HEXDIG; + user_unreserved = "&" | "=" | "+" | "$" | "," | ";" | "?" | "/"; + user = ( unreserved | escaped | user_unreserved )+; + visual_separator = "-" | "." | "(" | ")"; + phonedigit = DIGIT | visual_separator?; + global_number_digits = "+" phonedigit* DIGIT phonedigit*; + param_unreserved = "[" | "]" | "/" | ":" | "&" | "+" | "$"; + pct_encoded = "%" HEXDIG HEXDIG; + paramchar = param_unreserved | unreserved | pct_encoded; + pname = paramchar+; + pvalue = paramchar+; + parameter = ";" pname ( "=" pvalue )?; + port = DIGIT+; + + gen_delims = ":" | "/" | "?" | "#" | "[" | "]" | "@"; + sub_delims = "!" | "$" | "&" | "'" | "(" | ")" | "*" | "+" | "," | ";" | "="; + utf8text = (HTAB | 0x20..0x7e | UTF8_NONASCII)*; + UPALPHA = 0x41..0x5A; + hname = ALPHA *token; + hval = utf8text; + ident_char = alphanum | "." | "-" | "+" | "%" | "="; + ident = alphanum ident_char{3,31}; +}%% diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Authentication-Info.rl b/tinyMSRP/ragel/tmsrp_parser_header_Authentication-Info.rl new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Authentication-Info.rl diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Authorization.rl b/tinyMSRP/ragel/tmsrp_parser_header_Authorization.rl new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Authorization.rl diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl b/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl new file mode 100644 index 0000000..c64dce0 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl @@ -0,0 +1,189 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Byte_Range.c + * @brief MSRP 'Byte-Range' header. + */ +#include "tinymsrp/headers/tmsrp_header_Byte-Range.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Byte_Range; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_start{ + TSK_PARSER_SET_INTEGER_EX(hdr_Byte_Range->start, int64_t, atoi64); + } + + action parse_end{ + if(tag_start && *tag_start == '*'){ + hdr_Byte_Range->end = -1; + } + else{ + TSK_PARSER_SET_INTEGER_EX(hdr_Byte_Range->end, int64_t, atoi64); + } + } + + action parse_total{ + if(tag_start && *tag_start == '*'){ + hdr_Byte_Range->total = -1; + } + else{ + TSK_PARSER_SET_INTEGER_EX(hdr_Byte_Range->total, int64_t, atoi64); + } + } + + #// Byte-Range = "Byte-Range:" SP range-start "-" range-end "/" total + #//range-start = 1*DIGIT + #//range-end = 1*DIGIT / "*" + #//total = 1*DIGIT / "*" + Byte_Range = "Byte-Range:"i SP DIGIT+>tag %parse_start "-" (DIGIT+ | "*")>tag %parse_end "/" (DIGIT+ | "*")>tag %parse_total; + + # Entry point + main := Byte_Range :>CRLF?; + +}%% + +tmsrp_header_Byte_Range_t* tmsrp_header_Byte_Range_create(int64_t start, int64_t end, int64_t total) +{ + return tsk_object_new(TMSRP_HEADER_BYTE_RANGE_VA_ARGS(start, end, total)); +} + +tmsrp_header_Byte_Range_t* tmsrp_header_Byte_Range_create_null() +{ + return tmsrp_header_Byte_Range_create(1, -1, -1); +} + +int tmsrp_header_Byte_Range_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Byte_Range_t *Byte_Range = (const tmsrp_header_Byte_Range_t *)header; + tsk_istr_t start, end, total; + + if(Byte_Range->start>=0){ + tsk_itoa(Byte_Range->start, &start); + } + if(Byte_Range->end>=0){ + tsk_itoa(Byte_Range->end, &end); + } + if(Byte_Range->total>=0){ + tsk_itoa(Byte_Range->total, &total); + } + + return tsk_buffer_append_2(output, "%s-%s/%s", + Byte_Range->start>=0 ? start : "*", + Byte_Range->end>=0 ? end : "*", + Byte_Range->total>=0 ? total : "*" + ); + } + + return -1; +} + +tmsrp_header_Byte_Range_t *tmsrp_header_Byte_Range_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Byte_Range_t *hdr_Byte_Range = tmsrp_header_Byte_Range_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Byte_Range_first_final); + (void)(tmsrp_machine_parser_header_Byte_Range_error); + (void)(tmsrp_machine_parser_header_Byte_Range_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Byte-Range' header."); + TSK_OBJECT_SAFE_FREE(hdr_Byte_Range); + } + + return hdr_Byte_Range; +} + + + + + + + +//======================================================== +// Byte_Range header object definition +// + +static tsk_object_t* tmsrp_header_Byte_Range_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Byte_Range_t *Byte_Range = self; + if(Byte_Range){ + TMSRP_HEADER(Byte_Range)->type = tmsrp_htype_Byte_Range; + TMSRP_HEADER(Byte_Range)->tostring = tmsrp_header_Byte_Range_tostring; + + Byte_Range->start = va_arg(*app, int64_t); + Byte_Range->end = va_arg(*app, int64_t); + Byte_Range->total = va_arg(*app, int64_t); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Byte-Range header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Byte_Range_dtor(tsk_object_t *self) +{ + tmsrp_header_Byte_Range_t *Byte_Range = self; + if(Byte_Range){ + } + else{ + TSK_DEBUG_ERROR("Null Byte-Range header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Byte_Range_def_s = +{ + sizeof(tmsrp_header_Byte_Range_t), + tmsrp_header_Byte_Range_ctor, + tmsrp_header_Byte_Range_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Byte_Range_def_t = &tmsrp_header_Byte_Range_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl b/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl new file mode 100644 index 0000000..ff05b61 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl @@ -0,0 +1,178 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Content_Type.c + * @brief MSRP Content-Type header. + */ +#include "tinymsrp/headers/tmsrp_header_Content-Type.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/**@defgroup tmsrp_header_Content_Type_group MSRP Content_Type header. +*/ + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Content_Type; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_value{ + TSK_PARSER_SET_STRING(hdr_ctype->value); + } + + action parse_param{ + TSK_PARSER_ADD_PARAM(hdr_ctype->params); + } + + m_parameter = (pname (EQUAL pvalue)?)>tag %parse_param; + + m_type = token; + m_subtype = token; + + media_type = (m_type SLASH m_subtype)@1 >tag %parse_value ((SEMI m_parameter)*)@0; + + Content_Type = ( "Content-Type"i ) HCOLON media_type; + + # Entry point + main := Content_Type :>CRLF?; + +}%% + + +tmsrp_header_Content_Type_t* tmsrp_header_Content_Type_create(const char* type) +{ + return tsk_object_new(TMSRP_HEADER_CONTENT_TYPE_VA_ARGS(type)); +} + +tmsrp_header_Content_Type_t* tmsrp_header_Content_Type_create_null() +{ + return tmsrp_header_Content_Type_create(tsk_null); +} + +int tmsrp_header_Content_Type_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Content_Type_t *Content_Type = (const tmsrp_header_Content_Type_t *)header; + const tsk_list_item_t *item; + + if(Content_Type->value){ + tsk_buffer_append(output, Content_Type->value, tsk_strlen(Content_Type->value)); + } + // Params + tsk_list_foreach(item, Content_Type->params){ + tsk_buffer_append(output, ";", 1); + tsk_params_tostring(Content_Type->params, ';', output); + } + } + + return -1; +} + +tmsrp_header_Content_Type_t *tmsrp_header_Content_Type_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Content_Type_t *hdr_ctype = tmsrp_header_Content_Type_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Content_Type_first_final); + (void)(tmsrp_machine_parser_header_Content_Type_error); + (void)(tmsrp_machine_parser_header_Content_Type_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Content-Type' header."); + TSK_OBJECT_SAFE_FREE(hdr_ctype); + } + + return hdr_ctype; +} + + + + + + + +//======================================================== +// Content_Type header object definition +// + +/**@ingroup tmsrp_header_Content_Type_group +*/ +static tsk_object_t* tmsrp_header_Content_Type_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Content_Type_t *Content_Type = self; + if(Content_Type){ + TMSRP_HEADER(Content_Type)->type = tmsrp_htype_Content_Type; + TMSRP_HEADER(Content_Type)->tostring = tmsrp_header_Content_Type_tostring; + + Content_Type->value = tsk_strdup( va_arg(*app, const char*) ); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Content_Type header."); + } + return self; +} + +/**@ingroup tmsrp_header_Content_Type_group +*/ +static tsk_object_t* tmsrp_header_Content_Type_dtor(tsk_object_t *self) +{ + tmsrp_header_Content_Type_t *Content_Type = self; + if(Content_Type){ + TSK_FREE(Content_Type->value); + TSK_OBJECT_SAFE_FREE(Content_Type->params); + } + else{ + TSK_DEBUG_ERROR("Null Content-Type header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Content_Type_def_s = +{ + sizeof(tmsrp_header_Content_Type_t), + tmsrp_header_Content_Type_ctor, + tmsrp_header_Content_Type_dtor, + tsk_null +}; +const tsk_object_def_t *tmsrp_header_Content_Type_def_t = &tmsrp_header_Content_Type_def_s;
\ No newline at end of file diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl b/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl new file mode 100644 index 0000000..8552ed4 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl @@ -0,0 +1,161 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Dummy.c + * @brief MSRP Dummy header. + */ +#include "tinymsrp/headers/tmsrp_header_Dummy.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Dummy; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_hname{ + TSK_PARSER_SET_STRING(hdr_Dummy->name); + } + + action parse_hval{ + TSK_PARSER_SET_STRING(hdr_Dummy->value); + } + + #//hname ":" SP hval CRLF + Dummy = hname>tag %parse_hname :>SP* ":" SP*<: hval>tag %parse_hval; + + # Entry point + main := Dummy :>CRLF?; + +}%% + + +tmsrp_header_Dummy_t* tmsrp_header_Dummy_create(const char* name, const char* value) +{ + return tsk_object_new(TMSRP_HEADER_DUMMY_VA_ARGS(name, value)); +} + +tmsrp_header_Dummy_t* tmsrp_header_Dummy_create_null() +{ + return tmsrp_header_Dummy_create(tsk_null, tsk_null); +} + +int tmsrp_header_Dummy_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Dummy_t *Dummy = (const tmsrp_header_Dummy_t *)header; + if(Dummy->value){ + return tsk_buffer_append(output, Dummy->value, tsk_strlen(Dummy->value)); + } + return 0; + } + + return -1; +} + +tmsrp_header_Dummy_t *tmsrp_header_Dummy_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Dummy_t *hdr_Dummy = tmsrp_header_Dummy_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Dummy_first_final); + (void)(tmsrp_machine_parser_header_Dummy_error); + (void)(tmsrp_machine_parser_header_Dummy_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse Dummy header."); + TSK_OBJECT_SAFE_FREE(hdr_Dummy); + } + + return hdr_Dummy; +} + + + + + + + +//======================================================== +// Dummy header object definition +// + +static tsk_object_t* tmsrp_header_Dummy_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Dummy_t *Dummy = self; + if(Dummy){ + TMSRP_HEADER(Dummy)->type = tmsrp_htype_Dummy; + TMSRP_HEADER(Dummy)->tostring = tmsrp_header_Dummy_tostring; + + Dummy->name = tsk_strdup(va_arg(*app, const char*)); + Dummy->value = tsk_strdup(va_arg(*app, const char*)); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Dummy header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Dummy_dtor(tsk_object_t *self) +{ + tmsrp_header_Dummy_t *Dummy = self; + if(Dummy){ + TSK_FREE(Dummy->name); + TSK_FREE(Dummy->value); + } + else{ + TSK_DEBUG_ERROR("Null Dummy header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Dummy_def_s = +{ + sizeof(tmsrp_header_Dummy_t), + tmsrp_header_Dummy_ctor, + tmsrp_header_Dummy_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Dummy_def_t = &tmsrp_header_Dummy_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl b/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl new file mode 100644 index 0000000..ae5240e --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl @@ -0,0 +1,154 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Expires.c + * @brief MSRP 'Expires' header. + */ +#include "tinymsrp/headers/tmsrp_header_Expires.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Expires; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_value{ + TSK_PARSER_SET_INTEGER_EX(hdr_Expires->value, int64_t, atoi64) + } + + #// "Expires:" SP 1*DIGIT + Expires = "Expires:"i SP DIGIT+>tag %parse_value; + + # Entry point + main := Expires :>CRLF?; + +}%% + + +tmsrp_header_Expires_t* tmsrp_header_Expires_create(int64_t value) +{ + return tsk_object_new(TMSRP_HEADER_EXPIRES_VA_ARGS(value)); +} + +tmsrp_header_Expires_t* tmsrp_header_Expires_create_null() +{ + return tmsrp_header_Expires_create(-1); +} + +int tmsrp_header_Expires_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Expires_t *Expires = (const tmsrp_header_Expires_t *)header; + if(Expires->value>=0){ + return tsk_buffer_append_2(output, "%lld", Expires->value); + } + return 0; + } + + return -1; +} + +tmsrp_header_Expires_t *tmsrp_header_Expires_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Expires_t *hdr_Expires = tmsrp_header_Expires_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Expires_first_final); + (void)(tmsrp_machine_parser_header_Expires_error); + (void)(tmsrp_machine_parser_header_Expires_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Expires' header."); + TSK_OBJECT_SAFE_FREE(hdr_Expires); + } + + return hdr_Expires; +} + + + + + + + +//======================================================== +// Expires header object definition +// + +static tsk_object_t* tmsrp_header_Expires_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Expires_t *Expires = self; + if(Expires){ + TMSRP_HEADER(Expires)->type = tmsrp_htype_Message_ID; + TMSRP_HEADER(Expires)->tostring = tmsrp_header_Expires_tostring; + + Expires->value = va_arg(*app, int64_t); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Expires header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Expires_dtor(tsk_object_t *self) +{ + tmsrp_header_Expires_t *Expires = self; + if(Expires){ + } + else{ + TSK_DEBUG_ERROR("Null Expires header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Expires_def_s = +{ + sizeof(tmsrp_header_Expires_t), + tmsrp_header_Expires_ctor, + tmsrp_header_Expires_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Expires_def_t = &tmsrp_header_Expires_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Failure-Report.rl b/tinyMSRP/ragel/tmsrp_parser_header_Failure-Report.rl new file mode 100644 index 0000000..30bd29b --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Failure-Report.rl @@ -0,0 +1,154 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Failure_Report.c + * @brief MSRP 'Failure-Report' header. + */ +#include "tinymsrp/headers/tmsrp_header_Failure-Report.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Failure_Report; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action is_yes{ + hdr_Failure_Report->type = freport_yes; + } + + action is_no{ + hdr_Failure_Report->type = freport_no; + } + + action ispartial{ + hdr_Failure_Report->type = freport_partial; + } + + #// "Failure-Report:" ( "yes" / "no" / "partial" ) + Failure_Report = "Failure-Report:"i SP ("yes"i %is_yes | "no"i %is_no | "partial"i %ispartial); + + # Entry point + main := Failure_Report :>CRLF?; + +}%% + + +tmsrp_header_Failure_Report_t* tmsrp_header_Failure_Report_create(tmsrp_freport_type_t freport_type) +{ + return tsk_object_new(TMSRP_HEADER_FAILURE_REPORT_VA_ARGS(freport_type)); +} + +tmsrp_header_Failure_Report_t* tmsrp_header_Failure_Report_create_null() +{ + return tmsrp_header_Failure_Report_create(freport_yes); +} + +int tmsrp_header_Failure_Report_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Failure_Report_t *Failure_Report = (const tmsrp_header_Failure_Report_t *)header; + const char* value = (Failure_Report->type == freport_yes) ? "yes" : (Failure_Report->type == freport_no ? "no" : "partial"); + return tsk_buffer_append(output, value, tsk_strlen(value)); + } + + return -1; +} + +tmsrp_header_Failure_Report_t *tmsrp_header_Failure_Report_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Failure_Report_t *hdr_Failure_Report = tmsrp_header_Failure_Report_create_null(); + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Failure_Report_first_final); + (void)(tmsrp_machine_parser_header_Failure_Report_error); + (void)(tmsrp_machine_parser_header_Failure_Report_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Failure-Report' header."); + TSK_OBJECT_SAFE_FREE(hdr_Failure_Report); + } + + return hdr_Failure_Report; +} + + + + + + + +//======================================================== +// Failure_Report header object definition +// + +static tsk_object_t* tmsrp_header_Failure_Report_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Failure_Report_t *Failure_Report = self; + if(Failure_Report){ + TMSRP_HEADER(Failure_Report)->type = tmsrp_htype_Failure_Report; + TMSRP_HEADER(Failure_Report)->tostring = tmsrp_header_Failure_Report_tostring; + + Failure_Report->type = va_arg(*app, tmsrp_freport_type_t); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Failure-Report header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Failure_Report_dtor(tsk_object_t *self) +{ + tmsrp_header_Failure_Report_t *Failure_Report = self; + if(Failure_Report){ + } + else{ + TSK_DEBUG_ERROR("Null Failure-Report header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Failure_Report_def_s = +{ + sizeof(tmsrp_header_Failure_Report_t), + tmsrp_header_Failure_Report_ctor, + tmsrp_header_Failure_Report_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Failure_Report_def_t = &tmsrp_header_Failure_Report_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl b/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl new file mode 100644 index 0000000..fd79f6d --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl @@ -0,0 +1,197 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_From_Path.c + * @brief MSRP "From-Path" header. + */ +#include "tinymsrp/headers/tmsrp_header_From-Path.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_From_Path; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_uri{ + int len = (int)(p - tag_start); + tmsrp_uri_t* uri; + if((uri = tmsrp_uri_parse(tag_start, (tsk_size_t)len))){ + if(!header->uri){ + header->uri = uri; + } + else{ + if(!header->otherURIs){ + header->otherURIs = tsk_list_create(); + } + tsk_list_push_back_data(header->otherURIs, ((void**) &uri)); + } + } + } + + MSRP_URI = (any -- SP)* >tag %parse_uri; + + #//"From-Path:" SP MSRP-URI *( SP MSRP-URI ) + From_Path = "From-Path:"i SP MSRP_URI (SP <:MSRP_URI)*; + + # Entry point + main := From_Path :>CRLF?; + +}%% + + +tmsrp_header_From_Path_t* tmsrp_header_From_Path_create(const tmsrp_uri_t* uri) +{ + return tsk_object_new(TMSRP_HEADER_FROM_PATH_VA_ARGS(uri)); +} + +tmsrp_header_From_Path_t* tmsrp_header_From_Path_create_null() +{ + return tmsrp_header_From_Path_create(tsk_null); +} + +int tmsrp_header_From_Path_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_From_Path_t *From_Path = (const tmsrp_header_From_Path_t *)header; + const tsk_list_item_t *item; + + if(From_Path->uri){ + tmsrp_uri_serialize(From_Path->uri, output); + } + tsk_list_foreach(item, From_Path->otherURIs){ + tsk_buffer_append(output, " ", 1); + tmsrp_uri_serialize(TMSRP_URI(item->data), output); + } + } + + return -1; +} + +tmsrp_header_From_Path_t *tmsrp_header_From_Path_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_From_Path_t *header = tmsrp_header_From_Path_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_From_Path_first_final); + (void)(tmsrp_machine_parser_header_From_Path_error); + (void)(tmsrp_machine_parser_header_From_Path_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'From-Path' header."); + TSK_OBJECT_SAFE_FREE(header); + } + + return header; +} + + +tmsrp_header_From_Path_t *tmsrp_header_From_Path_clone(const tmsrp_header_From_Path_t* From_Path) +{ + tmsrp_header_From_Path_t* clone = tsk_null; + + if(!From_Path){ + goto bail; + } + + clone = tmsrp_header_From_Path_create_null(); + clone->uri = tmsrp_uri_clone(From_Path->uri); + if(From_Path->otherURIs){ + tsk_list_item_t *item; + clone->otherURIs = tsk_list_create(); + + tsk_list_foreach(item, From_Path->otherURIs){ + tmsrp_uri_t *uri = tmsrp_uri_clone(TMSRP_URI(item->data)); + tsk_list_push_back_data(clone->otherURIs, (void**)&uri); + } + } + +bail: + return clone; +} + + + + +//======================================================== +// From_Path header object definition +// + +static tsk_object_t* tmsrp_header_From_Path_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_From_Path_t *From_Path = self; + if(From_Path){ + TMSRP_HEADER(From_Path)->type = tmsrp_htype_From_Path; + TMSRP_HEADER(From_Path)->tostring = tmsrp_header_From_Path_tostring; + + From_Path->uri = tsk_object_ref((void*)va_arg(*app, const tmsrp_uri_t*)); + } + else{ + TSK_DEBUG_ERROR("Failed to create new From-Path header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_From_Path_dtor(tsk_object_t *self) +{ + tmsrp_header_From_Path_t *From_Path = self; + if(From_Path){ + TSK_OBJECT_SAFE_FREE(From_Path->uri); + TSK_OBJECT_SAFE_FREE(From_Path->otherURIs); + } + else{ + TSK_DEBUG_ERROR("Null From-Path header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_From_Path_def_s = +{ + sizeof(tmsrp_header_From_Path_t), + tmsrp_header_From_Path_ctor, + tmsrp_header_From_Path_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_From_Path_def_t = &tmsrp_header_From_Path_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl b/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl new file mode 100644 index 0000000..9929227 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl @@ -0,0 +1,154 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Max_Expires.c + * @brief MSRP 'Max-Expires' header. + */ +#include "tinymsrp/headers/tmsrp_header_Max-Expires.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Max_Expires; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_value{ + TSK_PARSER_SET_INTEGER_EX(hdr_Max_Expires->value, int64_t, atoi64) + } + + #// "Max-Expires:" SP 1*DIGIT + Max_Expires = "Max-Expires:"i SP DIGIT+>tag %parse_value; + + # Entry point + main := Max_Expires :>CRLF?; + +}%% + + +tmsrp_header_Max_Expires_t* tmsrp_header_Max_Expires_create(int64_t value) +{ + return tsk_object_new(TMSRP_HEADER_MAX_EXPIRES_VA_ARGS(value)); +} + +tmsrp_header_Max_Expires_t* tmsrp_header_Max_Expires_create_null() +{ + return tmsrp_header_Max_Expires_create(-1); +} + +int tmsrp_header_Max_Expires_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Max_Expires_t *Max_Expires = (const tmsrp_header_Max_Expires_t *)header; + if(Max_Expires->value>=0){ + return tsk_buffer_append_2(output, "%lld", Max_Expires->value); + } + return 0; + } + + return -1; +} + +tmsrp_header_Max_Expires_t *tmsrp_header_Max_Expires_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Max_Expires_t *hdr_Max_Expires = tmsrp_header_Max_Expires_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Max_Expires_first_final); + (void)(tmsrp_machine_parser_header_Max_Expires_error); + (void)(tmsrp_machine_parser_header_Max_Expires_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Max-Expires' header."); + TSK_OBJECT_SAFE_FREE(hdr_Max_Expires); + } + + return hdr_Max_Expires; +} + + + + + + + +//======================================================== +// Max-Expires header object definition +// + +static tsk_object_t* tmsrp_header_Max_Expires_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Max_Expires_t *Max_Expires = self; + if(Max_Expires){ + TMSRP_HEADER(Max_Expires)->type = tmsrp_htype_Max_Expires; + TMSRP_HEADER(Max_Expires)->tostring = tmsrp_header_Max_Expires_tostring; + + Max_Expires->value = va_arg(*app, int64_t); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Max-Expires header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Max_Expires_dtor(tsk_object_t *self) +{ + tmsrp_header_Max_Expires_t *Max_Expires = self; + if(Max_Expires){ + } + else{ + TSK_DEBUG_ERROR("Null Max-Expires header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Max_Expires_def_s = +{ + sizeof(tmsrp_header_Max_Expires_t), + tmsrp_header_Max_Expires_ctor, + tmsrp_header_Max_Expires_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Max_Expires_def_t = &tmsrp_header_Max_Expires_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl b/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl new file mode 100644 index 0000000..3997cfa --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl @@ -0,0 +1,158 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Message_Id.c + * @brief MSRP 'Message-Id' header. + * + */ +#include "tinymsrp/headers/tmsrp_header_Message-ID.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Message_Id; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_id{ + TSK_PARSER_SET_STRING(hdr_Message_Id->value); + } + + #// "Message-ID:" SP ident + Message_Id = "Message-ID:"i SP ident>tag %parse_id; + + # Entry point + main := Message_Id :>CRLF?; + +}%% + + +tmsrp_header_Message_ID_t* tmsrp_header_Message_ID_create(const char* value) +{ + return tsk_object_new(TMSRP_HEADER_MESSAGE_ID_VA_ARGS(value)); +} + +tmsrp_header_Message_ID_t* tmsrp_header_Message_ID_create_null() +{ + return tmsrp_header_Message_ID_create(tsk_null); +} + + +int tmsrp_header_Message_ID_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header) + { + const tmsrp_header_Message_ID_t *Message_Id = (const tmsrp_header_Message_ID_t *)header; + if(Message_Id->value){ + return tsk_buffer_append(output, Message_Id->value, tsk_strlen(Message_Id->value)); + } + return 0; + } + + return -1; +} + +tmsrp_header_Message_ID_t *tmsrp_header_Message_ID_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Message_ID_t *hdr_Message_Id = tmsrp_header_Message_ID_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Message_Id_first_final); + (void)(tmsrp_machine_parser_header_Message_Id_error); + (void)(tmsrp_machine_parser_header_Message_Id_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Message-Id' header."); + TSK_OBJECT_SAFE_FREE(hdr_Message_Id); + } + + return hdr_Message_Id; +} + + + + + + + +//======================================================== +// Message_Id header object definition +// + +static tsk_object_t* tmsrp_header_Message_ID_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Message_ID_t *Message_Id = self; + if(Message_Id){ + TMSRP_HEADER(Message_Id)->type = tmsrp_htype_Message_ID; + TMSRP_HEADER(Message_Id)->tostring = tmsrp_header_Message_ID_tostring; + + Message_Id->value = tsk_strdup(va_arg(*app, const char*)); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Message-Id header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Message_ID_dtor(tsk_object_t *self) +{ + tmsrp_header_Message_ID_t *Message_Id = self; + if(Message_Id){ + TSK_FREE(Message_Id->value); + } + else{ + TSK_DEBUG_ERROR("Null Message-Id header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Message_ID_def_s = +{ + sizeof(tmsrp_header_Message_ID_t), + tmsrp_header_Message_ID_ctor, + tmsrp_header_Message_ID_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Message_ID_def_t = &tmsrp_header_Message_ID_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl b/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl new file mode 100644 index 0000000..0329c24 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl @@ -0,0 +1,154 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Min_Expires.c + * @brief MSRP 'Min-Expires' header. + */ +#include "tinymsrp/headers/tmsrp_header_Min-Expires.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Min_Expires; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_value{ + TSK_PARSER_SET_INTEGER_EX(hdr_Min_Expires->value, int64_t, atoi64) + } + + #// "Min-Expires:" SP 1*DIGIT + Min_Expires = "Min-Expires:"i SP DIGIT+>tag %parse_value; + + # Entry point + main := Min_Expires :>CRLF?; + +}%% + + +tmsrp_header_Min_Expires_t* tmsrp_header_Min_Expires_create(int64_t value) +{ + return tsk_object_new(TMSRP_HEADER_MIN_EXPIRES_VA_ARGS(value)); +} + +tmsrp_header_Min_Expires_t* tmsrp_header_Min_Expires_create_null() +{ + return tmsrp_header_Min_Expires_create(-1); +} + +int tmsrp_header_Min_Expires_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Min_Expires_t *Min_Expires = (const tmsrp_header_Min_Expires_t *)header; + if(Min_Expires->value>=0){ + return tsk_buffer_append_2(output, "%lld", Min_Expires->value); + } + return 0; + } + + return -1; +} + +tmsrp_header_Min_Expires_t *tmsrp_header_Min_Expires_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Min_Expires_t *hdr_Min_Expires = tmsrp_header_Min_Expires_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Min_Expires_first_final); + (void)(tmsrp_machine_parser_header_Min_Expires_error); + (void)(tmsrp_machine_parser_header_Min_Expires_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Min-Expires' header."); + TSK_OBJECT_SAFE_FREE(hdr_Min_Expires); + } + + return hdr_Min_Expires; +} + + + + + + + +//======================================================== +// Min-Expires header object definition +// + +static tsk_object_t* tmsrp_header_Min_Expires_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Min_Expires_t *Min_Expires = self; + if(Min_Expires){ + TMSRP_HEADER(Min_Expires)->type = tmsrp_htype_Min_Expires; + TMSRP_HEADER(Min_Expires)->tostring = tmsrp_header_Min_Expires_tostring; + + Min_Expires->value = va_arg(*app, int64_t); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Min-Expires header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Min_Expires_dtor(tsk_object_t *self) +{ + tmsrp_header_Min_Expires_t *Min_Expires = self; + if(Min_Expires){ + } + else{ + TSK_DEBUG_ERROR("Null Min-Expires header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Min_Expires_def_s = +{ + sizeof(tmsrp_header_Min_Expires_t), + tmsrp_header_Min_Expires_ctor, + tmsrp_header_Min_Expires_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Min_Expires_def_t = &tmsrp_header_Min_Expires_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Status.rl b/tinyMSRP/ragel/tmsrp_parser_header_Status.rl new file mode 100644 index 0000000..2c3a31e --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Status.rl @@ -0,0 +1,177 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Status.c + * @brief MSRP 'Status' header. + */ +#include "tinymsrp/headers/tmsrp_header_Status.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Status; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_namespace{ + TSK_PARSER_SET_INT(hdr_Status->_namespace); + } + + action parse_code{ + TSK_PARSER_SET_INT(hdr_Status->code); + } + + action parse_reason{ + TSK_PARSER_SET_STRING(hdr_Status->reason); + } + + #/// @par ABNF : Status = "Status:" SP namespace SP status-code [SP text-reason] + #/// namespace = 3(DIGIT) ; "000" for all codes defined in RFC 4975 + #/// text-reason = utf8text + Status = "Status:"i SP DIGIT{3}>tag %parse_namespace SP DIGIT{3}>tag %parse_code (SP utf8text>tag %parse_reason)?; + + # Entry point + main := Status :>CRLF?; + +}%% + + + +tmsrp_header_Status_t* tmsrp_header_Status_create(short _namespace, short code, const char* reason) +{ + return tsk_object_new(TMSRP_HEADER_STATUS_VA_ARGS(_namespace, code, reason)); +} + +tmsrp_header_Status_t* tmsrp_header_Status_create_null() +{ + return tmsrp_header_Status_create(0, 200, tsk_null); +} + + +int tmsrp_header_Status_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Status_t *Status = (const tmsrp_header_Status_t *)header; + + // Status: 000 200 OK + return tsk_buffer_append_2(output, "%.3hi %.3hi%s%s", + Status->_namespace, + Status->code, + Status->reason ? " " : "", + Status->reason ? Status->reason : "" + ); + } + + return -1; +} + +tmsrp_header_Status_t *tmsrp_header_Status_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Status_t *hdr_Status = tmsrp_header_Status_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Status_first_final); + (void)(tmsrp_machine_parser_header_Status_error); + (void)(tmsrp_machine_parser_header_Status_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Status' header."); + TSK_OBJECT_SAFE_FREE(hdr_Status); + } + + return hdr_Status; +} + + + + + + + +//======================================================== +// Status header object definition +// + +static tsk_object_t* tmsrp_header_Status_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Status_t *Status = self; + if(Status){ + TMSRP_HEADER(Status)->type = tmsrp_htype_Status; + TMSRP_HEADER(Status)->tostring = tmsrp_header_Status_tostring; +#if defined(__GNUC__) + Status->_namespace = (short)va_arg(*app, int); + Status->code = (short)va_arg(*app, int); +#else + Status->_namespace = va_arg(*app, short); + Status->code = va_arg(*app, short); +#endif + Status->reason = tsk_strdup( va_arg(*app, const char*) ); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Status header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Status_dtor(tsk_object_t *self) +{ + tmsrp_header_Status_t *Status = self; + if(Status){ + TSK_FREE(Status->reason); + } + else{ + TSK_DEBUG_ERROR("Null Status header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Status_def_s = +{ + sizeof(tmsrp_header_Status_t), + tmsrp_header_Status_ctor, + tmsrp_header_Status_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Status_def_t = &tmsrp_header_Status_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Success-Report.rl b/tinyMSRP/ragel/tmsrp_parser_header_Success-Report.rl new file mode 100644 index 0000000..e89610d --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Success-Report.rl @@ -0,0 +1,149 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Success_Report.c + * @brief MSRP 'Success-Report' header. + */ +#include "tinymsrp/headers/tmsrp_header_Success-Report.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Success_Report; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action is_yes{ + hdr_Success_Report->yes = 1; + } + + action is_no{ + hdr_Success_Report->yes = 0; + } + + #// "Success-Report:" ( "yes" / "no" ) + Success_Report = "Success-Report:"i SP ("yes"i %is_yes | "no"i %is_no); + + # Entry point + main := Success_Report :>CRLF?; + +}%% + +tmsrp_header_Success_Report_t* tmsrp_header_Success_Report_create(tsk_bool_t isSuccess) +{ + return tsk_object_new(TMSRP_HEADER_SUCCESS_REPORT_VA_ARGS(isSuccess)); +} + +tmsrp_header_Success_Report_t* tmsrp_header_Success_Report_create_null() +{ + return tmsrp_header_Success_Report_create(tsk_false); +} + +int tmsrp_header_Success_Report_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Success_Report_t *Success_Report = (const tmsrp_header_Success_Report_t *)header; + const char* value = Success_Report->yes ? "yes" : "no"; + return tsk_buffer_append(output, value, tsk_strlen(value)); + } + + return -1; +} + +tmsrp_header_Success_Report_t *tmsrp_header_Success_Report_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Success_Report_t *hdr_Success_Report = tmsrp_header_Success_Report_create_null(); + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Success_Report_first_final); + (void)(tmsrp_machine_parser_header_Success_Report_error); + (void)(tmsrp_machine_parser_header_Success_Report_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Success-Report' header."); + TSK_OBJECT_SAFE_FREE(hdr_Success_Report); + } + + return hdr_Success_Report; +} + + + + + + + +//======================================================== +// Success_Report header object definition +// + +static tsk_object_t* tmsrp_header_Success_Report_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Success_Report_t *Success_Report = self; + if(Success_Report){ + TMSRP_HEADER(Success_Report)->type = tmsrp_htype_Success_Report; + TMSRP_HEADER(Success_Report)->tostring = tmsrp_header_Success_Report_tostring; + + Success_Report->yes = va_arg(*app, tsk_bool_t) ? 1 : 0; + } + else{ + TSK_DEBUG_ERROR("Failed to create new Success-Report header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Success_Report_dtor(tsk_object_t *self) +{ + tmsrp_header_Success_Report_t *Success_Report = self; + if(Success_Report){ + } + else{ + TSK_DEBUG_ERROR("Null Success-Report header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Success_Report_def_s = +{ + sizeof(tmsrp_header_Success_Report_t), + tmsrp_header_Success_Report_ctor, + tmsrp_header_Success_Report_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Success_Report_def_t = &tmsrp_header_Success_Report_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl b/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl new file mode 100644 index 0000000..6817f2f --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl @@ -0,0 +1,196 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_To_Path.c + * @brief MSRP "To-Path" header. + */ +#include "tinymsrp/headers/tmsrp_header_To-Path.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_To_Path; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_uri{ + int len = (int)(p - tag_start); + tmsrp_uri_t* uri; + if((uri = tmsrp_uri_parse(tag_start, (tsk_size_t)len))){ + if(!header->uri){ + header->uri = uri; + } + else{ + if(!header->otherURIs){ + header->otherURIs = tsk_list_create(); + } + tsk_list_push_back_data(header->otherURIs, ((void**) &uri)); + } + } + } + + MSRP_URI = (any -- SP)* >tag %parse_uri; + + #//"To-Path:" SP MSRP-URI *( SP MSRP-URI ) + To_Path = "To-Path:"i SP MSRP_URI (SP <:MSRP_URI)*; + + # Entry point + main := To_Path :>CRLF?; + +}%% + +tmsrp_header_To_Path_t* tmsrp_header_To_Path_create(const tmsrp_uri_t* uri) +{ + return tsk_object_new(TMSRP_HEADER_TO_PATH_VA_ARGS(uri)); +} + +tmsrp_header_To_Path_t* tmsrp_header_To_Path_create_null() +{ + return tmsrp_header_To_Path_create(tsk_null); +} + +int tmsrp_header_To_Path_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_To_Path_t *To_Path = (const tmsrp_header_To_Path_t *)header; + const tsk_list_item_t *item; + + if(To_Path->uri){ + tmsrp_uri_serialize(To_Path->uri, output); + } + tsk_list_foreach(item, To_Path->otherURIs){ + tsk_buffer_append(output, " ", 1); + tmsrp_uri_serialize(TMSRP_URI(item->data), output); + } + } + + return -1; +} + +tmsrp_header_To_Path_t *tmsrp_header_To_Path_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_To_Path_t *header = tmsrp_header_To_Path_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_To_Path_first_final); + (void)(tmsrp_machine_parser_header_To_Path_error); + (void)(tmsrp_machine_parser_header_To_Path_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'To-Path' header."); + TSK_OBJECT_SAFE_FREE(header); + } + + return header; +} + +tmsrp_header_To_Path_t *tmsrp_header_To_Path_clone(const tmsrp_header_To_Path_t* To_Path) +{ + tmsrp_header_To_Path_t* clone = tsk_null; + + if(!To_Path){ + goto bail; + } + + clone = tmsrp_header_To_Path_create_null(); + clone->uri = tmsrp_uri_clone(To_Path->uri); + if(To_Path->otherURIs){ + tsk_list_item_t *item; + clone->otherURIs = tsk_list_create(); + + tsk_list_foreach(item, To_Path->otherURIs){ + tmsrp_uri_t *uri = tmsrp_uri_clone(TMSRP_URI(item->data)); + tsk_list_push_back_data(clone->otherURIs, (void**)&uri); + } + } + +bail: + return clone; +} + + + + + +//======================================================== +// To_Path header object definition +// + +static tsk_object_t* tmsrp_header_To_Path_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_To_Path_t *To_Path = self; + if(To_Path){ + TMSRP_HEADER(To_Path)->type = tmsrp_htype_To_Path; + TMSRP_HEADER(To_Path)->tostring = tmsrp_header_To_Path_tostring; + + To_Path->uri = tsk_object_ref((void*)va_arg(*app, const tmsrp_uri_t*)); + } + else{ + TSK_DEBUG_ERROR("Failed to create new To-Path header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_To_Path_dtor(tsk_object_t *self) +{ + tmsrp_header_To_Path_t *To_Path = self; + if(To_Path){ + TSK_OBJECT_SAFE_FREE(To_Path->uri); + TSK_OBJECT_SAFE_FREE(To_Path->otherURIs); + } + else{ + TSK_DEBUG_ERROR("Null To-Path header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_To_Path_def_s = +{ + sizeof(tmsrp_header_To_Path_t), + tmsrp_header_To_Path_ctor, + tmsrp_header_To_Path_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_To_Path_def_t = &tmsrp_header_To_Path_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl b/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl new file mode 100644 index 0000000..69db84e --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl @@ -0,0 +1,180 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Use_Path.c + * @brief MSRP "Use-Path" header. + */ +#include "tinymsrp/headers/tmsrp_header_Use-Path.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_header_Use_Path; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action parse_uri{ + int len = (int)(p - tag_start); + tmsrp_uri_t* uri; + if((uri = tmsrp_uri_parse(tag_start, (tsk_size_t)len))){ + if(!header->uri){ + header->uri = uri; + } + else{ + if(!header->otherURIs){ + header->otherURIs = tsk_list_create(); + } + tsk_list_push_back_data(header->otherURIs, ((void**) &uri)); + } + } + } + + MSRP_URI = (any -- SP)* >tag %parse_uri; + + #//"Use-Path:" SP MSRP-URI *( SP MSRP-URI ) + Use_Path = "Use-Path:"i SP MSRP_URI (SP <:MSRP_URI)*; + + # Entry point + main := Use_Path :>CRLF?; + +}%% + + + +tmsrp_header_Use_Path_t* tmsrp_header_Use_Path_create(const tmsrp_uri_t* uri) +{ + return tsk_object_new(TMSRP_HEADER_USE_PATH_VA_ARGS(uri)); +} + +tmsrp_header_Use_Path_t* tmsrp_header_Use_Path_create_null() +{ + return tmsrp_header_Use_Path_create(tsk_null); +} + +int tmsrp_header_Use_Path_tostring(const tmsrp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const tmsrp_header_Use_Path_t *Use_Path = (const tmsrp_header_Use_Path_t *)header; + const tsk_list_item_t *item; + + if(Use_Path->uri){ + tmsrp_uri_serialize(Use_Path->uri, output); + } + tsk_list_foreach(item, Use_Path->otherURIs){ + tsk_buffer_append(output, " ", 1); + tmsrp_uri_serialize(TMSRP_URI(item->data), output); + } + } + + return -1; +} + +tmsrp_header_Use_Path_t *tmsrp_header_Use_Path_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_header_Use_Path_t *header = tmsrp_header_Use_Path_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_header_Use_Path_first_final); + (void)(tmsrp_machine_parser_header_Use_Path_error); + (void)(tmsrp_machine_parser_header_Use_Path_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse 'Use-Path' header."); + TSK_OBJECT_SAFE_FREE(header); + } + + return header; +} + + + + + + + +//======================================================== +// Use_Path header object definition +// + +static tsk_object_t* tmsrp_header_Use_Path_ctor(tsk_object_t *self, va_list * app) +{ + tmsrp_header_Use_Path_t *Use_Path = self; + if(Use_Path){ + const tmsrp_uri_t* uri = va_arg(*app, const tmsrp_uri_t*); + + TMSRP_HEADER(Use_Path)->type = tmsrp_htype_Use_Path; + TMSRP_HEADER(Use_Path)->tostring = tmsrp_header_Use_Path_tostring; + + if(uri){ + Use_Path->uri = tsk_object_ref((void*)uri); + } + } + else{ + TSK_DEBUG_ERROR("Failed to create new Use-Path header."); + } + return self; +} + +static tsk_object_t* tmsrp_header_Use_Path_dtor(tsk_object_t *self) +{ + tmsrp_header_Use_Path_t *Use_Path = self; + if(Use_Path){ + TSK_OBJECT_SAFE_FREE(Use_Path->uri); + TSK_OBJECT_SAFE_FREE(Use_Path->otherURIs); + } + else{ + TSK_DEBUG_ERROR("Null Use-Path header."); + } + + return self; +} + +static const tsk_object_def_t tmsrp_header_Use_Path_def_s = +{ + sizeof(tmsrp_header_Use_Path_t), + tmsrp_header_Use_Path_ctor, + tmsrp_header_Use_Path_dtor, + tsk_null +}; + +const tsk_object_def_t *tmsrp_header_Use_Path_def_t = &tmsrp_header_Use_Path_def_s; diff --git a/tinyMSRP/ragel/tmsrp_parser_message.rl b/tinyMSRP/ragel/tmsrp_parser_message.rl new file mode 100644 index 0000000..4961158 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_message.rl @@ -0,0 +1,357 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +/**@file tmsrp_machine_message.rl + * @brief Ragel file. + */ +#include "tinymsrp/parsers/tmsrp_parser_message.h" + +#include "tinymsrp/headers/tmsrp_header_Dummy.h" +#include "tinymsrp/headers/tmsrp_header_Expires.h" +#include "tinymsrp/headers/tmsrp_header_Max-Expires.h" +#include "tinymsrp/headers/tmsrp_header_Min-Expires.h" +#include "tinymsrp/headers/tmsrp_header_Use-Path.h" +#include "tinymsrp/headers/tmsrp_header_WWW-Authenticate.h" + +#include "tsk_string.h" +#include "tsk_memory.h" +#include "tsk_debug.h" + +static tsk_bool_t parse_payload(tmsrp_message_t* msrp_msg, const char* tag_start, const char** p, const char* pe, tsk_bool_t* payload_parsed); +static void set_payload(tmsrp_message_t* msrp_msg, const void* ptr, tsk_size_t len); + +#define TMSRP_MSG_PARSER_ADD_HEADER(name) \ + if((header = (tmsrp_header_t*)tmsrp_header_##name##_parse(tag_start, (p - tag_start)))){ \ + tmsrp_message_add_header(msrp_msg, header); \ + header = tsk_object_unref(header); \ + } +%%{ + machine tmsrp_machine_message; + + ########################################### + # Includes + ########################################### + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + ########################################### + # Actions + ########################################### + action parse_Authentication_Info{ + //FIXME: TMSRP_MSG_PARSER_ADD_HEADER(Authentication_Info); + TSK_DEBUG_WARN("Authentication_Info Not implemented"); + } + + action parse_Authorization{ + //FIXME: TMSRP_MSG_PARSER_ADD_HEADER(Authorization); + TSK_DEBUG_WARN("Authorization Not implemented"); + } + + action parse_Byte_Range{ + TMSRP_MSG_PARSER_ADD_HEADER(Byte_Range); + } + + action parse_Content_Type{ + TMSRP_MSG_PARSER_ADD_HEADER(Content_Type); + } + + action parse_Expires{ + TMSRP_MSG_PARSER_ADD_HEADER(Expires); + } + + action parse_Failure_Report{ + TMSRP_MSG_PARSER_ADD_HEADER(Failure_Report); + } + + action parse_From_Path{ + TMSRP_MSG_PARSER_ADD_HEADER(From_Path); + } + + action parse_Max_Expires{ + TMSRP_MSG_PARSER_ADD_HEADER(Max_Expires); + } + + action parse_Message_ID{ + TMSRP_MSG_PARSER_ADD_HEADER(Message_ID); + } + + action parse_Min_Expires{ + TMSRP_MSG_PARSER_ADD_HEADER(Min_Expires); + } + + action parse_Status{ + TMSRP_MSG_PARSER_ADD_HEADER(Status); + } + + action parse_Success_Report{ + TMSRP_MSG_PARSER_ADD_HEADER(Success_Report); + } + + action parse_To_Path{ + TMSRP_MSG_PARSER_ADD_HEADER(To_Path); + } + + action parse_Use_Path{ + TMSRP_MSG_PARSER_ADD_HEADER(Use_Path); + } + + action parse_WWW_Authenticate{ + TMSRP_MSG_PARSER_ADD_HEADER(WWW_Authenticate); + } + + action parse_Dummy{ + TMSRP_MSG_PARSER_ADD_HEADER(Dummy); + } + + action parse_tid{ + TSK_PARSER_SET_STRING(msrp_msg->tid); + } + + action parse_method{ + if(msrp_msg->type == tmsrp_unknown){ + msrp_msg->type = tmsrp_request; + TSK_PARSER_SET_STRING(msrp_msg->line.request.method); + msrp_msg->line.request.type = tmsrp_request_get_type(msrp_msg->line.request.method); + } + else{ + //cs = %%{ write first_final; }%%; + cs = tmsrp_machine_message_error; + TSK_DEBUG_ERROR("Message type already defined."); + } + } + + + action parse_status_code{ + if(msrp_msg->type == tmsrp_unknown){ + msrp_msg->type = tmsrp_response; + TSK_PARSER_SET_INT(msrp_msg->line.response.status); + } + else{ + //cs = %%{ write first_final; }%%; + cs = tmsrp_machine_message_error; + TSK_DEBUG_ERROR("Message type already defined."); + } + } + action parse_comment{ + TSK_PARSER_SET_STRING(msrp_msg->line.response.comment); + } + + + action try_parse_data{ + parse_payload(msrp_msg, tag_start, &p, pe, &payload_parsed); // will update "p" + } + + action parse_data{ + // if the msrp message contain a valid content-type, then gob it otherwise continue until we reach the endline + int len; + if(parse_payload(msrp_msg, tag_start, &p, pe, &payload_parsed)){ // will update "p" + // (This space left deliberately blank) + } + else if((len = (int)(p - tag_start))>0){ + set_payload(msrp_msg, tag_start, (tsk_size_t)len); + } + } + + action parse_endtid{ + TSK_PARSER_SET_STRING(msrp_msg->end_line.tid); + } + + action parse_cflag{ + if(tag_start){ + msrp_msg->end_line.cflag = *tag_start; + } + else msrp_msg->end_line.cflag = '#'; + } + + action outside_endline{ + *msg_size = (p - (const char*)input) + 1; + } + + action into_endline{ + into_endline = tsk_true; + } + action endtid_match{ + ( into_endline || (((pe-p) >7/*seven hyphens*/) && (msrp_msg->tid) && tsk_strniequals(msrp_msg->tid, (p+7), tsk_strlen(msrp_msg->tid))) ) + } + + + ########################################### + # Headers + ########################################### + + Authentication_Info = "Authentication-Info:"i SP any* :>CRLF %parse_Authentication_Info; + Authorization = "Authorization:"i SP any* :>CRLF %parse_Authorization; + Byte_Range = "Byte-Range:"i SP any* :>CRLF %parse_Byte_Range; + Content_Type = "Content-Type:"i SP any* :>CRLF %parse_Content_Type; + Expires = "Expires:"i SP any* :>CRLF %parse_Expires; + Failure_Report = "Failure-Report:"i SP any* :>CRLF %parse_Failure_Report ; + From_Path = "From-Path:"i SP any* :>CRLF %parse_From_Path ; + Max_Expires = "Max-Expires:"i SP any* :>CRLF %parse_Max_Expires; + Message_ID = "Message-ID:"i SP any* :>CRLF %parse_Message_ID; + Min_Expires = "Min-Expires:"i SP any* :>CRLF %parse_Min_Expires; + Status = "Status:"i SP any* :>CRLF %parse_Status; + Success_Report = "Success-Report:"i SP any* :>CRLF %parse_Success_Report; + To_Path = "To-Path:"i SP any* :>CRLF %parse_To_Path; + Use_Path = "Use-Path:"i SP any* :>CRLF %parse_Use_Path; + WWW_Authenticate = "WWW-Authenticate:"i SP any* :>CRLF %parse_WWW_Authenticate; + + Dummy = hname ":" SP hval :>CRLF %parse_Dummy; + + header = (Authentication_Info | Authorization | Byte_Range | Content_Type | Expires | Failure_Report | From_Path | Max_Expires | Message_ID | Min_Expires | Status | Success_Report | To_Path | Use_Path | WWW_Authenticate)>tag @10 | (Dummy>tag) @0; + + #headers = To_Path From_Path ( header )*; + headers = ( header )*; + + ########################################### + # Utils + ########################################### + transact_id = ident; + method = UPALPHA*; + status_code = DIGIT{3}; + comment = utf8text; + + continuation_flag = "+" | "$" | "#"; + end_line = "-------" transact_id>tag %parse_endtid continuation_flag>tag %parse_cflag CRLF; + + Other_Mime_header = Dummy; + + data = any*; + + ########################################### + # Request + ########################################### + req_start = "MSRP" SP transact_id>tag %parse_tid SP method>tag %parse_method CRLF; + #content_stuff = (Other_Mime_header)* CRLF data>tag %parse_data :>CRLF; + content_stuff = data>tag >try_parse_data %parse_data; + msrp_request = req_start headers>10 (CRLF content_stuff CRLF)?>5 :>end_line when endtid_match >into_endline; + + ########################################### + # Response + ########################################### + resp_start = "MSRP" SP transact_id>tag %parse_tid SP status_code>tag %parse_status_code (SP comment>tag %parse_comment)? CRLF; + msrp_response = resp_start headers end_line; + + ########################################### + # Message + ########################################### + msrp_req_or_resp = (msrp_request | msrp_response)>1 @outside_endline any*>0; + + ########################################### + # Entry Point + ########################################### + main := msrp_req_or_resp; +}%% + +TSK_RAGEL_DISABLE_WARNINGS_BEGIN() +/* Ragel data */ +%% write data; +TSK_RAGEL_DISABLE_WARNINGS_END() + +tmsrp_message_t* tmsrp_message_parse(const void *input, tsk_size_t size) +{ + tsk_size_t msg_size; + return tmsrp_message_parse_2(input, size, &msg_size); +} + +tmsrp_message_t* tmsrp_message_parse_2(const void *input, tsk_size_t size, tsk_size_t* msg_size) +{ + tmsrp_message_t* msrp_msg = tsk_null; + const char* tag_start = tsk_null; + tmsrp_header_t* header = tsk_null; + tsk_bool_t into_endline = tsk_false; + tsk_bool_t payload_parsed = tsk_false; + + /* Ragel variables */ + int cs = 0; + const char* p = input; + const char* pe = p + size; + const char* eof = tsk_null; + + (void)(eof); + (void)(tmsrp_machine_message_first_final); + (void)(tmsrp_machine_message_error); + (void)(tmsrp_machine_message_en_main); + + *msg_size = 0; + + if(!input || !size){ + //TSK_DEBUG_ERROR("Null or empty buffer."); // --> very common case(stream): do not bother us... + goto bail; + } + + if(!(msrp_msg = tmsrp_message_create_null())){ + goto bail; + } + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + /* Ragel init */ + %% write init; + + /* Ragel execute */ + %% write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + /* Check result */ + if( cs < %%{ write first_final; }%% ){ + //TSK_DEBUG_ERROR("Failed to parse MSRP message."); --> very common case(stream): do not bother us... + TSK_OBJECT_SAFE_FREE(msrp_msg); + goto bail; + } + +bail: + return msrp_msg; +} + +static tsk_bool_t parse_payload(tmsrp_message_t* msrp_msg, const char* tag_start, const char** p, const char* pe, tsk_bool_t* payload_parsed) +{ + int64_t payload_len, endline_len; + tsk_bool_t can_parse_payload; + + if(*payload_parsed){ + TSK_DEBUG_INFO("payload already parsed"); + return tsk_true; + } + + if(pe && p && *p && msrp_msg && (can_parse_payload = TMSRP_HEADER_BYTE_RANGE_IS_VALID(msrp_msg->ByteRange))){ + payload_len = (msrp_msg->ByteRange->end - msrp_msg->ByteRange->start) + 1; + endline_len = 2/*CRLF*/ + 7/*hyphens*/ + tsk_strlen(msrp_msg->tid) + 2/*CRLF*/; + can_parse_payload = (pe - tag_start) > (payload_len + endline_len); + if(can_parse_payload){ + set_payload(msrp_msg, tag_start, (tsk_size_t)payload_len); + *p = ((tag_start + payload_len) - 1); + *payload_parsed = tsk_true; + return tsk_true; + } + } + return tsk_false; +} + +static void set_payload(tmsrp_message_t* msrp_msg, const void* ptr, tsk_size_t len) +{ + if(msrp_msg->Content){ + tsk_buffer_cleanup(msrp_msg->Content); + tsk_buffer_append(msrp_msg->Content, ptr, len); + } + else{ + msrp_msg->Content = tsk_buffer_create(ptr, len); + } +}
\ No newline at end of file diff --git a/tinyMSRP/ragel/tmsrp_parser_uri.rl b/tinyMSRP/ragel/tmsrp_parser_uri.rl new file mode 100644 index 0000000..da46488 --- /dev/null +++ b/tinyMSRP/ragel/tmsrp_parser_uri.rl @@ -0,0 +1,134 @@ +/* +* Copyright (C) 2009-2015 Mamadou DIOP. +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmsrp_header_Dummy.c + * @brief MSRP Dummy header. + */ +#include "tinymsrp/parsers/tmsrp_parser_uri.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" + +#include <string.h> + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmsrp_machine_parser_uri; + + # Includes + include tmsrp_machine_utils "./ragel/tmsrp_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + #/* Sets HOST type */ + action is_ipv4 { uri->authority.host_type = tmsrp_host_ipv4; } + action is_ipv6 { uri->authority.host_type = tmsrp_host_ipv6; } + action is_hostname { uri->authority.host_type = tmsrp_host_hostname; } + + action parse_scheme{ + TSK_PARSER_SET_STRING(uri->scheme); + } + + action parse_userinfo{ + TSK_PARSER_SET_STRING(uri->authority.userinfo); + } + + action parse_host{ + TSK_PARSER_SET_STRING(uri->authority.host); + if(uri->authority.host_type == tmsrp_host_ipv6){ + tsk_strunquote_2(&uri->authority.host, '[', ']'); + } + } + + action parse_port{ + TSK_PARSER_SET_INT(uri->authority.port); + } + + action parse_session_id{ + TSK_PARSER_SET_STRING(uri->session_id); + } + + action parse_transport{ + TSK_PARSER_SET_STRING(uri->transport); + } + + action parse_param{ + TSK_PARSER_ADD_PARAM(uri->params); + } + + + + #//MSRP-URI = msrp-scheme "://" authority ["/" session-id] ";" transport *( ";" URI-parameter) + #//msrp-scheme = "msrp" / "msrps" + #//session-id = 1*( unreserved / "+" / "=" / "/" ) + #//transport = "tcp" / 1*ALPHANUM + #//URI-parameter = token ["=" token] + #//authority = [ userinfo "@" ] host [ ":" port ] + + msrp_scheme = ("msrp" | "msrps")>tag %parse_scheme; + + userinfo = (unreserved | pct_encoded | sub_delims | ":")* >tag %parse_userinfo; + myhost = ((IPv6reference >is_ipv6)>2 | (IPv4address >is_ipv4)>1 | (hostname >is_hostname)>0)>tag %parse_host; + authority = (userinfo "@")? myhost (":" port>tag %parse_port)?; + + session_id = (unreserved | "+" | "=" | "/")+ >tag %parse_session_id; + + transport = ("tcp" | alphanum*)>tag %parse_transport; + + URI_parameter = (token ("=" token)?)>tag %parse_param; + + URI = msrp_scheme "://" authority ("/" session_id)? ";" transport ( ";" URI_parameter)*; + + # Entry point + main := URI; +}%% + +tmsrp_uri_t *tmsrp_uri_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + tmsrp_uri_t *uri = tmsrp_uri_create_null(); + + const char *tag_start = tsk_null; + + TSK_RAGEL_DISABLE_WARNINGS_BEGIN() + %%write data; + (void)(eof); + (void)(tmsrp_machine_parser_uri_first_final); + (void)(tmsrp_machine_parser_uri_error); + (void)(tmsrp_machine_parser_uri_en_main); + %%write init; + %%write exec; + TSK_RAGEL_DISABLE_WARNINGS_END() + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse MSRP/MSRPS header."); + TSK_OBJECT_SAFE_FREE(uri); + } + + return uri; +}
\ No newline at end of file |