00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #ifndef _C_CHANNELCONTROL_H
00021 #define _C_CHANNELCONTROL_H
00022 
00023 #include "string_t.hpp"
00024 #include "map_t.hpp"
00025 
00026 #include "C_IdGenerator.hpp"
00027 #include "C_XmlData.hpp"
00028 
00029 #include "C_MessageFrame.hpp"
00030 #include "C_TransportControl.hpp"
00031 #include "C_ProtocolControl.hpp"
00032 #include "C_SemaphoreTimed.hpp"
00033 
00034 
00035 #define ERROR_CHANNEL_UNKNOWN -1
00036 typedef map_t<string_t, int> T_ChannelNameMap, *T_pChannelNameMap ;
00037 
00038 class C_ChannelControl {
00039 
00040 public:
00041 
00042   typedef enum _channel_type {
00043     E_CHANNEL_GLOBAL,
00044     E_CHANNEL_LOCAL,
00045     E_CHANNEL_UNKNOWN
00046   } T_ChannelType, *T_pChannelType ;
00047 
00048   typedef enum _channel_open_status {
00049     E_CHANNEL_CLOSED,
00050     E_CHANNEL_OPEN_IN_PROGESS,
00051     E_CHANNEL_OPENED
00052   } T_ChannelStatus, *T_pChannelStatus ;
00053 
00054   typedef struct _channel_data {
00055 
00056     int              m_id           ;
00057     T_ChannelType    m_type         ;
00058     int              m_protocol_id  ;
00059     int              m_transport_id ;
00060     C_ProtocolFrame *m_protocol     ;
00061     C_Transport     *m_transport    ;
00062     char            *m_open_args    ;
00063     
00064     T_ChannelStatus  m_open_status  ;
00065     int              m_open_id      ;
00066     bool             m_reconnect    ;
00067 
00068     char            *m_name         ;
00069     
00070 
00071   } T_ChannelData,  *T_pChannelData ;
00072     
00073    C_ChannelControl() ;
00074   ~C_ChannelControl() ;
00075 
00076   bool fromXml (C_XmlData          *P_data,
00077                 C_ProtocolControl  *P_protocol_ctrl,
00078                 C_TransportControl *P_transport_ctrl) ;
00079 
00080   int            get_channel_id   (char *P_name);
00081   char*          get_channel_name (int P_id);
00082   T_pChannelData get_channel_data (char *P_name);
00083   T_pChannelData get_channel_data (int P_id);
00084 
00085   int            open_global_channel () ;
00086   int            check_global_channel () ;
00087   int            open_local_channel (int           P_id, 
00088                                      char         *P_args,
00089                                      int          *P_table, 
00090                                      T_pOpenStatus P_status);
00091 
00092 
00093 
00094   int            set_option_global_channel (int   P_id,
00095                                             char *P_args,
00096                                             int  *P_table) ;
00097 
00098 
00099   void           close_local_channel (int P_id, int*P_table);
00100 
00101 
00102 
00103   int            nb_channel () ;
00104   int            nb_global_channel() ;
00105   int            open_id_from_channel_id (int P_id, int *P_table);
00106   int            send_to_channel (int P_id, int *P_table, C_MessageFrame *P_msg);
00107 
00108   void           reset_channel (int *P_table);
00109 
00110   void           opened (int P_id, int P_open_id);
00111   void           open_failed (int P_id, int P_open_id);
00112   void           closed (int P_id, int P_open_id);
00113   
00114   int            opened () ;
00115 
00116   C_Transport**  get_transport_table (int *P_size) ;
00117 
00118   C_ProtocolFrame *get_channel_protocol (int P_id) ;
00119 
00120   bool            reconnect() ;
00121 
00122 protected:
00123 private:
00124 
00125   T_pChannelNameMap   m_name_map           ;
00126   T_pChannelData     *m_channel_table      ;
00127   int                 m_channel_table_size ;
00128   T_pC_IdGenerator    m_id_gen             ;
00129 
00130   int                 m_nb_global_channel     ;
00131   int                *m_channel_to_ctxt_table ;
00132   int                *m_ctxt_to_channel_table ;
00133 
00134   C_Transport        **m_transport_table ;
00135   int                  m_nb_transport    ;
00136 
00137   bool                 m_reconnect ;
00138   C_SemaphoreTimed    *m_sem_reconnect ;
00139 
00140   void create_context_channel () ;
00141   void create_transport_table (C_TransportControl *P_transport_ctrl) ;
00142   
00143 } ;
00144 
00145 #endif