1// Sun, 18 Jun 2000
2// Y.Takagi
3
4#if defined(__HAIKU__) || defined(HAIKU_TARGET_PLATFORM_BONE)
5#	include <sys/socket.h>
6#else
7#	include <net/socket.h>
8#endif
9
10#ifdef _DEBUG
11#include <iostream>
12#include <fstream>
13#endif
14
15#include "Socket.h"
16#include "SocketStream.h"
17
18/*-----------------------------------------------------------------*/
19
20socketstreambuf::socketstreambuf(Socket *sock, streamsize n)
21	: streambuf(), __sock(sock), __alsize(n), __pu(NULL), __po(NULL)
22{
23	setg(0, 0, 0);
24	setp(0, 0);
25}
26
27socketstreambuf::~socketstreambuf()
28{
29	if (__pu)
30		delete [] __pu;
31	if (__po)
32		delete [] __po;
33}
34
35int socketstreambuf::underflow()
36{
37//	cout << "***** underflow" << endl;
38
39	int bytes;
40
41	if (__pu == NULL) {
42		__pu = new char[__alsize];
43	}
44
45	bytes = __sock->read(__pu, __alsize);
46	if (bytes > 0) {
47#ifdef _DEBUG
48		ofstream ofs("recv.log", ios::binary | ios::app);
49		ofs.write(__pu, bytes);
50#endif
51		setg(__pu, __pu, __pu + bytes);
52		return *gptr();
53	}
54
55	return EOF;
56}
57
58int socketstreambuf::overflow(int c)
59{
60//	cout << "***** overflow" << endl;
61
62	if (__po == NULL) {
63		__po = new char[__alsize];
64		setp(__po, __po + __alsize);
65	} else if (sync() != 0) {
66		return EOF;
67	}
68	return sputc(c);
69}
70
71int socketstreambuf::sync()
72{
73//	cout << "***** sync" << endl;
74
75	if (__po) {
76		int length = pptr() - pbase();
77		if (length > 0) {
78			const char *buffer = pbase();
79			int bytes;
80			while (length > 0) {
81				bytes = __sock->write(buffer, length);
82				if (bytes <= 0) {
83					return EOF;
84				}
85#ifdef _DEBUG
86				ofstream ofs("send.log", ios::binary | ios::app);
87				ofs.write(buffer, bytes);
88#endif
89				length -= bytes;
90				buffer += bytes;
91			}
92			pbump(pbase() - pptr());
93		}
94	}
95
96	return 0;
97}
98
99/* -------------------------------------------------------------- */
100
101socketstreambase::socketstreambase(Socket *sock, streamsize n)
102	: buf(sock, n)
103{
104	ios::init(&this->buf);
105}
106
107/*-----------------------------------------------------------------*/
108
109isocketstream::isocketstream(Socket *sock, streamsize n)
110	: socketstreambase(sock, n), istream(socketstreambase::rdbuf())
111{
112}
113
114isocketstream::~isocketstream()
115{
116}
117
118/*-----------------------------------------------------------------*/
119
120osocketstream::osocketstream(Socket *sock, streamsize n)
121	: socketstreambase(sock, n), ostream(socketstreambase::rdbuf())
122{
123}
124
125osocketstream::~osocketstream()
126{
127	flush();
128}
129