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 Writer for module::ActiveSocketSink / module::PassiveSocketSink
47 This writer will write the packets completely as datagrams to the given socket which must be connected.
49 class ConnectedDgramWriter
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 a FileHandle using the provided Writer.
73 If using the default ConnectedDgramWriter the filehandle must be writable, connected and
74 able to handle complete datagrams.
76 This output module will write data to a FileHandle object using a given \a Writer. This
77 output module is active. This requires the file handle to be able to signal its readiness to
78 accept more data via the Scheduler.
80 The default \a Writer is senf::ppi::ConnectedDgramWriter which will write out the complete packet to
83 A \a Writer must fulfill the following interface:
88 typedef unspecified Handle; // type of handle requested
90 SomeWriter(); // EITHER default constructible OR
91 SomeWriter(SomeWriter const & other); // copy constructible
93 void operator()(Handle handle, Packet packet); // insertion function
96 Whenever a packet is received for sending, the \a Writer's \c operator() is called.
100 template <class Writer=ConnectedDgramWriter>
101 class ActiveSocketSink : public Module
103 SENF_PPI_MODULE(ActiveSocketSink);
106 typedef typename Writer::Handle Handle; ///< Handle type requested by writer
108 connector::ActiveInput input; ///< Input connector from which data is received
110 ActiveSocketSink(Handle handle); ///< Create new writer for the given handle
111 /**< Data will be written to \a handle using \a Writer.
112 \pre Requires \a Writer to be default constructible
113 \param[in] handle Handle to write data to */
114 ActiveSocketSink(Handle handle, Writer const & writer);
115 ///< Create new writer for the given handle
116 /**< Data will be written to \a handle using \a Writer.
117 \pre Requires \a Writer to be copy constructible
118 \param[in] handle Handle to write data to
119 \param[in] writer Writer helper writing packet date to the
122 Writer & writer(); ///< Access the Writer
131 /** \brief Output module writing data to a FileHandle using the provided \a Writer.
132 If using the default ConnectedDgramWriter the filehandle must be writable, connected and
133 able to handle complete datagrams.
135 This output module will write data to a FileHandle object using a given \a Writer. This
136 output module is passive. This implies, that the output handle may not block. This also
137 implies, that data will probably get lost if written to fast for the underlying transport
138 mechanism. Either this is desired (like for a UDP socket) or some additional bandwidth
139 shaping needs to be used.
141 The default \a Writer is senf::ppi::ConnectedDgramWriter which will write out the complete packet to
144 The \a Writer must fulfill the following interface:
149 typedef unspecified Handle; // type of handle requested
151 SomeWriter(); // EITHER default constructible
152 SomeWriter(SomeWriter const & other); // OR copy constructible
154 void operator()(Handle handle, Packet packet); // insertion function
157 Whenever a packet is received for sending, the \a Writer's \c operator() is called.
161 template <class Writer=ConnectedDgramWriter>
162 class PassiveSocketSink : public Module
164 SENF_PPI_MODULE(PassiveSocketSink);
167 typedef typename Writer::Handle Handle; ///< Handle type requested by writer
169 connector::PassiveInput input; ///< Input connector from which data is received
171 PassiveSocketSink(Handle handle); ///< Create new writer for the given handle
172 /**< Data will be written to \a handle using \a Writer.
173 \pre Requires \a Writer to be default constructible
174 \param[in] handle Handle to write data to */
175 PassiveSocketSink(Handle handle, Writer const & writer);
176 ///< Create new writer for the given handle
177 /**< Data will be written to \a handle using \a Writer.
178 \pre Requires \a Writer to be copy constructible
179 \param[in] handle Handle to write data to */
181 Writer & writer(); ///< Access the Writer
182 void replaceHandle(Handle newHandle);
183 /**< Replace the handle to which the packets are written
184 * Normally you should access the handle and call connect with
185 * the new address. This also works for other
186 * (active) ConnectedSocketSinks/Sources */
198 ///////////////////////////////hh.e////////////////////////////////////////
199 #include "SocketSink.cci"
200 #include "SocketSink.ct"
201 #include "SocketSink.cti"
208 // c-file-style: "senf"
209 // indent-tabs-mode: nil
210 // ispell-local-dictionary: "american"
211 // compile-command: "scons -u test"
212 // comment-column: 40