00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "parser_h248.hpp"
00021 #include "iostream_t.hpp"
00022 #include <regex.h>
00023 #include "string_t.hpp"
00024 #include "Utils.hpp"
00025
00026
00027 C_ProtocolFrame::T_MsgError parse_h248 (char *P_buf,
00028 size_t *P_size,
00029 char *P_buf_header,
00030 size_t P_size_header) {
00031
00032 C_ProtocolFrame::T_MsgError L_error = C_ProtocolFrame::E_MSG_ERROR_DECODING_SIZE_LESS ;
00033
00034 size_t L_size = *P_size ;
00035 int L_nb_acc = 1 ;
00036 size_t L_i = 0 ;
00037
00038 while (L_size) {
00039 switch (P_buf[L_i]) {
00040 case '{':
00041 L_nb_acc++ ;
00042 break ;
00043 case '}':
00044 L_nb_acc-- ;
00045 break ;
00046 default :
00047 break ;
00048 }
00049 L_size-- ;
00050
00051 L_i++;
00052
00053 if (L_nb_acc == 0) {
00054 L_error = C_ProtocolFrame::E_MSG_OK ;
00055 *P_size -= (L_i+1) ;
00056 break ;
00057 }
00058 }
00059
00060 return (L_error) ;
00061 }
00062
00063
00064 char* skip_blank(char *P_ptr,
00065 char *P_buffer,
00066 size_t P_size_buffer,
00067 size_t *P_size) {
00068
00069 char *L_blank_ptr = NULL ;
00070 char *L_new_ptr = P_ptr ;
00071
00072
00073 L_blank_ptr = P_ptr ;
00074 while (((L_blank_ptr) && (L_blank_ptr < (P_buffer + P_size_buffer))) &&
00075 ((*L_blank_ptr == ' ') ||
00076 (*L_blank_ptr == '\t'))) { L_blank_ptr++ ; }
00077 if (L_blank_ptr != P_ptr) {
00078 *(P_size) = (L_blank_ptr - P_ptr) ;
00079 L_new_ptr = L_blank_ptr ;
00080 }
00081
00082 return (L_new_ptr) ;
00083 }
00084
00085
00086 char * filter_h248(char* P_buffer) {
00087
00088 size_t L_size = 0 ;
00089
00090 size_t L_size_buffer = 0 ;
00091 size_t L_size_end = 0 ;
00092
00093 char *L_pos = NULL ;
00094 char *L_ptr = P_buffer ;
00095
00096 char *L_result = NULL ;
00097 char *L_new = NULL ;
00098
00099 bool L_skip_blank = true ;
00100 size_t L_size_blank = 0 ;
00101
00102
00103 if ((P_buffer != NULL) &&
00104 ((L_size_buffer = strlen(P_buffer)) > 0 )) {
00105
00106 L_size_end = L_size_buffer ;
00107
00108 ALLOC_TABLE(L_result,
00109 char*,
00110 sizeof(char),
00111 L_size_buffer);
00112
00113 if ((strchr(L_ptr,'\n')) == NULL) {
00114 L_new = L_result ;
00115 L_size = L_size_buffer ;
00116
00117
00118 if (L_skip_blank) {
00119 L_ptr = skip_blank(L_ptr,P_buffer, L_size_buffer, &L_size_blank) ;
00120 L_size -= L_size_blank ;
00121 }
00122
00123 memcpy(L_new, L_ptr, L_size);
00124 L_new += (L_size+1) ;
00125
00126 *L_new = '\0' ;
00127 *(L_new-1) = '\n' ;
00128
00129 } else {
00130
00131
00132 while( (L_ptr)
00133 && (L_pos = strchr(L_ptr,'\n')) != NULL) {
00134
00135 L_size_blank = 0 ;
00136
00137 L_size = L_pos - L_ptr ;
00138
00139 if (L_skip_blank) {
00140 L_ptr = skip_blank(L_ptr,P_buffer, L_size_buffer, &L_size_blank) ;
00141 L_size -= L_size_blank ;
00142 L_size_end -= L_size_blank ;
00143 }
00144
00145 if (L_new == NULL) { L_new = L_result ; } else { L_new += 1 ; }
00146 memcpy(L_new, L_ptr, L_size);
00147
00148 L_new += L_size ;
00149
00150 if ((L_pos + 1) <= (P_buffer+L_size_buffer)) {
00151 L_ptr = L_pos + 1 ;
00152 } else {
00153 L_ptr = NULL ;
00154 }
00155
00156 L_size_end -= (L_size + 1) ;
00157
00158 *(L_new) = '\n' ;
00159
00160 }
00161
00162
00163
00164 if (L_size_end > 0) {
00165
00166 L_size = L_size_end ;
00167 L_size_blank = 0 ;
00168
00169
00170 if (L_skip_blank) {
00171 L_ptr = skip_blank(L_ptr,P_buffer, L_size_buffer, &L_size_blank) ;
00172 L_size -= L_size_blank ;
00173 }
00174
00175
00176 if (L_size) {
00177 L_new +=1 ;
00178
00179 memcpy(L_new, L_ptr, L_size);
00180 L_new += (L_size+1) ;
00181
00182 *L_new = '\0' ;
00183 *(L_new-1) = '\n' ;
00184 } else {
00185
00186 L_new += 1 ;
00187 *L_new = '\0' ;
00188 }
00189 } else {
00190
00191 L_new += 1 ;
00192 *L_new = '\0' ;
00193
00194 }
00195 }
00196 }
00197
00198 return (L_result);
00199
00200 }
00201