// ********************************************************************** // // Copyright (c) 2002 // MutableRealms, Inc. // Huntsville, AL, USA // // All Rights Reserved // // ********************************************************************** #ifndef ICE_EMITTER_H #define ICE_EMITTER_H #include #include #include #include #include #include #include #include #include namespace Ice { class LocalException; } namespace IceInternal { class Outgoing; class Emitter : public EventHandler, public JTCMutex { public: void destroy(); bool destroyed() const; void prepareRequest(Outgoing*); void sendRequest(Outgoing*, bool); void prepareBatchRequest(Outgoing*); void finishBatchRequest(Outgoing*); void abortBatchRequest(); void flushBatchRequest(); int timeout() const; // // Operations from EventHandler // virtual bool server() const; virtual bool readable() const; virtual void read(BasicStream&); virtual void message(BasicStream&); virtual void exception(const ::Ice::LocalException&); virtual void finished(); virtual bool tryDestroy(); private: Emitter(const InstancePtr&, const TransceiverPtr&, const EndpointPtr&); virtual ~Emitter(); friend class EmitterFactory; enum State { StateActive, StateHolding, StateClosing, StateClosed }; void setState(State, const ::Ice::LocalException&); TransceiverPtr _transceiver; EndpointPtr _endpoint; TraceLevelsPtr _traceLevels; ::Ice::LoggerPtr _logger; ThreadPoolPtr _threadPool; ::Ice::Int _nextRequestId; std::map< ::Ice::Int, Outgoing*> _requests; std::auto_ptr< ::Ice::LocalException> _exception; BasicStream _batchStream; State _state; }; class EmitterFactory : public ::IceUtil::Shared, public JTCMutex { public: EmitterPtr create(const std::vector&); private: EmitterFactory(const InstancePtr&); virtual ~EmitterFactory(); void destroy(); friend class Instance; InstancePtr _instance; std::map _emitters; }; } #endif