00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027
00028
00029
00030
00031
00032 #include <typeinfo>
00033
00034 #define prefix_ inline
00035
00036
00037 template <class SPolicy>
00038 prefix_ senf::ServerSocketHandle<SPolicy>::ServerSocketHandle()
00039 {}
00040
00041 template <class SPolicy>
00042 template <class OtherPolicy>
00043 prefix_ senf::ServerSocketHandle<SPolicy>::
00044 ServerSocketHandle(ServerSocketHandle<OtherPolicy> other,
00045 typename SocketHandle<SPolicy>::template IsCompatible<OtherPolicy>::type *)
00046 : SocketHandle<SPolicy>(other,true)
00047 {}
00048
00049 template <class SPolicy>
00050 prefix_ senf::ServerSocketHandle<SPolicy>::
00051 ServerSocketHandle(std::auto_ptr<SocketBody> body)
00052 : SocketHandle<SPolicy>(body)
00053 {}
00054
00055 template <class SPolicy>
00056 template <class OtherPolicy>
00057 prefix_ typename senf::SocketHandle<SPolicy>::template IsCompatible<OtherPolicy>::type const &
00058 senf::ServerSocketHandle<SPolicy>::operator=(ServerSocketHandle<OtherPolicy> other)
00059 {
00060 assign(other);
00061 return *this;
00062 }
00063
00064
00065
00066
00067 template <class SPolicy>
00068 prefix_ void senf::ServerSocketHandle<SPolicy>::bind(AddressParam addr)
00069 {
00070 SPolicy::AddressingPolicy::bind(*this,addr);
00071 }
00072
00073 template <class SPolicy>
00074 prefix_ void senf::ServerSocketHandle<SPolicy>::listen(unsigned backlog)
00075 {
00076 SPolicy::CommunicationPolicy::listen(*this,backlog);
00077 }
00078
00079 template <class SPolicy>
00080 prefix_ typename senf::ServerSocketHandle<SPolicy>::Address
00081 senf::ServerSocketHandle<SPolicy>::local()
00082 {
00083 typename SPolicy::AddressingPolicy::Address addr;
00084 this->local(addr);
00085 return addr;
00086 }
00087
00088 template <class SPolicy>
00089 prefix_ void senf::ServerSocketHandle<SPolicy>::local(Address & addr)
00090 {
00091 SPolicy::AddressingPolicy::local(*this,addr);
00092 }
00093
00094 template <class SPolicy>
00095 prefix_ typename senf::ServerSocketHandle<SPolicy>::ClientHandle
00096 senf::ServerSocketHandle<SPolicy>::accept()
00097 {
00098 return ClientHandle(this->body().clone(
00099 SPolicy::CommunicationPolicy::accept(*this), false));
00100 }
00101
00102 template <class SPolicy>
00103 prefix_ std::pair<typename senf::ServerSocketHandle<SPolicy>::ClientHandle,
00104 typename senf::ServerSocketHandle<SPolicy>::Address>
00105 senf::ServerSocketHandle<SPolicy>::acceptfrom()
00106 {
00107
00108 Address address;
00109 ClientHandle handle = acceptfrom(address);
00110 return std::make_pair(handle,address);
00111 }
00112
00113 template <class SPolicy>
00114 prefix_ typename senf::ServerSocketHandle<SPolicy>::ClientHandle
00115 senf::ServerSocketHandle<SPolicy>::acceptfrom(Address & addr)
00116 {
00117 return ClientHandle(this->body().clone(
00118 SPolicy::CommunicationPolicy::accept(*this,addr), false));
00119 }
00120
00121
00122
00123 template <class SPolicy>
00124 prefix_ senf::ServerSocketHandle<SPolicy>::ServerSocketHandle(FileHandle other,
00125 bool isChecked)
00126 : SocketHandle<SPolicy>(other, isChecked)
00127 {}
00128
00129 template <class SPolicy>
00130 prefix_ senf::ServerSocketHandle<SPolicy>
00131 senf::ServerSocketHandle<SPolicy>::cast_static(FileHandle handle)
00132 {
00133 return ServerSocketHandle(handle,true);
00134 }
00135
00136 template <class SPolicy>
00137 prefix_ senf::ServerSocketHandle<SPolicy>
00138 senf::ServerSocketHandle<SPolicy>::cast_dynamic(FileHandle handle)
00139 {
00140 SocketHandle<SPolicy> h (SocketHandle<SPolicy>::cast_dynamic(handle));
00141 if (! static_cast<SocketBody&>(FileHandle::body(handle)).isServer())
00142 throw std::bad_cast();
00143 return cast_static(handle);
00144 }
00145
00146 template <class SPolicy>
00147 prefix_ void senf::ServerSocketHandle<SPolicy>::state(SocketStateMap & map, unsigned lod)
00148 {
00149 map["handle"] = prettyName(typeid(*this));
00150 if (this->valid()) {
00151 map["valid"] << "true";
00152 this->body().state(map,lod);
00153 } else
00154 map["valid"] << "false";
00155 }
00156
00157 template <class SPolicy>
00158 prefix_ std::string senf::ServerSocketHandle<SPolicy>::dumpState(unsigned lod)
00159 {
00160 SocketStateMap map;
00161 state(map,lod);
00162 return detail::dumpState(map);
00163 }
00164
00165
00166 #undef prefix_
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177