Transport.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file   Transport.h
00006  *
00007  *  $Id: Transport.h 73791 2006-07-27 20:54:56Z wotte $
00008  *
00009  *  @author Nagarajan Surendran <naga@cs.wustl.edu>
00010  */
00011 //=============================================================================
00012 
00013 
00014 #ifndef TAO_AV_TRANSPORT_H
00015 #define TAO_AV_TRANSPORT_H
00016 #include /**/ "ace/pre.h"
00017 
00018 
00019 #include "orbsvcs/AV/FlowSpec_Entry.h"
00020 #include "orbsvcs/AV/AV_Core.h"
00021 
00022 #include "orbsvcs/AV/AV_export.h"
00023 
00024 #include "ace/Service_Object.h"
00025 #include "ace/Acceptor.h"
00026 #include "ace/SOCK_Acceptor.h"
00027 #include "ace/SOCK_Connector.h"
00028 #include "ace/Connector.h"
00029 #include "ace/Addr.h"
00030 #include "ace/SOCK_Dgram.h"
00031 
00032 
00033 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00034 
00035 // Forward declarations.
00036 class TAO_AV_Core;
00037 class TAO_AV_Transport_Factory;
00038 class TAO_AV_Protocol_Object;
00039 class TAO_AV_Callback;
00040 class TAO_AV_Transport;
00041 
00042 /**
00043  * @class TAO_AV_Transport_Item
00044  * @brief
00045  */
00046 class TAO_AV_Export TAO_AV_Transport_Item
00047 {
00048 public:
00049   /// creator method, the Transport name can only be set when the
00050   /// object is created.
00051   TAO_AV_Transport_Item (const ACE_CString &name);
00052 
00053   /// return a reference to the character representation of the Transport
00054   /// factories name.
00055   const ACE_CString &name (void);
00056 
00057   /// return a pointer to the Transport factory.
00058   TAO_AV_Transport_Factory *factory (void);
00059 
00060   /// set the factory pointer's valus.
00061   void factory (TAO_AV_Transport_Factory *factory);
00062 
00063 private:
00064   /// Transport factory name.
00065   ACE_CString name_;
00066 
00067   /// pointer to factory object.
00068   TAO_AV_Transport_Factory *factory_;
00069 };
00070 
00071 
00072 
00073 
00074 class TAO_AV_Flow_Protocol_Factory;
00075 
00076 /**
00077  * @class TAO_AV_Flow_Protocol_Item
00078  * @brief
00079  */
00080 class TAO_AV_Export TAO_AV_Flow_Protocol_Item
00081 {
00082 public:
00083   /// creator method, the Flow_Protocol name can only be set when the
00084   /// object is created.
00085   TAO_AV_Flow_Protocol_Item (const ACE_CString &name);
00086 
00087   /// return a reference to the character representation of the Flow_Protocol
00088   /// factories name.
00089   const ACE_CString &name (void);
00090 
00091   /// return a pointer to the Flow_Protocol factory.
00092   TAO_AV_Flow_Protocol_Factory *factory (void);
00093 
00094   /// set the factory pointer's valus.
00095   void factory (TAO_AV_Flow_Protocol_Factory *factory);
00096 
00097 private:
00098   /// Flow_Protocol factory name.
00099   ACE_CString name_;
00100 
00101   /// pointer to factory object.
00102   TAO_AV_Flow_Protocol_Factory *factory_;
00103 };
00104 
00105 
00106 /**
00107  * @class TAO_AV_Flow_Handler
00108  * @brief
00109  */
00110 class TAO_AV_Export TAO_AV_Flow_Handler
00111 {
00112 public:
00113   /// Constructor.
00114   TAO_AV_Flow_Handler (void);
00115 
00116   virtual ~TAO_AV_Flow_Handler (void);
00117   /// Start/stop the flow handler.
00118   virtual int start (TAO_FlowSpec_Entry::Role role);
00119   virtual int stop  (TAO_FlowSpec_Entry::Role role);
00120 
00121   /// Schedule timer. Uses the get_timeout method on the callback.
00122   virtual int schedule_timer (void);
00123   virtual int cancel_timer (void);
00124 
00125   /// get the transport.
00126   TAO_AV_Transport *transport (void);
00127 
00128   /// set/get protocol_object.
00129   TAO_AV_Protocol_Object* protocol_object (void);
00130   void protocol_object (TAO_AV_Protocol_Object *protocol_object);
00131 
00132   /// set the callback.
00133   void callback (TAO_AV_Callback *callback);
00134 
00135   /// Handle timeout. called from reactor.
00136   virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
00137 
00138   /// set the remote address.
00139   virtual int set_remote_address (ACE_Addr *address);
00140 
00141   /// get the underlying event handler. To be overridden by the derived clases.
00142   virtual ACE_Event_Handler* event_handler (void) = 0;
00143 
00144   virtual int change_qos (AVStreams::QoS);
00145 
00146 protected:
00147   TAO_AV_Transport *transport_;
00148   TAO_AV_Callback *callback_;
00149   TAO_AV_Protocol_Object *protocol_object_;
00150   long timer_id_;
00151   ACE_Reactor *reactor_;
00152   void *timeout_arg_;
00153 };
00154 
00155 //  Transports
00156 /**
00157  * @class TAO_AV_Transport
00158  * @brief A Base class for the different transport protocols.
00159  *        All the different transports should derive and implement
00160  *        the open,close,send and recv methods.
00161  */
00162 class TAO_AV_Export TAO_AV_Transport
00163 {
00164 public:
00165   TAO_AV_Transport (void);
00166 
00167   virtual ~TAO_AV_Transport (void);
00168 
00169   virtual int open (ACE_Addr *address) = 0;
00170 
00171   virtual int close (void) = 0;
00172 
00173   /// Write the complete Message_Block chain to the connection.
00174   virtual int mtu (void) = 0;
00175   virtual ACE_Addr *get_peer_addr (void) = 0;
00176   virtual ACE_Addr *get_local_addr (void);
00177   virtual ssize_t send (const ACE_Message_Block *mblk,
00178                         ACE_Time_Value *s = 0) = 0;
00179 
00180   /// Write the contents of the buffer of length len to the connection.
00181   virtual ssize_t send (const char *buf,
00182                         size_t len,
00183                         ACE_Time_Value *s = 0) = 0;
00184 
00185   /// Write the contents of iovcnt iovec's to the connection.
00186   virtual ssize_t send (const iovec *iov,
00187                         int iovcnt,
00188                         ACE_Time_Value *s = 0) = 0;
00189 
00190   /// Read len bytes from into buf.
00191   virtual ssize_t recv (char *buf,
00192                         size_t len,
00193                         ACE_Time_Value *s = 0) = 0;
00194 
00195   /// Read len bytes from into buf using flags.
00196   virtual ssize_t recv (char *buf,
00197                         size_t len,
00198                         int flags,
00199                         ACE_Time_Value *s = 0) = 0;
00200 
00201   ///  Read received data into the iovec buffers.
00202   virtual ssize_t recv (iovec *iov,
00203                         int iovcnt,
00204                         ACE_Time_Value *s = 0) = 0;
00205 
00206 };
00207 
00208 class TAO_Base_StreamEndPoint;
00209 class TAO_AV_Core;
00210 class TAO_FlowSpec_Entry;
00211 
00212 /**
00213  * @class TAO_AV_Acceptor
00214  * @brief
00215  */
00216 class TAO_AV_Export TAO_AV_Acceptor
00217 {
00218 public:
00219   TAO_AV_Acceptor (void);
00220   virtual ~TAO_AV_Acceptor (void);
00221   virtual int open (TAO_Base_StreamEndPoint *endpoint,
00222                     TAO_AV_Core *av_core,
00223                     TAO_FlowSpec_Entry *entry,
00224                     TAO_AV_Flow_Protocol_Factory *factory,
00225                     TAO_AV_Core::Flow_Component flow_comp) = 0;
00226 
00227   virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
00228                             TAO_AV_Core *av_core,
00229                             TAO_FlowSpec_Entry *entry,
00230                             TAO_AV_Flow_Protocol_Factory *factory,
00231                             TAO_AV_Core::Flow_Component flow_comp) = 0;
00232 
00233   const char *flowname ();
00234   virtual int close (void) = 0;
00235 protected:
00236   ACE_CString flowname_;
00237   TAO_AV_Core *av_core_;
00238   ACE_Addr *address_;
00239 };
00240 
00241 /**
00242  * @class TAO_AV_Connector
00243  * @brief
00244  */
00245 class TAO_AV_Export TAO_AV_Connector
00246 {
00247 public:
00248   TAO_AV_Connector (void);
00249   virtual ~TAO_AV_Connector (void);
00250   const char *flowname (void);
00251 
00252   virtual int open (TAO_Base_StreamEndPoint *endpoint,
00253                     TAO_AV_Core *av_core,
00254                     TAO_AV_Flow_Protocol_Factory *factory) = 0;
00255 
00256   virtual int connect (TAO_FlowSpec_Entry *entry,
00257                        TAO_AV_Transport *&transport,
00258                        TAO_AV_Core::Flow_Component flow_component) = 0;
00259 
00260   virtual int close (void) = 0;
00261 protected:
00262   ACE_CString flowname_;
00263 };
00264 
00265 
00266 typedef ACE_Unbounded_Set<TAO_AV_Connector*> TAO_AV_ConnectorSet;
00267 typedef ACE_Unbounded_Set_Iterator<TAO_AV_Connector*> TAO_AV_ConnectorSetItor;
00268 
00269 /**
00270  * @class TAO_AV_Connector_Registry
00271  * @brief
00272  */
00273 class TAO_AV_Export TAO_AV_Connector_Registry
00274 {
00275 public:
00276   /**
00277    *  int connect (TAO_FlowSpec_Entry *flowspec,
00278    *               TAO_AV_Transport *&transport);
00279    *  TAO_AV_Connector *get_connector (TAO_AV_Core::Protocol protocol);
00280    * Return the connector bridges
00281    */
00282   TAO_AV_Connector_Registry (void);
00283   ~TAO_AV_Connector_Registry (void);
00284   int open (TAO_Base_StreamEndPoint *endpoint,
00285             TAO_AV_Core *av_core,
00286             TAO_AV_FlowSpecSet &flow_spec_set);
00287   int close (TAO_AV_Connector *connector);
00288   int close_all (void);
00289   TAO_AV_ConnectorSetItor begin (void);
00290   TAO_AV_ConnectorSetItor end (void);
00291 protected:
00292   TAO_AV_ConnectorSet connectors_;
00293 };
00294 
00295 typedef ACE_Unbounded_Set<TAO_AV_Acceptor*> TAO_AV_AcceptorSet;
00296 typedef ACE_Unbounded_Set_Iterator<TAO_AV_Acceptor*> TAO_AV_AcceptorSetItor;
00297 
00298 /**
00299  * @class TAO_AV_Acceptor_Registry
00300  * @brief
00301  */
00302 class TAO_AV_Export TAO_AV_Acceptor_Registry
00303 {
00304 public:
00305   TAO_AV_Acceptor_Registry (void);
00306   ~TAO_AV_Acceptor_Registry (void);
00307   int open (TAO_Base_StreamEndPoint *endpoint,
00308             TAO_AV_Core *av_core,
00309             TAO_AV_FlowSpecSet &flow_spec_set);
00310   int close (TAO_AV_Acceptor *acceptor);
00311   int close_all (void);
00312   TAO_AV_AcceptorSetItor begin (void);
00313   TAO_AV_AcceptorSetItor end (void);
00314 protected:
00315   int open_default (TAO_Base_StreamEndPoint *endpoint,
00316                     TAO_AV_Core *av_core,
00317                     TAO_FlowSpec_Entry *entry);
00318   TAO_AV_AcceptorSet acceptors_;
00319 };
00320 
00321 /**
00322  * @class TAO_AV_Transport_Factory
00323  * @brief
00324  */
00325 class TAO_AV_Export TAO_AV_Transport_Factory : public ACE_Service_Object
00326 {
00327 public:
00328   /// Initialization hook.
00329   TAO_AV_Transport_Factory (void);
00330   virtual ~TAO_AV_Transport_Factory (void);
00331   virtual int init (int argc, char *argv[]);
00332   virtual int match_protocol (const char *protocol_string);
00333   virtual TAO_AV_Acceptor *make_acceptor (void);
00334   virtual TAO_AV_Connector *make_connector (void);
00335   int ref_count;
00336 };
00337 
00338 TAO_END_VERSIONED_NAMESPACE_DECL
00339 
00340 #if defined (__ACE_INLINE__)
00341 #include "orbsvcs/AV/Transport.inl"
00342 #endif /* __ACE_INLINE__ */
00343 
00344 #include /**/ "ace/post.h"
00345 #endif /* TAO_AV_TRANSPORT_H */

Generated on Tue Feb 2 17:47:49 2010 for TAO_AV by  doxygen 1.4.7