// ********************************************************************** // // Copyright (c) 2003-2009 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 #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Ice { class LocalException; class ObjectAdapterI; } namespace IceInternal { class OutgoingConnectionFactory : virtual public IceUtil::Shared, public IceUtil::Monitor { public: class CreateConnectionCallback : virtual public IceUtil::Shared { public: virtual void setConnection(const Ice::ConnectionIPtr&, bool) = 0; virtual void setException(const Ice::LocalException&) = 0; }; typedef IceUtil::Handle CreateConnectionCallbackPtr; void destroy(); void waitUntilFinished(); Ice::ConnectionIPtr create(const std::vector&, bool, Ice::EndpointSelectionType, bool&); void create(const std::vector&, bool, Ice::EndpointSelectionType, const CreateConnectionCallbackPtr&); void setRouterInfo(const RouterInfoPtr&); void removeAdapter(const Ice::ObjectAdapterPtr&); void flushBatchRequests(); private: OutgoingConnectionFactory(const InstancePtr&); virtual ~OutgoingConnectionFactory(); friend class Instance; struct ConnectorInfo { ConnectorInfo(const ConnectorPtr& c, const EndpointIPtr& e) : connector(c), endpoint(e) { } bool operator<(const ConnectorInfo& other) const; bool operator==(const ConnectorInfo& other) const; ConnectorPtr connector; EndpointIPtr endpoint; }; class ConnectCallback : public Ice::ConnectionI::StartCallback, public IceInternal::EndpointI_connectors { public: ConnectCallback(const OutgoingConnectionFactoryPtr&, const std::vector&, bool, const CreateConnectionCallbackPtr&, Ice::EndpointSelectionType); virtual void connectionStartCompleted(const Ice::ConnectionIPtr&); virtual void connectionStartFailed(const Ice::ConnectionIPtr&, const Ice::LocalException&); virtual void connectors(const std::vector&); virtual void exception(const Ice::LocalException&); void getConnectors(); void nextEndpoint(); void getConnection(); void nextConnector(); void setConnection(const Ice::ConnectionIPtr&, bool); void setException(const Ice::LocalException&); bool hasConnector(const ConnectorInfo&); bool removeConnectors(const std::vector&); void removeFromPending(); bool operator<(const ConnectCallback&) const; private: const OutgoingConnectionFactoryPtr _factory; const std::vector _endpoints; const bool _hasMore; const CreateConnectionCallbackPtr _callback; const Ice::EndpointSelectionType _selType; std::vector::const_iterator _endpointsIter; std::vector _connectors; std::vector::const_iterator _iter; }; typedef IceUtil::Handle ConnectCallbackPtr; friend class ConnectCallback; std::vector applyOverrides(const std::vector&); Ice::ConnectionIPtr findConnection(const std::vector&, bool&); void incPendingConnectCount(); void decPendingConnectCount(); Ice::ConnectionIPtr getConnection(const std::vector&, const ConnectCallbackPtr&, bool&); void finishGetConnection(const std::vector&, const ConnectorInfo&, const Ice::ConnectionIPtr&, const ConnectCallbackPtr&); void finishGetConnection(const std::vector&, const Ice::LocalException&, const ConnectCallbackPtr&); bool addToPending(const ConnectCallbackPtr&, const std::vector&); void removeFromPending(const ConnectCallbackPtr&, const std::vector&); Ice::ConnectionIPtr findConnection(const std::vector&, bool&); Ice::ConnectionIPtr createConnection(const TransceiverPtr&, const ConnectorInfo&); void handleException(const Ice::LocalException&, bool); void handleException(const Ice::LocalException&, const ConnectorInfo&, const Ice::ConnectionIPtr&, bool); const InstancePtr _instance; bool _destroyed; std::multimap _connections; std::map > _pending; std::multimap _connectionsByEndpoint; int _pendingConnectCount; }; class IncomingConnectionFactory : public EventHandler, public Ice::ConnectionI::StartCallback, public IceUtil::Monitor { public: void activate(); void hold(); void destroy(); void waitUntilHolding() const; void waitUntilFinished(); EndpointIPtr endpoint() const; std::list connections() const; void flushBatchRequests(); // // Operations from EventHandler // virtual bool datagram() const; virtual bool readable() const; virtual bool read(BasicStream&); virtual void message(BasicStream&, const ThreadPoolPtr&); virtual void finished(const ThreadPoolPtr&); virtual void exception(const Ice::LocalException&); virtual std::string toString() const; virtual void connectionStartCompleted(const Ice::ConnectionIPtr&); virtual void connectionStartFailed(const Ice::ConnectionIPtr&, const Ice::LocalException&); private: IncomingConnectionFactory(const InstancePtr&, const EndpointIPtr&, const Ice::ObjectAdapterPtr&); void initialize(const std::string&); virtual ~IncomingConnectionFactory(); friend class Ice::ObjectAdapterI; enum State { StateActive, StateHolding, StateClosed }; void setState(State); AcceptorPtr _acceptor; const TransceiverPtr _transceiver; const EndpointIPtr _endpoint; Ice::ObjectAdapterPtr _adapter; const bool _warn; std::list _connections; State _state; }; } #endif