1 /**************************************************************************
2 ** (c) Copyright 2012, Andromeda Technology & Automation
3 ***************************************************************************
4 ** MODULE INFORMATION *
5 ***********************
6 ** FILE NAME : sockstream.h
7 ** SYSTEM NAME : Socket stream classes
8 ** VERSION NUMBER : 0.1
10 ** DESCRIPTION : sockbuf and sockstream classes.
12 ** Special thanks to Marc Groenewegen <marcg@dinkum.nl>
14 ** EXPORTED OBJECTS : class sockbuf, class isockstream,
15 ** class osockstream, class sockstream
18 ***************************************************************************
19 ** ADMINISTRATIVE INFORMATION *
20 ********************************
21 ** ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
22 ** CREATION DATE : Aug 16, 2012
23 ** LAST UPDATE : Nov 13, 2012
25 **************************************************************************/
30 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31 ** NAME : basic_sockbuf - Template class that applies basic_streambuf to sockets.
32 ** MEMBERS : sock : Socket object that holds the network socket.
34 ** METHODS : connect() : Connect the sockbuf to a Socket object.
35 ** close() : Close the UNIX file descriptor in the Socket.
36 ** overflow() : Override the base class function overflow.
37 ** underflow() : Override the base class function underflow.
42 ** RELATIONS : std::basic_streambuf, Socket
44 ** LAST MODIFIED : Oct 19, 2012
45 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
48 #define SOCKBUFSIZE 1500
50 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
51 class basic_sockbuf : public std::basic_streambuf<_CharT, _Traits>
56 _CharT gbuf[SOCKBUFSIZE];
57 _CharT pbuf[SOCKBUFSIZE];
63 setg(gbuf,gbuf+SOCKBUFSIZE,gbuf+SOCKBUFSIZE); // set get area
64 setp(pbuf,pbuf+SOCKBUFSIZE); // set put area
67 virtual ~basic_sockbuf()
72 void connect(StreamSocket s)
82 virtual int underflow()
84 int bytes_read = sock.Read(gbuf, SOCKBUFSIZE);
87 setg(gbuf, gbuf, gbuf + bytes_read);
96 virtual int overflow(int c)
99 if (c != _Traits::eof() )
109 // check if there's data to flush
110 if (this->pptr() > this->pbase())
112 sock.Write(pbuf, this->pptr() - pbuf);
113 setp(pbuf, pbuf + SOCKBUFSIZE); // reset put area
119 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
120 ** NAME : basic_isockstream
130 ** LAST MODIFIED : Nov 13, 2012
131 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
134 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
135 class basic_isockstream : public std::basic_istream<_CharT, _Traits>
138 basic_sockbuf<_CharT, _Traits> _M_sockbuf;
141 basic_isockstream(StreamSocket _s)
143 this->init(&_M_sockbuf);
144 _M_sockbuf.connect(_s);
154 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
155 ** NAME : basic_osockstream
165 ** LAST MODIFIED : Nov 13, 2012
166 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
169 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
170 class basic_osockstream : public std::basic_ostream<_CharT,_Traits>
173 basic_sockbuf<_CharT, _Traits> _M_sockbuf;
176 basic_osockstream(StreamSocket _s)
178 this->init(&_M_sockbuf);
179 _M_sockbuf.connect(_s);
188 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
189 ** NAME : basic_sockstream
199 ** LAST MODIFIED : Nov 13, 2012
200 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
203 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
204 class basic_sockstream : public std::basic_iostream<_CharT, _Traits>
207 basic_sockbuf<_CharT, _Traits> _M_sockbuf;
210 basic_sockstream(StreamSocket _s)
212 this->init(&_M_sockbuf);
213 _M_sockbuf.connect(_s);
223 // Predefined buffer and stream types
225 typedef basic_sockbuf<char> sockbuf;
226 typedef basic_isockstream<char> isockstream;
227 typedef basic_osockstream<char> osockstream;
228 typedef basic_sockstream<char> sockstream;
230 typedef basic_sockbuf<wchar_t> wsockbuf;
231 typedef basic_isockstream<wchar_t> wisockstream;
232 typedef basic_osockstream<wchar_t> wosockstream;
233 typedef basic_sockstream<wchar_t> wsockstream;