+ wxUint32 total = 0;
+ int ret = 1;
+
+ // If the socket is invalid or parameters are ill, return immediately
+ if (!m_socket || !buffer || !nbytes)
+ return 0;
+
+ // Possible combinations (they are checked in this order)
+ // wxSOCKET_NOWAIT
+ // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK)
+ // wxSOCKET_BLOCK
+ // wxSOCKET_NONE
+ //
+ if (m_flags & wxSOCKET_NOWAIT)
+ {
+ GSocket_SetNonBlocking(m_socket, 1);
+ ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
+ GSocket_SetNonBlocking(m_socket, 0);
+
+ if (ret > 0)
+ total = ret;
+ }
+ else
+ {
+ bool more = TRUE;
+
+ while (more)
+ {
+ if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
+ break;
+
+ ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
+
+ if (ret > 0)
+ {
+ total += ret;
+ nbytes -= ret;
+ buffer = (const char *)buffer + ret;
+ }
+
+ // If we got here and wxSOCKET_WAITALL is not set, we can leave
+ // now. Otherwise, wait until we send all the data or until there
+ // is an error.
+ //
+ more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL));
+ }
+ }
+
+ return total;
+}
+
+wxSocketBase& wxSocketBase::WriteMsg(const void *buffer, wxUint32 nbytes)
+{
+ wxUint32 total;
+ bool error;
+ int old_flags;
+ struct
+ {
+ unsigned char sig[4];
+ unsigned char len[4];