Socket: BUGFIX: Move incorrect v-function call out of FileBody destructor
[senf.git] / Socket / SocketHandle.cc
index 3f8a0ce..aa0cf61 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 //
-// Copyright (C) 2006 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-//     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Copyright (C) 2006
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Stefan Bund <g0dil@berlios.de>
 //
 // 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,7 +20,9 @@
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-// Definition of non-inline non-template functions
+/** \file
+    \brief SocketHandle non-inline non-template implementation
+ */
 
 #include "SocketHandle.hh"
 #include "SocketHandle.ih"
 // Custom includes
 #include <sstream>
 #include <sys/socket.h>
-#include "Utils/TypeInfo.hh"
+#include "../Utils/TypeInfo.hh"
 
 //#include "SocketHandle.mpp"
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
+///////////////////////////////////////////////////////////////////////////
+// senf::SocketBody
+
+prefix_ void senf::SocketBody::state(SocketStateMap & map, unsigned lod)
+{
+    map["file.handle"]     << fd();
+    map["file.refcount"]   << refcount();
+    map["socket.server"]   << isServer();
+    map["socket.protocol"] << v_protocolName();
+    map["socket.protocol.policy"]   << prettyName(typeid(protocol().policy()));
+    protocol().state(map,lod);
+}
+
 prefix_ void senf::SocketBody::v_close()
 {
-    if (::shutdown(fd(),SHUT_RDWR) < 0)
-        throw SystemException(errno);
-    if (::close(fd()) < 0)
-        throw SystemException(errno);
+    protocol().close();
 }
 
 prefix_ void senf::SocketBody::v_terminate()
 {
-    struct linger ling;
-    ling.l_onoff = 0;
-    ling.l_linger = 0;
-
-    // We purposely IGNORE any errors: this method is used to try and
-    // terminate the connection ignoring any possible problems
-
-    ::setsockopt(fd(),SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
-    ::shutdown(fd(),SHUT_RDWR);
-    ::close(fd());
+    protocol().terminate();
 }
 
 prefix_ bool senf::SocketBody::v_eof()
@@ -62,21 +65,11 @@ prefix_ bool senf::SocketBody::v_eof()
     return protocol().eof();
 }
 
-prefix_ void senf::SocketBody::state(SocketStateMap & map, unsigned lod)
-{
-    map["file.handle"] = fd();
-    map["file.refcount"] = refcount();
-    map["socket.server"] = isServer();
-    map["socket.protocol"] = prettyName(typeid(protocol()));
-    map["socket.policy"] = prettyName(typeid(protocol().policy()));
-    protocol().state(map,lod);
-}
-
 ///////////////////////////////////////////////////////////////////////////
 // senf::detail::StateMapOrdering
 
 namespace {
-    bool contains(std::string::iterator b, std::string::iterator e, char c)
+    bool contains(std::string::const_iterator b, std::string::const_iterator e, char c)
     {
         for (; b != e; ++b)
             if (*b == c)
@@ -85,41 +78,6 @@ namespace {
     }
 }
 
-prefix_ bool senf::detail::StateMapOrdering::operator()(std::string a1, std::string a2)
-    const
-{
-    std::string::iterator i1 (a1.begin());
-    std::string::iterator const i1_end (a1.end());
-    std::string::iterator i2 (a2.begin());
-    std::string::iterator const i2_end (a2.end());
-    for(; i1 != i1_end && i2 != i2_end && *i1 == *i2; ++i1, ++i2) ;
-    if (i1 == i1_end) {
-        if (i2 == i2_end)
-            // the strings are equal
-            return false;
-        if (contains(i2,i2_end,'.'))
-            // the longer string is a sub-'directory' of the shorter
-           /** \fixme shouldn't this be *i2 == '.' ? */
-            return true;
-        return *i1 < *i2;
-    }
-    else if (i2 == i2_end) { // && i1 != i1_end
-        if (contains(i1,i1_end,'.'))
-            // the longer string is a sub-'directory' of the shorter
-           /** \fixme shouldn't this be *i1 == '.' ? */
-            return false;
-        return *i1 < *i2;
-    }
-    if (contains(i1,i1_end,'.')) {
-        if (contains(i2,i2_end,'.'))
-            return *i1 < *i2;
-        return false;
-    }
-    else if (contains(i2,i2_end,'.'))
-        return true;
-    return *i1 < *i2;
-}
-
 prefix_ std::string senf::detail::dumpState(SocketStateMap const & map)
 {
     std::stringstream s;
@@ -130,13 +88,6 @@ prefix_ std::string senf::detail::dumpState(SocketStateMap const & map)
     return s.str();
 }
 
-template <class Policy>
-prefix_ std::ostream & senf::operator<<(std::ostream & os, SocketHandle<Policy> handle)
-{
-    os << handle.dumpState();
-    return os;
-}
-
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "SocketHandle.mpp"
@@ -144,5 +95,10 @@ prefix_ std::ostream & senf::operator<<(std::ostream & os, SocketHandle<Policy>
 \f
 // 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: