+ // If in wxSOCKET_WAITALL mode, all bytes should have been read.
+ if (m_flags & wxSOCKET_WAITALL)
+ m_error = (m_lcount != nbytes);
+ else
+ m_error = (m_lcount == 0);
+
+ // Allow read events from now on
+ m_reading = false;
+
+ return *this;
+}
+
+wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes)
+{
+ int total;
+
+ // Try the pushback buffer first
+ total = GetPushback(buffer, nbytes, false);
+ nbytes -= total;
+ buffer = (char *)buffer + total;
+
+ // Return now in one of the following cases:
+ // - the socket is invalid,
+ // - we got all the data,
+ // - we got *some* data and we are not using wxSOCKET_WAITALL.
+ if ( !m_socket ||
+ !nbytes ||
+ ((total != 0) && !(m_flags & wxSOCKET_WAITALL)) )
+ return total;
+
+ // Possible combinations (they are checked in this order)
+ // wxSOCKET_NOWAIT
+ // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK)
+ // wxSOCKET_BLOCK
+ // wxSOCKET_NONE
+ //
+ int ret;
+ if (m_flags & wxSOCKET_NOWAIT)
+ {
+ m_socket->SetNonBlocking(1);
+ ret = m_socket->Read((char *)buffer, nbytes);
+ m_socket->SetNonBlocking(0);