64735f2d227f3485be058d34555ab68db6d42308
[senf.git] / Socket / SocketHandle.cc
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
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.
12 //
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.
17 //
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.
22
23 /** \file
24     \brief SocketHandle non-inline non-template implementation
25  */
26
27 #include "SocketHandle.hh"
28 #include "SocketHandle.ih"
29
30 // Custom includes
31 #include <sstream>
32 #include <sys/socket.h>
33 #include "../Utils/TypeInfo.hh"
34
35 //#include "SocketHandle.mpp"
36 #define prefix_
37 ///////////////////////////////cc.p////////////////////////////////////////
38
39 prefix_ void senf::SocketBody::v_close()
40 {
41     protocol().close();
42 }
43
44 prefix_ void senf::SocketBody::v_terminate()
45 {
46     protocol().terminate();
47 }
48
49 prefix_ bool senf::SocketBody::v_eof()
50     const
51 {
52     return protocol().eof();
53 }
54
55 prefix_ void senf::SocketBody::state(SocketStateMap & map, unsigned lod)
56 {
57     map["file.handle"]     << fd();
58     map["file.refcount"]   << refcount();
59     map["socket.server"]   << isServer();
60     map["socket.protocol"] << prettyName(typeid(protocol()));
61     map["socket.policy"]   << prettyName(typeid(protocol().policy()));
62     protocol().state(map,lod);
63 }
64
65 ///////////////////////////////////////////////////////////////////////////
66 // senf::detail::StateMapOrdering
67
68 namespace {
69     bool contains(std::string::const_iterator b, std::string::const_iterator e, char c)
70     {
71         for (; b != e; ++b)
72             if (*b == c)
73                 return true;
74         return false;
75     }
76 }
77
78 prefix_ std::string senf::detail::dumpState(SocketStateMap const & map)
79 {
80     std::stringstream s;
81     SocketStateMap::const_iterator i (map.begin());
82     SocketStateMap::const_iterator i_end (map.end());
83     for (; i != i_end; ++i)
84         s << i->first << ": " << i->second << "\n";
85     return s.str();
86 }
87
88 template <class Policy>
89 prefix_ std::ostream & senf::operator<<(std::ostream & os, SocketHandle<Policy> handle)
90 {
91     os << handle.dumpState();
92     return os;
93 }
94
95 ///////////////////////////////cc.e////////////////////////////////////////
96 #undef prefix_
97 //#include "SocketHandle.mpp"
98
99 \f
100 // Local Variables:
101 // mode: c++
102 // fill-column: 100
103 // c-file-style: "senf"
104 // indent-tabs-mode: nil
105 // ispell-local-dictionary: "american"
106 // compile-command: "scons -u test"
107 // comment-column: 40
108 // End: