00001 /* -*- C++ -*- */ 00002 00003 //============================================================================= 00004 /** 00005 * @file ATM_Connector.h 00006 * 00007 * $Id: ATM_Connector.h 79410 2007-08-20 12:34:28Z johnnyw $ 00008 * 00009 * @author Joe Hoffert <joeh@cs.wustl.edu> 00010 */ 00011 //============================================================================= 00012 00013 #ifndef ACE_ATM_CONNECTOR_H 00014 #define ACE_ATM_CONNECTOR_H 00015 #include /**/ "ace/pre.h" 00016 00017 #include /**/ "ace/config-all.h" 00018 00019 #if !defined (ACE_LACKS_PRAGMA_ONCE) 00020 # pragma once 00021 #endif /* ACE_LACKS_PRAGMA_ONCE */ 00022 00023 #if defined (ACE_HAS_ATM) 00024 00025 #include "ace/ATM_Stream.h" 00026 #include "ace/ATM_Params.h" 00027 #include "ace/ATM_QoS.h" 00028 00029 #if defined (ACE_WIN32) || defined (ACE_HAS_LINUX_ATM) 00030 #include "ace/SOCK_Connector.h" 00031 ACE_BEGIN_VERSIONED_NAMESPACE_DECL 00032 typedef ACE_SOCK_Connector ATM_Connector; 00033 ACE_END_VERSIONED_NAMESPACE_DECL 00034 #else 00035 #include "ace/XTI_ATM_Mcast.h" 00036 ACE_BEGIN_VERSIONED_NAMESPACE_DECL 00037 typedef ACE_XTI_ATM_Mcast ATM_Connector; 00038 // Open versioned namespace, if enabled by the user. 00039 ACE_END_VERSIONED_NAMESPACE_DECL 00040 #endif 00041 00042 // Open versioned namespace, if enabled by the user. 00043 ACE_BEGIN_VERSIONED_NAMESPACE_DECL 00044 00045 /** 00046 * @class ACE_ATM_Connector 00047 * 00048 * @brief Defines an active connection factory for the ACE_ATM C++ 00049 * wrappers. 00050 */ 00051 class ACE_Export ACE_ATM_Connector 00052 { 00053 public: 00054 // = Initialization methods. 00055 /// Default constructor. 00056 ACE_ATM_Connector (void); 00057 00058 /** 00059 * Actively connect and produce a <new_stream> if things go well. 00060 * The <remote_sap> is the address that we are trying to connect 00061 * with. The <params> are the parameters needed for either socket 00062 * or XTI/ATM connections. The @a timeout is the amount of time to 00063 * wait to connect. If it's 0 then we block indefinitely. If 00064 * *timeout == {0, 0} then the connection is done using non-blocking 00065 * mode. In this case, if the connection can't be made immediately 00066 * the value of -1 is returned with <errno == EWOULDBLOCK>. If 00067 * *timeout > {0, 0} then this is the maximum amount of time to wait before 00068 * timing out. If the time expires before the connection is made 00069 * <errno == ETIME>. The <local_sap> is the value of local address 00070 * to bind to. If it's the default value of <ACE_ATM_Addr::sap_any> then 00071 * the user is letting the OS do the binding. If <reuse_addr> == 1 00072 * then the <local_addr> is reused, even if it hasn't been cleanedup yet. 00073 */ 00074 ACE_ATM_Connector (ACE_ATM_Stream &new_stream, 00075 const ACE_ATM_Addr &remote_sap, 00076 ACE_ATM_Params params = ACE_ATM_Params(), 00077 ACE_ATM_QoS options = ACE_ATM_QoS(), 00078 ACE_Time_Value *timeout = 0, 00079 const ACE_ATM_Addr &local_sap = ACE_ATM_Addr( "", 0 ), 00080 int reuse_addr = 0, 00081 #if defined (ACE_WIN32) 00082 int flags = 0, 00083 #else 00084 int flags = O_RDWR, 00085 #endif /* ACE_WIN32 */ 00086 int perms = 0); 00087 00088 /** 00089 * Actively connect and produce a <new_stream> if things go well. 00090 * The <remote_sap> is the address that we are trying to connect 00091 * with. The <params> are the parameters needed for either socket 00092 * or XTI/ATM connections. The @a timeout is the amount of time to 00093 * wait to connect. If it's 0 then we block indefinitely. If 00094 * *timeout == {0, 0} then the connection is done using non-blocking 00095 * mode. In this case, if the connection can't be made immediately 00096 * the value of -1 is returned with <errno == EWOULDBLOCK>. If 00097 * *timeout > {0, 0} then this is the maximum amount of time to wait before 00098 * timing out. If the time expires before the connection is made 00099 * <errno == ETIME>. The <local_sap> is the value of local address 00100 * to bind to. If it's the default value of <ACE_ATM_Addr::sap_any> then 00101 * the user is letting the OS do the binding. If <reuse_addr> == 1 00102 * then the <local_addr> is reused, even if it hasn't been cleanedup yet. 00103 */ 00104 int connect (ACE_ATM_Stream &new_stream, 00105 const ACE_ATM_Addr &remote_sap, 00106 ACE_ATM_Params params = ACE_ATM_Params(), 00107 ACE_ATM_QoS options = ACE_ATM_QoS(), 00108 ACE_Time_Value *timeout = 0, 00109 const ACE_ATM_Addr &local_sap = ACE_ATM_Addr( "", 00110 0 ), 00111 int reuse_addr = 0, 00112 #if defined (ACE_WIN32) 00113 int flags = 0, 00114 #else 00115 int flags = O_RDWR, 00116 #endif /* ACE_WIN32 */ 00117 int perms = 0); 00118 00119 /** 00120 * Try to complete a non-blocking connection. 00121 * If connection completion is successful then <new_stream> contains 00122 * the connected ACE_SOCK_Stream. If <remote_sap> is non-NULL then it 00123 * will contain the address of the connected peer. 00124 */ 00125 int complete (ACE_ATM_Stream &new_stream, 00126 ACE_ATM_Addr *remote_sap, 00127 ACE_Time_Value *tv); 00128 00129 /** 00130 * Actively add a leaf to the root (i.e., point-to-multipoint). The 00131 * <remote_sap> is the address of the leaf that we 00132 * are trying to add. 00133 */ 00134 int add_leaf (ACE_ATM_Stream ¤t_stream, 00135 const ACE_Addr &remote_sap, 00136 ACE_ATM_QoS &qos); 00137 00138 /// Resets any event associations on this handle 00139 int reset_new_handle (ACE_HANDLE handle); 00140 00141 // = Meta-type info 00142 typedef ACE_ATM_Addr PEER_ADDR; 00143 typedef ACE_ATM_Stream PEER_STREAM; 00144 00145 /// Dump the state of an object. 00146 void dump (void) const; 00147 00148 /// Declare the dynamic allocation hooks. 00149 ACE_ALLOC_HOOK_DECLARE; 00150 00151 private: 00152 ATM_Connector connector_; 00153 }; 00154 00155 // Open versioned namespace, if enabled by the user. 00156 ACE_END_VERSIONED_NAMESPACE_DECL 00157 00158 #if defined (__ACE_INLINE__) 00159 #include "ace/ATM_Connector.inl" 00160 #endif /* __ACE_INLINE__ */ 00161 00162 #endif /* ACE_HAS_ATM */ 00163 #include /**/ "ace/post.h" 00164 #endif /* ACE_ATM_CONNECTOR_H */