00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #include "ClientSocketHandle.ih"
00028
00029
00030 #include <typeinfo>
00031
00032 #define prefix_ inline
00033
00034
00035
00036
00037
00038 template <class Handle, class ForwardWritableRange>
00039 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00040 senf::detail::ReadRange<Handle,ForwardWritableRange,true>::read(Handle & handle,
00041 ForwardWritableRange & range)
00042 {
00043 typename boost::range_iterator<ForwardWritableRange>::type const i (boost::begin(range));
00044 char * const ic (reinterpret_cast<char*>(storage_iterator(i)));
00045 return i + (handle.read( ic,
00046 reinterpret_cast<char*>(storage_iterator(boost::end(range))) )
00047 - ic);
00048 }
00049
00050 template <class Handle, class ForwardWritableRange>
00051 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00052 senf::detail::ReadRange<Handle,ForwardWritableRange,true>::
00053 readfrom(Handle & handle, ForwardWritableRange & range, typename Handle::Address & addr)
00054 {
00055 typename boost::range_iterator<ForwardWritableRange>::type const i (boost::begin(range));
00056 char * const ic (reinterpret_cast<char*>(storage_iterator(i)));
00057 return i + (handle.readfrom( ic,
00058 reinterpret_cast<char*>(storage_iterator(boost::end(range))),
00059 addr )
00060 - ic);
00061 }
00062
00063
00064
00065
00066 template <class Handle, class ForwardReadableRange>
00067 prefix_ typename boost::range_const_iterator<ForwardReadableRange>::type
00068 senf::detail::WriteRange<Handle, ForwardReadableRange, true>::
00069 write(Handle & handle, ForwardReadableRange & range)
00070 {
00071 typename boost::range_const_iterator<ForwardReadableRange>::type i
00072 (boost::const_begin(range));
00073 char const * const ic (reinterpret_cast<char const *>(storage_iterator(i)));
00074 std::advance(i, handle.write(ic,
00075 reinterpret_cast<char const *>(
00076 storage_iterator(boost::const_end(range)))) - ic);
00077 return i;
00078 }
00079
00080 template <class Handle, class ForwardReadableRange>
00081 prefix_ typename boost::range_const_iterator<ForwardReadableRange>::type
00082 senf::detail::WriteRange<Handle, ForwardReadableRange, true>::
00083 writeto(Handle & handle, ForwardReadableRange & range, typename Handle::Address const & addr)
00084 {
00085 typename boost::range_const_iterator<ForwardReadableRange>::type i
00086 (boost::const_begin(range));
00087 char const * const ic (reinterpret_cast<char const *>(storage_iterator(i)));
00088 std::advance(i, handle.writeto(addr, ic,
00089 reinterpret_cast<char const *>(
00090 storage_iterator(boost::const_end(range)))) - ic);
00091 return i;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100 template <class SPolicy>
00101 prefix_ senf::ClientSocketHandle<SPolicy>::ClientSocketHandle()
00102 {}
00103
00104 #ifndef DOXYGEN
00105 template <class SPolicy>
00106 template <class OtherPolicy>
00107 prefix_ senf::ClientSocketHandle<SPolicy>::
00108 ClientSocketHandle(ClientSocketHandle<OtherPolicy> other,
00109 typename SocketHandle<SPolicy>::template IsCompatible<OtherPolicy>::type *)
00110 : SocketHandle<SPolicy>(other,true)
00111 {}
00112 #else
00113 template <class SPolicy>
00114 template <class OtherPolicy>
00115 prefix_ senf::ClientSocketHandle<SPolicy>::
00116 ClientSocketHandle(ClientSocketHandle<OtherPolicy> other)
00117 {}
00118 #endif
00119
00120 template <class SPolicy>
00121 prefix_ senf::ClientSocketHandle<SPolicy>::ClientSocketHandle(FileHandle other, bool isChecked)
00122 : SocketHandle<SPolicy>(other, isChecked)
00123 {}
00124
00125 template <class SPolicy>
00126 prefix_
00127 senf::ClientSocketHandle<SPolicy>::ClientSocketHandle(std::auto_ptr<SocketBody> body)
00128 : SocketHandle<SPolicy>(body)
00129 {}
00130
00131 #ifndef DOXYGEN
00132 template <class SPolicy>
00133 template <class OtherPolicy>
00134 prefix_ typename senf::SocketHandle<SPolicy>::template IsCompatible<OtherPolicy>::type const &
00135 senf::ClientSocketHandle<SPolicy>::operator=(ClientSocketHandle<OtherPolicy> other)
00136 {
00137 assign(other);
00138 return *this;
00139 }
00140 #else
00141 template <class SPolicy>
00142 template <class OtherPolicy>
00143 prefix_ OtherPolicy const &
00144 senf::ClientSocketHandle<SPolicy>::operator=(ClientSocketHandle<OtherPolicy> other)
00145 {}
00146 #endif
00147
00148
00149
00150
00151
00152
00153 #ifndef DOXYGEN
00154 template <class SPolicy>
00155 template <class ForwardWritableRange>
00156 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00157 senf::ClientSocketHandle<SPolicy>::
00158 read(ForwardWritableRange const & range,
00159 typename boost::disable_if< boost::is_convertible<ForwardWritableRange,unsigned> >::type *)
00160 {
00161 return detail::ReadRange<
00162 ClientSocketHandle<SPolicy>,
00163 ForwardWritableRange const,
00164 contiguous_storage_iterator<
00165 typename boost::range_iterator<ForwardWritableRange>::type
00166 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
00167 >::read(*this, range);
00168 }
00169 #else
00170 template <class SPolicy>
00171 template <class ForwardWritableRange>
00172 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00173 senf::ClientSocketHandle<SPolicy>::
00174 read(ForwardWritableRange const & range)
00175 {}
00176 #endif
00177
00178 #ifndef DOXYGEN
00179 template <class SPolicy>
00180 template <class ForwardWritableRange>
00181 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00182 senf::ClientSocketHandle<SPolicy>::
00183 read(ForwardWritableRange & range,
00184 typename boost::disable_if< boost::is_convertible<ForwardWritableRange,unsigned> >::type *)
00185 {
00186 return detail::ReadRange<
00187 ClientSocketHandle<SPolicy>,
00188 ForwardWritableRange,
00189 contiguous_storage_iterator<
00190 typename boost::range_iterator<ForwardWritableRange>::type
00191 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
00192 >::read(*this, range);
00193 }
00194 #else
00195 template <class SPolicy>
00196 template <class ForwardWritableRange>
00197 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00198 senf::ClientSocketHandle<SPolicy>::
00199 read(ForwardWritableRange & range)
00200 {}
00201 #endif
00202
00203 template <class SPolicy>
00204 prefix_ char * senf::ClientSocketHandle<SPolicy>::read(char * start, char * end)
00205 {
00206 return start + SPolicy::ReadPolicy::read(*this, start, end-start);
00207 }
00208
00209
00210
00211 template <class SPolicy>
00212 template <class ForwardWritableRange>
00213 prefix_ typename boost::range_iterator<ForwardWritableRange const>::type
00214 senf::ClientSocketHandle<SPolicy>::readfrom(ForwardWritableRange const & range, Address & from)
00215 {
00216 return detail::ReadRange<
00217 ClientSocketHandle<SPolicy>,
00218 ForwardWritableRange const,
00219 contiguous_storage_iterator<
00220 typename boost::range_iterator<ForwardWritableRange>::type
00221 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
00222 >::readfrom(*this, range, from);
00223 }
00224
00225 template <class SPolicy>
00226 template <class ForwardWritableRange>
00227 prefix_ typename boost::range_iterator<ForwardWritableRange>::type
00228 senf::ClientSocketHandle<SPolicy>::readfrom(ForwardWritableRange & range, Address & from)
00229 {
00230 return detail::ReadRange<
00231 ClientSocketHandle<SPolicy>,
00232 ForwardWritableRange,
00233 contiguous_storage_iterator<
00234 typename boost::range_iterator<ForwardWritableRange>::type
00235 >::value && sizeof(typename boost::range_value<ForwardWritableRange>::type)==sizeof(char)
00236 >::readfrom(*this, range, from);
00237 }
00238
00239 template <class SPolicy>
00240 prefix_ char * senf::ClientSocketHandle<SPolicy>::readfrom(char * start, char * end,
00241 Address & from)
00242 {
00243 return start + SPolicy::ReadPolicy::readfrom(*this, start, end-start, from);
00244 }
00245
00246
00247
00248 template <class SPolicy>
00249 template <class ForwardReadableRange>
00250 prefix_ typename boost::range_const_iterator<ForwardReadableRange const>::type
00251 senf::ClientSocketHandle<SPolicy>::write(ForwardReadableRange const & range)
00252 {
00253 return detail::WriteRange<
00254 ClientSocketHandle<SPolicy>,
00255 ForwardReadableRange const,
00256 contiguous_storage_iterator<
00257 typename boost::range_iterator<ForwardReadableRange>::type
00258 >::value && sizeof(typename boost::range_value<ForwardReadableRange>::type)==sizeof(char)
00259 >::write(*this, range);
00260 }
00261
00262 template <class SPolicy>
00263 prefix_ char const * senf::ClientSocketHandle<SPolicy>::write(char const * start, char const * end)
00264 {
00265 return start + SPolicy::WritePolicy::write(*this, start, end-start);
00266 }
00267
00268
00269
00270 template <class SPolicy>
00271 template <class ForwardReadableRange>
00272 prefix_ typename boost::range_const_iterator<ForwardReadableRange const>::type
00273 senf::ClientSocketHandle<SPolicy>::writeto(AddressParam addr, ForwardReadableRange const & range)
00274 {
00275 return detail::WriteRange<
00276 ClientSocketHandle<SPolicy>,
00277 ForwardReadableRange const,
00278 contiguous_storage_iterator<
00279 typename boost::range_iterator<ForwardReadableRange>::type
00280 >::value && sizeof(typename boost::range_value<ForwardReadableRange>::type)==sizeof(char)
00281 >::writeto(*this, range, addr);
00282 }
00283
00284 template <class SPolicy>
00285 prefix_ char const * senf::ClientSocketHandle<SPolicy>::writeto(AddressParam addr,
00286 char const * start,
00287 char const * end)
00288 {
00289 return start + SPolicy::WritePolicy::writeto(*this, addr, start, end-start);
00290 }
00291
00292
00293
00294
00295
00296
00297 template <class SPolicy>
00298 prefix_ typename SPolicy::AddressingPolicy::Address
00299 senf::ClientSocketHandle<SPolicy>::peer()
00300 const
00301 {
00302 typename SPolicy::AddressingPolicy::Address addr;
00303 this->peer(addr);
00304 return addr;
00305 }
00306
00307 template <class SPolicy>
00308 prefix_ void senf::ClientSocketHandle<SPolicy>::
00309 peer(typename SPolicy::AddressingPolicy::Address & addr)
00310 const
00311 {
00312 SPolicy::AddressingPolicy::peer(*this, addr);
00313 }
00314
00315
00316
00317 template <class SPolicy>
00318 prefix_ typename SPolicy::AddressingPolicy::Address
00319 senf::ClientSocketHandle<SPolicy>::local()
00320 const
00321 {
00322 typename SPolicy::AddressingPolicy::Address addr;
00323 this->local(addr);
00324 return addr;
00325 }
00326
00327 template <class SPolicy>
00328 prefix_ void senf::ClientSocketHandle<SPolicy>::
00329 local(typename SPolicy::AddressingPolicy::Address & addr)
00330 const
00331 {
00332 SPolicy::AddressingPolicy::local(*this,addr);
00333 }
00334
00335
00336
00337 template <class SPolicy>
00338 prefix_ void senf::ClientSocketHandle<SPolicy>::connect(AddressParam addr)
00339 const
00340 {
00341 SPolicy::AddressingPolicy::connect(*this, addr);
00342 }
00343
00344
00345
00346 template <class SPolicy>
00347 prefix_ void senf::ClientSocketHandle<SPolicy>::bind(AddressParam addr)
00348 const
00349 {
00350 SPolicy::AddressingPolicy::bind(*this, addr);
00351 }
00352
00353
00354
00355
00356 template <class SPolicy>
00357 prefix_ senf::ClientSocketHandle<SPolicy>
00358 senf::ClientSocketHandle<SPolicy>::cast_static(FileHandle handle)
00359 {
00360 return ClientSocketHandle(handle, true);
00361 }
00362
00363 template <class SPolicy>
00364 prefix_ senf::ClientSocketHandle<SPolicy>
00365 senf::ClientSocketHandle<SPolicy>::cast_dynamic(FileHandle handle)
00366 {
00367 SocketHandle<SPolicy> h (SocketHandle<SPolicy>::cast_dynamic(handle));
00368 if (static_cast<SocketBody&>(FileHandle::body(h)).isServer())
00369 throw std::bad_cast();
00370 return cast_static(handle);
00371 }
00372
00373
00374
00375
00376 template <class SPolicy>
00377 prefix_ void senf::ClientSocketHandle<SPolicy>::state(SocketStateMap & map, unsigned lod)
00378 {
00379 map["handle"] = prettyName(typeid(*this));
00380 if (this->valid()) {
00381 map["valid"] << "true";
00382 this->body().state(map,lod);
00383 } else
00384 map["valid"] << "false";
00385 }
00386
00387 template <class SPolicy>
00388 prefix_ std::string senf::ClientSocketHandle<SPolicy>::dumpState(unsigned lod)
00389 {
00390 SocketStateMap map;
00391 state(map,lod);
00392 return detail::dumpState(map);
00393 }
00394
00395
00396 #undef prefix_
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407