4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Stefan Bund <stefan.bund@fokus.fraunhofer.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 ClientSocketHandle inline template implementation
27 #include "ClientSocketHandle.ih"
32 #define prefix_ inline
33 ///////////////////////////////cti.p///////////////////////////////////////
35 ///////////////////////////////////////////////////////////////////////////
36 // senf::detail::ReadRange<Policy,ForwardWritableRange,true>
38 // senf::detail::ReadRange<Policy,ForwardWritableRange,true>::read
40 template <class Handle, class ForwardWritableRange>
41 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
42 senf::detail::ReadRange<Handle,ForwardWritableRange,true>::read(Handle & handle,
43 ForwardWritableRange & range)
45 typename boost::range_iterator<ForwardWritableRange>::type i (boost::begin(range));
46 char * ic (reinterpret_cast<char*>(storage_iterator(i)));
47 return i + (handle.read( ic,
48 reinterpret_cast<char*>(storage_iterator(boost::end(range))) )
52 // senf::detail::ReadRange<Policy,ForwardWritableRange,true>::readfrom
54 template <class Handle, class ForwardWritableRange>
55 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
56 senf::detail::ReadRange<Handle,ForwardWritableRange,true>::
57 readfrom(Handle & handle, ForwardWritableRange & range, typename Handle::Address & addr)
59 typename boost::range_iterator<ForwardWritableRange>::type i (boost::begin(range));
60 char * ic (reinterpret_cast<char*>(storage_iterator(i)));
61 return i + (handle.readfrom( ic,
62 reinterpret_cast<char*>(storage_iterator(boost::end(range))),
67 ///////////////////////////////////////////////////////////////////////////
68 // senf::ClientSocketHandle<Policy>
70 ////////////////////////////////////////
73 template <class Policy>
74 template <class OtherPolicy>
75 prefix_ senf::ClientSocketHandle<Policy>::
76 ClientSocketHandle(ClientSocketHandle<OtherPolicy> other,
77 typename SocketHandle<Policy>::template IsCompatible<OtherPolicy>::type *)
78 : SocketHandle<Policy>(other,true)
81 template <class Policy>
82 prefix_ senf::ClientSocketHandle<Policy>::ClientSocketHandle(FileHandle other, bool isChecked)
83 : SocketHandle<Policy>(other, isChecked)
86 template <class Policy>
88 senf::ClientSocketHandle<Policy>::ClientSocketHandle(std::auto_ptr<SocketProtocol> protocol,
90 : SocketHandle<Policy>(protocol,false)
95 template <class Policy>
96 template <class OtherPolicy>
97 prefix_ typename senf::SocketHandle<Policy>::template IsCompatible<OtherPolicy>::type const &
98 senf::ClientSocketHandle<Policy>::operator=(ClientSocketHandle<OtherPolicy> other)
104 ////////////////////////////////////////
105 // reading and writing
107 // senf::ClientSocketHandle<Policy>::read
109 template <class Policy>
110 template <class ForwardWritableRange>
111 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
112 senf::ClientSocketHandle<Policy>::read(ForwardWritableRange const & range)
114 return detail::ReadRange<
115 ClientSocketHandle<Policy>,
116 ForwardWritableRange const,
117 contiguous_storage_iterator<
118 typename boost::range_iterator<ForwardWritableRange>::type
119 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
120 >::read(*this, range);
123 template <class Policy>
124 template <class ForwardWritableRange>
125 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
126 senf::ClientSocketHandle<Policy>::read(ForwardWritableRange & range)
128 return detail::ReadRange<
129 ClientSocketHandle<Policy>,
130 ForwardWritableRange,
131 contiguous_storage_iterator<
132 typename boost::range_iterator<ForwardWritableRange>::type
133 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
134 >::read(*this, range);
137 template <class Policy>
138 prefix_ char * senf::ClientSocketHandle<Policy>::read(char * start, char * end)
140 return start + Policy::ReadPolicy::read(*this, start, end-start);
143 // senf::ClientSocketHandle<Policy>::readfrom
145 template <class Policy>
146 template <class ForwardWritableRange>
147 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
148 senf::ClientSocketHandle<Policy>::readfrom(ForwardWritableRange const & range, Address & from)
150 return detail::ReadRange<
151 ClientSocketHandle<Policy>,
152 ForwardWritableRange const,
153 contiguous_storage_iterator<
154 typename boost::range_iterator<ForwardWritableRange>::type
155 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
156 >::readfrom(*this, range, from);
159 template <class Policy>
160 template <class ForwardWritableRange>
161 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
162 senf::ClientSocketHandle<Policy>::readfrom(ForwardWritableRange & range, Address & from)
164 return detail::ReadRange<
165 ClientSocketHandle<Policy>,
166 ForwardWritableRange,
167 contiguous_storage_iterator<
168 typename boost::range_iterator<ForwardWritableRange>::type
169 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
170 >::readfrom(*this, range, from);
173 template <class Policy>
174 prefix_ char * senf::ClientSocketHandle<Policy>::readfrom(char * start, char * end,
177 return start + Policy::ReadPolicy::readfrom(*this, start, end-start, from);
180 // senf::ClientSocketHandle<Policy>::write
182 template <class Policy>
183 prefix_ unsigned senf::ClientSocketHandle<Policy>::write(char const * buffer,
186 return Policy::WritePolicy::write(*this, buffer, size);
189 // senf::ClientSocketHandle<Policy>::writeto
191 template <class Policy>
192 prefix_ unsigned senf::ClientSocketHandle<Policy>::
193 writeto(typename boost::call_traits<typename Policy::AddressingPolicy::Address>::param_type addr,
194 std::string const & data)
196 return this->writeto(addr, data.data(), data.size());
199 template <class Policy>
200 prefix_ unsigned senf::ClientSocketHandle<Policy>::
201 writeto(typename boost::call_traits<typename Policy::AddressingPolicy::Address>::param_type addr,
202 char const * buffer, unsigned size)
204 return Policy::WritePolicy::writeto(*this, addr, buffer, size);
207 ////////////////////////////////////////
210 // senf::ClientSocketHandle<Policy>::peer
212 template <class Policy>
213 prefix_ typename Policy::AddressingPolicy::Address
214 senf::ClientSocketHandle<Policy>::peer()
216 typename Policy::AddressingPolicy::Address addr;
221 template <class Policy>
222 prefix_ void senf::ClientSocketHandle<Policy>::
223 peer(typename Policy::AddressingPolicy::Address & addr)
225 Policy::AddressingPolicy::peer(*this,addr);
228 // senf::ClientSocketHandle<Policy>::local
230 template <class Policy>
231 prefix_ typename Policy::AddressingPolicy::Address
232 senf::ClientSocketHandle<Policy>::local()
234 typename Policy::AddressingPolicy::Address addr;
239 template <class Policy>
240 prefix_ void senf::ClientSocketHandle<Policy>::
241 local(typename Policy::AddressingPolicy::Address & addr)
243 Policy::AddressingPolicy::local(*this,addr);
246 // senf::ClientSocketHandle<Policy>::connect
248 template <class Policy>
249 prefix_ void senf::ClientSocketHandle<Policy>::connect(AddressParam addr)
251 Policy::AddressingPolicy::connect(*this,addr);
254 // senf::ClientSocketHandle<Policy>::bind
256 template <class Policy>
257 prefix_ void senf::ClientSocketHandle<Policy>::
258 bind(typename boost::call_traits<typename Policy::AddressingPolicy::Address>::param_type addr)
260 Policy::AddressingPolicy::bind(*this,addr);
263 ////////////////////////////////////////
266 // senf::ClientSocketHandle<Policy>::rcvbuf
268 template <class Policy>
269 prefix_ unsigned senf::ClientSocketHandle<Policy>::rcvbuf()
271 return Policy::BufferingPolicy::rcvbuf(*this);
274 template <class Policy>
275 prefix_ void senf::ClientSocketHandle<Policy>::rcvbuf(unsigned size)
277 Policy::BufferingPolicy::rcvbuf(*this,size);
280 // senf::ClientSocketHandle<Policy>::sndbuf
282 template <class Policy>
283 prefix_ unsigned senf::ClientSocketHandle<Policy>::sndbuf()
285 return Policy::BufferingPolicy::sndbuf(*this);
288 template <class Policy>
289 prefix_ void senf::ClientSocketHandle<Policy>::sndbuf(unsigned size)
291 Policy::BufferingPolicy::sndbuf(*this,size);
294 ////////////////////////////////////////
297 template <class Policy>
298 prefix_ senf::ClientSocketHandle<Policy>
299 senf::ClientSocketHandle<Policy>::cast_static(FileHandle handle)
301 return ClientSocketHandle(handle, true);
304 template <class Policy>
305 prefix_ senf::ClientSocketHandle<Policy>
306 senf::ClientSocketHandle<Policy>::cast_dynamic(FileHandle handle)
308 SocketHandle<Policy> h (SocketHandle<Policy>::cast_dynamic(handle));
309 if (static_cast<SocketBody&>(FileHandle::body(h)).isServer())
310 throw std::bad_cast();
311 return cast_static(handle);
314 ////////////////////////////////////////
317 template <class Policy>
318 prefix_ void senf::ClientSocketHandle<Policy>::state(SocketStateMap & map, unsigned lod)
320 map["handle"] = prettyName(typeid(*this));
321 this->body().state(map,lod);
324 template <class Policy>
325 prefix_ std::string senf::ClientSocketHandle<Policy>::dumpState(unsigned lod)
329 return detail::dumpState(map);
332 ///////////////////////////////cti.e///////////////////////////////////////
339 // c-file-style: "senf"
340 // indent-tabs-mode: nil
341 // ispell-local-dictionary: "american"