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