1///////////////////////////////////////////////////////////////////////////// 2// Name: src/common/sckstrm.cpp 3// Purpose: wxSocket*Stream 4// Author: Guilhem Lavaux 5// Modified by: 6// Created: 17/07/97 7// RCS-ID: $Id: sckstrm.cpp 42897 2006-11-01 10:21:24Z JS $ 8// Copyright: (c) 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// For compilers that support precompilation, includes "wx.h". 13#include "wx/wxprec.h" 14 15#ifdef __BORLANDC__ 16 #pragma hdrstop 17#endif 18 19#if wxUSE_SOCKETS && wxUSE_STREAMS 20 21#include "wx/sckstrm.h" 22 23#ifndef WX_PRECOMP 24 #include "wx/stream.h" 25#endif 26 27#include "wx/socket.h" 28 29// --------------------------------------------------------------------------- 30// wxSocketOutputStream 31// --------------------------------------------------------------------------- 32 33wxSocketOutputStream::wxSocketOutputStream(wxSocketBase& s) 34 : m_o_socket(&s) 35{ 36} 37 38wxSocketOutputStream::~wxSocketOutputStream() 39{ 40} 41 42size_t wxSocketOutputStream::OnSysWrite(const void *buffer, size_t size) 43{ 44 size_t ret = m_o_socket->Write((const char *)buffer, size).LastCount(); 45 m_lasterror = m_o_socket->Error() ? wxSTREAM_WRITE_ERROR : wxSTREAM_NO_ERROR; 46 return ret; 47 48 // Patch 1476893 caused Advise to hang, needs further investigation 49#if 0 50 const char *buf = (const char *)buffer; 51 size_t count = 0; 52 53 while ( count < size && m_o_socket->WaitForWrite() ) 54 { 55 const size_t ret = m_o_socket->Write(buf, size - count).LastCount(); 56 57 buf += ret; 58 count += ret; 59 60 if ( m_o_socket->Error() ) 61 { 62 if (m_o_socket->LastError() != wxSOCKET_WOULDBLOCK) 63 { 64 m_lasterror = wxSTREAM_WRITE_ERROR; 65 return count; 66 } 67 } 68 } 69 70 m_lasterror = wxSTREAM_NO_ERROR; 71 return count; 72#endif 73} 74 75// --------------------------------------------------------------------------- 76// wxSocketInputStream 77// --------------------------------------------------------------------------- 78 79wxSocketInputStream::wxSocketInputStream(wxSocketBase& s) 80 : m_i_socket(&s) 81{ 82} 83 84wxSocketInputStream::~wxSocketInputStream() 85{ 86} 87 88size_t wxSocketInputStream::OnSysRead(void *buffer, size_t size) 89{ 90 size_t ret = m_i_socket->Read((char *)buffer, size).LastCount(); 91 m_lasterror = m_i_socket->Error() ? wxSTREAM_READ_ERROR : wxSTREAM_NO_ERROR; 92 return ret; 93 94 // Patch 1476893 caused Advise to hang, needs further investigation 95#if 0 96 char *buf = (char *)buffer; 97 size_t count = 0; 98 99 while ( count < size && m_i_socket->WaitForRead() ) 100 { 101 const size_t ret = m_i_socket->Read(buf, size - count).LastCount(); 102 103 buf += ret; 104 count += ret; 105 106 if ( m_i_socket->Error() ) 107 { 108 if (m_i_socket->LastError() != wxSOCKET_WOULDBLOCK) 109 { 110 m_lasterror = wxSTREAM_READ_ERROR; 111 return count; 112 } 113 } 114 } 115 116 m_lasterror = wxSTREAM_NO_ERROR; 117 return count; 118#endif 119} 120 121// --------------------------------------------------------------------------- 122// wxSocketStream 123// --------------------------------------------------------------------------- 124 125wxSocketStream::wxSocketStream(wxSocketBase& s) 126 : wxSocketInputStream(s), wxSocketOutputStream(s) 127{ 128} 129 130wxSocketStream::~wxSocketStream() 131{ 132} 133 134#endif 135 // wxUSE_STREAMS && wxUSE_SOCKETS 136