C_MessageExternal.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_MessageExternal.hpp"
00021 #include "Utils.hpp"
00022 #include "ProtocolData.hpp"
00023 #include "BufferUtils.hpp"
00024 
00025 #include "GeneratorTrace.hpp"
00026 #include "GeneratorError.h"
00027 
00028 #include "C_ProtocolExternal.hpp"
00029 
00030 #define min(a,b) (a)<(b) ? (a) : (b)
00031 #define max(a,b) (a)>(b) ? (a) : (b)
00032 
00033 C_MessageExternal::C_MessageExternal() : 
00034   C_MessageFrame(), 
00035   m_protocol(NULL),
00036   m_nb_values(0),
00037   m_all_values(NULL),
00038   m_ids(NULL){
00039 
00040   int L_i ;
00041 
00042   ALLOC_TABLE(m_header, T_pValueData, 
00043               sizeof(T_ValueData), m_nb_header_fields);
00044   for (L_i = 0 ; L_i < m_nb_header_fields; L_i++) {
00045     m_header[L_i].m_type = E_TYPE_NUMBER ;
00046     m_header[L_i].m_value.m_val_number = 0 ;
00047     m_header[L_i].m_id = L_i ;
00048   }
00049   
00050   ALLOC_TABLE(m_body, T_pMultiValueData, 
00051               sizeof(T_MultiValueData), m_nb_body_values);
00052   for(L_i = 0 ; L_i < m_nb_body_values; L_i++) {
00053     m_body[L_i].m_nb = 0 ;
00054     m_body[L_i].m_values = NULL ;
00055   }
00056   
00057   m_id = -1 ;
00058 }
00059 
00060 C_MessageExternal::~C_MessageExternal() {
00061   int L_i, L_j ;
00062 
00063   // first delete body values
00064   for (L_i = m_nb_header_fields; L_i < m_nb_values; L_i++) {
00065     for (L_j = 0; L_j < m_nb_body_fields; L_j++) {
00066       resetMemory(m_all_values[L_i][L_j]);
00067     }
00068     FREE_TABLE(m_all_values[L_i]);
00069   }
00070   FREE_TABLE(m_all_values);
00071   FREE_TABLE(m_ids);
00072   
00073   for(L_i = 0 ; L_i < m_nb_body_values; L_i++) {
00074     if (m_body[L_i].m_nb !=0) {
00075       FREE_TABLE(m_body[L_i].m_values);
00076       m_body[L_i].m_nb = 0 ;
00077     }
00078   }
00079   FREE_TABLE(m_body);
00080   for(L_i=0; L_i < m_nb_header_fields; L_i++) {
00081     if(m_header_not_present_table[m_id][L_i] == true ) {
00082       resetMemory(m_header[L_i]);
00083     }
00084   }
00085   FREE_TABLE(m_header);
00086 
00087   m_protocol = NULL ;
00088   m_nb_values = 0 ;
00089 }
00090 
00091 void C_MessageExternal::internal_reset() {
00092 
00093   int L_i, L_j ;
00094 
00095   for (L_i = 0 ; L_i < m_nb_header_fields; L_i++) {
00096     if(m_header_not_present_table[m_id][L_i] == true ) {
00097       resetMemory(m_header[L_i]);
00098     }
00099   }
00100   for(L_i = 0 ; L_i < m_nb_body_values; L_i++) {
00101     m_body[L_i].m_nb = 0 ;
00102     m_body[L_i].m_values = NULL ;
00103   }
00104   if (m_nb_values) {
00105     for (L_i = m_nb_header_fields; L_i < m_nb_values; L_i++) {
00106       for (L_j = 0; L_j < m_nb_body_fields; L_j++) {
00107         resetMemory(m_all_values[L_i][L_j]);
00108       }
00109       FREE_TABLE(m_all_values[L_i]);
00110     }
00111     FREE_TABLE(m_all_values);
00112     FREE_TABLE(m_ids);
00113     m_nb_values = 0 ;
00114   }
00115   m_protocol = NULL ;
00116   m_id = -1 ;
00117 
00118 }
00119 
00120 T_pValueData C_MessageExternal::get_session_id (C_ContextFrame *P_ctxt) { // session id
00121   T_pValueData L_value ;
00122   L_value = ((this)->*(m_get_id))(m_session_id,0);
00123   if (L_value == NULL) {
00124      L_value = get_out_of_session_id();
00125   }  
00126   return (L_value);
00127 }
00128 
00129 T_pValueData C_MessageExternal::get_out_of_session_id () {
00130   return (((this)->*(m_get_outof_session_id))(m_outof_session_id,0));
00131 }
00132 
00133 
00134 T_pValueData C_MessageExternal::get_id_header (int P_id, int P_instance) { 
00135    return (&m_header[P_id]);
00136 }
00137 
00138 T_pValueData C_MessageExternal::get_id_body (int   P_id, int P_instance) { 
00139   int L_id ;
00140 
00141   L_id = P_id - m_nb_header_fields -1 ;
00142   return (m_body[L_id].m_values[P_instance]);
00143 }
00144 
00145 
00146 T_pValueData C_MessageExternal::get_type () { 
00147   return (((this)->*(m_get_type))(m_type_id));
00148 }
00149 
00150 T_pValueData C_MessageExternal::get_type_header (int P_instance) { 
00151    return (&m_header[m_type_id]);
00152 }
00153 
00154 T_pValueData C_MessageExternal::get_type_body (int P_instance) { 
00155   int L_id ;
00156 
00157   L_id = m_type_id - m_nb_header_fields ;
00158   return (m_body[L_id].m_values[0]);
00159 
00160 }
00161 
00162 int C_MessageExternal::get_nb_header_fields () {
00163   return (m_nb_header_fields) ;
00164 }
00165 int C_MessageExternal::get_nb_body_values   () {
00166   return (m_nb_body_values) ;
00167 }
00168 int C_MessageExternal::get_nb_body_fields   () {
00169   return (m_nb_body_fields) ;
00170 }
00171 
00172 bool C_MessageExternal::update_fields (C_MessageFrame *P_ref) {
00173   return (true);
00174 }
00175 bool C_MessageExternal::compare_types (C_MessageFrame *P_ref) {
00176   bool               L_result ;
00177   C_MessageExternal *L_msg ;
00178 
00179   GEN_DEBUG(1, "C_MessageExternal::compare_types() start");
00180   L_msg = dynamic_cast<C_MessageExternal*>(P_ref) ;
00181 
00182   L_result = (L_msg == NULL) ? false : (L_msg->m_id == m_id) ;
00183 
00184 
00185   GEN_DEBUG(1, "C_MessageExternal::compare_types() end");
00186   return (L_result);
00187 }
00188 
00189 bool C_MessageExternal::check (C_MessageFrame  *P_ref, 
00190                                unsigned int     P_levelMask,
00191                                T_CheckBehaviour P_behave) {
00192   GEN_DEBUG(1, "C_MessageExternal::check() start");
00193 
00194   C_MessageExternal  *L_ref                ;
00195 
00196   int                 L_min_nb_values      ;
00197   int                 L_i                  ;
00198   bool                L_found = true       ;
00199   bool                L_additional = false ;
00200 
00201   L_ref = dynamic_cast<C_MessageExternal*>(P_ref);
00202 
00203   L_min_nb_values = min (L_ref->m_nb_values, m_nb_values);
00204   L_additional = (m_nb_values > L_ref->m_nb_values) ;
00205   
00206   // check value of component and operation-code
00207   if (L_found == true) {
00208     for (L_i = 0 ; L_i < L_min_nb_values ; L_i++) {
00209       if (L_ref->m_ids[L_i] !=
00210           m_ids[L_i]) {
00211         L_found = false ;
00212         break;
00213       }
00214     } // for L_i
00215    
00216     if (L_found == false) {
00217       if ((P_levelMask & _check_level_mask[E_CHECK_LEVEL_FIELD_PRESENCE]) || 
00218           (P_levelMask & _check_level_mask[E_CHECK_LEVEL_FIELD_ADDED])) {
00219         GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00220                               "check failed in [" 
00221                               <<  m_message_names[m_id] 
00222                               << "] " << m_protocol->message_name() 
00223                               << ", " << m_protocol->message_component_name ()
00224                               << " ["
00225                               << m_names[L_ref->m_ids[L_i]]
00226                               << "] not found");
00227         return (L_found);
00228       }
00229       
00230     }
00231    
00232     if (P_levelMask & _check_level_mask[E_CHECK_LEVEL_FIELD_ADDED]) {
00233       if (L_additional == true) { // additional values
00234         if (L_min_nb_values < m_nb_values) {
00235           for (L_i = L_min_nb_values ; L_i < m_nb_values ; L_i++) {
00236             GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00237                                   "check failed in [" 
00238                                   <<  m_message_names[m_id] 
00239                                   << "] " << m_protocol->message_name() 
00240                                   << ", " << m_protocol->message_component_name ()
00241                                   << " ["
00242                                   << m_names[this->m_ids[L_i]]
00243                                   << "] not found");
00244 
00245 
00246           }
00247         } else { //missing values
00248           if (L_min_nb_values < L_ref->m_nb_values) {
00249             for (L_i = L_min_nb_values ; L_i < L_ref->m_nb_values ; L_i++) {
00250               GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00251                                     "check failed in [" 
00252                                     <<  m_message_names[m_id] 
00253                                     << "] " << m_protocol->message_name() 
00254                                     << ", " << m_protocol->message_component_name ()
00255                                     << " ["
00256                                     << m_names[L_ref->m_ids[L_i]]
00257                                     << "] not found");
00258             }
00259           }
00260         }
00261       }
00262     }
00263   } // if L_found
00264    
00265 
00266   GEN_DEBUG(1, "C_MessageExternal::check() end");
00267   return (L_found);
00268 }
00269 
00270 bool C_MessageExternal::check_field_presence 
00271 (int              P_id,
00272  T_CheckBehaviour P_behave,
00273  int              P_instance,
00274  int              P_sub_id) {
00275   
00276   bool            L_found = false ;
00277 
00278   GEN_DEBUG(1, "C_MessageExternal::check_field_presence() start");
00279   // this->dump(std::cerr);
00280 
00281   if (P_id < m_nb_header_fields) {
00282     if ((int) m_header[P_id].m_id == P_id) {
00283       L_found = true ;
00284     }
00285   } else {
00286     if (P_sub_id == -1) {
00287       if (m_body[P_id-m_nb_header_fields].m_nb != 0) {
00288         L_found = (P_instance <= m_body[P_id-m_nb_header_fields].m_nb ) ? true : false ;
00289       }
00290     } 
00291   }
00292 
00293   if (L_found == false) {
00294     if (P_id <  m_nb_header_fields) {
00295       GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00296                             "check failed in [" 
00297                             <<  m_message_names[m_id] 
00298                             << "] " << m_protocol->message_name() 
00299                             << ", " << m_protocol->message_component_name ()
00300                             << " ["
00301                             << m_names[P_id]
00302                             << "] not found");
00303       
00304     } else {
00305       if (P_sub_id == -1) {
00306         GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00307                               "check failed in [" 
00308                               <<  m_message_names[m_id] 
00309                               << "] " << m_protocol->message_name() 
00310                               << ", " << m_protocol->message_component_name ()
00311                               << " ["
00312                               << m_names[P_id]
00313                               << "] not found");
00314       }
00315     }
00316   }
00317 
00318   
00319   
00320   GEN_DEBUG(1, "C_MessageExternal::check_field_presence() end");
00321   
00322   return (L_found);
00323 }
00324 
00325 
00326 bool C_MessageExternal::check_field_value
00327 (C_MessageFrame  *P_ref,
00328  int              P_id,
00329  T_CheckBehaviour P_behave,
00330  int              P_instance,
00331  int              P_sub_id) {
00332   
00333   bool            L_check = false ;
00334  
00335   C_MessageExternal  *L_ref                ;
00336 
00337   GEN_DEBUG(1, "C_MessageExternal::check_field_value() start");
00338 
00339   L_ref = dynamic_cast<C_MessageExternal*>(P_ref);
00340 
00341   if (P_id < m_nb_header_fields) {
00342     L_check = (L_ref->m_header[P_id] == m_header[P_id]) ;
00343   } else {
00344     if (P_sub_id != -1 ) {
00345       if ((m_body[P_id-m_nb_header_fields].m_nb != 0) &&
00346           (m_body[P_id-m_nb_header_fields].m_nb == L_ref->m_body[P_id-m_nb_header_fields].m_nb) &&
00347           (P_instance <= L_ref->m_body[P_id-m_nb_header_fields].m_nb) &&
00348           (P_instance <= m_body[P_id-m_nb_header_fields].m_nb) &&
00349           (L_ref->m_ids[P_id] == m_ids[P_id])) {
00350          L_check =(m_body[P_id-m_nb_header_fields]
00351                               .m_values[P_instance][P_sub_id-m_nb_header_fields-m_nb_body_values]
00352                              ==
00353                              L_ref->m_body[P_id-m_nb_header_fields]
00354                               .m_values[P_instance][P_sub_id-m_nb_header_fields-m_nb_body_values]) ;
00355       } else {
00356         L_check = false;
00357       }
00358     } else {
00359       L_check = (P_instance <= m_body[P_id-m_nb_header_fields].m_nb) ;
00360     }
00361 
00362   }
00363   
00364   if (L_check == false) {
00365     if (P_sub_id != -1) {
00366       GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00367                             "check failed in [" 
00368                             <<  m_message_names[m_id] 
00369                             << "] " << m_protocol->message_name() 
00370                             << " and ["
00371                             << m_names[P_id]
00372                             << "] " << m_protocol->message_component_name ());
00373       GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00374                             "    value of field [" 
00375                             << m_names[P_sub_id]
00376                             << "] is incorrect");
00377       
00378     } else {
00379       if (P_id <  m_nb_header_fields) {
00380         GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00381                               "check failed in [" 
00382                               <<  m_message_names[m_id] 
00383                               << "] " << m_protocol->message_name() 
00384                               << ", value of " << m_protocol->message_component_name ()
00385                               << " ["
00386                               << m_names[P_id]
00387                               << "] is incorrect");
00388 
00389       } else {
00390         GEN_LOG_EVENT        (_check_behaviour_mask[P_behave], 
00391                               "check failed in [" 
00392                               <<  m_message_names[m_id] 
00393                               << "] " << m_protocol->message_name() 
00394                               << ", " << m_protocol->message_component_name ()
00395                               << " ["
00396                               << m_names[P_id]
00397                               << "] is incorrect ");
00398       }
00399     }
00400   }
00401   
00402   
00403   GEN_DEBUG(1, "C_MessageExternal::check_field_value() end");
00404   
00405   return (L_check);
00406 }
00407 
00408 
00409 
00410 bool C_MessageExternal::check_field_order
00411 (int              P_id,
00412  T_CheckBehaviour P_behave,
00413  int              P_position) {
00414 
00415   
00416   bool            L_check = false ;
00417  
00418  
00419   GEN_DEBUG(1, "C_MessageExternal::check_field_value() start");
00420 
00421   if (P_id < m_nb_values) {
00422     L_check = ( m_ids[P_position] == P_id) ; 
00423   }
00424 
00425   if (L_check == false) {
00426     GEN_LOG_EVENT  (_check_behaviour_mask[P_behave], 
00427                     "check order failed in [" 
00428                     <<  m_message_names[m_id] 
00429                     << "] " << m_protocol->message_name() 
00430                     << ", received " << m_protocol->message_component_name ()
00431                     << " ["
00432                     << m_names[m_ids[P_position]+m_nb_header_fields]
00433                     << "] when expecting ["
00434                     <<  m_names[P_id]
00435                     << "]");
00436   }
00437 
00438 
00439   
00440   GEN_DEBUG(1, "C_MessageExternal::check_field_value() end");
00441   
00442   return (L_check);
00443 }
00444 
00445 
00446 T_TypeType C_MessageExternal::get_field_type  (int P_id, 
00447                                                int P_sub_id) {
00448   GEN_DEBUG(1, "C_MessageExternal::get_field_type() start");
00449   T_TypeType L_type = E_TYPE_NUMBER;
00450   GEN_DEBUG(1, "C_MessageExternal::get_field_type() end");
00451   L_type = m_protocol->get_field_type(P_id,P_sub_id) ;
00452   return (L_type);
00453 }
00454 
00455 // bool fct (source, dest);
00456 
00457 bool         C_MessageExternal::get_field_value (int P_id,
00458                                                  int P_instance,
00459                                                  int P_sub_id,
00460                                                  T_pValueData P_value) {
00461 
00462   GEN_DEBUG(1, "C_MessageExternal::get_field_value() start");
00463 
00464   // P_id : field_header_id, body_value_id or body_header_id
00465   // if body_value_id ou body_header_id => use instance
00466   // if body_header_id => must use a body_value_id 
00467 
00468   if (P_id < m_nb_header_fields) {
00469     copyValue(*(P_value),m_header[P_id],true) ;
00470   } else {
00471     copyValue(*(P_value),
00472               m_body[P_id-m_nb_header_fields]
00473               .m_values[P_instance][P_sub_id-m_nb_header_fields-m_nb_body_values]
00474               ,true) ;
00475   }
00476 
00477   GEN_DEBUG(1, "C_MessageExternal::get_field_value() end");
00478 
00479   return (true);
00480 }
00481 
00482 bool         C_MessageExternal::set_field_value (T_pValueData P_value, 
00483                                                  int P_id,
00484                                                  int P_instance,
00485                                                  int P_sub_id) {
00486 
00487   GEN_DEBUG(1, "C_MessageExternal::set_field_value() start");
00488 
00489   if (P_id < m_nb_header_fields) {
00490     copyValue(m_header[P_id],*(P_value),true) ;
00491   } else {
00492     copyValue(
00493               m_body[P_id-m_nb_header_fields]
00494               .m_values[P_instance][P_sub_id-m_nb_header_fields-m_nb_body_values],
00495               *(P_value),
00496               true) ;
00497   }
00498 
00499 
00500 
00501   GEN_DEBUG(1, "C_MessageExternal::set_field_value() end");
00502   return (true);  
00503 }
00504 
00505 
00506 C_MessageExternal::C_MessageExternal(C_MessageExternal &P_val) {
00507 
00508   int L_i, L_j ;
00509   int L_id ;
00510   int L_instance ;
00511   int *L_body_instance ;
00512 
00513   ALLOC_TABLE(L_body_instance, int*, sizeof(int), 
00514               m_nb_body_values);
00515   for (L_i = 0 ; L_i < m_nb_body_values; L_i ++) {
00516     L_body_instance[L_i] = 0 ;
00517   }
00518 
00519   m_protocol = P_val.m_protocol ;
00520   m_id = P_val.m_id ;
00521   m_nb_values = P_val.m_nb_values ;
00522   ALLOC_TABLE(m_header, T_pValueData, 
00523               sizeof(T_ValueData), m_nb_header_fields);
00524   for (L_i = 0 ; L_i < m_nb_header_fields; L_i++) {
00525     m_header[L_i].m_type = E_TYPE_NUMBER ;
00526     copyValue(m_header[L_i], P_val.m_header[L_i], false);
00527   }
00528   ALLOC_TABLE(m_body, T_pMultiValueData, 
00529               sizeof(T_MultiValueData), m_nb_body_values);
00530 
00531   for(L_i = 0 ; L_i < m_nb_body_values; L_i++) {
00532     m_body[L_i].m_nb = 0 ;
00533     m_body[L_i].m_values = NULL ;
00534   }
00535 
00536   ALLOC_TABLE(m_all_values,T_pValueData*, 
00537               sizeof(T_pValueData), m_nb_values);
00538   ALLOC_TABLE(m_ids,int*, 
00539               sizeof(int), m_nb_values);
00540   for (L_i = 0; L_i < m_nb_header_fields; L_i++) {
00541     m_all_values[L_i] = &(m_header[L_i]) ;
00542     m_ids[L_i]=L_i;
00543   }
00544   
00545 
00546   for (L_i = m_nb_header_fields; L_i < m_nb_values; L_i++) {
00547 
00548     ALLOC_TABLE(m_all_values[L_i],
00549                 T_pValueData, sizeof(T_ValueData), m_nb_body_fields);
00550     m_ids[L_i] = P_val.m_ids[L_i] ;
00551 
00552     L_id = m_ids[L_i] ;
00553 
00554     for (L_j = 0 ; L_j < m_nb_body_fields; L_j ++) {
00555       copyValue(m_all_values[L_i][L_j],
00556                 P_val.m_all_values[L_i][L_j],
00557                 false);
00558     }
00559     if (L_body_instance[L_id] == 0) {
00560       L_body_instance[L_id] = P_val.m_body[L_id].m_nb ;
00561       ALLOC_TABLE(m_body[L_id].m_values, T_pValueData*,
00562                   sizeof(T_pValueData), L_body_instance[L_id]);
00563     } 
00564     
00565     L_instance = m_body[L_id].m_nb ;
00566     m_body[L_id].m_values[L_instance] = m_all_values[L_i] ;
00567     m_body[L_id].m_nb ++;
00568   }
00569   FREE_TABLE(L_body_instance);
00570 }
00571 
00572 C_MessageExternal& C_MessageExternal::operator= (C_MessageExternal &P_val) {
00573 
00574   int L_i, L_j ;
00575   int L_id ;
00576   int L_instance ;
00577   int *L_body_instance ;
00578 
00579 
00580   ALLOC_TABLE(L_body_instance, int*, sizeof(int), 
00581               m_nb_body_values);
00582   for (L_i = 0 ; L_i < m_nb_body_values; L_i ++) {
00583     L_body_instance[L_i] = 0 ;
00584   }
00585 
00586   internal_reset() ;
00587   m_protocol = P_val.m_protocol ;
00588   m_id = P_val.m_id ;
00589 
00590   for (L_i = 0 ; L_i < m_nb_header_fields; L_i++) {
00591     copyValue(m_header[L_i], P_val.m_header[L_i], false);
00592   }
00593   m_nb_values = P_val.m_nb_values ;
00594 
00595   ALLOC_TABLE(m_all_values,T_pValueData*, 
00596               sizeof(T_pValueData), m_nb_values);
00597   ALLOC_TABLE(m_ids,int*, 
00598               sizeof(int), m_nb_values);
00599   for (L_i = 0; L_i < m_nb_header_fields; L_i++) {
00600     m_all_values[L_i] = &(m_header[L_i]) ;
00601     m_ids[L_i]=L_i;
00602   }
00603   for (L_i = m_nb_header_fields; L_i < m_nb_values; L_i++) {
00604     
00605     ALLOC_TABLE(m_all_values[L_i],
00606                 T_pValueData, sizeof(T_ValueData), m_nb_body_fields);
00607     m_ids[L_i] = P_val.m_ids[L_i] ;
00608     L_id = m_ids[L_i] ;
00609     for (L_j = 0 ; L_j < m_nb_body_fields; L_j ++) {
00610       copyValue(m_all_values[L_i][L_j],
00611                 P_val.m_all_values[L_i][L_j],
00612                 false);
00613     }
00614     if (L_body_instance[L_id] == 0) {
00615       L_body_instance[L_id] = P_val.m_body[L_i].m_nb ;
00616       ALLOC_TABLE(m_body[L_id].m_values, T_pValueData*,
00617                   sizeof(T_pValueData), L_body_instance[L_id]);
00618     }
00619     L_instance = m_body[L_id].m_nb ;
00620     
00621     m_body[L_id].m_values[L_instance] = m_all_values[L_i] ;
00622     m_body[L_id].m_nb ++;
00623   }
00624 
00625   FREE_TABLE(L_body_instance);
00626   return (*this);
00627 }
00628 
00629 iostream_output& operator<< (iostream_output&   P_stream, 
00630                              C_MessageExternal& P_msg) {
00631 
00632   int L_i, L_j, L_k ;
00633   char *L_string_value ;
00634 
00635   P_stream << P_msg.m_message_names[P_msg.m_id] ;
00636 
00637   for (L_i = 0; L_i < P_msg.m_nb_header_fields ; L_i++) {
00638     if (P_msg.m_header_not_present_table[P_msg.m_id][L_i] == true) {
00639       P_stream << iostream_endl ;
00640       P_stream << GEN_HEADER_LOG << GEN_HEADER_NO_LEVEL ;
00641       P_stream << "[" 
00642                << P_msg.m_names[P_msg.m_ids[L_i]] 
00643                << "] = "  ;
00644 
00645       L_string_value = (P_msg.m_protocol)
00646         ->get_string_value(L_i, P_msg.m_all_values[L_i]);
00647 
00648       P_stream << "[" ;
00649       if (L_string_value == NULL) {
00650         P_stream << *P_msg.m_all_values[L_i] ;
00651       } else {
00652         P_stream << L_string_value ;
00653       }
00654       P_stream << "]" ;
00655     }
00656   }
00657 
00658   for (L_i = P_msg.m_nb_header_fields ; L_i < P_msg.m_nb_values ; L_i++) {
00659 
00660     P_stream << iostream_endl ;
00661     P_stream << GEN_HEADER_LOG << GEN_HEADER_NO_LEVEL ;
00662     P_stream << "[" 
00663              << P_msg.m_names[P_msg.m_ids[L_i]+P_msg.m_nb_header_fields] 
00664              << "] = ["  ;
00665 
00666     L_k = P_msg.m_ids[L_i] ;
00667 
00668     for (L_j = 0 ; L_j < P_msg.m_nb_body_fields ; L_j++) {
00669       
00670       if (P_msg.m_body_not_present_table[L_k][L_j] == true) {
00671         P_stream << iostream_endl ;
00672         P_stream << GEN_HEADER_LOG << GEN_HEADER_NO_LEVEL ;
00673         P_stream << " [" 
00674                  << P_msg.m_names[P_msg.m_all_values[L_i][L_j].m_id]
00675                  << "] = " ;
00676         L_string_value = 
00677           (P_msg.m_protocol)
00678           ->get_string_value_field_body(L_j, 
00679                                         &(P_msg.m_all_values[L_i][L_j]));
00680         
00681         P_stream << "[" ;
00682         if (L_string_value == NULL) {
00683           P_stream << P_msg.m_all_values[L_i][L_j] ;
00684         } else {
00685           P_stream << L_string_value ;
00686         }
00687         P_stream << "]" ;
00688       }
00689     }
00690     
00691     P_stream << iostream_endl << GEN_HEADER_LOG << GEN_HEADER_NO_LEVEL ;
00692     P_stream << " ]" ;
00693     
00694   }
00695 
00696 
00697   return (P_stream) ;
00698 }
00699 
00700 int C_MessageExternal::m_nb_header_fields = 0 ;
00701 int C_MessageExternal::m_nb_body_values = 0 ;
00702 int C_MessageExternal::m_nb_body_fields = 0 ;
00703 int C_MessageExternal::m_session_id = 0     ;
00704 int C_MessageExternal::m_outof_session_id = 0 ;
00705 int C_MessageExternal::m_type_id = 0 ;
00706 C_MessageExternal::T_GetId_instance C_MessageExternal::m_get_id = NULL ;
00707 
00708 
00709 C_MessageExternal::T_GetId_instance C_MessageExternal::m_get_outof_session_id = NULL ;
00710 C_MessageExternal::T_GetId C_MessageExternal::m_get_type = NULL ;
00711 
00712 
00713 char** C_MessageExternal::m_names = NULL ;
00714 char** C_MessageExternal::m_message_names = NULL ;
00715 
00716 bool** C_MessageExternal::m_body_not_present_table = NULL ;
00717 bool** C_MessageExternal::m_header_not_present_table = NULL ;
00718 
00719 void C_MessageExternal::dump(iostream_output& P_stream) {
00720 
00721   P_stream << *this << iostream_endl ;
00722 
00723 }
00724 
00725 void C_MessageExternal::set_protocol_data (int P_nb_header_fields,
00726                                            int P_nb_body_values,
00727                                            int P_nb_body_fields,
00728                                            int P_session_id,
00729                                            int P_outof_session_id,
00730                                            int P_type_id,
00731                                            char **P_names,
00732                                            char **P_message_names,
00733                                            bool **P_body_not_present_table,
00734                                            bool **P_header_not_present_table) {
00735  
00736   m_nb_header_fields =  P_nb_header_fields ;
00737   m_nb_body_values = P_nb_body_values ;
00738   m_nb_body_fields = P_nb_body_fields ;
00739   m_session_id = P_session_id ;
00740   m_outof_session_id = P_outof_session_id ;
00741   m_type_id = P_type_id ;
00742 
00743   if (m_session_id < (m_nb_header_fields - 1)) {
00744     m_get_id = &C_MessageExternal::get_id_header ;
00745   } else if (m_session_id < (m_nb_header_fields + m_nb_body_values - 1)) {
00746     m_get_id = &C_MessageExternal::get_id_body ;
00747   } 
00748 
00749   if (m_outof_session_id < (m_nb_header_fields - 1)) {
00750     m_get_outof_session_id = &C_MessageExternal::get_id_header ;
00751   } else if (m_outof_session_id < (m_nb_header_fields + m_nb_body_values - 1)) {
00752     m_get_outof_session_id = &C_MessageExternal::get_id_body ;
00753   } 
00754 
00755   if (m_type_id < (m_nb_header_fields - 1)) {
00756     m_get_type = &C_MessageExternal::get_type_header ;
00757   } else if (m_type_id< (m_nb_header_fields + m_nb_body_values - 1)) {
00758     m_get_type = &C_MessageExternal::get_type_body ;
00759   } 
00760 
00761   m_names = P_names ;
00762   m_message_names = P_message_names ;
00763   m_body_not_present_table = P_body_not_present_table ;
00764   m_header_not_present_table = P_header_not_present_table ;
00765 
00766 }
00767 
00768 C_MessageExternal::C_MessageExternal (C_ProtocolExternal *P_protocol,
00769                                       T_pValueData        P_header, 
00770                                       T_pValueDataList    P_body,       
00771                                       list_t<int>        *P_body_id,
00772                                       int                *P_instance_body) {
00773 
00774   int                       L_i, L_index ;
00775   int                       L_id, L_instance ;
00776   T_ValueDataList::iterator L_value_it ;
00777   list_t<int>::iterator     L_id_it    ;
00778 
00779   GEN_DEBUG(1, "C_MessageExternal::C_MessageExternal() start");
00780   
00781   m_protocol = P_protocol ;
00782   m_header = P_header ;
00783   m_nb_values = m_nb_header_fields ;  
00784 
00785   ALLOC_TABLE(m_body, T_pMultiValueData, 
00786               sizeof(T_MultiValueData), m_nb_body_values);
00787   for(L_i = 0 ; L_i < m_nb_body_values; L_i++) {
00788     m_body[L_i].m_nb = 0 ;
00789     if (P_instance_body[L_i] != 0 ) {
00790       ALLOC_TABLE(m_body[L_i].m_values, T_pValueData*,
00791                   sizeof(T_pValueData), P_instance_body[L_i]);
00792     } else {
00793       m_body[L_i].m_values = NULL ;
00794     }
00795   }
00796 
00797 
00798   if (!P_body->empty()) {
00799     m_nb_values += P_body->size() ;
00800   }
00801   ALLOC_TABLE(m_all_values,T_pValueData*, 
00802               sizeof(T_pValueData), m_nb_values);
00803 
00804   ALLOC_TABLE(m_ids,int*, 
00805               sizeof(int), m_nb_values);
00806   L_index = 0 ;
00807   for (L_i = 0; L_i < m_nb_header_fields; L_i++) {
00808     m_all_values[L_index] = &(m_header[L_i]) ;
00809     m_ids[L_index] = L_i ;
00810     L_index++ ;
00811   }
00812 
00813   if (!P_body->empty()) {
00814     L_id_it = P_body_id->begin() ;
00815     for(L_value_it = P_body->begin();
00816         L_value_it != P_body->end();
00817         L_value_it++) {
00818       m_all_values[L_index] = *L_value_it ;
00819       L_id = *L_id_it;
00820       m_ids[L_index] = L_id ;
00821       L_instance = m_body[L_id].m_nb ;
00822       m_body[L_id].m_values[L_instance] = *L_value_it ;
00823       m_body[L_id].m_nb ++ ;
00824       L_index++;
00825       L_id_it++;
00826     }
00827   }
00828 
00829   GEN_DEBUG(1, "C_MessageExternal::C_MessageExternal() end");
00830 }
00831 
00832 
00833 char* C_MessageExternal::name() {
00834   return(m_message_names[m_id]);
00835 }
00836 
00837 int C_MessageExternal::get_id_message(){
00838   return (m_id) ;
00839 }
00840 
00841 
00842 bool C_MessageExternal::get_field_value(int P_id, 
00843                                         C_RegExp *P_reg,
00844                                         T_pValueData P_value) {
00845   return (true) ;
00846 }
00847 
00848 void C_MessageExternal::update_message_stats () {
00849 }
00850 
00851 
00852 int C_MessageExternal::get_buffer (T_pValueData P_dest,
00853                                    T_MessagePartType P_header_body_type) {
00854   return (0) ;
00855 }

Generated on Wed Mar 7 14:57:52 2007 for Seagull by  doxygen 1.4.6