// ********************************************************************** // // Copyright (c) 2003-2004 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #ifndef ICE_CONNECTION_FACTORY_H #define ICE_CONNECTION_FACTORY_H #include #include #include // For ThreadPerIncomingConnectionFactory. #include #include #include #include #include #include #include #include #include #include #include namespace Ice { class LocalException; class ObjectAdapterI; } namespace IceInternal { class OutgoingConnectionFactory : public IceUtil::Shared, public IceUtil::Monitor { public: void destroy(); void waitUntilFinished(); Ice::ConnectionIPtr create(const std::vector&, bool&); void setRouter(const ::Ice::RouterPrx&); void removeAdapter(const ::Ice::ObjectAdapterPtr&); void flushBatchRequests(); private: OutgoingConnectionFactory(const InstancePtr&); virtual ~OutgoingConnectionFactory(); friend class Instance; const InstancePtr _instance; bool _destroyed; std::multimap _connections; std::set _pending; // Endpoints for which connection establishment is pending. }; class IncomingConnectionFactory : public EventHandler, public IceUtil::Monitor { public: void activate(); void hold(); void destroy(); void waitUntilHolding() const; void waitUntilFinished(); EndpointPtr endpoint() const; bool equivalent(const EndpointPtr&) const; std::list connections() const; void flushBatchRequests(); // // Operations from EventHandler // virtual bool datagram() const; virtual bool readable() const; virtual void read(BasicStream&); virtual void message(BasicStream&, const ThreadPoolPtr&); virtual void finished(const ThreadPoolPtr&); virtual void exception(const ::Ice::LocalException&); virtual std::string toString() const; private: IncomingConnectionFactory(const InstancePtr&, const EndpointPtr&, const ::Ice::ObjectAdapterPtr&); virtual ~IncomingConnectionFactory(); friend class ::Ice::ObjectAdapterI; enum State { StateActive, StateHolding, StateClosed }; void setState(State); void registerWithPool(); void unregisterWithPool(); void run(); class ThreadPerIncomingConnectionFactory : public IceUtil::Thread { public: ThreadPerIncomingConnectionFactory(const IncomingConnectionFactoryPtr&); virtual void run(); private: IncomingConnectionFactoryPtr _factory; }; friend class ThreadPerIncomingConnectionFactory; IceUtil::ThreadPtr _threadPerIncomingConnectionFactory; AcceptorPtr _acceptor; const TransceiverPtr _transceiver; const EndpointPtr _endpoint; const ::Ice::ObjectAdapterPtr _adapter; bool _registeredWithPool; const bool _warn; std::list _connections; State _state; }; } #endif