1219019Sgabor// Sun, 18 Jun 2000
2219019Sgabor// Y.Takagi
3219019Sgabor
4219019Sgabor#if defined(__HAIKU__) || defined(HAIKU_TARGET_PLATFORM_BONE)
5219019Sgabor#	include <sys/socket.h>
6219019Sgabor#else
7219019Sgabor#	include <net/socket.h>
8219019Sgabor#endif
9219019Sgabor
10219019Sgabor#ifdef _DEBUG
11219019Sgabor#include <iostream>
12219019Sgabor#include <fstream>
13219019Sgabor#endif
14219019Sgabor
15219019Sgabor#include "Socket.h"
16219019Sgabor#include "SocketStream.h"
17219019Sgabor
18219019Sgabor/*-----------------------------------------------------------------*/
19219019Sgabor
20219019Sgaborsocketstreambuf::socketstreambuf(Socket *sock, streamsize n)
21219019Sgabor	: streambuf(), __sock(sock), __alsize(n), __pu(NULL), __po(NULL)
22219019Sgabor{
23219019Sgabor	setg(0, 0, 0);
24219019Sgabor	setp(0, 0);
25219019Sgabor}
26219019Sgabor
27219019Sgaborsocketstreambuf::~socketstreambuf()
28219019Sgabor{
29219019Sgabor	if (__pu)
30219019Sgabor		delete [] __pu;
31219019Sgabor	if (__po)
32219019Sgabor		delete [] __po;
33219019Sgabor}
34219019Sgabor
35219019Sgaborint socketstreambuf::underflow()
36219019Sgabor{
37219019Sgabor//	cout << "***** underflow" << endl;
38219019Sgabor
39219019Sgabor	int bytes;
40219019Sgabor
41219019Sgabor	if (__pu == NULL) {
42219019Sgabor		__pu = new char[__alsize];
43219019Sgabor	}
44219019Sgabor
45219019Sgabor	bytes = __sock->read(__pu, __alsize);
46219019Sgabor	if (bytes > 0) {
47219019Sgabor#ifdef _DEBUG
48219019Sgabor		ofstream ofs("recv.log", ios::binary | ios::app);
49219019Sgabor		ofs.write(__pu, bytes);
50219019Sgabor#endif
51219019Sgabor		setg(__pu, __pu, __pu + bytes);
52219019Sgabor		return *gptr();
53219019Sgabor	}
54219019Sgabor
55219019Sgabor	return EOF;
56219019Sgabor}
57219019Sgabor
58219019Sgaborint socketstreambuf::overflow(int c)
59219019Sgabor{
60219019Sgabor//	cout << "***** overflow" << endl;
61219019Sgabor
62219019Sgabor	if (__po == NULL) {
63219019Sgabor		__po = new char[__alsize];
64219019Sgabor		setp(__po, __po + __alsize);
65219019Sgabor	} else if (sync() != 0) {
66219019Sgabor		return EOF;
67219019Sgabor	}
68219019Sgabor	return sputc(c);
69219019Sgabor}
70219019Sgabor
71219019Sgaborint socketstreambuf::sync()
72219019Sgabor{
73219019Sgabor//	cout << "***** sync" << endl;
74219019Sgabor
75219019Sgabor	if (__po) {
76219019Sgabor		int length = pptr() - pbase();
77219019Sgabor		if (length > 0) {
78219019Sgabor			const char *buffer = pbase();
79219019Sgabor			int bytes;
80219019Sgabor			while (length > 0) {
81219019Sgabor				bytes = __sock->write(buffer, length);
82219019Sgabor				if (bytes <= 0) {
83219019Sgabor					return EOF;
84219019Sgabor				}
85219019Sgabor#ifdef _DEBUG
86219019Sgabor				ofstream ofs("send.log", ios::binary | ios::app);
87219019Sgabor				ofs.write(buffer, bytes);
88219019Sgabor#endif
89219019Sgabor				length -= bytes;
90219019Sgabor				buffer += bytes;
91219019Sgabor			}
92219019Sgabor			pbump(pbase() - pptr());
93219019Sgabor		}
94219019Sgabor	}
95219019Sgabor
96219019Sgabor	return 0;
97219019Sgabor}
98219019Sgabor
99219019Sgabor/* -------------------------------------------------------------- */
100219019Sgabor
101219019Sgaborsocketstreambase::socketstreambase(Socket *sock, streamsize n)
102219019Sgabor	: buf(sock, n)
103219019Sgabor{
104219019Sgabor	ios::init(&this->buf);
105219019Sgabor}
106219019Sgabor
107219019Sgabor/*-----------------------------------------------------------------*/
108219019Sgabor
109219019Sgaborisocketstream::isocketstream(Socket *sock, streamsize n)
110219019Sgabor	: socketstreambase(sock, n), istream(socketstreambase::rdbuf())
111219019Sgabor{
112219019Sgabor}
113219019Sgabor
114219019Sgaborisocketstream::~isocketstream()
115219019Sgabor{
116219019Sgabor}
117219019Sgabor
118219019Sgabor/*-----------------------------------------------------------------*/
119219019Sgabor
120219019Sgaborosocketstream::osocketstream(Socket *sock, streamsize n)
121219019Sgabor	: socketstreambase(sock, n), ostream(socketstreambase::rdbuf())
122219019Sgabor{
123219019Sgabor}
124219019Sgabor
125219019Sgaborosocketstream::~osocketstream()
126219019Sgabor{
127219019Sgabor	flush();
128219019Sgabor}
129219019Sgabor