Main Page   Class Hierarchy   Compound List   File List   Compound Members  

C_TransIP.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 "C_TransIP.hpp"
00021 #include "Utils.hpp"
00022 
00023 #include <cerrno>
00024 #include <unistd.h>
00025 
00026 #include <regex.h>
00027 
00028 #include "iostream_t.hpp"
00029 #include "integer_t.hpp" // For strtoul_f
00030 
00031 #ifdef DEBUG_MODE
00032 #define GEN_DEBUG(l,a) iostream_error << a << iostream_endl << iostream_flush ; 
00033 #else
00034 #define GEN_DEBUG(l,a) 
00035 #endif
00036 
00037 #define GEN_ERROR(l,a) iostream_error << a << iostream_endl << iostream_flush ; 
00038 
00039 #define LOG_ERROR(m) { \
00040  char L_err [100] ; \
00041  snprintf(L_err, 100, (m)) ; \
00042 (*m_logError)(L_err); \
00043 }
00044 
00045 #define LOG_ERROR_P1(m,P1) { \
00046  char L_err [100] ; \
00047  snprintf(L_err, 100, (m), (P1)) ; \
00048 (*m_logError)(L_err); \
00049 }
00050 
00051 #define LOG_ERROR_P2(m,P1,P2) { \
00052  char L_err [100] ; \
00053  snprintf(L_err, 100, (m), (P1),(P2)) ; \
00054 (*m_logError)(L_err); \
00055 }
00056 
00057 
00058 #define LOG_ALL(m) { \
00059  char L_msg [100] ; \
00060  snprintf(L_msg, 100, (m)) ; \
00061 (*m_logInfo)(L_msg); \
00062 }
00063 
00064 #define LOG_ALL_P1(m,P1) { \
00065  char L_msg [100] ; \
00066  snprintf(L_msg, 100, (m), (P1)) ; \
00067 (*m_logInfo)(L_msg); \
00068 }
00069 
00070 #define LOG_ALL_P2(m,P1,P2) { \
00071  char L_msg [100] ; \
00072  snprintf(L_msg, 100, (m), (P1),(P2)) ; \
00073 (*m_logInfo)(L_msg); \
00074 }
00075 
00076 #define DEFAULT_BUFFER_SIZE 65535
00077 
00078 #define DEFAULT_DECODE_BUFFER_SIZE 4096
00079 #define DEFAULT_ENCODE_BUFFER_SIZE 4096
00080 #define DEFAULT_READ_BUFFER_SIZE   1024
00081 
00082 
00083 C_TransIP::C_TransIP() {
00084   GEN_DEBUG(0, "C_TransIP::C_TransIP()") ;
00085   m_socket_map.clear () ;
00086 
00087   m_ip_addr_map.clear() ;
00088   m_max_fd = 0 ;
00089   m_buffer_size = DEFAULT_BUFFER_SIZE ;
00090 
00091   m_encode_buffer_size = DEFAULT_ENCODE_BUFFER_SIZE ;
00092   m_decode_buffer_size = DEFAULT_DECODE_BUFFER_SIZE ;
00093   m_decode_buffer = NULL ;
00094   m_encode_buffer = NULL ;
00095 
00096   m_read_buffer_size = DEFAULT_READ_BUFFER_SIZE ;
00097 
00098 }
00099 
00100 C_TransIP::~C_TransIP() {
00101 
00102   GEN_DEBUG(0, "C_TransIP::~C_TransIP() start") ;
00103 
00104   close() ;
00105   m_max_fd = 0 ;
00106 
00107   FREE_TABLE(m_decode_buffer);
00108   FREE_TABLE(m_encode_buffer);
00109 
00110   GEN_DEBUG(0, "C_TransIP::~C_TransIP() end") ;
00111 }
00112 
00113 int C_TransIP::init (char *P_buf,
00114                      T_logFunction P_logError,
00115                      T_logFunction P_logInfo) {
00116 
00117   int L_ret = -1 ;
00118 
00119   GEN_DEBUG(1, "C_TransIP::init  ("<< P_buf << ")");
00120   m_logError = P_logError ;
00121   m_logInfo = P_logInfo ;
00122 
00123   if (analyze_init_string(P_buf)) {
00124     ALLOC_TABLE(m_decode_buffer,
00125                 unsigned char *,
00126                 sizeof(unsigned char),
00127                 m_decode_buffer_size);
00128     ALLOC_TABLE(m_encode_buffer,
00129                 unsigned char *,
00130                 sizeof(unsigned char),
00131                 m_encode_buffer_size);
00132     L_ret = 0 ;
00133   }
00134 
00135   return (L_ret);
00136 }
00137 
00138 int C_TransIP::config (T_pConfigValueList P_config_param_list) {
00139   GEN_DEBUG(1, "C_TransIP::config  ()");
00140   // m_logInfo = NULL ;
00141   // m_logError = NULL ;
00142   return(0);
00143 }
00144 
00145 
00146 int C_TransIP::open (int   P_channel_id,
00147                      char *P_buf, 
00148                      T_pOpenStatus P_status,
00149                      C_ProtocolFrame *P_protocol) {
00150 
00151   int        L_ret = 0 ;
00152   T_pIpAddr  L_openAddr = NULL ;
00153   C_Socket  *L_socket = NULL ;
00154 
00155   GEN_DEBUG(1, "C_TransIP::open(protocol=" << P_protocol << ")");
00156 
00157   // check protocol compatibility
00158   if ((P_protocol->get_type() != C_ProtocolFrame::E_PROTOCOL_BINARY) && 
00159       (P_protocol->get_type() != C_ProtocolFrame::E_PROTOCOL_TEXT) ) {
00160     // GEN_ERROR(1, "Protocol not compatible with transport (must be binary or text)");
00161     LOG_ALL("Protocol not compatible with transport (must be binary or text)");
00162     return (-1) ;
00163   }
00164 
00165   *P_status = E_OPEN_FAILED ;
00166   L_openAddr = create_IpAddr() ;
00167 
00168   if (analyze_open_string(P_buf, L_openAddr) == true) {
00169 
00170     if (L_openAddr->m_open != NULL) {
00171       extract_ip_addr(L_openAddr);
00172       resolve_addr(L_openAddr);
00173 
00174       L_socket =
00175         open(P_channel_id, L_openAddr, P_status, 
00176              (C_ProtocolBinaryFrame*)P_protocol) ;
00177 
00178       if (L_socket != NULL) {
00179         L_ret = L_socket -> get_id () ;
00180         m_socket_map.insert (T_SocketMap::value_type(L_ret,L_socket));
00181         if (L_ret > m_max_fd) { m_max_fd = L_ret;  } ;
00182       }
00183 
00184     } else {
00185       L_ret = -1 ;
00186     }
00187   } else {
00188     L_ret = -1 ;
00189   }
00190   
00191   if (L_ret != -1) {
00192     m_ip_addr_map.insert(T_IpAddrMap::value_type(L_ret,L_openAddr));
00193   } else {
00194     delete_IpAddr(&L_openAddr);
00195   }
00196   return(L_ret) ;
00197 }
00198 
00199 int C_TransIP::set_channel_id (int   P_id,
00200                             int   P_channel_id) {
00201   int L_ret ;
00202   T_SocketMap::iterator L_it ;
00203   
00204   L_it = m_socket_map.find(T_SocketMap::key_type(P_id));
00205   if (L_it != m_socket_map.end()) {
00206     (L_it->second)->set_channel_id(P_channel_id);
00207     L_ret = 0 ;
00208   } else { 
00209     L_ret = -1 ;
00210   }
00211   return (L_ret);
00212 }
00213 
00214 T_SelectDef C_TransIP::select_definition () {
00215   return (NULL) ; // use normal select
00216 }
00217 
00218 int C_TransIP::pre_select (int             P_n, 
00219                            fd_set         *P_readfds,  
00220                            fd_set         *P_writefds,
00221                            fd_set         *P_exceptfds, 
00222                            struct timeval *P_timeout, 
00223                            int            *P_cnx, 
00224                            size_t          P_nb) {
00225 
00226   T_SocketMap::iterator L_it ;
00227 
00228   for(L_it = m_socket_map.begin();
00229       L_it != m_socket_map.end ();
00230       L_it ++) {
00231     (L_it->second) -> set_fd_set (P_readfds, P_writefds);
00232   }
00233   
00234   return ((m_max_fd > P_n) ? m_max_fd : P_n) ;
00235 }
00236 
00237 int C_TransIP::post_select (int                 P_n, 
00238                             fd_set             *P_readfds,  
00239                             fd_set             *P_writefds,
00240                             fd_set             *P_exceptfds, 
00241                             T_pC_TransportEvent P_eventTable,
00242                             size_t             *P_nb) {
00243 
00244   T_SocketMap::iterator L_it ;
00245   int L_n = P_n ;
00246   C_Socket *L_newSocket, *L_socket ;
00247   C_TransportEvent L_event ;
00248   int L_id ;
00249 
00250   int L_nb_event = 0 ;
00251 
00252   list_t<T_SocketMap::iterator>::iterator L_del_it ;
00253   list_t<C_Socket*>::iterator             L_ins_it ;
00254 
00255   bool L_max_update = false ;
00256 
00257   GEN_DEBUG(0, "C_TransIP::post_select()");
00258 
00259   for (L_it = m_socket_map.begin();
00260        L_it != m_socket_map.end ();
00261        L_it++) {
00262 
00263     if (L_n) {
00264 
00265       L_socket = L_it->second ;
00266       L_event.no_event() ;
00267       L_newSocket = L_socket->process_fd_set(P_readfds,P_writefds, &L_event);
00268       switch (L_event.m_type) {
00269         
00270       case C_TransportEvent::E_TRANS_NO_EVENT:
00271         GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_NO_EVENT");
00272         break ;
00273         
00274       case C_TransportEvent::E_TRANS_RECEIVED:
00275         GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_RECEIVED");
00276         P_eventTable[L_nb_event] = L_event ;
00277 
00278         // insert decode process
00279         decode_from_protocol (L_socket);
00280 
00281         L_nb_event++ ;
00282         L_n -- ;
00283         break ;
00284 
00285       case C_TransportEvent::E_TRANS_CLOSED:
00286         GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_CLOSED");
00287         L_id = (L_socket)->get_id() ;
00288         LOG_ALL_P1("Connection closed: [%d]", L_id);
00289         (L_socket)->_close() ;
00290         m_delete_list.push_back(L_it) ;
00291         DELETE_VAR(L_socket);
00292         if (L_id == m_max_fd) { L_max_update = true ; }
00293         P_eventTable[L_nb_event] = L_event ;
00294         L_nb_event++ ;
00295         L_n-- ;
00296         break ;
00297 
00298       case C_TransportEvent::E_TRANS_CONNECTION:
00299         L_id = L_event.m_id ;
00300         GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_CONNECTION id=" 
00301                   << L_id);
00302         if (L_id > m_max_fd) { L_max_update = true ; }
00303         m_insert_list.push_back(L_newSocket);
00304         P_eventTable[L_nb_event] = L_event ;
00305         L_nb_event++ ;
00306         L_n-- ;
00307         break ;
00308 
00309       case C_TransportEvent::E_TRANS_OPEN:
00310         P_eventTable[L_nb_event] = L_event ;
00311         L_nb_event++ ;
00312         L_n-- ;
00313         break ;
00314 
00315       case C_TransportEvent::E_TRANS_OPEN_FAILED:
00316         L_id = (L_socket)->get_id() ;
00317         (L_socket)->_close() ;
00318         m_delete_list.push_back(L_it) ;
00319         DELETE_VAR(L_socket);
00320         if (L_id == m_max_fd) { L_max_update = true ; }
00321         P_eventTable[L_nb_event] = L_event ;
00322         L_nb_event++ ;
00323         L_n-- ;
00324         break ;
00325         
00326       }
00327     }
00328   }
00329 
00330   if (! m_delete_list.empty() ) {
00331     for(L_del_it = m_delete_list.begin();
00332         L_del_it != m_delete_list.end();
00333         L_del_it++) {
00334       m_socket_map.erase(*L_del_it);
00335     }
00336     m_delete_list.erase(m_delete_list.begin(), m_delete_list.end());
00337   }
00338 
00339   if (! m_insert_list.empty()) {
00340     for(L_ins_it = m_insert_list.begin();
00341         L_ins_it != m_insert_list.end();
00342         L_ins_it++) {
00343       L_newSocket = *L_ins_it ;
00344       L_id = L_newSocket->get_id();
00345       m_socket_map.insert(T_SocketMap::value_type(L_id,L_newSocket));
00346     }
00347     m_insert_list.erase(m_insert_list.begin(), m_insert_list.end());
00348   }
00349 
00350   if (L_max_update == true) {
00351     m_max_fd = (m_socket_map.empty()) ? 
00352       0 : (m_socket_map.rbegin())->first ;
00353     GEN_DEBUG(0, "C_TransIP::post_select() max fd [" << m_max_fd << "]");
00354   }
00355 
00356   *P_nb = L_nb_event ;
00357   GEN_DEBUG(0, "C_TransIP::post_select() L_nb_event = " << L_nb_event);
00358   GEN_DEBUG(0, "C_TransIP::post_select() return  = " << L_n);
00359   return (L_n);
00360 }
00361 
00362 
00363 int C_TransIP::send_message (int             P_id,
00364                              C_MessageFrame *P_msg) {
00365 
00366   T_SocketMap::iterator L_it         ;
00367   C_Socket             *L_socket     ;
00368 
00369 
00370   size_t                L_size = m_encode_buffer_size;
00371   unsigned char        *L_data = m_encode_buffer ;
00372   
00373   C_ProtocolBinaryFrame *L_protocol ; 
00374   
00375   C_ProtocolFrame::T_MsgError      L_error = C_ProtocolFrame::E_MSG_OK ;
00376 
00377   int                   L_ret = -1   ;
00378 
00379   L_it = m_socket_map.find (T_SocketMap::key_type(P_id));
00380   if (L_it != m_socket_map.end()) {
00381     L_socket = L_it->second ;
00382     L_protocol = L_socket -> get_protocol() ;
00383 
00384     L_error = L_protocol->encode_message(P_msg, L_data, &L_size);
00385     
00386     if (L_error == C_ProtocolFrame::E_MSG_OK) {
00387       L_protocol->log_buffer((char*)"sent", L_data, L_size);
00388 
00389       L_ret = L_socket
00390         ->send_buffer(L_data, L_size);
00391 
00392     }
00393   }
00394   return ((L_ret>0) ? 0 : L_ret) ;
00395 }
00396 
00397 int C_TransIP::close () {
00398 
00399   T_SocketMap::iterator L_it ;
00400   C_Socket *L_socket ;
00401 
00402 
00403   T_IpAddrMap::iterator L_ip_addr_it ;
00404   T_pIpAddr             L_addr ;
00405 
00406   if (!m_ip_addr_map.empty()) {
00407     for (L_ip_addr_it = m_ip_addr_map.begin();
00408          L_ip_addr_it != m_ip_addr_map.end ();
00409          L_ip_addr_it++) {
00410       L_addr = (L_ip_addr_it->second) ;
00411       delete_IpAddr(&L_addr);
00412     }
00413     m_ip_addr_map.erase(m_ip_addr_map.begin(), m_ip_addr_map.end());
00414   }
00415 
00416   
00417   if (!m_socket_map.empty()) {
00418     for (L_it = m_socket_map.begin();
00419          L_it != m_socket_map.end ();
00420          L_it++) {
00421       L_socket = L_it->second ;
00422       L_socket -> _close();
00423       DELETE_VAR(L_socket);
00424     }
00425     m_socket_map.erase(m_socket_map.begin(), m_socket_map.end());
00426   }
00427   return (0);
00428 }
00429 
00430 int C_TransIP::close (int P_id) {
00431 
00432   T_SocketMap::iterator L_it ;
00433   C_Socket *L_socket ;
00434   int       L_ret = 0 ;
00435 
00436 
00437   T_IpAddrMap::iterator L_ip_addr_it ;
00438   T_pIpAddr             L_addr ;
00439 
00440   if (!m_ip_addr_map.empty()) {
00441     L_ip_addr_it = m_ip_addr_map.find (T_IpAddrMap::key_type(P_id));
00442     if (L_ip_addr_it != m_ip_addr_map.end()) {
00443       L_addr = L_ip_addr_it->second ;
00444       delete_IpAddr(&L_addr);
00445       m_ip_addr_map.erase(L_ip_addr_it);
00446     } else {
00447       L_ret = -1 ; 
00448     }
00449   } else {
00450     L_ret = -1 ;
00451   }
00452 
00453 
00454 
00455   if (!m_socket_map.empty()) {
00456     L_it = m_socket_map.find (T_SocketMap::key_type(P_id));
00457     if (L_it != m_socket_map.end()) {
00458       L_socket = L_it->second ;
00459       L_socket -> _close();
00460       DELETE_VAR(L_socket);
00461       m_socket_map.erase(L_it);
00462     } else {
00463       L_ret = -1 ; 
00464     }
00465   } else {
00466     L_ret = -1 ;
00467   }
00468 
00469   return (L_ret);
00470 }
00471 
00472 // Internal methods
00473 
00474 C_Socket* C_TransIP::open (int              P_channel_id, 
00475                            T_pIpAddr        P_Addr,
00476                            T_pOpenStatus    P_status,
00477                            C_ProtocolBinaryFrame *P_protocol) {
00478 
00479   int                L_rc ;
00480   C_Socket          *L_socket_created = NULL ;
00481 
00482   GEN_DEBUG(1, "C_TransIP::open ()");
00483 
00484   switch (P_Addr->m_umode) {
00485   case E_IP_USAGE_MODE_SERVER: {
00486 
00487     if (m_trans_type == E_SOCKET_TCP_MODE) {
00488       C_SocketListen *L_Socket ;
00489       
00490       NEW_VAR(L_Socket, C_SocketListen(m_trans_type, 
00491                                        P_Addr, 
00492                                        P_channel_id, 
00493                                        m_read_buffer_size, 
00494                                        m_decode_buffer_size));
00495       // std::cerr << "m_trans_type " << m_trans_type << std::endl;
00496       L_rc = L_Socket->_open(m_buffer_size, P_protocol) ;
00497       if (L_rc == 0) {
00498         L_socket_created = L_Socket ;
00499         *P_status = E_OPEN_OK ;
00500       } else {
00501         DELETE_VAR(L_Socket) ;
00502         *P_status = E_OPEN_FAILED ;
00503       }
00504     } else {
00505       C_SocketServer *L_Socket ;
00506       
00507       NEW_VAR(L_Socket, C_SocketServer(m_trans_type, 
00508                                        P_Addr, 
00509                                        P_channel_id, 
00510                                        m_read_buffer_size, 
00511                                        m_decode_buffer_size));
00512       
00513       L_rc = L_Socket->_open_udp(m_buffer_size, P_protocol) ;
00514       if (L_rc == 0) {
00515         L_socket_created = L_Socket ;
00516         *P_status = E_OPEN_OK ;
00517       } else {
00518         DELETE_VAR(L_Socket) ;
00519         *P_status = E_OPEN_FAILED ;
00520       }
00521     }
00522   }
00523     break ;
00524     
00525   case E_IP_USAGE_MODE_CLIENT: {
00526     C_SocketClient *L_Socket ;
00527 
00528     NEW_VAR(L_Socket, C_SocketClient(m_trans_type, 
00529                                      P_Addr, 
00530                                      P_channel_id, 
00531                                      m_read_buffer_size, 
00532                                      m_decode_buffer_size));
00533 
00534     // std::cerr << "m_trans_type Client" << m_trans_type << std::endl;
00535     L_rc = L_Socket->_open(P_status, m_buffer_size, P_protocol) ;
00536     if (L_rc == 0) {
00537       L_socket_created = L_Socket ;
00538     } else {
00539       DELETE_VAR(L_Socket) ;
00540       *P_status = E_OPEN_FAILED ;
00541     }
00542   }
00543 
00544     break ;
00545 
00546   case E_IP_USAGE_MODE_UNKNOWN:
00547 
00548     // GEN_ERROR(1, "OPEN failed: Unsupported mode");
00549     LOG_ALL("OPEN failed: Unsupported mode");
00550     *P_status = E_OPEN_FAILED ;
00551     break ;
00552   }
00553   
00554   return (L_socket_created);
00555 }
00556 
00557 bool C_TransIP::analyze_ulong_value (char* P_buf, 
00558                                      char* P_pattern,
00559                                      size_t* P_value) {
00560   bool L_ret = false ;
00561   char            *L_ptr          ;
00562   char             L_tmp  [255]   ;
00563   char            *L_buf          ;
00564 
00565   char            *L_pattern      ;
00566 
00567   L_buf = P_buf ;
00568   L_ptr = strstr(L_buf, P_pattern);
00569   ALLOC_TABLE(L_pattern, char*, sizeof(char),strlen(P_pattern)+8);
00570   L_pattern[0] = '\0' ;
00571   sprintf(L_pattern, "%s", P_pattern);
00572   strcat(L_pattern, "%[^;]*s");
00573   if (L_ptr != NULL) {
00574     sscanf(L_ptr, L_pattern, L_tmp);
00575     GEN_DEBUG(1, "C_TransIP::analyze_ulong_value() buffer size [" 
00576               << L_tmp << "]");
00577 
00578     if (strlen(L_tmp)>0) {
00579       char *L_end_ptr ;
00580       unsigned long L_value ;
00581       L_value = strtoul_f (L_tmp, &L_end_ptr, 10);
00582       if (L_end_ptr[0] == '\0') { // good format
00583         *P_value = L_value ;
00584         L_ret = true ;
00585       }
00586     }
00587   }
00588 
00589   FREE_TABLE(L_pattern);
00590   return (L_ret);
00591 }
00592 
00593 bool C_TransIP::analyze_string_value (char* P_buf, 
00594                                       char* P_pattern,
00595                                       char* P_value) {
00596   bool L_ret = false ;
00597 
00598   char            *L_ptr          ;
00599   char            *L_pattern      ;
00600 
00601   GEN_DEBUG(1, "C_TransIP::analyze_string_value ("<< P_buf << ")");
00602   L_ptr = strstr(P_buf,P_pattern) ;
00603   ALLOC_TABLE(L_pattern, char*, sizeof(char),strlen(P_pattern)+8);
00604   L_pattern[0] = '\0' ;
00605   sprintf(L_pattern, "%s", P_pattern);
00606   strcat(L_pattern, "%[^;]*s");
00607   if (L_ptr != NULL) {
00608     sscanf(L_ptr, L_pattern, P_value);
00609     L_ret = true ;
00610   }
00611 
00612   FREE_TABLE(L_pattern);
00613   return (L_ret);
00614 }
00615 
00616 void C_TransIP::analyze_optional_init_string(char *P_buf) {
00617 
00618   if (analyze_ulong_value (P_buf,
00619                            (char*)"decode-buf-len=",
00620                            &m_decode_buffer_size)) {
00621     // not mandatory
00622   } 
00623   if (analyze_ulong_value (P_buf,
00624                            (char*)"encode-buf-len=",
00625                            &m_encode_buffer_size)) {
00626     // not mandatory
00627   } 
00628   if (analyze_ulong_value (P_buf,
00629                            (char*)"read-buf-len=",
00630                            &m_read_buffer_size)) {
00631     // not mandatory
00632   } 
00633 }
00634 
00635 bool C_TransIP::analyze_init_string(char *P_buf) {
00636 
00637   bool             L_ret = false  ;
00638   char             L_tmp  [255]   ;
00639 
00640 
00641   GEN_DEBUG(1, "C_TransIP::analyze_init_string  ("<< P_buf << ")");
00642 
00643   if (analyze_string_value (P_buf,
00644                            (char*)"type=",
00645                            L_tmp)) {
00646     // mandatory
00647     if (!strcmp(L_tmp,"tcp")) {
00648       m_trans_type = E_SOCKET_TCP_MODE ;
00649       L_ret = true ;
00650     } else if (!strcmp(L_tmp,"udp")) {
00651       m_trans_type = E_SOCKET_UDP_MODE ;
00652       L_ret = true ;
00653     }
00654   } 
00655 
00656   analyze_optional_init_string(P_buf);
00657 
00658   return (L_ret);
00659   
00660 }
00661 
00662 bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) {
00663 
00664   char            L_tmp  [255] ;
00665   char           *L_buf, *L_ptr ;
00666 
00667   GEN_DEBUG(1, "C_TransIP::analyze_open_string (args=" << P_buf << ")");
00668 
00669   L_buf = P_buf ;
00670   L_ptr = strstr(L_buf, "mode=");
00671   if (L_ptr != NULL) {
00672     sscanf(L_ptr+5, "%[^;]*s", L_tmp);
00673     GEN_DEBUG(1, "m [" << L_tmp << "]");
00674     if (!strcmp(L_tmp,"server")) {
00675       P_addr->m_umode = E_IP_USAGE_MODE_SERVER ;
00676     } else if (!strcmp(L_tmp,"client")) {
00677       P_addr->m_umode = E_IP_USAGE_MODE_CLIENT ;
00678     }
00679   }
00680   L_buf = P_buf ;
00681   L_ptr = strstr(L_buf, "source=");
00682   if (L_ptr != NULL) {
00683     sscanf(L_ptr+7, "%[^;]*s", L_tmp);
00684     GEN_DEBUG(1, "C_TransIP::analyze_open_string() s [" << L_tmp << "]");
00685     if (strlen(L_tmp)>0) {
00686       ALLOC_TABLE(P_addr->m_open,
00687                   char*,sizeof(char),
00688                   strlen(L_tmp)+1);
00689       strcpy(P_addr->m_open, L_tmp);
00690 
00691       ALLOC_TABLE(P_addr->m_open_src,
00692                   char*,sizeof(char),
00693                   strlen(L_tmp)+1);
00694       strcpy(P_addr->m_open_src, L_tmp);
00695     } 
00696   }
00697   L_buf = P_buf ;
00698   L_ptr = strstr(L_buf, "dest=");
00699   if (L_ptr != NULL) {
00700     sscanf(L_ptr+5, "%[^;]*s", L_tmp);
00701     GEN_DEBUG(1, "C_TransIP::analyze_open_string() d [" << L_tmp << "]");
00702     if (strlen(L_tmp)>0) {
00703       ALLOC_TABLE(P_addr->m_open,
00704                   char*,sizeof(char),
00705                   strlen(L_tmp)+1);
00706       strcpy(P_addr->m_open, L_tmp);
00707     }
00708   }
00709 
00710   L_buf = P_buf ;
00711   L_ptr = strstr(L_buf, "buffer=");
00712   if (L_ptr != NULL) {
00713     sscanf(L_ptr+7, "%[^;]*s", L_tmp);
00714     GEN_DEBUG(1, "C_TransIP::analyze_open_string() buffer size [" 
00715               << L_tmp << "]");
00716     if (strlen(L_tmp)>0) {
00717       char *L_end_ptr ;
00718       unsigned long L_value ;
00719       L_value = strtoul_f (L_tmp, &L_end_ptr, 10);
00720       if (L_end_ptr[0] == '\0') { // good format
00721         m_buffer_size = L_value ;
00722         P_addr->m_buffer_size = L_value ;
00723       }
00724     }
00725   }
00726 
00727   return (true) ;
00728 }
00729 
00730 int C_TransIP::extract_ip_addr(T_pIpAddr P_pIpAddr) {
00731   
00732   char      *L_search = NULL ;
00733 
00734   regex_t    L_regExpr ;
00735   regmatch_t L_pmatch ;
00736   int        L_status ;
00737 
00738   char       L_buffer[1024] ;
00739   size_t     L_matchSize ;
00740 
00741   GEN_DEBUG(0, "C_TransIP::extract_ip_addr()");
00742 
00743   if (P_pIpAddr == NULL) { return (-1) ; }
00744   if (P_pIpAddr->m_open == NULL) { return (0) ; }
00745 
00746   L_search = P_pIpAddr->m_open ;
00747   P_pIpAddr -> m_value = NULL ;
00748   P_pIpAddr -> m_port = -1 ;
00749   memset(&(P_pIpAddr->m_addr), 0, sizeof(T_SockAddrStorage));
00750 
00751   // skip blank 
00752   L_status = regcomp (&L_regExpr, "^[:blank:]*\\[", REG_EXTENDED) ;
00753   if (L_status != 0) {
00754     regerror(L_status, &L_regExpr, L_buffer, 1024);
00755     regfree (&L_regExpr) ;
00756     LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00757     // GEN_ERROR(0, "regcomp error: [" << L_buffer << "]");
00758     return (-1);
00759   }
00760   
00761   L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00762   regfree (&L_regExpr) ;
00763 
00764   if (L_status == 0) { // IP V6
00765 
00766     L_search += L_pmatch.rm_eo ;
00767 
00768     // find end of address
00769     L_status = regcomp(&L_regExpr, "[^]]*", REG_EXTENDED) ;
00770     if (L_status != 0) {
00771       regerror(L_status, &L_regExpr, L_buffer, 1024);
00772       regfree (&L_regExpr) ;
00773       LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00774 
00775       // GEN_ERROR(0, "regcomp error: [" << L_buffer << "]");
00776       return (-1);
00777     }
00778 
00779     L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00780     regfree (&L_regExpr) ;
00781     if (L_status == 0) { // end of IP addr found
00782 
00783       L_matchSize = L_pmatch.rm_eo - L_pmatch.rm_so ;
00784       if (L_matchSize) { memcpy(L_buffer, L_search, L_matchSize); }
00785       L_buffer[L_matchSize] = 0 ;
00786       L_search += L_matchSize ;
00787       L_search = strstr(L_search, ":");
00788 
00789       GEN_DEBUG(1, "C_TransIP::extract_ip_addr() IPV6 addr [" << L_buffer << "]");
00790       
00791     } else {
00792       LOG_ALL_P1("regexec error character: [%c] not found", ']');
00793 
00794       // GEN_ERROR(0, "regexec error character [" << ']' << "] not found" );
00795       return (-1);
00796     }
00797 
00798   } else { // IP V4 or hostname
00799 
00800     
00801     L_search = strstr(P_pIpAddr->m_open, ":") ;
00802 
00803     L_matchSize = (L_search != NULL) 
00804       ? (L_search - (P_pIpAddr->m_open)) : strlen(P_pIpAddr->m_open) ;
00805     if (L_matchSize) { memcpy(L_buffer, P_pIpAddr->m_open, L_matchSize) ; }
00806     L_buffer[L_matchSize] = 0 ;
00807 
00808       
00809     GEN_DEBUG(0, "C_TransIP::extract_ip_addr() IPV4 addr or hostname = [" 
00810               << L_buffer << "]");
00811   }
00812 
00813   if (strlen(L_buffer) != 0) {
00814     ALLOC_TABLE(P_pIpAddr -> m_value, char*, 
00815                 sizeof(char), strlen(L_buffer)+1) ;
00816     strcpy(P_pIpAddr->m_value, L_buffer);
00817   }
00818 
00819   if (L_search != NULL) {
00820     char *L_end_ptr = NULL ;
00821     P_pIpAddr -> m_port = (long)strtoul_f(L_search+1, &L_end_ptr, 10);
00822     if (L_end_ptr[0] != '\0') { 
00823       P_pIpAddr->m_port = -1 ;
00824       GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00825     }
00826   } else {
00827     GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00828   }
00829 
00830   GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Port [" << P_pIpAddr->m_port << "]");
00831 
00832 #ifdef DEBUG_MODE
00833   {
00834     const char *L_novalue = "no value" ;
00835     char *L_value = (P_pIpAddr->m_value == NULL) ?
00836       (char*)L_novalue : P_pIpAddr->m_value ;
00837     GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Addr value [" 
00838               << L_value << "]") ;
00839   }
00840 #endif
00841 
00842   if (P_pIpAddr->m_open_src != NULL) { 
00843 
00844     L_search = P_pIpAddr->m_open_src ;
00845     P_pIpAddr -> m_value_src = NULL ;
00846     P_pIpAddr -> m_port_src = -1 ;
00847     memset(&(P_pIpAddr->m_addr_src), 0, sizeof(T_SockAddrStorage));
00848 
00849     // skip blank 
00850     L_status = regcomp (&L_regExpr, "^[:blank:]*\\[", REG_EXTENDED) ;
00851     if (L_status != 0) {
00852       regerror(L_status, &L_regExpr, L_buffer, 1024);
00853       regfree (&L_regExpr) ;
00854       LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00855       // GEN_ERROR(0, "regcomp error: [" << L_buffer << "]");
00856       return (-1);
00857     }
00858   
00859     L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00860     regfree (&L_regExpr) ;
00861 
00862     if (L_status == 0) { // IP V6
00863       
00864       L_search += L_pmatch.rm_eo ;
00865       
00866       // find end of address
00867       L_status = regcomp(&L_regExpr, "[^]]*", REG_EXTENDED) ;
00868       if (L_status != 0) {
00869         regerror(L_status, &L_regExpr, L_buffer, 1024);
00870         regfree (&L_regExpr) ;
00871         LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00872         // GEN_ERROR(0, "regcomp error: [" << L_buffer << "]");
00873         return (-1);
00874       }
00875       
00876       L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00877       regfree (&L_regExpr) ;
00878       if (L_status == 0) { // end of IP addr found
00879         
00880         L_matchSize = L_pmatch.rm_eo - L_pmatch.rm_so ;
00881         if (L_matchSize) { memcpy(L_buffer, L_search, L_matchSize); }
00882         L_buffer[L_matchSize] = 0 ;
00883         L_search += L_matchSize ;
00884         L_search = strstr(L_search, ":");
00885 
00886         GEN_DEBUG(1, "C_TransIP::extract_ip_addr() IPV6 addr [" << L_buffer << "]");
00887       
00888       } else {
00889         LOG_ALL_P1("regexec error character: [%c] not found", ']');
00890         // GEN_ERROR(0, "regexec error character [" << ']' << "] not found" );
00891         return (-1);
00892       }
00893 
00894     } else { // IP V4 or hostname
00895       
00896       
00897       L_search = strstr(P_pIpAddr->m_open_src, ":") ;
00898 
00899       L_matchSize = (L_search != NULL) 
00900         ? (L_search - (P_pIpAddr->m_open_src)) : strlen(P_pIpAddr->m_open_src) ;
00901       if (L_matchSize) { memcpy(L_buffer, P_pIpAddr->m_open_src, L_matchSize) ; }
00902       L_buffer[L_matchSize] = 0 ;
00903 
00904       
00905       GEN_DEBUG(0, "C_TransIP::extract_ip_addr() IPV4 addr or hostname = [" 
00906                 << L_buffer << "]");
00907     }
00908 
00909     if (strlen(L_buffer) != 0) {
00910       ALLOC_TABLE(P_pIpAddr -> m_value_src, char*, 
00911                   sizeof(char), strlen(L_buffer)+1) ;
00912       strcpy(P_pIpAddr->m_value_src, L_buffer);
00913     }
00914 
00915     if (L_search != NULL) {
00916       char *L_end_ptr = NULL ;
00917       P_pIpAddr -> m_port_src = (long)strtoul_f(L_search+1, &L_end_ptr, 10);
00918       if (L_end_ptr[0] != '\0') { 
00919         P_pIpAddr->m_port_src = -1 ;
00920         GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00921       }
00922     } else {
00923       GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00924     }
00925 
00926     GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Port [" << P_pIpAddr->m_port << "]");
00927 
00928 #ifdef DEBUG_MODE
00929   {
00930     const char *L_novalue = "no value" ;
00931     char *L_value = (P_pIpAddr->m_value_src == NULL) ?
00932       (char*)L_novalue : P_pIpAddr->m_value_src ;
00933     GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Addr value [" 
00934               << L_value << "]") ;
00935   }
00936 #endif
00937 
00938   }
00939   
00940 
00941   return (0);
00942 }
00943 
00944 int C_TransIP::resolve_addr(T_pIpAddr P_pIpAddr) {
00945 
00946   char              *L_host              = P_pIpAddr->m_value ;
00947   long               L_port              = P_pIpAddr->m_port  ;
00948   T_SockAddrStorage *L_resolved_sockaddr = &P_pIpAddr->m_addr ;
00949   char               L_local_host[255]                        ;
00950 
00951 #ifndef USE_IPV4_ONLY  
00952   struct addrinfo   L_hints      ;
00953   struct addrinfo  *L_local_addr ;
00954 #else
00955   struct hostent   *L_local_addr ;
00956 #endif
00957 
00958 #ifdef DEBUG_MODE
00959 
00960   const char *L_cNoHost = "none" ;
00961   char *L_hostDebug = (L_host == NULL) ? (char*)L_cNoHost : L_host ;
00962 
00963   GEN_DEBUG(1, "C_TransIP::resolve_addr() [" 
00964             << L_hostDebug
00965             << "]:[" << L_port << "]");
00966 #endif
00967 
00968 #ifndef USE_IPV4_ONLY
00969   memset((char*)&L_hints, 0, sizeof(L_hints));
00970   L_hints.ai_flags  = AI_PASSIVE;
00971   L_hints.ai_family = PF_UNSPEC;
00972 #endif
00973 
00974   if (L_host == NULL) {
00975     if (gethostname(L_local_host, 255)) {
00976       LOG_ALL("Unable to get local IP address");
00977       // GEN_ERROR(1, "Unable to get local IP address");
00978       return(-1);
00979     } else {
00980       ALLOC_TABLE(L_host, char*, sizeof(char),
00981                   strlen(L_local_host)+1);
00982       strcpy(L_host, L_local_host) ;
00983       P_pIpAddr->m_value = L_host  ;
00984     }
00985   }
00986   memset(L_resolved_sockaddr, 0, sizeof(T_SockAddrStorage));
00987 
00988 #ifndef USE_IPV4_ONLY
00989   if (getaddrinfo(L_host,
00990                   NULL,
00991                   &L_hints,
00992                   &L_local_addr) != 0) {
00993     LOG_ALL_P1("Unknown host: [%s]", L_host);
00994     // GEN_ERROR(1, "Unknown host [" << L_host << "]");
00995     return (-1);
00996   }
00997 
00998   L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->ai_addr->sa_family;
00999   memcpy(L_resolved_sockaddr,
01000          L_local_addr->ai_addr,
01001          SOCKADDR_IN_SIZE
01002          (RICAST(T_SockAddrStorage *,L_local_addr->ai_addr)));
01003 #else
01004   L_local_addr = gethostbyname(L_host);
01005   if (L_local_addr != NULL) {
01006     L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->h_addrtype;
01007     memcpy((void*)&L_resolved_sockaddr->sin_addr.s_addr,
01008            L_local_addr->h_addr_list[0],
01009            L_local_addr->h_length);
01010   } else {
01011     LOG_ALL_P1("Unknown host: [%s]", L_host);
01012     // GEN_ERROR(1, "Unknown host [" << L_host << "]");
01013     return (-1);
01014   }
01015 #endif
01016 
01017   switch (L_resolved_sockaddr->SOCKADDR_FAMILY) {
01018   case AF_INET:
01019     (RICAST(struct sockaddr_in *, L_resolved_sockaddr))->sin_port =
01020       htons((short)L_port);
01021     break ;
01022 #ifndef USE_IPV4_ONLY
01023   case AF_INET6:
01024     (RICAST(struct sockaddr_in6 *, L_resolved_sockaddr))->sin6_port =
01025       htons((short)L_port);
01026     break ;
01027 #endif
01028   default:
01029     LOG_ALL("Unsupported network");
01030     //    GEN_ERROR(1, "Unsupported network");
01031     return(-1);
01032   }
01033   if (inet_addr((char**)&(P_pIpAddr->m_ip), L_resolved_sockaddr) == -1) {
01034     LOG_ALL("Address not supported");
01035 
01036     // GEN_ERROR(1, "Address not supported");
01037   }
01038 
01039 #ifndef USE_IPV4_ONLY
01040   freeaddrinfo(L_local_addr);
01041 #endif
01042 
01043   // To be optimized
01044   L_host              = P_pIpAddr->m_value_src ;
01045   L_port              = P_pIpAddr->m_port_src  ;
01046   L_resolved_sockaddr = &P_pIpAddr->m_addr_src ;
01047 
01048 #ifdef DEBUG_MODE
01049 {
01050   const char *L_cNoHost = "none" ;
01051   char *L_hostDebug = (L_host == NULL) ? (char*)L_cNoHost : L_host ;
01052 
01053   GEN_DEBUG(1, "C_TransIP::resolve_addr() [" 
01054             << L_hostDebug
01055             << "]:[" << L_port << "]");
01056 }
01057 #endif
01058 
01059 #ifndef USE_IPV4_ONLY
01060   memset((char*)&L_hints, 0, sizeof(L_hints));
01061   L_hints.ai_flags  = AI_PASSIVE;
01062   L_hints.ai_family = PF_UNSPEC;
01063 #endif
01064 
01065   if (L_host == NULL) {
01066     if (gethostname(L_local_host, 255)) {
01067       LOG_ALL("Unable to get local IP address");
01068       // GEN_ERROR(1, "Unable to get local IP address");
01069       return(-1);
01070     } else {
01071       ALLOC_TABLE(L_host, char*, sizeof(char),
01072                   strlen(L_local_host)+1);
01073       strcpy(L_host, L_local_host) ;
01074       P_pIpAddr->m_value_src = L_host  ;
01075     }
01076   }
01077   memset(L_resolved_sockaddr, 0, sizeof(T_SockAddrStorage));
01078 
01079 #ifndef USE_IPV4_ONLY
01080   if (getaddrinfo(L_host,
01081                   NULL,
01082                   &L_hints,
01083                   &L_local_addr) != 0) {
01084     LOG_ALL_P1("Unknown host: [%s]", L_host);
01085     // GEN_ERROR(1, "Unknown host [" << L_host << "]");
01086     return (-1);
01087   }
01088 
01089   L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->ai_addr->sa_family;
01090   memcpy(L_resolved_sockaddr,
01091          L_local_addr->ai_addr,
01092          SOCKADDR_IN_SIZE
01093          (RICAST(T_SockAddrStorage *,L_local_addr->ai_addr)));
01094 #else
01095   L_local_addr = gethostbyname(L_host);
01096   if (L_local_addr != NULL) {
01097     L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->h_addrtype;
01098     memcpy((void*)&L_resolved_sockaddr->sin_addr.s_addr,
01099            L_local_addr->h_addr_list[0],
01100            L_local_addr->h_length);
01101   } else {
01102     LOG_ALL_P1("Unknown host: [%s]", L_host);
01103     // GEN_ERROR(1, "Unknown host [" << L_host << "]");
01104     return (-1);
01105   }
01106 #endif
01107 
01108   switch (L_resolved_sockaddr->SOCKADDR_FAMILY) {
01109   case AF_INET:
01110     (RICAST(struct sockaddr_in *, L_resolved_sockaddr))->sin_port =
01111       htons((short)L_port);
01112     break ;
01113 #ifndef USE_IPV4_ONLY
01114   case AF_INET6:
01115     (RICAST(struct sockaddr_in6 *, L_resolved_sockaddr))->sin6_port =
01116       htons((short)L_port);
01117     break ;
01118 #endif
01119   default:
01120     LOG_ALL("Unsupported network");
01121 
01122     // GEN_ERROR(1, "Unsupported network");
01123     return(-1);
01124   }
01125   if (inet_addr((char**)&(P_pIpAddr->m_ip_src), L_resolved_sockaddr) == -1) {
01126     LOG_ALL("Address not supported");
01127     // GEN_ERROR(1, "Address not supported");
01128   }
01129 
01130 #ifndef USE_IPV4_ONLY
01131   freeaddrinfo(L_local_addr);
01132 #endif
01133 
01134   GEN_DEBUG(0, "C_TransIP::inet_addr() inet_addr [" << P_pIpAddr->m_ip << "]");
01135 
01136   return(0);
01137 }
01138 
01139 int C_TransIP::inet_addr(char **P_Addr, T_SockAddrStorage * P_AddrS) {
01140 
01141 #ifndef USE_IPV4_ONLY
01142   char * L_ipAddr = NULL;
01143 
01144   GEN_DEBUG(0, "C_TransIP::inet_addr()");
01145 
01146   ALLOC_TABLE(L_ipAddr, char*, sizeof(char), 1024);
01147 
01148   if (getnameinfo(RICAST(struct sockaddr *, P_AddrS),
01149                   sizeof(struct sockaddr_storage),
01150                   L_ipAddr,
01151                   1024,
01152                   NULL,
01153                   0,
01154                   NI_NUMERICHOST) != 0) {
01155     FREE_TABLE(L_ipAddr);
01156     return(-1);
01157   }
01158 
01159   *P_Addr = L_ipAddr ;
01160 #endif 
01161   return (0) ;
01162   
01163 }
01164 
01165 
01166 void C_TransIP::decode_from_protocol (C_Socket *P_socket) {
01167 
01168   // previous data remaining buffer
01169   size_t                            L_data_size, L_tmp_size ;
01170   unsigned char                    *L_session_buf, *L_current_data ;
01171   C_pDataDecode                     L_decode = P_socket->get_decode() ;
01172   C_ProtocolBinaryFrame            *L_protocol = P_socket->get_protocol() ;
01173   T_pRcvMsgCtxtList                 L_msg_list = P_socket->get_list() ;
01174   T_ReceiveMsgContext               L_msg_ctxt ;
01175   
01176   C_MessageFrame                   *L_decoded_msg ;
01177 
01178   C_ProtocolFrame::T_MsgError       L_decode_result        ;
01179   size_t                            L_ret ;
01180 
01181 
01182   unsigned char                    *L_data = m_decode_buffer ;
01183   size_t                            L_buf_size = m_decode_buffer_size ;
01184 
01185   
01186   GEN_DEBUG(0, "C_TransIP::decode_from_protocol() start");
01187 
01188   L_msg_ctxt.m_channel = P_socket->get_channel_id() ;
01189   L_msg_ctxt.m_response = P_socket->get_id();
01190 
01191   while ((L_data_size 
01192           = P_socket->received_buffer(L_data, 
01193                                       L_buf_size, 
01194                                       &L_msg_ctxt.m_time)) != 0) {
01195 
01196     L_protocol->log_buffer((char*)"received", L_data, L_data_size);
01197 
01198 
01199     L_session_buf = L_decode -> get_buffer(L_data, &L_data_size);
01200 
01201 
01202     L_current_data = L_session_buf ;
01203     L_tmp_size = L_data_size ;
01204     L_ret = L_data_size ;
01205     
01206     if (L_tmp_size) {
01207 
01208       do {
01209 
01210         // start decode engine
01211         L_decoded_msg 
01212           = L_protocol->decode_message (L_current_data, 
01213                                         &L_ret, 
01214                                         &L_decode_result) ;
01215         
01216         switch (L_decode_result) {
01217 
01218         case C_ProtocolFrame::E_MSG_OK:
01219           // Store new message received
01220           // for the call controller
01221 
01222           L_msg_ctxt.m_msg = L_decoded_msg ;
01223           L_msg_list->push_back(L_msg_ctxt);
01224           
01225           // prepare for next message
01226           L_tmp_size = L_data_size - L_ret ;
01227           if (L_ret != 0) { // not the last of the buffer
01228             L_current_data += L_tmp_size ;
01229             L_data_size -= L_tmp_size ;
01230           }
01231           break ;
01232 
01233         case C_ProtocolFrame::E_MSG_ERROR_DECODING_SIZE_LESS:
01234           // segmentation
01235           // => put L_current_data and L_data_size in 
01236           // => remaining data_buffer
01237 
01238           // save buffer for next receive
01239           if (L_decode->set_buffer (L_current_data, 
01240                                     L_data_size) != 0) {
01241             L_decode->reset_buffer() ;
01242           } 
01243           L_ret = 0 ;
01244           break ;
01245         default:
01246           // TO BE DONE : 
01247           // more complex synchronization algorithm !!!!!
01248           LOG_ALL("*** Unrecognized message received ***") ;
01249           // GEN_ERROR(E_GEN_FATAL_ERROR, 
01250           //    "*** Unrecognized message received ***") ;
01251           L_decode->reset_buffer() ;
01252           L_data_size = 0 ;
01253           L_ret = 0 ;
01254           break ;
01255         }
01256       
01257       } while (L_ret != 0) ;
01258 
01259     }
01260 
01261   }
01262 
01263   GEN_DEBUG(0, "C_TransIP::decode_from_protocol() end");
01264 }
01265 
01266 bool C_TransIP::get_message (int P_id, T_pReceiveMsgContext P_ctxt) {
01267 
01268   T_SocketMap::iterator  L_it          ;
01269   bool                   L_ret = false ;
01270   T_pRcvMsgCtxtList      L_list        ;
01271 
01272   GEN_DEBUG(0, "C_TransIP::get_message(" << P_id << ")");
01273 
01274   L_it = m_socket_map.find(T_SocketMap::key_type(P_id));
01275   if (L_it != m_socket_map.end()) {
01276     L_list = (L_it->second)->get_list() ;
01277     if (!L_list->empty()) {
01278       *P_ctxt = *L_list->begin() ;
01279       L_ret = true ;
01280       L_list->erase(L_list->begin()) ;
01281     }
01282   } else {
01283     LOG_ALL_P1("transport id: [%d] incorrect", P_id);
01284     //    GEN_ERROR(0, "transport id [" << P_id << "] incorrect");
01285   }
01286 
01287   GEN_DEBUG(0, "C_TransIP::get_message() end with " << L_ret);
01288   return (L_ret);
01289 }
01290 
01291 // External interface
01292 
01293 T_pTransport create_cipio_instance () {
01294   T_pC_TransIP L_inst ;
01295   NEW_VAR(L_inst, C_TransIP());
01296   return (L_inst);
01297 }
01298 
01299 void delete_cipio_instance (T_ppTransport P_inst) {
01300   if (P_inst != NULL) {
01301     T_pC_TransIP L_inst = (T_pC_TransIP) *P_inst ;
01302     DELETE_VAR(L_inst);
01303     *P_inst = NULL ;
01304   }
01305 }
01306 
01307 // end of file

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