Main Page   Class Hierarchy   Compound List   File List   Compound Members  

C_ProtocolExternal.hpp

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 #ifndef _C_PROTOCOL_EXTERNAL_H
00021 #define _C_PROTOCOL_EXTERNAL_H
00022 
00023 #include "Utils.hpp"
00024 #include "C_XmlData.hpp"
00025 
00026 #include "C_TransportControl.hpp"
00027 #include "C_ProtocolExternalFrame.hpp"
00028 #include "C_MsgBuildContext.hpp"
00029 #include "C_MsgBuildContextFactory.hpp"
00030 #include "list_t.hpp"
00031 #include "map_t.hpp"
00032 #include "string_t.hpp"
00033 #include "C_GeneratorConfig.hpp"
00034 
00035 #include "C_ProtocolStats.hpp"
00036 
00037 class C_MessageExternal ; // forward definition in .cpp (prevent recursive calls)
00038 
00039 class C_ProtocolExternal : public C_ProtocolExternalFrame {
00040 public:
00041   C_ProtocolExternal(C_TransportControl   *P_transport_control,
00042                      C_XmlData            *P_def,
00043                      char                **P_name,
00044                      T_pConfigValueList    P_config_value_list,
00045                      T_ConstructorResult  *P_res);
00046   ~C_ProtocolExternal();
00047 
00048   typedef struct _field_def_t  {
00049     int                                  m_id ;
00050     T_TypeType                           m_type ;
00051     C_MsgBuildContext::T_ContextFunction m_set;
00052     C_MsgBuildContext::T_ContextFunction m_get;
00053     C_MsgBuildContext::T_ContextFunction m_check_set;
00054     C_MsgBuildContext::T_ContextFunction m_check_get;
00055 
00056   } T_DefField, *T_pDefField ;
00057 
00058 
00059   C_MessageFrame* create_new_message (C_MessageFrame *P_msg) ;
00060   C_MessageFrame* create_new_message (void                *P_xml, 
00061                                       T_pInstanceDataList  P_list,
00062                                       int                 *P_nb_body_value) ;
00063 
00064   char*           message_name           ()                  ;
00065   char*           message_component_name ()                  ;
00066   T_pNameAndIdList message_name_list     ()                  ;
00067   T_pNameAndIdList message_component_name_list  ()           ;
00068 
00069   int             find_field         (char *P_name)          ;
00070   bool            find_present_session (int P_msg_id,int P_id) ;
00071 
00072   T_TypeType      get_field_type     (int P_id,
00073                                       int P_sub_id)          ;
00074 
00075   bool           check_sub_entity_needed     (int P_id)      ;
00076 
00077   char*          get_string_value(int P_id, T_pValueData P_data);
00078   char*          get_string_value_field_body(int P_id, T_pValueData P_data);
00079   
00080   C_MsgBuildContextFactory* get_factory() ;
00081 
00082 
00083   C_ProtocolFrame::T_MsgError from_external 
00084   (C_MsgBuildContext* P_build,
00085    T_pReceiveMsgContext P_recvMsgCtx) ;
00086   C_ProtocolFrame::T_MsgError to_external   
00087   (C_MsgBuildContext* P_build,
00088    C_MessageFrame *P_msg) ;
00089 
00090   void log_message (char* P_header, C_MessageFrame *P_msg) ;
00091 
00092 protected:
00093 private:
00094   typedef struct _fielddef_t {
00095     char *m_name    ; 
00096     char *m_type    ;
00097     char *m_get     ;
00098     char *m_set     ;
00099     char *m_check_get ;
00100     char *m_check_set ;
00101     char *m_default ;
00102     char *m_to_string ;
00103     char *m_from_string ;
00104     char *m_config_field_name ;
00105   } T_FieldDef, *T_pFieldDef ;
00106   typedef list_t<T_FieldDef> T_FieldDefList, *T_pFieldDefList ;
00107 
00108   typedef struct _field_value_t {
00109     char          *m_name  ; 
00110     char          *m_value ;
00111   } T_FieldValue, *T_pFieldValue ;
00112   typedef list_t<T_FieldValue> T_FieldValueList, *T_pFieldValueList ;
00113 
00114   typedef list_t<char*> T_CharList, *T_pCharList ;
00115 
00116 
00117   typedef struct _fielddef_body_t {
00118     char              *m_name             ; 
00119     char              *m_instance         ;
00120     T_pFieldValueList  m_list_value       ;
00121     T_pCharList        m_list_not_present ;
00122 
00123   } T_FieldBody, *T_pFieldBody ;
00124   typedef list_t<T_FieldBody> T_FieldBodyList, *T_pFieldBodyList ;
00125 
00126   typedef struct _fielddef_header_t {
00127     char              *m_name                    ; 
00128     T_pFieldValueList  m_list_value              ;
00129     T_pCharList        m_list_header_not_present ;
00130     T_pFieldBodyList   m_list_body               ;
00131   } T_FieldHeader, *T_pFieldHeader               ;
00132   typedef list_t<T_FieldHeader> T_FieldHeaderList, *T_pFieldHeaderList ;
00133 
00134 
00135   typedef struct _field_desc_t {
00136     int                                  m_id ;
00137     T_TypeType                           m_type ;
00138     char                                *m_name ; // to allocate  
00139     C_MsgBuildContext::T_ContextFunction m_get;
00140     C_MsgBuildContext::T_ContextFunction m_set;
00141     C_MsgBuildContext::T_ContextFunction m_check_get;
00142     C_MsgBuildContext::T_ContextFunction m_check_set;
00143 
00144     C_MsgBuildContext::T_ContextStringFunction m_to_string ;
00145     C_MsgBuildContext::T_ContextStringFunction m_from_string ;
00146     char*                         m_config_field_name ;
00147 
00148   } T_FieldDesc, *T_pFieldDesc ;
00149 
00150   typedef struct _field_body_t {
00151     int          m_id     ;
00152     char        *m_name   ; // to allocate
00153     T_pValueData m_header ;
00154   } T_FieldBodyDesc, *T_pFieldBodyDesc ;
00155   typedef map_t<string_t,T_pFieldDesc> T_FieldNameMap, *T_pFieldNameMap ;
00156   typedef map_t<string_t,T_pFieldBodyDesc> T_FieldBodyNameMap, *T_pFieldBodyNameMap ;
00157   typedef map_t<string_t,C_MessageExternal*> T_MessageNameMap, *T_pMessageNameMap ;
00158 
00159   typedef map_t<T_ValueData, C_MessageExternal*> T_MessageDecodeMap, *T_pMessageDecodeMap ;
00160   typedef map_t<T_ValueData, int > T_BodyDecodeMap, *T_pBodyDecodeMap ;
00161 
00162 
00163   
00164   int                       m_nb_body_fields      ;
00165   int                       m_nb_header_fields    ;
00166   int                       m_nb_body_values      ;
00167 
00168   int                       m_nb_config_params    ;
00169 
00170   
00171   int                       m_start_body_index    ;
00172   int                       m_end_header_index    ;
00173   
00174   T_pFieldBodyNameMap       m_body_value_name_map ;
00175   
00176   void                     *m_library_handle      ;
00177   T_FactoryInfo             m_factory_info        ;
00178   C_MsgBuildContextFactory *m_factory             ;
00179   C_MsgBuildContext        *m_factory_context     ;
00180   
00181   char                     *m_message_name        ;
00182   char                     *m_body_name           ;
00183 
00184   int                       m_session_id          ;
00185   int                       m_outof_session_id    ;
00186 
00187   int                       m_type_id             ;
00188   int                       m_body_type_id        ;
00189 
00190   T_pFieldNameMap           m_field_body_name_map ;
00191   T_pFieldNameMap           m_field_name_map      ;
00192   int                       m_id_counter          ;
00193 
00194   T_pValueData              m_header_defaults     , 
00195                             m_body_defaults ;
00196 
00197 
00198   char                     *m_data_field_name ;
00199   T_pMessageNameMap         m_message_map ;
00200 
00201 
00202   T_pFieldDesc             *m_header_field_desc_table   ;
00203   T_pFieldDesc             *m_body_field_desc_table     ;
00204   T_pFieldBodyDesc         *m_body_value_table          ;
00205 
00206   char                    **m_names_table               ;
00207   char                    **m_message_names_table       ;
00208   int                       m_nb_names                  ;
00209   int                       m_nb_message_names          ;
00210   T_pMessageDecodeMap       m_message_decode_map        ;
00211   T_pBodyDecodeMap          m_body_decode_map           ;
00212 
00213   bool                    **m_body_not_present_table    ;
00214 
00215   bool                    **m_header_not_present_table  ;
00216   
00217 
00218   C_MsgBuildContext::T_ContextFunction m_get_body;
00219   C_MsgBuildContext::T_ContextFunction m_add_body;
00220 
00221   C_MsgBuildContext::T_ContextFunction m_create_body;
00222   C_MsgBuildContext::T_ContextFunction m_delete_body;
00223 
00224   C_MsgBuildContext::T_ContextFunction m_create_header;
00225   C_MsgBuildContext::T_ContextFunction m_delete_header;
00226 
00227   C_MsgBuildContext::T_ContextStringFunction *m_from_string_table ;
00228   int                                         m_nb_from_string ;
00229   C_MsgBuildContext::T_ContextStringFunction *m_to_string_table ;
00230 
00231   C_MsgBuildContext::T_ContextStringFunction *m_from_string_field_body_table ;
00232   int                                         m_nb_from_string_field_body ;
00233   C_MsgBuildContext::T_ContextStringFunction *m_to_string_field_body_table ;
00234 
00235 
00236   T_pNameAndIdList             m_message_name_list            ;
00237   T_pNameAndIdList             m_message_comp_name_list       ;
00238 
00239   T_pConfigValueList           m_config_value_list ;
00240 
00241   int xml_analysis (C_XmlData *P_data, char **P_name,
00242                     T_pConfigValueList P_config_value_list);
00243 
00244   int xml_fields (C_XmlData *P_data, 
00245                   T_FieldDefList *P_fielddef_list,
00246                   char **P_section_name,
00247                   char **P_type,
00248                   char **P_create,
00249                   char **P_delete,
00250                   char **P_value_field,
00251                   char **P_add,
00252                   char **P_get,
00253                   bool   P_ctrl_body);
00254 
00255 
00256   int xml_configuration_parameters (C_XmlData *P_data, 
00257                                     T_ParamDefList *P_paramdef_list) ;
00258   
00259   int  update_config_params(T_ParamDef& P_config_param_dico,
00260                             T_pConfigValueList P_config_value_list);
00261   
00262 
00263 
00264   T_FieldBodyList* analyze_body_value(C_XmlData          *P_data, 
00265                                       T_FieldBodyList    *P_fielddef_body_list,
00266                                       bool                P_body_only,
00267                                       int                *P_ret);
00268 
00269   T_FieldValueList* analyze_setfield(C_XmlData          *P_data, 
00270                                      T_FieldValueList   *P_field_value_list,                        
00271                                      int                *P_ret);
00272 
00273   T_CharList*       analyze_not_present(C_XmlData          *P_data, 
00274                                         T_CharList         *P_field_not_present_list,                       
00275                                         int                *P_ret);
00276 
00277 
00278 
00279   T_FieldHeaderList* analyze_header_value(C_XmlData            *P_data, 
00280                                           T_FieldHeaderList    *P_fielddef_header_list,
00281                                           bool                  P_header_only,
00282                                           int                  *P_ret);
00283   int new_id () ;
00284   int get_id () ;
00285   
00286   int analyze_dictionnary (T_FieldDefList *P_header_fields,
00287                            T_FieldDefList *P_body_fields,
00288                            char *P_body_value_name,
00289                            char *P_session_id_name,
00290                            char *P_outof_session_id_name,
00291                            T_FieldBodyList *P_body_values,
00292                            T_FieldHeaderList *P_header_values,
00293                            char *P_header_type,
00294                            T_pConfigValueList P_config_value_list,
00295                            char *P_body_type) ;
00296 
00297 
00298   char* is_variable(char* P_variableString) ;
00299   char* find_config_value(char* P_variable) ;
00300 
00301   T_pFieldDesc check_field(T_FieldDef &P_field_def, 
00302                            char *P_field_name,
00303                            char **P_data_type_name, 
00304                            char *P_field_type,
00305                            char **P_field_type_found,
00306                            T_pConfigValueList P_config_value_list,
00307                            bool P_header);
00308 
00309   T_pFieldBodyDesc check_body(T_FieldBody &P_field_body);
00310   T_pFieldBodyDesc check_body_value(T_FieldBody &P_field_body);
00311 
00312   int              check_not_present(T_FieldBody &P_field_body);
00313   int              check_header_not_present(T_FieldHeader &P_field_header);
00314 
00315 
00316   void set_body_field_id();
00317   C_MessageExternal* build_message (C_MessageExternal*    P_msg, 
00318                                     T_FieldHeader& P_header_list,
00319                                     T_pInstanceDataList P_list,
00320                                     int                 *P_nb_body_value) ;
00321 
00322   int find_field_id (char*P_name);
00323 
00324 } ;
00325 
00326 #endif // _C_PROTOCOL_EXTERNAL_H
00327 
00328 
00329 
00330 
00331 
00332 
00333 

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