Main Page   Class Hierarchy   Compound List   File List   Compound Members  

parser_h248.cpp

00001 /*
00002  *  This program is free software; you can redistribute it and/or modify
00003  *  it under the terms of the GNU General Public License as published by
00004  *  the Free Software Foundation; either version 2 of the License, or
00005  *  (at your option) any later version.
00006  *
00007  *  This program is distributed in the hope that it will be useful,
00008  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  *  GNU General Public License for more details.
00011  *
00012  *  You should have received a copy of the GNU General Public License
00013  *  along with this program; if not, write to the Free Software
00014  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00015  *
00016  * (c)Copyright 2006 Hewlett-Packard Development Company, LP.
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       // skip blank
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       // if '\n' exists
00131 
00132       while(   (L_ptr) 
00133             && (L_pos = strchr(L_ptr,'\n')) != NULL) {
00134 
00135         L_size_blank = 0 ;
00136         // L_size : from start to '\n' not included
00137         L_size = L_pos - L_ptr ;
00138         // skip blank
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         // test end needed ? for L_ptr
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       } // while
00161 
00162 
00163       // ctrl the end of buffer
00164       if (L_size_end > 0) {
00165 
00166         L_size = L_size_end ;
00167         L_size_blank = 0 ;
00168 
00169         // skip blank
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           // add final '\0' 
00186           L_new += 1 ;
00187           *L_new = '\0' ;
00188         }
00189       } else {
00190         // add final '\0' 
00191         L_new += 1 ;
00192         *L_new = '\0' ;
00193         
00194       }
00195     }
00196   }
00197 
00198   return (L_result);
00199 
00200 }
00201 

Generated on Wed Mar 7 14:44:59 2007 for Seagull by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002