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 ** EXPORTED OBJECTS : class sockbuf, class isockstream,
13 ** class osockstream, class sockstream
16 ***************************************************************************
17 ** ADMINISTRATIVE INFORMATION *
18 ********************************
19 ** ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
20 ** CREATION DATE : Aug 16, 2012
21 ** LAST UPDATE : Oct 19, 2012
23 **************************************************************************/
28 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29 ** NAME : basic_sockbuf - Template class that applies basic_streambuf to sockets.
30 ** MEMBERS : sock : Socket object that holds the network socket.
32 ** METHODS : connect() : Connect the sockbuf to a Socket object.
33 ** close() : Close the UNIX file descriptor in the Socket.
34 ** overflow() : Override the base class function overflow.
35 ** underflow() : Override the base class function underflow.
40 ** RELATIONS : std::basic_streambuf, Socket
42 ** LAST MODIFIED : Oct 19, 2012
43 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
46 #define SOCKBUFSIZE 1500
48 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
49 class basic_sockbuf : public std::basic_streambuf<_CharT, _Traits>
54 _CharT gbuf[SOCKBUFSIZE];
55 _CharT pbuf[SOCKBUFSIZE];
61 setg(gbuf,gbuf+SOCKBUFSIZE,gbuf+SOCKBUFSIZE); // set get area
62 setp(pbuf,pbuf+SOCKBUFSIZE); // set put area
65 virtual ~basic_sockbuf()
70 void connect(StreamSocket s)
80 virtual int underflow()
82 int bytes_read = sock.Read(gbuf, SOCKBUFSIZE);
85 setg(gbuf, gbuf, gbuf + bytes_read);
94 virtual int overflow(int c)
97 if (c != _Traits::eof() )
107 // check if there's data to flush
108 if (this->pptr() > this->pbase())
110 sock.Write(pbuf, this->pptr() - pbuf);
111 setp(pbuf, pbuf + SOCKBUFSIZE); // reset put area
117 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
118 ** NAME : basic_isockstream
128 ** LAST MODIFIED : Oct 19, 2012
129 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
132 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
133 class basic_isockstream : public std::basic_istream<_CharT, _Traits>
136 basic_sockbuf<_CharT, _Traits> _M_sockbuf;
139 basic_isockstream(StreamSocket _s)
141 this->init(&_M_sockbuf);
142 _M_sockbuf.connect(_s);
147 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
148 ** NAME : basic_osockstream
158 ** LAST MODIFIED : Oct 19, 2012
159 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
162 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
163 class basic_osockstream : public std::basic_ostream<_CharT,_Traits>
166 basic_sockbuf<_CharT, _Traits> _M_sockbuf;
169 basic_osockstream(StreamSocket _s)
171 this->init(&_M_sockbuf);
172 _M_sockbuf.connect(_s);
176 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
177 ** NAME : basic_sockstream
187 ** LAST MODIFIED : Oct 19, 2012
188 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
191 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
192 class basic_sockstream : public std::basic_iostream<_CharT, _Traits>
195 basic_sockbuf<_CharT, _Traits> _M_sockbuf;
198 basic_sockstream(StreamSocket _s)
200 this->init(&_M_sockbuf);
201 _M_sockbuf.connect(_s);
206 // Predefined buffer and stream types
208 typedef basic_sockbuf<char> sockbuf;
209 typedef basic_isockstream<char> isockstream;
210 typedef basic_osockstream<char> osockstream;
211 typedef basic_sockstream<char> sockstream;
213 typedef basic_sockbuf<wchar_t> wsockbuf;
214 typedef basic_isockstream<wchar_t> wisockstream;
215 typedef basic_osockstream<wchar_t> wosockstream;
216 typedef basic_sockstream<wchar_t> wsockstream;