X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FClientSocketHandle.cti;h=079229dbf4c1a86f570400d4dd716ed5bd987d9c;hb=5443435c4c2b6e4386c5334b5b8358273f2bae93;hp=c6a934868128db5b25c51c9cd78c2d89ad9727e8;hpb=ac6a813d9d99f7add4e13aff7a4bcd314d5604a6;p=senf.git diff --git a/Socket/ClientSocketHandle.cti b/Socket/ClientSocketHandle.cti index c6a9348..079229d 100644 --- a/Socket/ClientSocketHandle.cti +++ b/Socket/ClientSocketHandle.cti @@ -1,9 +1,9 @@ // $Id$ // -// Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Copyright (C) 2006 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -20,9 +20,11 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Definition of inline template functions +/** \file + \brief ClientSocketHandle inline template implementation + */ -//#include "ClientSocketHandle.ih" +#include "ClientSocketHandle.ih" // Custom includes #include @@ -30,182 +32,356 @@ #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// -template +/////////////////////////////////////////////////////////////////////////// +// senf::detail::ReadRange + +template +prefix_ typename boost::range_iterator::type +senf::detail::ReadRange::read(Handle & handle, + ForwardWritableRange & range) +{ + typename boost::range_iterator::type const i (boost::begin(range)); + char * const ic (reinterpret_cast(storage_iterator(i))); + return i + (handle.read( ic, + reinterpret_cast(storage_iterator(boost::end(range))) ) + - ic); +} + +template +prefix_ typename boost::range_iterator::type +senf::detail::ReadRange:: +readfrom(Handle & handle, ForwardWritableRange & range, typename Handle::Address & addr) +{ + typename boost::range_iterator::type const i (boost::begin(range)); + char * const ic (reinterpret_cast(storage_iterator(i))); + return i + (handle.readfrom( ic, + reinterpret_cast(storage_iterator(boost::end(range))), + addr ) + - ic); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::detail::WriteRange + +template +prefix_ typename boost::range_const_iterator::type +senf::detail::WriteRange:: +write(Handle & handle, ForwardReadableRange & range) +{ + typename boost::range_const_iterator::type i + (boost::const_begin(range)); + char const * const ic (reinterpret_cast(storage_iterator(i))); + std::advance(i, handle.write(ic, + reinterpret_cast( + storage_iterator(boost::const_end(range)))) - ic); + return i; +} + +template +prefix_ typename boost::range_const_iterator::type +senf::detail::WriteRange:: +writeto(Handle & handle, ForwardReadableRange & range, typename Handle::Address const & addr) +{ + typename boost::range_const_iterator::type i + (boost::const_begin(range)); + char const * const ic (reinterpret_cast(storage_iterator(i))); + std::advance(i, handle.writeto(addr, ic, + reinterpret_cast( + storage_iterator(boost::const_end(range)))) - ic); + return i; +} + +/////////////////////////////////////////////////////////////////////////// +// senf::ClientSocketHandle + +//////////////////////////////////////// +// structors + +template +prefix_ senf::ClientSocketHandle::ClientSocketHandle() +{} + +#ifndef DOXYGEN +template template -prefix_ senf::ClientSocketHandle:: +prefix_ senf::ClientSocketHandle:: ClientSocketHandle(ClientSocketHandle other, - typename SocketHandle::template IsCompatible::type *) - : SocketHandle(other,true) + typename SocketHandle::template IsCompatible::type *) + : SocketHandle(other,true) {} +#else +template +template +prefix_ senf::ClientSocketHandle:: +ClientSocketHandle(ClientSocketHandle other) +{} +#endif -template -prefix_ senf::ClientSocketHandle::ClientSocketHandle(FileHandle other, - bool isChecked) - : SocketHandle(other, isChecked) +template +prefix_ senf::ClientSocketHandle::ClientSocketHandle(FileHandle other, bool isChecked) + : SocketHandle(other, isChecked) {} -template -prefix_ senf::ClientSocketHandle:: -ClientSocketHandle(std::auto_ptr protocol, int fd) - : SocketHandle(protocol,false) -{ - this->body().fd(fd); -} +template +prefix_ +senf::ClientSocketHandle::ClientSocketHandle(std::auto_ptr body) + : SocketHandle(body) +{} -template +#ifndef DOXYGEN +template template -prefix_ typename senf::SocketHandle::template IsCompatible::type const & -senf::ClientSocketHandle::operator=(ClientSocketHandle other) +prefix_ typename senf::SocketHandle::template IsCompatible::type const & +senf::ClientSocketHandle::operator=(ClientSocketHandle other) { assign(other); return *this; } +#else +template +template +prefix_ OtherPolicy const & +senf::ClientSocketHandle::operator=(ClientSocketHandle other) +{} +#endif -/////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////// // reading and writing -template -prefix_ unsigned senf::ClientSocketHandle::read(char * buffer, - unsigned size) +// senf::ClientSocketHandle::read + +#ifndef DOXYGEN +template +template +prefix_ typename boost::range_iterator::type +senf::ClientSocketHandle:: +read(ForwardWritableRange const & range, + typename boost::disable_if< boost::is_convertible >::type *) +{ + return detail::ReadRange< + ClientSocketHandle, + ForwardWritableRange const, + contiguous_storage_iterator< + typename boost::range_iterator::type + >::value && sizeof(typename boost::range_value::type)==sizeof(char) + >::read(*this, range); +} +#else +template +template +prefix_ typename boost::range_iterator::type +senf::ClientSocketHandle:: +read(ForwardWritableRange const & range) +{} +#endif + +#ifndef DOXYGEN +template +template +prefix_ typename boost::range_iterator::type +senf::ClientSocketHandle:: +read(ForwardWritableRange & range, + typename boost::disable_if< boost::is_convertible >::type *) { - return Policy::ReadPolicy::read(*this, buffer, size); + return detail::ReadRange< + ClientSocketHandle, + ForwardWritableRange, + contiguous_storage_iterator< + typename boost::range_iterator::type + >::value && sizeof(typename boost::range_value::type)==sizeof(char) + >::read(*this, range); } +#else +template +template +prefix_ typename boost::range_iterator::type +senf::ClientSocketHandle:: +read(ForwardWritableRange & range) +{} +#endif -template -prefix_ unsigned senf::ClientSocketHandle:: -readfrom(char * buffer, unsigned size, typename Policy::AddressingPolicy::Address & from) +template +prefix_ char * senf::ClientSocketHandle::read(char * start, char * end) { - return Policy::ReadPolicy::readfrom(*this, buffer, size, from); + return start + SPolicy::ReadPolicy::read(*this, start, end-start); } -template -prefix_ unsigned senf::ClientSocketHandle::write(char const * buffer, - unsigned size) +// senf::ClientSocketHandle::readfrom + +template +template +prefix_ typename boost::range_iterator::type +senf::ClientSocketHandle::readfrom(ForwardWritableRange const & range, Address & from) { - return Policy::WritePolicy::write(*this, buffer, size); + return detail::ReadRange< + ClientSocketHandle, + ForwardWritableRange const, + contiguous_storage_iterator< + typename boost::range_iterator::type + >::value && sizeof(typename boost::range_value::type)==sizeof(char) + >::readfrom(*this, range, from); } -template -prefix_ unsigned senf::ClientSocketHandle:: -writeto(typename boost::call_traits::param_type addr, - std::string const & data) +template +template +prefix_ typename boost::range_iterator::type +senf::ClientSocketHandle::readfrom(ForwardWritableRange & range, Address & from) { - return this->writeto(addr, data.data(), data.size()); + return detail::ReadRange< + ClientSocketHandle, + ForwardWritableRange, + contiguous_storage_iterator< + typename boost::range_iterator::type + >::value && sizeof(typename boost::range_value::type)==sizeof(char) + >::readfrom(*this, range, from); } -template -prefix_ unsigned senf::ClientSocketHandle:: -writeto(typename boost::call_traits::param_type addr, - char const * buffer, unsigned size) +template +prefix_ char * senf::ClientSocketHandle::readfrom(char * start, char * end, + Address & from) { - return Policy::WritePolicy::writeto(*this, addr, buffer, size); + return start + SPolicy::ReadPolicy::readfrom(*this, start, end-start, from); } -/////////////////////////////////////////////////////////////////////////// -// addressing +// senf::ClientSocketHandle::write -template -prefix_ typename Policy::AddressingPolicy::Address -senf::ClientSocketHandle::peer() +template +template +prefix_ typename boost::range_const_iterator::type +senf::ClientSocketHandle::write(ForwardReadableRange const & range) { - typename Policy::AddressingPolicy::Address addr; - this->peer(addr); - return addr; + return detail::WriteRange< + ClientSocketHandle, + ForwardReadableRange const, + contiguous_storage_iterator< + typename boost::range_iterator::type + >::value && sizeof(typename boost::range_value::type)==sizeof(char) + >::write(*this, range); } -template -prefix_ void senf::ClientSocketHandle:: -peer(typename Policy::AddressingPolicy::Address & addr) +template +prefix_ char const * senf::ClientSocketHandle::write(char const * start, char const * end) { - Policy::AddressingPolicy::peer(*this,addr); + return start + SPolicy::WritePolicy::write(*this, start, end-start); } -template -prefix_ typename Policy::AddressingPolicy::Address -senf::ClientSocketHandle::local() +// senf::ClientSocketHandle::writeto + +template +template +prefix_ typename boost::range_const_iterator::type +senf::ClientSocketHandle::writeto(AddressParam addr, ForwardReadableRange const & range) { - typename Policy::AddressingPolicy::Address addr; - this->local(addr); - return addr; + return detail::WriteRange< + ClientSocketHandle, + ForwardReadableRange const, + contiguous_storage_iterator< + typename boost::range_iterator::type + >::value && sizeof(typename boost::range_value::type)==sizeof(char) + >::writeto(*this, range, addr); } -template -prefix_ void senf::ClientSocketHandle:: -local(typename Policy::AddressingPolicy::Address & addr) +template +prefix_ char const * senf::ClientSocketHandle::writeto(AddressParam addr, + char const * start, + char const * end) { - Policy::AddressingPolicy::local(*this,addr); + return start + SPolicy::WritePolicy::writeto(*this, addr, start, end-start); } -template -prefix_ void senf::ClientSocketHandle::connect(AddressParam addr) +//////////////////////////////////////// +// addressing + +// senf::ClientSocketHandle::peer + +template +prefix_ typename SPolicy::AddressingPolicy::Address +senf::ClientSocketHandle::peer() + const { - Policy::AddressingPolicy::connect(*this,addr); + typename SPolicy::AddressingPolicy::Address addr; + this->peer(addr); + return addr; } -template -prefix_ void senf::ClientSocketHandle:: -bind(typename boost::call_traits::param_type addr) +template +prefix_ void senf::ClientSocketHandle:: +peer(typename SPolicy::AddressingPolicy::Address & addr) + const { - Policy::AddressingPolicy::bind(*this,addr); + SPolicy::AddressingPolicy::peer(*this, addr); } -/////////////////////////////////////////////////////////////////////////// -// Buffering +// senf::ClientSocketHandle::local -template -prefix_ unsigned senf::ClientSocketHandle::rcvbuf() +template +prefix_ typename SPolicy::AddressingPolicy::Address +senf::ClientSocketHandle::local() + const { - return Policy::BufferingPolicy::rcvbuf(*this); + typename SPolicy::AddressingPolicy::Address addr; + this->local(addr); + return addr; } -template -prefix_ void senf::ClientSocketHandle::rcvbuf(unsigned size) +template +prefix_ void senf::ClientSocketHandle:: +local(typename SPolicy::AddressingPolicy::Address & addr) + const { - Policy::BufferingPolicy::rcvbuf(*this,size); + SPolicy::AddressingPolicy::local(*this,addr); } -template -prefix_ unsigned senf::ClientSocketHandle::sndbuf() +// senf::ClientSocketHandle::connect + +template +prefix_ void senf::ClientSocketHandle::connect(AddressParam addr) + const { - return Policy::BufferingPolicy::sndbuf(*this); + SPolicy::AddressingPolicy::connect(*this, addr); } -template -prefix_ void senf::ClientSocketHandle::sndbuf(unsigned size) +// senf::ClientSocketHandle::bind + +template +prefix_ void senf::ClientSocketHandle::bind(AddressParam addr) + const { - Policy::BufferingPolicy::sndbuf(*this,size); + SPolicy::AddressingPolicy::bind(*this, addr); } -/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////// +// Casting -template -prefix_ senf::ClientSocketHandle -senf::ClientSocketHandle::cast_static(FileHandle handle) +template +prefix_ senf::ClientSocketHandle +senf::ClientSocketHandle::cast_static(FileHandle handle) { return ClientSocketHandle(handle, true); } -template -prefix_ senf::ClientSocketHandle -senf::ClientSocketHandle::cast_dynamic(FileHandle handle) +template +prefix_ senf::ClientSocketHandle +senf::ClientSocketHandle::cast_dynamic(FileHandle handle) { - SocketHandle h (SocketHandle::cast_dynamic(handle)); + SocketHandle h (SocketHandle::cast_dynamic(handle)); if (static_cast(FileHandle::body(h)).isServer()) throw std::bad_cast(); return cast_static(handle); } -template -prefix_ void senf::ClientSocketHandle::state(SocketStateMap & map, unsigned lod) +//////////////////////////////////////// +// State information + +template +prefix_ void senf::ClientSocketHandle::state(SocketStateMap & map, unsigned lod) { map["handle"] = prettyName(typeid(*this)); - this->body().state(map,lod); + this->body().state(map, lod); } -template -prefix_ std::string senf::ClientSocketHandle::dumpState(unsigned lod) +template +prefix_ std::string senf::ClientSocketHandle::dumpState(unsigned lod) { SocketStateMap map; state(map,lod); @@ -218,5 +394,10 @@ prefix_ std::string senf::ClientSocketHandle::dumpState(unsigned lod) // Local Variables: // mode: c++ +// fill-column: 100 // c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: