First implementation of socket stream classes derived
[sockstream.git] / include / sockstream.h
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
9 **
10 **  DESCRIPTION      :  sockbuf and sockstream classes.
11 **
12 **  EXPORTED OBJECTS : class sockbuf, class isockstream,
13 **                     class osockstream, class sockstream
14 **  LOCAL    OBJECTS : 
15 **  MODULES  USED    :
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
22 **      MODIFICATIONS   : 
23 **************************************************************************/
24
25 #include <ios>
26 #include "socket.h"
27
28 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29 **  NAME           : basic_sockbuf - Template class that applies basic_streambuf to sockets.
30 **  MEMBERS        : sock       : Socket object that holds the network socket.
31 **  OPERATORS      : None
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.
36 **
37 **  DESCRIPTION    : 
38 **
39 **
40 **  RELATIONS      : std::basic_streambuf, Socket
41 **  SEE ALSO       : 
42 **  LAST MODIFIED  : Oct 19, 2012
43 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
44 */
45
46 #define SOCKBUFSIZE  1500
47
48 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
49    class basic_sockbuf : public std::basic_streambuf<_CharT, _Traits>
50 {
51 private:
52    StreamSocket sock;
53
54    _CharT gbuf[SOCKBUFSIZE];
55    _CharT pbuf[SOCKBUFSIZE];
56
57 public:
58
59    basic_sockbuf()
60    {
61       setg(gbuf,gbuf+SOCKBUFSIZE,gbuf+SOCKBUFSIZE);  // set get area
62       setp(pbuf,pbuf+SOCKBUFSIZE);                   // set put area
63    }
64
65    virtual ~basic_sockbuf()
66    {
67       sync();
68    }
69
70    void connect(StreamSocket s)
71    {
72       sock = s;
73    }
74
75    void close()
76    {
77       sock.Close();
78    }
79
80    virtual int underflow()
81    {
82       int bytes_read = sock.Read(gbuf, SOCKBUFSIZE);
83       if (bytes_read > 0)
84       {
85          setg(gbuf, gbuf, gbuf + bytes_read);
86          return 0;
87       }
88       else
89       {
90          return -1;
91       }
92    }
93
94    virtual int overflow(int c)
95    {
96       sync();
97       if (c != _Traits::eof() )
98       {
99          *this->pptr() = c;
100          this->pbump(1);
101       }
102       return c;
103    }
104
105    virtual int sync()
106    {
107       // check if there's data to flush
108       if (this->pptr() > this->pbase())
109       {
110          sock.Write(pbuf, this->pptr() - pbuf);
111          setp(pbuf, pbuf + SOCKBUFSIZE);       // reset put area
112       }
113       return 0;
114    }
115 };
116
117 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
118 **  NAME           : basic_isockstream
119 **  MEMBERS        : 
120 **  OPERATORS      : None
121 **  METHODS        : 
122 **
123 **  DESCRIPTION    : 
124 **
125 **
126 **  RELATIONS      : 
127 **  SEE ALSO       : 
128 **  LAST MODIFIED  : Oct 19, 2012
129 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
130 */
131
132 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
133     class basic_isockstream : public std::basic_istream<_CharT, _Traits>
134 {
135 private:
136    basic_sockbuf<_CharT, _Traits>   _M_sockbuf;
137
138 public:
139    basic_isockstream(StreamSocket _s)
140    {
141       this->init(&_M_sockbuf);
142       _M_sockbuf.connect(_s);
143    }
144 };
145
146
147 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
148 **  NAME           : basic_osockstream
149 **  MEMBERS        : 
150 **  OPERATORS      : None
151 **  METHODS        : 
152 **
153 **  DESCRIPTION    : 
154 **
155 **
156 **  RELATIONS      : 
157 **  SEE ALSO       : 
158 **  LAST MODIFIED  : Oct 19, 2012
159 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
160 */
161
162 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
163     class basic_osockstream : public std::basic_ostream<_CharT,_Traits>
164 {
165 private:
166    basic_sockbuf<_CharT, _Traits>   _M_sockbuf;
167
168 public:
169    basic_osockstream(StreamSocket _s)
170    {
171       this->init(&_M_sockbuf);
172       _M_sockbuf.connect(_s);
173    }
174 };
175
176 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
177 **  NAME           : basic_sockstream
178 **  MEMBERS        : 
179 **  OPERATORS      : None
180 **  METHODS        : 
181 **
182 **  DESCRIPTION    : 
183 **
184 **
185 **  RELATIONS      : 
186 **  SEE ALSO       : 
187 **  LAST MODIFIED  : Oct 19, 2012
188 **+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
189 */
190
191 template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
192     class basic_sockstream : public std::basic_iostream<_CharT, _Traits>
193 {
194 private:
195    basic_sockbuf<_CharT, _Traits>   _M_sockbuf;
196
197 public:
198    basic_sockstream(StreamSocket _s)
199    {
200       this->init(&_M_sockbuf);
201       _M_sockbuf.connect(_s);
202    }
203 };
204
205
206 //  Predefined buffer and stream types
207
208 typedef basic_sockbuf<char>          sockbuf;
209 typedef basic_isockstream<char>      isockstream;
210 typedef basic_osockstream<char>      osockstream;
211 typedef basic_sockstream<char>       sockstream;
212
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;
217