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