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