// Sun, 18 Jun 2000
// Y.Takagi

#ifndef __SocketStream2_H
#define __SocketStream2_H

#include <istream.h>
#include <ostream.h>
#include <streambuf.h>

class Socket;

class socketstreambuf : public streambuf {
public:
	explicit socketstreambuf(Socket *sock, streamsize n);
	~socketstreambuf();

protected:
	virtual int underflow();
	virtual int overflow(int);
	virtual int sync();

private:
	Socket *__sock;
	streamsize __alsize;
	char *__pu;
	char *__po;
};

class socketstreambase : public virtual ios {
public:
	socketstreambuf *rdbuf();

protected:
	socketstreambase(Socket *sock, streamsize n);
	~socketstreambase() {}

private:
	socketstreambuf buf;
};

inline socketstreambuf *socketstreambase::rdbuf()
{
	return &this->buf;
}

class isocketstream : public socketstreambase, public istream {
public:
	explicit isocketstream(Socket *sock, streamsize n = 4096);
	virtual ~isocketstream();
};


class osocketstream : public socketstreambase, public ostream {
public:
	explicit osocketstream(Socket *sock, streamsize n = 4096);
	virtual ~osocketstream();
};

#endif	// __SocketStream2_H
