[Common-dev] CR: part 3: sockimp connect failure fix plus related host byte-order fix, etc.

[Common-dev] CR: part 3: sockimp connect failure fix plus related host byte-order fix, etc.

Liam Murray liamm at real.com
Fri Aug 6 18:00:46 PDT 2004


[Sorry, this has evolved into a big CR with a lot of small changes.]

Summary:
----------------

Misc. accumulated fixes to common/netio and client/common/netio. Mostly 
socket option updates, a byte order fix and connect failure fix.

Details:
-----------


In addition to changes in previous CRs, this adds the following modifications:

1) Eric Hyche suggested in response to my last CR that SetAddr() take only 
host order arguments. I agree that we should only use host order whenever 
possible. Now only one method in hxsockutil accepts net-order arguments and 
has been renamed to SetAddrNetOrder. This is used in cases where we get an 
inet_addr or some other bsd struct and are creating an IHXSockAddr. If only 
we used strings for address and port representation we could avoid all 
these net/host order problems. :)

2) Updates (mostly to shim socket code) to only store and pass arguments in 
host order; removed net order/host order conversions. Removed unused (and 
duplicated i HXSockUtil) function 
CHXClientNetServicesShim::CreateSocketAddress().

3) Small fix in HXSockUtil::SetAddr() which would likely crash in very 
unlikely case that FromCharArray fails.

4) Added HX_SOCKOPT_READBUF_FLAG socket option. Value can be one of following.

HX_SOCK_READBUF_SIZE_DEFAULT
HX_SOCK_READBUF_SIZE_COPY // copy to precisely sized buffer after read
HX_SOCK_READBUF_SIZE_PEEK // use FIONBIO or equivalent (not implemented)

Note that if HX_SOCK_READBUF_SIZE_PEEK  were to work reliably across 
platforms HX_SOCK_READBUF_SIZE_COPY  may not be needed. However, I'm not at 
this point sure it is reliably supported and efficient.

6) Added HX_SOCKOPT_READBUF_MAX  socket option. Value is a number that 
specifies override value for m_mss (otherwise defaults to approx. 64K for 
UDP and max segment size or 1500 for TCP)

7) Set DEFAULT_UDP_READ_SIZE to 0xf000 if symbian defined in hxnet.h.

8) Added some code to GetOption to return currently set values for missing 
HXSockOpt that were recently added.

9)  Split hxclientsockimp.cpp in client/common/netio/platform/posix into 
two files chxclientsocket.cpp and chxclientnetservices.cpp for sake of 
cleaner organization.

As a reminder, this also includes the following items from previous CRs:

1) Net order fix in hxsockutil

2) Moved IHXScheduler assert so it only asserts when socket idle timeout 
option is used (otherwise asserts when using simple context objects such as 
mini context)

3) Fix in sockimp to better handle connect failure. When a connect fails a 
write event is passed to OnEvent(). If an error is associated with the 
event the connect event is forwarded to IHXSocketResponse with the error 
code and no write event is subsequently sent. The first write event is only 
sent if the connection is successful. (This is how WSA event semantics 
works. Please verify this makes sense for us to follow.) Also note that a 
close event should not be sent unless a connection was successfully 
established for a socket. (Again, this corresponds with WSA semantics.)

4) When the windows client gets an FD_CONNECT along with a failure code 
from WSAAsyncSelect, it is passed on as a write event to 
CHXSocket::OnEvent(). Otherwise the connect is passed on upon receiving the 
first write event.

5) Changed CHXSocket::Init() so it returns an HX_RESULT. This is 
particularly helpful for the client derivations because they 
initialize/allocate resources during initialization.

Branch: HEAD

Builds, platforms verified: Windows client

Liam


Index: hxnet.h
===================================================================
RCS file: /cvsroot/common/include/hxnet.h,v
retrieving revision 1.22
diff -u -w -r1.22 hxnet.h
--- hxnet.h	30 Jul 2004 20:53:56 -0000	1.22
+++ hxnet.h	7 Aug 2004 00:40:25 -0000
@@ -82,10 +82,12 @@


  // Default read size for all other sockets when MSS is unavailable
+#if defined SYMBIAN
+#define DEFAULT_UDP_READ_SIZE 0xf000
+#else
  #define DEFAULT_UDP_READ_SIZE 0xffff
+#endif

-// SYMBIAN requires DEFAULT_UDP_READ_SIZE <= 0xf000
-// SO_MAX_MSG_SIZE for windows?

  /******************************************************************************
   *
@@ -433,12 +435,17 @@

  #define HX_SOCK_EVENT_ALL       (~0)

-typedef enum
-{
-    HX_SOCKBUF_DEFAULT,         // IHXBuffer
-    HX_SOCKBUF_TIMESTAMPED      // IHXTimeStampedBuffer
+typedef enum {
+    HX_SOCKBUF_DEFAULT,         /* IHXBuffer */
+    HX_SOCKBUF_TIMESTAMPED      /* IHXTimeStampedBuffer */
  } HXSockBufType;

+typedef enum {
+    HX_SOCK_READBUF_SIZE_DEFAULT,    /* read once into default sized read 
buffer */
+    HX_SOCK_READBUF_SIZE_COPY,       /* same as default but reallocates 
once size is known */
+    HX_SOCK_READBUF_SIZE_PEEK        /* use facility such as FIONBIO to 
determine size of pending data in network buffers */
+} HXSockReadBufFlag;
+
  /* Socket options for IHXSocket::GetOption() and IHXSocket::SetOption() */
  /* XXXTDM: Separate these like the real getsockopt/setsockopt? */
  typedef enum {
@@ -494,9 +501,11 @@
      HX_SOCKOPT_IDLETIMEOUT,

      /* Helix only*/
-    HX_SOCKOPT_BUFFER_TYPE,
-    HX_SOCKOPT_APP_SNDBUF,
-    HX_SOCKOPT_APP_RCVBUF,
+    HX_SOCKOPT_BUFFER_TYPE,     /* IHXBuffer type returned from read 
functions */
+    HX_SOCKOPT_APP_SNDBUF,      /* outbound app buffer size in bytes*/
+    HX_SOCKOPT_APP_RCVBUF,      /* inbound app buffer size in bytes*/
+    HX_SOCKOPT_READBUF_FLAG,    /* controls read buffer allocation and 
sizing behavior */
+    HX_SOCKOPT_READBUF_MAX,     /* max read buffer size in bytes (datagram 
and stream) */

      HX_SOCKOPT_LAST
  } HXSockOpt;

Index: hxsockutil.cpp
===================================================================
RCS file: /cvsroot/common/netio/hxsockutil.cpp,v
retrieving revision 1.12
diff -u -w -r1.12 hxsockutil.cpp
--- hxsockutil.cpp	30 Jul 2004 19:58:18 -0000	1.12
+++ hxsockutil.cpp	7 Aug 2004 00:38:00 -0000
@@ -42,6 +42,7 @@
  #include "safestring.h"
  #include "debug.h"
  #include "hxassert.h"
+#include "netbyte.h"
  #include "hxheap.h"
  #include "hxsockutil.h"

@@ -254,12 +255,14 @@

  }

-HX_RESULT HXSockUtil::SetAddr(IHXSockAddr* pAddr /*modified*/, const char* 
pAddrString, UINT16 port)
+HX_RESULT HXSockUtil::SetAddr(IHXSockAddr* pAddr /*modified*/,
+                              const char* pAddrString,
+                              UINT16 port)
  {
      HX_ASSERT(pAddr);
      HX_ASSERT(pAddrString);

-    IHXBuffer* pBuf;
+    IHXBuffer* pBuf = 0;
      HX_RESULT hr = CHXBuffer::FromCharArray(pAddrString, &pBuf);
      if (HXR_OK == hr)
      {
@@ -268,22 +271,21 @@
          {
              hr = pAddr->SetPort(port);
          }
-    }
      HX_RELEASE(pBuf);
+    }
+
      return hr;
  }

-HX_RESULT HXSockUtil::SetAddr(IHXSockAddr* pAddr /*modified*/,
+HX_RESULT HXSockUtil::SetAddrNetOrder(IHXSockAddr* pAddr /*modified*/,
                                  short family,
-                                const void* pAddrData /*net-order 
octets/hextets*/,
-                                UINT16 port)
+                                const void* pAddrData /*net order 
octets/hextets*/,
+                                UINT16 port /*net order*/)
  {
      HX_ASSERT(pAddrData);
-
      char szAddr[HX_ADDRSTRLEN]; // big enough for ipv6 and ipv4
      hx_inet_ntop(family, pAddrData, szAddr, HX_ADDRSTRLEN);
-
-    return SetAddr(pAddr, szAddr, port);
+    return SetAddr(pAddr, szAddr, WToHost(port));
  }


@@ -449,10 +451,9 @@
  }


-
  HX_RESULT HXSockUtil::CreateAddrIN4(IHXNetServices* pNetServices,
-                     UINT32 addr /*net order*/,
-                     UINT16 port /*net order*/,
+                     UINT32 addr,
+                     UINT16 port,
                       IHXSockAddr*& pAddrOut /*out*/)
  {
      HX_ASSERT(pNetServices);
@@ -461,7 +462,9 @@
      HX_RESULT hr = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN4, 
&pAddrOut);
      if(SUCCEEDED(hr))
      {
-        SetAddr(pAddrOut, AF_INET, &addr, port);
+        UINT32 netAddr = DwToNet(addr);
+        UINT16 netPort = WToNet(port);
+        SetAddrNetOrder(pAddrOut, AF_INET, &netAddr, netPort);
      }

      return hr;


Index: platform/posix/hxposixsockutil.cpp
===================================================================
RCS file: /cvsroot/common/netio/platform/posix/hxposixsockutil.cpp,v
retrieving revision 1.3
diff -u -w -r1.3 hxposixsockutil.cpp
--- platform/posix/hxposixsockutil.cpp	21 Jul 2004 23:10:33 -0000	1.3
+++ platform/posix/hxposixsockutil.cpp	7 Aug 2004 00:38:00 -0000
@@ -40,12 +40,13 @@
  #include "hxslist.h"
  #include "safestring.h"
  #include "sockimp.h"
-#include "debug.h"
-#include "hxassert.h"
-#include "hxheap.h"
+#include "netbyte.h"
  #include "hxsockutil.h"
  #include "hxposixsockutil.h"

+#include "debug.h"
+#include "hxassert.h"
+#include "hxheap.h"
  #ifdef _DEBUG
  #undef HX_THIS_FILE
  static const char HX_THIS_FILE[] = __FILE__;
@@ -66,7 +67,7 @@
      HX_RESULT hr = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN6, 
&pAddrOut);
      if (SUCCEEDED(hr))
      {
-        HXSockUtil::SetAddr(pAddrOut, AF_INET6, &psa->sin6_addr, 
psa->sin6_port);
+        HXSockUtil::SetAddrNetOrder(pAddrOut, AF_INET6, &psa->sin6_addr, 
psa->sin6_port);
      }

      return hr;
@@ -96,7 +97,14 @@
  {
      HX_ASSERT(pNetServices);
      HX_ASSERT(psa);
-    return HXSockUtil::CreateAddrIN4(pNetServices, psa->sin_addr.s_addr, 
psa->sin_port, pAddrOut);
+
+    HX_RESULT hr = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN4, 
&pAddrOut);
+    if(SUCCEEDED(hr))
+    {
+        hr = HXSockUtil::SetAddrNetOrder(pAddrOut, AF_INET, 
&psa->sin_addr.s_addr, psa->sin_port);
+    }
+
+    return hr;
  }


@@ -151,8 +159,8 @@

          IHXSockAddr* pAddr = 0;

-        const char* psz = phe->h_addr_list[idx];
-        if (!psz)
+        const char* pAddrOctets = phe->h_addr_list[idx];
+        if (!pAddrOctets)
          {
              // end of list
              break;
@@ -160,9 +168,9 @@

          HX_ASSERT(phe->h_length == sizeof(UINT32));

-        UINT32 addr = *(const UINT32*)(psz);
+        UINT32 addr = *(const UINT32*)(pAddrOctets);

-        hr = HXSockUtil::CreateAddrIN4(pNetServices,  addr, 0, pAddr);
+        hr = HXSockUtil::CreateAddrIN4(pNetServices,  WToHost(addr), 0, 
pAddr);
          if (HXR_OK == hr)
          {
              HX_ASSERT(pAddr != 0);
Index: platform/posix/sockimp.cpp
===================================================================
RCS file: /cvsroot/common/netio/platform/posix/sockimp.cpp,v
retrieving revision 1.37
diff -u -w -r1.37 sockimp.cpp
--- platform/posix/sockimp.cpp	30 Jul 2004 20:32:57 -0000	1.37
+++ platform/posix/sockimp.cpp	7 Aug 2004 00:38:00 -0000
@@ -1005,6 +1005,7 @@
      m_type(HX_SOCK_TYPE_NONE),
      m_proto(HX_SOCK_PROTO_NONE),
      m_bufType(HX_SOCKBUF_DEFAULT),
+    m_readBufFlag(HX_SOCK_READBUF_SIZE_DEFAULT),
      m_sock(HX_SOCK_NONE),
  #if defined(MISSING_DUALSOCKET)
      m_pSock4(NULL),
@@ -1034,7 +1035,6 @@
      }
      HX_ASSERT(m_punkContext != NULL);
      HX_ASSERT(m_pCCF != NULL);
-    HX_ASSERT(m_pScheduler != NULL);
  }

  CHXSocket::CHXSocket(CHXNetServices* pNetSvc, IUnknown* punkContext,
@@ -1077,7 +1077,6 @@
      }
      HX_ASSERT(m_punkContext != NULL);
      HX_ASSERT(m_pCCF != NULL);
-    HX_ASSERT(m_pScheduler != NULL);
  }

  CHXSocket::~CHXSocket(void)
@@ -1141,28 +1140,32 @@
          break;
      case HX_SOCK_STATE_CONNECTING:
          HX_ASSERT(uEvent & HX_SOCK_EVENT_WRITE);
-        m_sock.state = HX_SOCK_STATE_NORMAL; //XXXTDM: What if connect fails?
-
-        if (m_uSelectedEventMask & HX_SOCK_EVENT_CONNECT)
+        if (uEvent & HX_SOCK_EVENT_WRITE)
          {
              UINT32 err = 0;
-            HX_RESULT status;
              hx_getsockopt(&m_sock, HX_SOCKOPT_SOCKERR, &err);
-            status = ErrorToStatus(err);
+            HX_RESULT status = ErrorToStatus(err);
+
+            // NB: we shouldn't send a close event unless the connection 
is successful
+            m_sock.state = HX_SOCK_STATE_NORMAL;
+
              if (m_uSelectedEventMask & HX_SOCK_EVENT_CONNECT)
              {
                  m_pResponse->EventPending(HX_SOCK_EVENT_CONNECT, status);
              }
-        }
-        //XXXTDM: Pass up write event on failed connect?
-        if (m_uSelectedEventMask & HX_SOCK_EVENT_WRITE)
-        {
+
              HX_ASSERT(m_bIsResponseWriteEventPending);
              m_bIsResponseWriteEventPending = FALSE;
+
+            // only send the write event if the connection was 
successfully established
+            if (HXR_OK == status && m_uSelectedEventMask & 
HX_SOCK_EVENT_WRITE)
+            {
              m_pResponse->EventPending(HX_SOCK_EVENT_WRITE, HXR_OK);
          }
+        }
          break;
      case HX_SOCK_STATE_LISTENING:
+        HX_ASSERT(uEvent & HX_SOCK_EVENT_READ);
          if (uEvent & HX_SOCK_EVENT_READ)
          {
              m_uPendingEventMask = HX_SOCK_EVENT_ACCEPT;
@@ -1702,11 +1705,31 @@
          *pval = m_uIdleTimeout;
          return HXR_OK;
      }
-    if (name == HX_SOCKOPT_BUFFER_TYPE)
+    else if (name == HX_SOCKOPT_BUFFER_TYPE)
      {
          *pval = m_bufType;
          return HXR_OK;
      }
+    else if (name == HX_SOCKOPT_READBUF_FLAG)
+    {
+        *pval = m_readBufFlag;
+        return HXR_OK;
+    }
+    else if (name == HX_SOCKOPT_READBUF_MAX)
+    {
+        *pval = m_mss;
+        return HXR_OK;
+    }
+    else if (name == HX_SOCKOPT_APP_SNDBUF)
+    {
+        *pval = 0;
+        if (m_pSendBuffer)
+        {
+            *pval = m_pSendBuffer->GetSize();
+        }
+        return HXR_OK;
+    }
+

      if (hx_getsockopt(&m_sock, name, pval) != 0)
      {
@@ -1743,6 +1766,7 @@
  #endif
      if (name == HX_SOCKOPT_IDLETIMEOUT)
      {
+        HX_ASSERT(m_pScheduler);
          if (m_pScheduler == NULL)
          {
              return HXR_FAIL;
@@ -1759,12 +1783,33 @@
          }
          return HXR_OK;
      }
-    if (name == HX_SOCKOPT_BUFFER_TYPE)
+    else if (name == HX_SOCKOPT_BUFFER_TYPE)
      {
+        if (val != HX_SOCKBUF_DEFAULT &&
+            val != HX_SOCKBUF_TIMESTAMPED)
+        {
+            return HXR_FAIL;
+        }
          m_bufType = (HXSockBufType)val;
          return HXR_OK;
      }
-    if (name == HX_SOCKOPT_APP_SNDBUF)
+    else if (name == HX_SOCKOPT_READBUF_FLAG)
+    {
+        if (val != HX_SOCK_READBUF_SIZE_DEFAULT &&
+            val != HX_SOCK_READBUF_SIZE_COPY)
+        {
+            return HXR_FAIL;
+        }
+        m_readBufFlag = (HXSockReadBufFlag)val;
+
+        return HXR_OK;
+    }
+    else if (name == HX_SOCKOPT_READBUF_MAX)
+    {
+        m_mss = val;
+        return HXR_OK;
+    }
+    else if (name == HX_SOCKOPT_APP_SNDBUF)
      {
          if (m_pSendBuffer)
          {
@@ -1773,6 +1818,7 @@
          return HXR_OK;
      }

+
      if (hx_setsockopt(&m_sock, name, val) != 0)
      {
          return ErrorToStatus(hx_lastsockerr());
@@ -2003,6 +2049,7 @@
      return HXR_UNEXPECTED;
  }

+
  HX_RESULT
  CHXSocket::GetNativeAddr(IHXSockAddr* pAddr, sockaddr_in6* psa6,
                          sockaddr** ppsa, size_t* psalen)
@@ -2025,6 +2072,48 @@
  }

  HX_RESULT
+CHXSocket::SetReadBufferSize(IHXBuffer** ppBuf /*modified*/, UINT32 cbRead)
+{
+    HX_ASSERT(ppBuf && *ppBuf);
+    HX_ASSERT(cbRead != 0);
+
+    HX_RESULT hxr = HXR_OK;
+
+    //XXXLCM If we get rid of the following line and 'copy' is specified 
we can allocate
+    //       one temp buffer into which we read and avoid some extra 
allocations.
+    if (cbRead != (*ppBuf)->GetSize())
+    {
+        HX_ASSERT(cbRead < (*ppBuf)->GetSize());
+        if (HX_SOCK_READBUF_SIZE_COPY == m_readBufFlag)
+        {
+            // allocate a new buffer so buffer does not waste unused 
memory space
+            IHXBuffer* pResizedBuf = 0;
+            hxr = CreateReadBuffer(&pResizedBuf);
+            if (HXR_OK == hxr)
+            {
+                hxr = pResizedBuf->Set((*ppBuf)->GetBuffer(), cbRead);
+                if (HXR_OK == hxr)
+                {
+                    HX_RELEASE(*ppBuf);
+                    *ppBuf = pResizedBuf;
+                    (*ppBuf)->AddRef();
+                }
+                HX_RELEASE(pResizedBuf);
+            }
+        }
+        else
+        {
+            HX_ASSERT(HX_SOCK_READBUF_SIZE_DEFAULT == m_readBufFlag);
+            // just re-specify the size and avoid a copy
+            hxr = (*ppBuf)->SetSize(cbRead);
+        }
+    }
+
+    return hxr;
+}
+
+
+HX_RESULT
  CHXSocket::CreateReadBuffer(IHXBuffer** ppBuf)
  {
      HX_RESULT hxr = HXR_OK;
@@ -2116,7 +2205,7 @@
          n = hx_readfrom(&m_sock, (*ppBuf)->GetBuffer(), m_mss, psa, 
salen, bPeek);
          if (n > 0)
          {
-            (*ppBuf)->SetSize(n);
+            hxr = SetReadBufferSize(ppBuf, n);
          }
          else if (n == 0)
          {
@@ -2247,7 +2336,11 @@
          }
          else if (vec[n].get_len() < ppBufVec[n]->GetSize())
          {
-            ppBufVec[n]->SetSize(vec[n].get_len());
+            hxr = SetReadBufferSize(&ppBufVec[n], vec[n].get_len());
+            if (FAILED(hxr))
+            {
+                return hxr;
+            }
          }
      }
      return HXR_OK;
@@ -2767,7 +2860,7 @@
      Close();
  }

-void
+HX_RESULT
  CHXNetServices::Init(IUnknown* punkContext)
  {
      m_punkContext = punkContext;
@@ -2775,10 +2868,12 @@

      //XXXLCM this loads then unloads the winsock dll (undesireable)
      HXNetDrvLoader loader;
-    if(HXR_OK == loader.EnsureLoaded())
+    HX_RESULT hr = loader.EnsureLoaded();
+    if (HXR_OK == hr)
      {
          m_bIN6 = hx_netdrv_familyavail(HX_SOCK_FAMILY_IN6);
      }
+    return hr;
  }

  void
Index: platform/win/hxsocketselector.cpp
===================================================================
RCS file: /cvsroot/common/netio/platform/win/hxsocketselector.cpp,v
retrieving revision 1.6
diff -u -w -r1.6 hxsocketselector.cpp
--- platform/win/hxsocketselector.cpp	30 Jul 2004 22:57:10 -0000	1.6
+++ platform/win/hxsocketselector.cpp	7 Aug 2004 00:38:00 -0000
@@ -229,12 +229,6 @@
      wsaMask |= TranlateMaskValue(eventMask, 
HX_SOCK_EVENT_WRITE,      FD_WRITE);
      wsaMask |= TranlateMaskValue(eventMask, 
HX_SOCK_EVENT_CLOSE,      FD_CLOSE);

-    if(!m_wsaEventSemantics)
-    {
-        // we only will report HX_SOCK_EVENT_READ and HX_SOCK_EVENT_WRITE 
as on UNIX
-        wsaMask &= ~FD_CONNECT;
-    }
-
      // register to receive async socket event notifications
      int res = WSAAsyncSelect(fd, m_pMsgSink->GetSinkHandle(), 
HXMSG_SOCKETSELECT, wsaMask);
      if( SOCKET_ERROR != res )
@@ -412,7 +406,7 @@

  }

-UINT32 HXSocketSelector::TranslateWSAAsyncSelectEvent(UINT16 wsaEvent)
+UINT32 TranslateWSAAsyncSelectEvent(bool wsaEventSemantics, UINT16 
wsaEvent, UINT16 err)
  {
      UINT32 hxEvent = HX_SOCK_EVENT_NONE;
      switch (wsaEvent)
@@ -446,11 +440,15 @@
          // applications you do not need to handle this; you just wait
          // for the write event.
          //
-        HX_ASSERT(m_wsaEventSemantics);
-        if (m_wsaEventSemantics)
+        if (wsaEventSemantics)
          {
              hxEvent = HX_SOCK_EVENT_CONNECT;
          }
+        else if(err != 0)
+        {
+            // pass write event along with error code
+            hxEvent = HX_SOCK_EVENT_WRITE;
+        }
  	break;

      case FD_CLOSE:
@@ -458,7 +456,7 @@
          // Indicates that stream socket has transitioned to close-pending
          // state (either gracefully or abortively) from connected state
          //
-        if(m_wsaEventSemantics)
+        if(wsaEventSemantics)
          {
              hxEvent = HX_SOCK_EVENT_CLOSE;
          }
@@ -478,7 +476,7 @@
          //
          // Helix synthesizes HX_SOCK_EVENT_ACCEPT based on HX_SOCK_EVENT_READ
          //
-        if(m_wsaEventSemantics)
+        if(wsaEventSemantics)
          {
              hxEvent = HX_SOCK_EVENT_ACCEPT;
          }
@@ -525,13 +523,16 @@

      if(pHandler)
      {
-        UINT32 hxEvent = TranslateWSAAsyncSelectEvent(event);
+        UINT32 hxEvent = TranslateWSAAsyncSelectEvent(m_wsaEventSemantics, 
event, err);
          HX_RESULT hxResult = TranslateWSAAsyncSelectError(err);

          DPRINTF(D_SOCKETSELECT, ("HXSocketSelector::OnAsyncSelect(): 
%s:%s translated as %s(= %u) for handler [%p]\n",
              GetWSAEventString(event), GetWSAErrorString(err), 
GetSockEventString(hxEvent), hxEvent, pHandler));

+        if (HX_SOCK_EVENT_NONE != hxEvent)
+        {
          pHandler->OnSelectEvent(hxEvent, hxResult);
+        }
      }
      else
      {


Index: pub/hxsockutil.h
===================================================================
RCS file: /cvsroot/common/netio/pub/hxsockutil.h,v
retrieving revision 1.9
diff -u -w -r1.9 hxsockutil.h
--- pub/hxsockutil.h	30 Jul 2004 19:58:45 -0000	1.9
+++ pub/hxsockutil.h	7 Aug 2004 00:38:00 -0000
@@ -12,9 +12,11 @@

  struct HXSockUtil // namespace
  {
-    static HX_RESULT SetAddr(IHXSockAddr* pAddr /*modified*/, const char* 
pAddrString, UINT16 port);
-
      static HX_RESULT SetAddr(IHXSockAddr* pAddr /*modified*/,
+                             const char* pAddrString,
+                             UINT16 port = 0);
+
+    static HX_RESULT SetAddrNetOrder(IHXSockAddr* pAddr /*modified*/,
                                      short family,
                                      const void* const pAddrData /*net 
order*/,
                                      UINT16 port /*net order*/ = 0);
@@ -28,10 +30,9 @@
                                   const char* pszAddr, UINT16 port,
                                   IHXSockAddr*& pAddrOut /*out*/);

-
      static HX_RESULT CreateAddrIN4(IHXNetServices* pNetServices,
-                     UINT32 addr /*net order*/,
-                     UINT16 port /*net order*/,
+                     UINT32 addr,
+                     UINT16 port,
                       IHXSockAddr*& pAddrOut /*out*/);


Index: pub/platform/posix/sockimp.h
===================================================================
RCS file: /cvsroot/common/netio/pub/platform/posix/sockimp.h,v
retrieving revision 1.23
diff -u -w -r1.23 sockimp.h
--- pub/platform/posix/sockimp.h	30 Jul 2004 00:32:32 -0000	1.23
+++ pub/platform/posix/sockimp.h	7 Aug 2004 00:38:00 -0000
@@ -302,6 +302,7 @@
                              sockaddr** ppsa, size_t* psalen);
      HX_RESULT ErrorToStatus(int err);
      HX_RESULT CreateReadBuffer(IHXBuffer** ppBuf);
+    HX_RESULT SetReadBufferSize(IHXBuffer** ppBuf /*modified*/, UINT32 
cbRead);
      HX_RESULT DoRead(IHXBuffer** ppBuf, IHXSockAddr** ppAddr = NULL,
                              BOOL bPeek = FALSE);
      HX_RESULT DoWrite(IHXBuffer* pBuf,
@@ -336,6 +337,7 @@
      HXSockType                  m_type;
      HXSockProtocol              m_proto;
      HXSockBufType               m_bufType;
+    HXSockReadBufFlag           m_readBufFlag;
      HX_SOCK                     m_sock;
  #if defined(MISSING_DUALSOCKET)
      CHXSocket*                  m_pSock4;
@@ -441,7 +443,7 @@
      virtual ~CHXNetServices(void);

  public:
-    virtual void Init(IUnknown* punkContext);
+    virtual HX_RESULT Init(IUnknown* punkContext);
      virtual void Close(void);

      // This is used by CHXSocket::Accept().
Index: pub/platform/win/hxsocketselector.h
===================================================================
RCS file: /cvsroot/common/netio/pub/platform/win/hxsocketselector.h,v
retrieving revision 1.5
diff -u -w -r1.5 hxsocketselector.h
--- pub/platform/win/hxsocketselector.h	30 Jul 2004 22:57:30 -0000	1.5
+++ pub/platform/win/hxsocketselector.h	7 Aug 2004 00:38:00 -0000
@@ -81,7 +81,6 @@
      HXSocketSelector();
      virtual ~HXSocketSelector();
      static HX_RESULT CreateSelector(HXSocketSelector*& pSelector);
-    UINT32 TranslateWSAAsyncSelectEvent(UINT16 wsaEvent);

      // HXRefCounted
      void FinalRelease();









Index: platform/posix/shim_listening_socket.cpp
===================================================================
RCS file: 
/cvsroot/client/common/netio/platform/posix/shim_listening_socket.cpp,v
retrieving revision 1.4
diff -u -w -r1.4 shim_listening_socket.cpp
--- platform/posix/shim_listening_socket.cpp	30 Jul 2004 20:49:43 -0000	1.4
+++ platform/posix/shim_listening_socket.cpp	7 Aug 2004 00:49:33 -0000
@@ -280,14 +280,6 @@
              retVal = pTCPSocket->GetForeignPort(usPort);
              if (SUCCEEDED(retVal))
              {
-                // Since HXSockUtil::CreateAddrIN4 expects both
-                // address and port in net order, then if we
-                // are little-endian, we need to swap them.
-                if (!m_bBigEndian)
-                {
-                    ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
-                    usPort = CHXShimUtils::SwapUINT16(usPort);
-                }
                  // Create an IHXSockAddr with these parameters
                  IHXSockAddr* pAddr = NULL;
                  retVal = HXSockUtil::CreateAddrIN4(m_pNetServices, 
ulAddr, usPort, pAddr);
Index: platform/posix/shim_net_services.cpp
===================================================================
RCS file: /cvsroot/client/common/netio/platform/posix/shim_net_services.cpp,v
retrieving revision 1.5
diff -u -w -r1.5 shim_net_services.cpp
--- platform/posix/shim_net_services.cpp	30 Jul 2004 20:49:43 -0000	1.5
+++ platform/posix/shim_net_services.cpp	7 Aug 2004 00:49:33 -0000
@@ -40,7 +40,7 @@
  #include "hxprefs.h"
  #include "hxprefutil.h"
  #include "hxengin.h"
-#include "hxclientsockimp.h"
+//#include "chxclientsocket.h"
  #include "hxsockutil.h"
  #include "shim_resolve.h"
  #include "shim_listening_socket.h"
@@ -56,10 +56,12 @@
  {
  }

-void CHXClientNetServicesShim::Init(IUnknown* pContext)
+HX_RESULT CHXClientNetServicesShim::Init(IUnknown* pContext)
  {
-    CHXNetServices::Init(pContext);
+    HX_RESULT hr = CHXNetServices::Init(pContext);

+    if (HXR_OK == hr)
+    {
      // Get the IHXPreferences interface
      if(m_punkContext)
      {
@@ -73,6 +75,9 @@
          HX_RELEASE(pPrefs);
      }
  }
+    return hr;
+
+}

  void CHXClientNetServicesShim::Close(void)
  {
@@ -160,35 +165,6 @@
      else
      {
          retVal = CHXClientNetServices::CreateSocket(ppSock);
-    }
-
-    return retVal;
-}
-
-HX_RESULT CHXClientNetServicesShim::CreateSocketAddress(IHXNetServices* 
pNetServices,
-                                                        UINT32 
ulAddress,
-                                                        UINT16 
usPort,
-                                                        IHXSockAddr** 
ppAddr)
-{
-    HX_RESULT retVal = HXR_FAIL;
-
-    if (pNetServices && ppAddr)
-    {
-        IHXSockAddr* pAddr = NULL;
-        retVal = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN4, &pAddr);
-        if (SUCCEEDED(retVal))
-        {
-            // Set the address and port
-            HXSockUtil::SetAddr(pAddr, AF_INET, &ulAddress, usPort);
-            if (SUCCEEDED(retVal))
-            {
-                // AddRef the IHXSockAddr before it goes out
-                pAddr->AddRef();
-                // Return the out parameter
-                *ppAddr = pAddr;
-            }
-        }
-        HX_RELEASE(pAddr);
      }

      return retVal;
Index: platform/posix/shim_resolve.cpp
===================================================================
RCS file: /cvsroot/client/common/netio/platform/posix/shim_resolve.cpp,v
retrieving revision 1.3
diff -u -w -r1.3 shim_resolve.cpp
--- platform/posix/shim_resolve.cpp	23 Jul 2004 21:14:29 -0000	1.3
+++ platform/posix/shim_resolve.cpp	7 Aug 2004 00:49:33 -0000
@@ -164,13 +164,7 @@
      {
          // Convert the service port to an UINT16 (native order)
          m_usServicePort = (UINT16) atoi(pServ);
-        // HXSockUtil::CreateAddrIN4 expects the port to
-        // be in net order, so if we are little-endian, then
-        // we need to swap
-        if (!m_bBigEndian)
-        {
-            m_usServicePort = CHXShimUtils::SwapUINT16(m_usServicePort);
-        }
+
          // Call IHXResolver::GetHostByName(). This will
          // return in GetHostByNameDone().
          retVal = m_pResolver->GetHostByName(pNode);
@@ -196,12 +190,7 @@
          if (SUCCEEDED(status))
          {
              // IHXResolverResponse returns address in native order.
-            // HXSockUtil::CreateAddrIN4() expects addresses in
-            // net order, so if we are little-endian, we need to swap
-            if (!m_bBigEndian)
-            {
-                ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
-            }
+
              // Create an IHXSockAddr with this address and port
              IHXSockAddr* pAddr = NULL;
              retVal = HXSockUtil::CreateAddrIN4(m_pServices, ulAddr, 
m_usServicePort, pAddr);
Index: platform/posix/shim_socket.cpp
===================================================================
RCS file: /cvsroot/client/common/netio/platform/posix/shim_socket.cpp,v
retrieving revision 1.6
diff -u -w -r1.6 shim_socket.cpp
--- platform/posix/shim_socket.cpp	30 Jul 2004 20:49:43 -0000	1.6
+++ platform/posix/shim_socket.cpp	7 Aug 2004 00:49:33 -0000
@@ -328,13 +328,6 @@
                  retVal = m_pTCPSocket->GetLocalPort(usPort);
                  if (SUCCEEDED(retVal))
                  {
-                    // CreateAddrIN4 expects net order, so if
-                    // we are little-endian, then we need to swap
-                    if (!m_bBigEndian)
-                    {
-                        ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
-                        usPort = CHXShimUtils::SwapUINT16(usPort);
-                    }
                      IHXSockAddr* pAddr = NULL;
                      retVal = HXSockUtil::CreateAddrIN4(m_pNetServices, 
ulAddr, usPort, pAddr);
                      if (SUCCEEDED(retVal))
@@ -354,12 +347,6 @@
              retVal = m_pTCPSocket->GetLocalPort(usPort);
              if (SUCCEEDED(retVal))
              {
-                // CreateAddrIN4 expects net order, so if
-                // we are little-endian, then we need to swap
-                if (!m_bBigEndian)
-                {
-                    usPort = CHXShimUtils::SwapUINT16(usPort);
-                }
                  IHXSockAddr* pAddr = NULL;
                  retVal = HXSockUtil::CreateAddrIN4(m_pNetServices, 
ulAddr, usPort, pAddr);
                  if (SUCCEEDED(retVal))
@@ -393,13 +380,6 @@
                  retVal = m_pTCPSocket->GetForeignPort(usPort);
                  if (SUCCEEDED(retVal))
                  {
-                    // CreateAddrIN4 expects net order, so if
-                    // we are little-endian, then we need to swap
-                    if (!m_bBigEndian)
-                    {
-                        ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
-                        usPort = CHXShimUtils::SwapUINT16(usPort);
-                    }
                      IHXSockAddr* pAddr = NULL;
                      retVal = HXSockUtil::CreateAddrIN4(m_pNetServices, 
ulAddr, usPort, pAddr);
                      if (SUCCEEDED(retVal))
@@ -548,22 +528,16 @@

      if (pGroupAddr && pInterface && m_pUDPSocket)
      {
-        // Get the group address (net order)
+        // Get the group address (native order)
          UINT32 ulGroupAddr = 0;
          retVal = HXSockUtil::GetIN4Address(pGroupAddr, ulGroupAddr);
          if (SUCCEEDED(retVal))
          {
-            // Get the interface address (net order)
+            // Get the interface address (native order)
              UINT32 ulInterfaceAddr = 0;
              retVal = HXSockUtil::GetIN4Address(pInterface, ulInterfaceAddr);
              if (SUCCEEDED(retVal))
              {
-                // If little-endian, we need to convert to native
-                if (!m_bBigEndian)
-                {
-                    ulGroupAddr     = CHXShimUtils::SwapUINT32(ulGroupAddr);
-                    ulInterfaceAddr = 
CHXShimUtils::SwapUINT32(ulInterfaceAddr);
-                }
                  retVal = m_pUDPSocket->JoinMulticastGroup(ulGroupAddr, 
ulInterfaceAddr);
              }
          }
@@ -588,12 +562,6 @@
              retVal = HXSockUtil::GetIN4Address(pInterface, ulInterfaceAddr);
              if (SUCCEEDED(retVal))
              {
-                // If little-endian, we need to convert to native
-                if (!m_bBigEndian)
-                {
-                    ulGroupAddr     = CHXShimUtils::SwapUINT32(ulGroupAddr);
-                    ulInterfaceAddr = 
CHXShimUtils::SwapUINT32(ulInterfaceAddr);
-                }
                  retVal = m_pUDPSocket->LeaveMulticastGroup(ulGroupAddr, 
ulInterfaceAddr);
              }
          }
@@ -825,13 +793,7 @@
              // Save the UDP read address and port
              m_ulUDPReadAddress = ulAddr;
              m_usUDPReadPort    = nPort;
-            // The address and port are in native byte order. If
-            // we are little-endian, then we need to swap them
-            if (!m_bBigEndian)
-            {
-                m_ulUDPReadAddress = 
CHXShimUtils::SwapUINT32(m_ulUDPReadAddress);
-                m_usUDPReadPort    = 
CHXShimUtils::SwapUINT16(m_usUDPReadPort);
-            }
+
              // Init the buffer offset
              m_ulLastReadOffset = 0;
              // Schedule a callback to send the HX_SOCK_EVENT_READ event
@@ -1102,11 +1064,16 @@
          retVal = CreateSockAddr(&pAddr);
          if (SUCCEEDED(retVal))
          {
-            // We saved the address and port from
-            // IHXUDPSocketResponse::ReadFrom() and have
-            // already converted them to net order. Now
-            // we need to set these into the address
-            HXSockUtil::SetAddr(pAddr, AF_INET, &m_ulUDPReadAddress, 
m_usUDPReadPort);
+            // Convert address and port from native to net order
+            UINT32 ulAddr = m_ulUDPReadAddress;
+            UINT16 usPort = m_usUDPReadPort;
+            if (!m_bBigEndian)
+            {
+                ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
+                usPort = CHXShimUtils::SwapUINT16(usPort);
+            }
+            // Set these into the address
+            HXSockUtil::SetAddrNetOrder(pAddr, AF_INET, &ulAddr, usPort);
              // Now read the buffer
              IHXBuffer* pBuffer = NULL;
              retVal = DoRead(&pBuffer, bPeek);


Index: win.pcf
===================================================================
RCS file: /cvsroot/client/common/netio/win.pcf,v
retrieving revision 1.9
diff -u -w -r1.9 win.pcf
--- win.pcf	19 Jul 2004 23:18:18 -0000	1.9
+++ win.pcf	7 Aug 2004 00:49:33 -0000
@@ -53,7 +53,8 @@

  project.AddSources("platform/win/hxnetif.cpp",
                     "platform/posix/chxresolver.cpp",
-                   "platform/posix/hxclientsockimp.cpp")
+                   "platform/posix/chxclientsocket.cpp",
+                   "platform/posix/chxclientnetservices.cpp")


  project.AddSources("platform/posix/shim_utils.cpp",




More information about the Common-dev mailing list
 

Site Map   |   Terms of Use   |   Privacy Policy   |   Contact Us

Copyright © 1995-2007 RealNetworks, Inc. All rights reserved. RealNetworks and Helix are trademarks of RealNetworks.
All other trademarks or registered trademarks are the property of their respective holders.