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