Ismael Barros : dpwsockx: Implementation of SPInit.

Alexandre Julliard julliard at winehq.org
Fri Sep 11 10:53:17 CDT 2009


Module: wine
Branch: master
Commit: 5a9ecdef436510e7e4b31099ba50f792a4917f8b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5a9ecdef436510e7e4b31099ba50f792a4917f8b

Author: Ismael Barros <razielmine at gmail.com>
Date:   Thu Sep 10 20:06:02 2009 +0200

dpwsockx: Implementation of SPInit.

---

 dlls/dpwsockx/Makefile.in     |    2 +-
 dlls/dpwsockx/dpwsockx_dll.h  |   68 +++++++++++++++++++++++++++++++++++++++++
 dlls/dpwsockx/dpwsockx_main.c |   20 ++++++++++++
 3 files changed, 89 insertions(+), 1 deletions(-)

diff --git a/dlls/dpwsockx/Makefile.in b/dlls/dpwsockx/Makefile.in
index c2c5f8c..bb02089 100644
--- a/dlls/dpwsockx/Makefile.in
+++ b/dlls/dpwsockx/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = dpwsockx.dll
-IMPORTS   = dxguid kernel32
+IMPORTS   = dxguid kernel32 ws2_32
 
 C_SRCS = \
 	dpwsockx_main.c
diff --git a/dlls/dpwsockx/dpwsockx_dll.h b/dlls/dpwsockx/dpwsockx_dll.h
index 08ae11c..a9454da 100644
--- a/dlls/dpwsockx/dpwsockx_dll.h
+++ b/dlls/dpwsockx/dpwsockx_dll.h
@@ -21,10 +21,78 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "winsock2.h"
 #include "winnt.h"
 #include "wine/dplaysp.h"
 
 
+typedef struct tagDPWS_THREADDATA
+{
+    BOOL           is_running;
+    SOCKET         sock;
+    SOCKADDR_IN    addr;
+    HANDLE         handle;
+    LPDIRECTPLAYSP lpISP;
+} DPWS_THREADDATA, *LPDPWS_THREADDATA;
+
+typedef struct tagDPWS_DATA
+{
+    SOCKET          sock;
+    DPWS_THREADDATA tcp_listener, udp_listener, dplaysrv;
+    SOCKADDR_IN     nameserverAddr;
+    LPDIRECTPLAYSP  lpISP;
+} DPWS_DATA, *LPDPWS_DATA;
+
+
+
+#ifdef WORDS_BIGENDIAN
+
+static inline u_short __dpws_ushort_swap(u_short s)
+{
+    return (s >> 8) | (s << 8);
+}
+static inline u_long __dpws_ulong_swap(u_long l)
+{
+    return ((u_long)__dpws_ushort_swap((u_short)l) << 16) | __dpws_ushort_swap((u_short)(l >> 16));
+}
+
+#define dpws_letohl(l) __dpws_ulong_swap(l)
+#define dpws_letohs(s) __dpws_ushort_swap(s)
+#define dpws_htolel(l) __dpws_ulong_swap(l)
+#define dpws_htoles(s) __dpws_ushort_swap(s)
+
+#else /* WORDS_BIGENDIAN */
+
+#define dpws_letohl(l) ((u_long)(l))
+#define dpws_letohs(s) ((u_short)(s))
+#define dpws_htolel(l) ((u_long)(l))
+#define dpws_htoles(s) ((u_short)(s))
+
+#endif /* WORDS_BIGENDIAN */
+
+
+#include "pshpack1.h"
+
+typedef struct tagDPSP_MSG_HEADER
+{
+    DWORD       mixed;
+    SOCKADDR_IN SockAddr;
+} DPSP_MSG_HEADER, *LPDPSP_MSG_HEADER;
+typedef const DPSP_MSG_HEADER* LPCDPSP_MSG_HEADER;
+
+#include "poppack.h"
+
+
+#define DPSP_MSG_TOKEN_REMOTE    0xFAB00000
+#define DPSP_MSG_TOKEN_FORWARDED 0xCAB00000
+#define DPSP_MSG_TOKEN_SERVER    0xBAB00000
+
+#define DPSP_MSG_MAKE_MIXED(s,t) dpws_htolel((s) | (t))
+#define DPSP_MSG_SIZE(m)         (dpws_letohl(m) & 0x000FFFFF)
+#define DPSP_MSG_TOKEN(m)        (dpws_letohl(m) & 0xFFF00000)
+
+
+
 HRESULT WINAPI SPInit( LPSPINITDATA );
 
 #endif	/* __WINE_DPWSOCKX_DLL_H */
diff --git a/dlls/dpwsockx/dpwsockx_main.c b/dlls/dpwsockx/dpwsockx_main.c
index e8fe902..ff6f5b5 100644
--- a/dlls/dpwsockx/dpwsockx_main.c
+++ b/dlls/dpwsockx/dpwsockx_main.c
@@ -23,6 +23,7 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "winsock2.h"
 #include "dpwsockx_dll.h"
 #include "wine/debug.h"
 #include "dplay.h"
@@ -205,6 +206,9 @@ static void setup_callbacks( LPDPSP_SPCALLBACKS lpCB )
  */
 HRESULT WINAPI SPInit( LPSPINITDATA lpspData )
 {
+    WSADATA wsaData;
+    DPWS_DATA dpwsData;
+
     TRACE( "Initializing library for %s (%s)\n",
            wine_dbgstr_guid(lpspData->lpGuid), debugstr_w(lpspData->lpszName) );
 
@@ -217,5 +221,21 @@ HRESULT WINAPI SPInit( LPSPINITDATA lpspData )
     /* Assign callback functions */
     setup_callbacks( lpspData->lpCB );
 
+    /* Load Winsock 2.0 DLL */
+    if ( WSAStartup( MAKEWORD(2, 0), &wsaData ) != 0 )
+    {
+        ERR( "WSAStartup() failed\n" );
+        return DPERR_UNAVAILABLE;
+    }
+
+    /* Initialize internal data */
+    memset( &dpwsData, 0, sizeof(DPWS_DATA) );
+    dpwsData.lpISP = lpspData->lpISP;
+    IDirectPlaySP_SetSPData( lpspData->lpISP, &dpwsData, sizeof(DPWS_DATA),
+                             DPSET_LOCAL );
+
+    /* dplay needs to know the size of the header */
+    lpspData->dwSPHeaderSize = sizeof(DPSP_MSG_HEADER);
+
     return DP_OK;
 }




More information about the wine-cvs mailing list