00001 // -*- C++ -*- 00002 00003 //============================================================================= 00004 /** 00005 * @file Connector.h 00006 * 00007 * Connector.h,v 4.65 2006/02/24 17:25:11 shuston Exp 00008 * 00009 * @author Douglas C. Schmidt <schmidt@cs.wustl.edu> 00010 */ 00011 //============================================================================= 00012 00013 #ifndef ACE_CONNECTOR_H 00014 #define ACE_CONNECTOR_H 00015 00016 #include /**/ "ace/pre.h" 00017 00018 #include "ace/Service_Object.h" 00019 00020 #if !defined (ACE_LACKS_PRAGMA_ONCE) 00021 # pragma once 00022 #endif /* ACE_LACKS_PRAGMA_ONCE */ 00023 00024 #include "ace/Strategies_T.h" 00025 #include "ace/Synch_Options.h" 00026 #include "ace/Unbounded_Set.h" 00027 00028 ACE_BEGIN_VERSIONED_NAMESPACE_DECL 00029 00030 /** 00031 * @class ACE_Connector_Base 00032 * 00033 * @brief This base interface allows ACE_NonBlocking_Connect_Handler 00034 * to only care about the SVC_HANDLER template parameter of the 00035 * ACE_Connector. Otherwise, ACE_NonBlocking_Connect_Handler would 00036 * have to be configured with all the template parameters that 00037 * ACE_Connector is configured with. 00038 */ 00039 template <class SVC_HANDLER> 00040 class ACE_Connector_Base 00041 { 00042 public: 00043 00044 virtual ~ACE_Connector_Base (void) {} 00045 00046 /// Initialize the Svc_Handler. 00047 virtual void initialize_svc_handler (ACE_HANDLE handle, 00048 SVC_HANDLER *svc_handler) = 0; 00049 00050 /// Return the handle set representing the non-blocking connects in 00051 /// progress. 00052 virtual ACE_Unbounded_Set<ACE_HANDLE> &non_blocking_handles (void) = 0; 00053 }; 00054 00055 /** 00056 * @class ACE_NonBlocking_Connect_Handler 00057 * 00058 * @brief Performs non-blocking connects on behalf of the Connector. 00059 */ 00060 template <class SVC_HANDLER> 00061 class ACE_NonBlocking_Connect_Handler : public ACE_Event_Handler 00062 { 00063 public: 00064 00065 // Constructor. 00066 ACE_NonBlocking_Connect_Handler (ACE_Connector_Base<SVC_HANDLER> &connector, 00067 SVC_HANDLER *, 00068 long timer_id); 00069 00070 /// Close up and return underlying SVC_HANDLER through @c sh. 00071 /** 00072 * If the return value is true the close was performed succesfully, 00073 * implying that this object was removed from the reactor and thereby 00074 * (by means of reference counting decremented to 0) deleted. 00075 * If the return value is false, the close was not successful. 00076 * The @c sh does not have any connection to the return 00077 * value. The argument will return a valid svc_handler object if a 00078 * valid one exists within the object. Returning a valid svc_handler 00079 * pointer also invalidates the svc_handler contained in this 00080 * object. 00081 */ 00082 bool close (SVC_HANDLER *&sh); 00083 00084 /// Get SVC_HANDLER. 00085 SVC_HANDLER *svc_handler (void); 00086 00087 // = Get/set handle. 00088 /// Get handle. 00089 ACE_HANDLE handle (void); 00090 00091 /// Set handle. 00092 void handle (ACE_HANDLE); 00093 00094 // = Set/get timer id. 00095 /// Get timer id. 00096 long timer_id (void); 00097 00098 /// Set timer id. 00099 void timer_id (long timer_id); 00100 00101 /// Called by ACE_Reactor when asynchronous connections fail. 00102 virtual int handle_input (ACE_HANDLE); 00103 00104 /// Called by ACE_Reactor when asynchronous connections succeed. 00105 virtual int handle_output (ACE_HANDLE); 00106 00107 /// Called by ACE_Reactor when asynchronous connections suceeds (on 00108 /// some platforms only). 00109 virtual int handle_exception (ACE_HANDLE fd); 00110 00111 /// This method is called if a connection times out before 00112 /// completing. 00113 virtual int handle_timeout (const ACE_Time_Value &tv, 00114 const void *arg); 00115 00116 /// Should Reactor resume us if we have been suspended before the 00117 /// upcall? 00118 virtual int resume_handler (void); 00119 00120 /// Dump the state of an object. 00121 void dump (void) const; 00122 00123 /// Declare the dynamic allocation hooks. 00124 ACE_ALLOC_HOOK_DECLARE; 00125 00126 private: 00127 00128 /// Connector base. 00129 ACE_Connector_Base<SVC_HANDLER> &connector_; 00130 00131 /// Associated SVC_HANDLER. 00132 SVC_HANDLER *svc_handler_; 00133 00134 /// Associated timer id. 00135 long timer_id_; 00136 }; 00137 00138 /** 00139 * @class ACE_Connector 00140 * 00141 * @brief Generic factory for actively connecting clients and creating 00142 * service handlers (SVC_HANDLERs). 00143 * 00144 * Implements the strategy for actively establishing connections with 00145 * clients. An ACE_Connector is parameterized by concrete types that 00146 * conform to the interfaces of PEER_CONNECTOR and SVC_HANDLER. The 00147 * PEER_CONNECTOR is instantiated with a transport mechanism that 00148 * actively establishes connections. The SVC_HANDLER is instantiated 00149 * with a concrete type that performs the application-specific 00150 * service. Both blocking and non-blocking connects are supported. 00151 * Further, non-blocking connects support timeouts. 00152 */ 00153 template <class SVC_HANDLER, ACE_PEER_CONNECTOR_1> 00154 class ACE_Connector : public ACE_Connector_Base<SVC_HANDLER>, public ACE_Service_Object 00155 { 00156 public: 00157 00158 // Useful STL-style traits. 00159 typedef ACE_TYPENAME SVC_HANDLER::addr_type addr_type; 00160 typedef ACE_PEER_CONNECTOR connector_type; 00161 typedef SVC_HANDLER handler_type; 00162 typedef ACE_TYPENAME SVC_HANDLER::stream_type stream_type; 00163 00164 // typedef ACE_TYPENAME ACE_PEER_CONNECTOR_ADDR PEER_ADDR; 00165 #if defined (ACE_HAS_TYPENAME_KEYWORD) 00166 typedef ACE_PEER_CONNECTOR_ADDR ACE_PEER_ADDR_TYPEDEF; 00167 #endif /* ACE_HAS_TYPENAME_KEYWORD */ 00168 00169 typedef ACE_TYPENAME _ACE_PEER_CONNECTOR::PEER_ADDR 00170 ACE_TYPENAME_ACE_PEER_CONNECTOR_PEER_ADDR; 00171 00172 /** 00173 * Initialize a connector. @a flags indicates how <SVC_HANDLER>'s 00174 * should be initialized prior to being activated. Right now, the 00175 * only flag that is processed is ACE_NONBLOCK, which enabled 00176 * non-blocking I/O on the <SVC_HANDLER> when it is opened. 00177 */ 00178 ACE_Connector (ACE_Reactor *r = ACE_Reactor::instance (), 00179 int flags = 0); 00180 00181 /** 00182 * Initialize a connector. @a flags indicates how <SVC_HANDLER>'s 00183 * should be initialized prior to being activated. Right now, the 00184 * only flag that is processed is ACE_NONBLOCK, which enabled 00185 * non-blocking I/O on the <SVC_HANDLER> when it is opened. 00186 */ 00187 virtual int open (ACE_Reactor *r = ACE_Reactor::instance (), 00188 int flags = 0); 00189 00190 /// Shutdown a connector and release resources. 00191 virtual ~ACE_Connector (void); 00192 00193 // = Connection establishment methods. 00194 00195 /** 00196 * Initiate connection of <svc_handler> to peer at <remote_addr> 00197 * using <synch_options>. If the caller wants to designate the 00198 * selected <local_addr> they can (and can also insist that the 00199 * <local_addr> be reused by passing a value <reuse_addr> == 00200 * 1). @a flags and <perms> can be used to pass any flags that are 00201 * needed to perform specific operations such as opening a file 00202 * within connect with certain permissions. If the connection fails 00203 * the <close> hook on the <svc_handler> will be called 00204 * automatically to prevent resource leaks. 00205 */ 00206 virtual int connect (SVC_HANDLER *&svc_handler, 00207 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00208 const ACE_Synch_Options &synch_options = ACE_Synch_Options::defaults, 00209 const ACE_PEER_CONNECTOR_ADDR &local_addr 00210 = (ACE_TYPENAME_ACE_PEER_CONNECTOR_PEER_ADDR &) ACE_PEER_CONNECTOR_ADDR_ANY, 00211 int reuse_addr = 0, 00212 int flags = O_RDWR, 00213 int perms = 0); 00214 00215 /** 00216 * This is a variation on the previous <connect> method. On cached 00217 * connectors the <svc_handler_hint> variable can be used as a hint 00218 * for future lookups. Since this variable is modified in the 00219 * context of the internal cache its use is thread-safe. But the 00220 * actual svc_handler for the current connection is returned in the 00221 * second parameter <svc_handler>. If the connection fails the 00222 * <close> hook on the <svc_handler> will be called automatically to 00223 * prevent resource leaks. 00224 */ 00225 virtual int connect (SVC_HANDLER *&svc_handler_hint, 00226 SVC_HANDLER *&svc_handler, 00227 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00228 const ACE_Synch_Options &synch_options = ACE_Synch_Options::defaults, 00229 const ACE_PEER_CONNECTOR_ADDR &local_addr 00230 = (ACE_TYPENAME_ACE_PEER_CONNECTOR_PEER_ADDR &) ACE_PEER_CONNECTOR_ADDR_ANY, 00231 int reuse_addr = 0, 00232 int flags = O_RDWR, 00233 int perms = 0); 00234 00235 /** 00236 * Initiate connection of <n> <svc_handlers> to peers at 00237 * <remote_addrs> using <synch_options>. Returns -1 if failure 00238 * occurs and 0 otherwise. If <failed_svc_handlers> is non-NULL, a 00239 * 1 is placed in the corresponding index of <failed_svc_handler> 00240 * for each <svc_handlers[i]> that failed to connect, else a 0 is 00241 * placed in that index. 00242 */ 00243 virtual int connect_n (size_t n, 00244 SVC_HANDLER *svc_handlers[], 00245 ACE_PEER_CONNECTOR_ADDR remote_addrs[], 00246 ACE_TCHAR *failed_svc_handlers = 0, 00247 const ACE_Synch_Options &synch_options = 00248 ACE_Synch_Options::defaults); 00249 00250 /** 00251 * Cancel a <svc_handler> that was started asynchronously. Note that 00252 * this is the only case when the Connector does not actively close 00253 * the <svc_handler>. It is left up to the caller of <cancel> to 00254 * decide the fate of the <svc_handler>. 00255 */ 00256 virtual int cancel (SVC_HANDLER *svc_handler); 00257 00258 /// Close down the Connector. All pending non-blocking connects are 00259 /// canceled and the corresponding svc_handler is closed. 00260 virtual int close (void); 00261 00262 /// Return the underlying PEER_CONNECTOR object. 00263 virtual ACE_PEER_CONNECTOR &connector (void) const; 00264 00265 /// Initialize Svc_Handler. 00266 virtual void initialize_svc_handler (ACE_HANDLE handle, 00267 SVC_HANDLER *svc_handler); 00268 00269 /// Set Reactor. 00270 virtual void reactor (ACE_Reactor *reactor); 00271 00272 /// Get Reactor. 00273 virtual ACE_Reactor *reactor (void) const; 00274 00275 /// Dump the state of an object. 00276 void dump (void) const; 00277 00278 /// Declare the dynamic allocation hooks. 00279 ACE_ALLOC_HOOK_DECLARE; 00280 00281 protected: 00282 // = Helpful typedefs. 00283 typedef ACE_NonBlocking_Connect_Handler<SVC_HANDLER> NBCH; 00284 00285 // = The following two methods define the Connector's strategies for 00286 // creating, connecting, and activating SVC_HANDLER's, respectively. 00287 00288 /** 00289 * Bridge method for creating a SVC_HANDLER. The default is to 00290 * create a new SVC_HANDLER only if <sh> == 0, else <sh> is 00291 * unchanged. However, subclasses can override this policy to 00292 * perform SVC_HANDLER creation in any way that they like (such as 00293 * creating subclass instances of SVC_HANDLER, using a singleton, 00294 * dynamically linking the handler, etc.). Returns -1 if failure, 00295 * else 0. 00296 */ 00297 virtual int make_svc_handler (SVC_HANDLER *&sh); 00298 00299 /** 00300 * Bridge method for connecting the <svc_handler> to the 00301 * <remote_addr>. The default behavior delegates to the 00302 * <PEER_CONNECTOR::connect>. 00303 */ 00304 virtual int connect_svc_handler (SVC_HANDLER *&svc_handler, 00305 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00306 ACE_Time_Value *timeout, 00307 const ACE_PEER_CONNECTOR_ADDR &local_addr, 00308 int reuse_addr, 00309 int flags, 00310 int perms); 00311 virtual int connect_svc_handler (SVC_HANDLER *&svc_handler, 00312 SVC_HANDLER *&sh_copy, 00313 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00314 ACE_Time_Value *timeout, 00315 const ACE_PEER_CONNECTOR_ADDR &local_addr, 00316 int reuse_addr, 00317 int flags, 00318 int perms); 00319 00320 /** 00321 * Bridge method for activating a <svc_handler> with the appropriate 00322 * concurrency strategy. The default behavior of this method is to 00323 * activate the SVC_HANDLER by calling its <open> method (which 00324 * allows the SVC_HANDLER to define its own concurrency strategy). 00325 * However, subclasses can override this strategy to do more 00326 * sophisticated concurrency activations (such as creating the 00327 * SVC_HANDLER as an "active object" via multi-threading or 00328 * multi-processing). 00329 */ 00330 virtual int activate_svc_handler (SVC_HANDLER *svc_handler); 00331 00332 /// Creates and registers ACE_NonBlocking_Connect_Handler. 00333 int nonblocking_connect (SVC_HANDLER *, 00334 const ACE_Synch_Options &); 00335 00336 /// Implementation the <connect> methods. 00337 virtual int connect_i (SVC_HANDLER *&svc_handler, 00338 SVC_HANDLER **sh_copy, 00339 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00340 const ACE_Synch_Options &synch_options, 00341 const ACE_PEER_CONNECTOR_ADDR &local_addr, 00342 int reuse_addr, 00343 int flags, 00344 int perms); 00345 00346 /// Return the handle set representing the non-blocking connects in 00347 /// progress. 00348 ACE_Unbounded_Set<ACE_HANDLE> &non_blocking_handles (void); 00349 00350 // = Dynamic linking hooks. 00351 /// Default version does no work and returns -1. Must be overloaded 00352 /// by application developer to do anything meaningful. 00353 virtual int init (int argc, ACE_TCHAR *argv[]); 00354 00355 /// Calls <handle_close> to shutdown the Connector gracefully. 00356 virtual int fini (void); 00357 00358 /// Default version returns address info in <buf>. 00359 virtual int info (ACE_TCHAR **, size_t) const; 00360 00361 // = Service management hooks. 00362 /// Default version does no work and returns -1. Must be overloaded 00363 /// by application developer to do anything meaningful. 00364 virtual int suspend (void); 00365 00366 /// Default version does no work and returns -1. Must be overloaded 00367 /// by application developer to do anything meaningful. 00368 virtual int resume (void); 00369 00370 private: 00371 /// This is the peer connector factory. 00372 ACE_PEER_CONNECTOR connector_; 00373 00374 /** 00375 * Flags that indicate how <SVC_HANDLER>'s should be initialized 00376 * prior to being activated. Right now, the only flag that is 00377 * processed is ACE_NONBLOCK, which enabled non-blocking I/O on 00378 * the <SVC_HANDLER> when it is opened. 00379 */ 00380 int flags_; 00381 00382 /// Pointer to the Reactor. 00383 ACE_Reactor *reactor_; 00384 00385 /// Handle set representing the non-blocking connects in progress. 00386 ACE_Unbounded_Set<ACE_HANDLE> non_blocking_handles_; 00387 00388 }; 00389 00390 /** 00391 * @class ACE_Strategy_Connector 00392 * 00393 * @brief Abstract factory for creating a service handler 00394 * (SVC_HANDLER), connecting the SVC_HANDLER, and activating the 00395 * SVC_HANDLER. 00396 * 00397 * Implements a flexible and extensible set of strategies for 00398 * actively establishing connections with clients. There are 00399 * three main strategies: (1) creating a SVC_HANDLER, (2) 00400 * actively initiating a new connection from the client, 00401 * and (3) activating the SVC_HANDLER with a 00402 * particular concurrency mechanism after the connection is established. 00403 */ 00404 template <class SVC_HANDLER, ACE_PEER_CONNECTOR_1> 00405 class ACE_Strategy_Connector 00406 : public ACE_Connector <SVC_HANDLER, ACE_PEER_CONNECTOR_2> 00407 { 00408 public: 00409 00410 // Useful STL-style traits. 00411 typedef ACE_Creation_Strategy<SVC_HANDLER> 00412 creation_strategy_type; 00413 typedef ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> 00414 connect_strategy_type; 00415 typedef ACE_Concurrency_Strategy<SVC_HANDLER> 00416 concurrency_strategy_type; 00417 typedef ACE_Connector <SVC_HANDLER, ACE_PEER_CONNECTOR_2> 00418 base_type; 00419 00420 // = Define some useful (old style) traits. 00421 typedef ACE_Creation_Strategy<SVC_HANDLER> 00422 CREATION_STRATEGY; 00423 typedef ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> 00424 CONNECT_STRATEGY; 00425 typedef ACE_Concurrency_Strategy<SVC_HANDLER> 00426 CONCURRENCY_STRATEGY; 00427 typedef ACE_Connector <SVC_HANDLER, ACE_PEER_CONNECTOR_2> 00428 SUPER; 00429 00430 /** 00431 * Initialize a connector. @a flags indicates how <SVC_HANDLER>'s 00432 * should be initialized prior to being activated. Right now, the 00433 * only flag that is processed is ACE_NONBLOCK, which enabled 00434 * non-blocking I/O on the <SVC_HANDLER> when it is opened. 00435 */ 00436 ACE_Strategy_Connector (ACE_Reactor *r = ACE_Reactor::instance (), 00437 ACE_Creation_Strategy<SVC_HANDLER> * = 0, 00438 ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> * = 0, 00439 ACE_Concurrency_Strategy<SVC_HANDLER> * = 0, 00440 int flags = 0); 00441 00442 /** 00443 * Initialize a connector. @a flags indicates how <SVC_HANDLER>'s 00444 * should be initialized prior to being activated. Right now, the 00445 * only flag that is processed is ACE_NONBLOCK, which enabled 00446 * non-blocking I/O on the <SVC_HANDLER> when it is opened. 00447 * Default strategies would be created and used. 00448 */ 00449 virtual int open (ACE_Reactor *r, 00450 int flags); 00451 00452 /** 00453 * Initialize a connector. @a flags indicates how <SVC_HANDLER>'s 00454 * should be initialized prior to being activated. Right now, the 00455 * only flag that is processed is ACE_NONBLOCK, which enabled 00456 * non-blocking I/O on the <SVC_HANDLER> when it is opened. 00457 */ 00458 virtual int open (ACE_Reactor *r = ACE_Reactor::instance (), 00459 ACE_Creation_Strategy<SVC_HANDLER> * = 0, 00460 ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> * = 0, 00461 ACE_Concurrency_Strategy<SVC_HANDLER> * = 0, 00462 int flags = 0); 00463 00464 /// Shutdown a connector and release resources. 00465 virtual ~ACE_Strategy_Connector (void); 00466 00467 /// Close down the Connector 00468 virtual int close (void); 00469 00470 // = Strategies accessors 00471 virtual ACE_Creation_Strategy<SVC_HANDLER> *creation_strategy (void) const; 00472 virtual ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> *connect_strategy (void) const; 00473 virtual ACE_Concurrency_Strategy<SVC_HANDLER> *concurrency_strategy (void) const; 00474 00475 protected: 00476 // = The following three methods define the <Connector>'s strategies 00477 // for creating, connecting, and activating <SVC_HANDLER>'s, 00478 // respectively. 00479 00480 /** 00481 * Bridge method for creating a <SVC_HANDLER>. The strategy for 00482 * creating a <SVC_HANDLER> are configured into the Connector via 00483 * it's <creation_strategy_>. The default is to create a new 00484 * <SVC_HANDLER> only if <sh> == 0, else <sh> is unchanged. 00485 * However, subclasses can override this policy to perform 00486 * <SVC_HANDLER> creation in any way that they like (such as 00487 * creating subclass instances of <SVC_HANDLER>, using a singleton, 00488 * dynamically linking the handler, etc.). Returns -1 if failure, 00489 * else 0. 00490 */ 00491 virtual int make_svc_handler (SVC_HANDLER *&sh); 00492 00493 /** 00494 * Bridge method for connecting the new connection into the 00495 * <SVC_HANDLER>. The default behavior delegates to the 00496 * <PEER_CONNECTOR::connect> in the <Connect_Strategy>. 00497 */ 00498 virtual int connect_svc_handler (SVC_HANDLER *&sh, 00499 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00500 ACE_Time_Value *timeout, 00501 const ACE_PEER_CONNECTOR_ADDR &local_addr, 00502 int reuse_addr, 00503 int flags, 00504 int perms); 00505 00506 /** 00507 * Bridge method for connecting the new connection into the 00508 * <SVC_HANDLER>. The default behavior delegates to the 00509 * <PEER_CONNECTOR::connect> in the <Connect_Strategy>. 00510 * <sh_copy> is used to obtain a copy of the <sh> pointer, but that 00511 * can be kept in the stack; the motivation is a bit too long to 00512 * include here, but basically we want to modify <sh> safely, using 00513 * the internal locks in the Connect_Strategy, while saving a TSS 00514 * copy in <sh_copy>, usually located in the stack. 00515 */ 00516 virtual int connect_svc_handler (SVC_HANDLER *&sh, 00517 SVC_HANDLER *&sh_copy, 00518 const ACE_PEER_CONNECTOR_ADDR &remote_addr, 00519 ACE_Time_Value *timeout, 00520 const ACE_PEER_CONNECTOR_ADDR &local_addr, 00521 int reuse_addr, 00522 int flags, 00523 int perms); 00524 00525 /** 00526 * Bridge method for activating a <SVC_HANDLER> with the appropriate 00527 * concurrency strategy. The default behavior of this method is to 00528 * activate the <SVC_HANDLER> by calling its <open> method (which 00529 * allows the <SVC_HANDLER> to define its own concurrency strategy). 00530 * However, subclasses can override this strategy to do more 00531 * sophisticated concurrency activations (such as creating the 00532 * <SVC_HANDLER> as an "active object" via multi-threading or 00533 * multi-processing). 00534 */ 00535 virtual int activate_svc_handler (SVC_HANDLER *svc_handler); 00536 00537 // = Strategy objects. 00538 00539 /// Creation strategy for an <Connector>. 00540 CREATION_STRATEGY *creation_strategy_; 00541 00542 /// 1 if <Connector> created the creation strategy and thus should 00543 /// delete it, else 0. 00544 int delete_creation_strategy_; 00545 00546 /// Connect strategy for a <Connector>. 00547 CONNECT_STRATEGY *connect_strategy_; 00548 00549 /// 1 if <Connector> created the connect strategy and thus should 00550 /// delete it, else 0. 00551 int delete_connect_strategy_; 00552 00553 /// Concurrency strategy for an <Connector>. 00554 CONCURRENCY_STRATEGY *concurrency_strategy_; 00555 00556 /// 1 if <Connector> created the concurrency strategy and thus should 00557 /// delete it, else 0. 00558 int delete_concurrency_strategy_; 00559 }; 00560 00561 ACE_END_VERSIONED_NAMESPACE_DECL 00562 00563 #if defined (ACE_TEMPLATES_REQUIRE_SOURCE) 00564 #include "ace/Connector.cpp" 00565 #endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ 00566 00567 #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) 00568 #pragma implementation ("Connector.cpp") 00569 #endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ 00570 00571 #include /**/ "ace/post.h" 00572 00573 #endif /* ACE_CONNECTOR_H */