X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=PPI%2FSocketSink.hh;h=ee944ddf8ba9c46106bc00bf7fd3109a9b1688f9;hb=5443435c4c2b6e4386c5334b5b8358273f2bae93;hp=742e2dbbd9507b249aff4a1b5e1f536331f6a5ae;hpb=f52075dad8b8291570fa2c61ef9b5ec0a04d1e5e;p=senf.git diff --git a/PPI/SocketSink.hh b/PPI/SocketSink.hh index 742e2db..ee944dd 100644 --- a/PPI/SocketSink.hh +++ b/PPI/SocketSink.hh @@ -56,6 +56,7 @@ namespace ppi { senf::DatagramFramingPolicy, senf::ConnectedCommunicationPolicy>::policy > Handle; ///< Handle type supported by this writer + typedef Packet PacketType; void operator()(Handle handle, Packet const & packet); ///< Write \a packet to \a handle @@ -65,6 +66,37 @@ namespace ppi { \param[in] packet Packet to write */ }; + /** \brief Writer sending data with ClientSocketHandle::writeto() + + This writer will send out data using ClientSocketHandle::writeto(). The target address can + be specified in the writer constructor and can be adjusted at any time. + + If no target address is set, incoming data will be silently dropped. + */ + template + class TargetDgramWriter + { + public: + typedef HandleType Handle; + typedef Packet PacketType; + + TargetDgramWriter(); ///< Create TargetDgramWriter with unset target address + TargetDgramWriter(typename Handle::Address const & target); + ///< Create TargetDgramWriter sending to \a target + + typename Handle::Address target() const; ///< Get current target address + void target(typename Handle::Address const & target); ///< Set target address + + void operator()(Handle handle, Packet const & packet); ///< Write \a packet to \a handle + /**< Write the complete \a packet as a datagram to \a + handle. + \param[in] handle Handle to write data to + \param[in] packet Packet to write */ + + private: + typename Handle::Address target_; + }; + class IPv4SourceForcingDgramWriter : ConnectedDgramWriter { public: @@ -74,6 +106,7 @@ namespace ppi { senf::MakeSocketPolicy< senf::WriteablePolicy, senf::DatagramFramingPolicy>::policy > Handle; ///< Handle type supported by this writer + typedef Packet PacketType; void source(senf::INet4Address & source); senf::INet4Address source(); @@ -102,6 +135,7 @@ namespace ppi { senf::MakeSocketPolicy< senf::WriteablePolicy, senf::DatagramFramingPolicy>::policy > Handle; ///< Handle type supported by this writer + typedef Packet PacketType; void source(senf::INet6Address & source); senf::INet6Address source(); @@ -145,6 +179,7 @@ namespace module { { public: typedef unspecified Handle; // type of handle requested + typedef unspecified_type PacketType // type of packet read SomeWriter(); // EITHER default constructible OR SomeWriter(SomeWriter const & other); // copy constructible @@ -164,9 +199,18 @@ namespace module { public: typedef typename Writer::Handle Handle; ///< Handle type requested by writer - connector::ActiveInput<> input; ///< Input connector from which data is received + connector::ActiveInput input; ///< Input connector from which data is received - ActiveSocketSink(Handle handle); ///< Create new writer for the given handle + ActiveSocketSink(); ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be default constructible */ + explicit ActiveSocketSink(Writer const & writer); + ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be copy constructible + \param[in] writer Writer helper writing packet date to + the socket */ + explicit ActiveSocketSink(Handle handle); ///< Create new writer for the given handle /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be default constructible \param[in] handle Handle to write data to */ @@ -175,10 +219,15 @@ namespace module { /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be copy constructible \param[in] handle Handle to write data to - \param[in] writer Writer helper writing packet date to the - socket */ + \param[in] writer Writer helper writing packet date to + the socket */ + + Writer & writer(); ///< Access the Writer + Handle handle(); ///< Access handle + void handle(Handle handle); ///< Set handle + /**< Assigning an empty or in-valid() handle will disable + the module until a new. valid handle is assigned. */ - Writer & writer(); ///< Access the Writer private: void write(); @@ -206,6 +255,7 @@ namespace module { { public: typedef unspecified Handle; // type of handle requested + typedef unspecified_type PacketType // type of packet read SomeWriter(); // EITHER default constructible SomeWriter(SomeWriter const & other); // OR copy constructible @@ -225,9 +275,18 @@ namespace module { public: typedef typename Writer::Handle Handle; ///< Handle type requested by writer - connector::PassiveInput<> input; ///< Input connector from which data is received + connector::PassiveInput input; ///< Input connector from which data is received - PassiveSocketSink(Handle handle); ///< Create new writer for the given handle + PassiveSocketSink(); ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be default constructible */ + explicit PassiveSocketSink(Writer const & writer); + ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be copy constructible + \param[in] writer Writer helper writing packet date to + the socket */ + explicit PassiveSocketSink(Handle handle); ///< Create new writer for the given handle /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be default constructible \param[in] handle Handle to write data to */ @@ -235,22 +294,23 @@ namespace module { ///< Create new writer for the given handle /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be copy constructible - \param[in] handle Handle to write data to */ + \param[in] handle Handle to write data to + \param[in] writer Writer helper writing packet date to + the socket */ - Writer & writer(); ///< Access the Writer - Handle & handle(); /**< Access the handle. This is intendet to be mainly used to reconnect - the underlying socket. */ - /* void reconnect(senf::SocketAddress newAddress); - ///< Reconnect the handle to which the packets are written - */ + Writer & writer(); ///< Access the Writer + Handle & handle(); ///< Access handle + void handle(Handle handle); ///< Set handle + /**< Assigning an empty or in-valid() handle will disable + the module until a new. valid handle is assigned. */ + +#ifndef DOXYGEN void replaceHandle(Handle newHandle); - /**< Replace the handle to which the packets are written - * Normally you should access the handle and call connect with - * the new address. This also works for other - * (active) ConnectedSocketSinks/Sources */ +#endif private: void write(); + void checkThrottle(); Handle handle_; Writer writer_;