4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief SocketSink public header */
26 #ifndef HH_SocketSink_
27 #define HH_SocketSink_ 1
30 #include "../Packets/Packets.hh"
31 #include "../Socket/ClientSocketHandle.hh"
32 #include "../Socket/SocketPolicy.hh"
33 #include "../Socket/ReadWritePolicy.hh"
34 #include "../Socket/FramingPolicy.hh"
35 #include "../Socket/CommunicationPolicy.hh"
37 #include "Connectors.hh"
39 //#include "SocketSink.mpp"
40 ///////////////////////////////hh.p////////////////////////////////////////
45 /** \brief Write helper for module::ActiveSocketSink / module::PassiveSocketSink
47 This write helper will write the packets completely as datagrams to the given socket.
52 typedef senf::ClientSocketHandle<
53 senf::MakeSocketPolicy< senf::WriteablePolicy,
54 senf::DatagramFramingPolicy,
55 senf::ConnectedCommunicationPolicy>::policy > Handle;
56 ///< Handle type supported by this writer
58 void operator()(Handle handle, Packet packet);
59 ///< Write \a packet to \a handle
60 /**< Write the complete \a packet as a datagram to \a
62 \param[in] handle Handle to write data to
63 \param[in] packet Packet to write */
72 /** \brief Output module writing data to arbitrary FileHandle
74 This output module will write data to a FileHandle object using a given \a Sink. This
75 output module is active. This requires the file handle to be able to signal its readiness to
76 accept more data via the Scheduler.
78 The default \a Sink is senf::ppi::PacketSink which will write out the complete packet to
81 A \a Sink must fulfill the following interface:
86 typedef unspecified Handle; // type of handle requested
88 SomeSink(); // EITHER default constructible OR
89 SomeSink(SomeSink const & other); // copy constructible
91 void operator()(Handle handle, Packet packet); // insertion function
94 Whenever a packet is received for sending, the \a Sink's \c operator() is called.
98 template <class Sink=PacketSink>
99 class ActiveSocketSink : public Module
101 SENF_PPI_MODULE(ActiveSocketSink);
104 typedef typename Sink::Handle Handle; ///< Handle type requested by writer
106 connector::ActiveInput input; ///< Input connector from which data is received
108 ActiveSocketSink(Handle handle); ///< Create new writer for the given handle
109 /**< Data will be written to \a handle using \a Sink.
110 \pre Requires \a Sink to be default constructible
111 \param[in] handle Handle to write data to */
112 ActiveSocketSink(Handle handle, Sink const & sink);
113 ///< Create new writer for the given handle
114 /**< Data will be written to \a handle using \a Sink.
115 \pre Requires \a Sink to be copy constructible
116 \param[in] handle Handle to write data to
117 \param[in] sink Sink helper writing packet date to the
120 Sink & sink(); ///< Access the sink helper
130 /** \brief Output module writing data to arbitrary FileHandle
132 This output module will write data to a FileHandle object using a given \a Sink. This
133 output module is passive. This implies, that the output handle may not block. This also
134 implies, that data will probably get lost if written to fast for the underlying transport
135 mechanism. Either this is desired (like for a UDP socket) or some additional bandwidth
136 shaping needs to be used.
138 The default \a Sink is senf::ppi::PacketSink which will write out the complete packet to
141 The \a Sink must fulfill the following interface:
146 typedef unspecified Handle; // type of handle requested
148 SomeSink(); // EITHER default constructible
149 SomeSink(SomeSink const & other); // OR copy constructible
151 void operator()(Handle handle, Packet packet); // insertion function
154 Whenever a packet is received for sending, the \a Sink's \c operator() is called.
158 template <class Sink=PacketSink>
159 class PassiveSocketSink : public Module
161 SENF_PPI_MODULE(PassiveSocketSink);
164 typedef typename Sink::Handle Handle; ///< Handle type requested by writer
166 connector::PassiveInput input; ///< Input connector from which data is received
168 PassiveSocketSink(Handle handle); ///< Create new writer for the given handle
169 /**< Data will be written to \a handle using \a Sink.
170 \pre Requires \a Sink to be default constructible
171 \param[in] handle Handle to write data to */
172 PassiveSocketSink(Handle handle, Sink const & sink);
173 ///< Create new writer for the given handle
174 /**< Data will be written to \a handle using \a Sink.
175 \pre Requires \a Sink to be copy constructible
176 \param[in] handle Handle to write data to */
178 Sink & sink(); ///< Access the sink helper
190 ///////////////////////////////hh.e////////////////////////////////////////
191 #include "SocketSink.cci"
192 #include "SocketSink.ct"
193 #include "SocketSink.cti"
200 // c-file-style: "senf"
201 // indent-tabs-mode: nil
202 // ispell-local-dictionary: "american"
203 // compile-command: "scons -u test"
204 // comment-column: 40