[PATCH 2/4] dpwsockx: Stub implementation

Ismael Barros razielmine at gmail.com
Mon Jul 20 10:52:50 CDT 2009


---
 dlls/dpwsockx/Makefile.in     |    5 +-
 dlls/dpwsockx/dpwsockx.c      |  226 +++++++++++++++++++++++++++++++++++++++++
 dlls/dpwsockx/dpwsockx.h      |   76 ++++++++++++++
 dlls/dpwsockx/dpwsockx_main.c |   21 ++++-
 4 files changed, 324 insertions(+), 4 deletions(-)
 create mode 100644 dlls/dpwsockx/dpwsockx.c
 create mode 100644 dlls/dpwsockx/dpwsockx.h

diff --git a/dlls/dpwsockx/Makefile.in b/dlls/dpwsockx/Makefile.in
index cebac28..bc56870 100644
--- a/dlls/dpwsockx/Makefile.in
+++ b/dlls/dpwsockx/Makefile.in
@@ -3,10 +3,11 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = dpwsockx.dll
-IMPORTS   = kernel32
+IMPORTS   = kernel32 ws2_32
 
 C_SRCS = \
-	dpwsockx_main.c
+	dpwsockx_main.c \
+	dpwsockx.c
 
 @MAKE_DLL_RULES@
 
diff --git a/dlls/dpwsockx/dpwsockx.c b/dlls/dpwsockx/dpwsockx.c
new file mode 100644
index 0000000..0a3deb1
--- /dev/null
+++ b/dlls/dpwsockx/dpwsockx.c
@@ -0,0 +1,226 @@
+/* Internet TCP/IP and IPX Connection For DirectPlay
+ *
+ * Copyright 2008 Ismael Barros Barros
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winsock2.h"
+#include "dpwsockx_dll.h"
+#include "wine/debug.h"
+#include "dplay.h"
+#include "wine/dplaysp.h"
+#include "dpwsockx.h"
+
+
+WINE_DEFAULT_DEBUG_CHANNEL(dplay);
+
+
+/* Callback functions */
+HRESULT WINAPI DPWSCB_EnumSessions( LPDPSP_ENUMSESSIONSDATA data );
+HRESULT WINAPI DPWSCB_Reply( LPDPSP_REPLYDATA data );
+HRESULT WINAPI DPWSCB_Send( LPDPSP_SENDDATA data );
+HRESULT WINAPI DPWSCB_CreatePlayer( LPDPSP_CREATEPLAYERDATA data );
+HRESULT WINAPI DPWSCB_DeletePlayer( LPDPSP_DELETEPLAYERDATA data );
+HRESULT WINAPI DPWSCB_GetAddress( LPDPSP_GETADDRESSDATA data );
+HRESULT WINAPI DPWSCB_GetCaps( LPDPSP_GETCAPSDATA data );
+HRESULT WINAPI DPWSCB_Open( LPDPSP_OPENDATA data );
+HRESULT WINAPI DPWSCB_CloseEx( LPDPSP_CLOSEDATA data );
+HRESULT WINAPI DPWSCB_ShutdownEx( LPDPSP_SHUTDOWNDATA data );
+HRESULT WINAPI DPWSCB_GetAddressChoices( LPDPSP_GETADDRESSCHOICESDATA data );
+HRESULT WINAPI DPWSCB_SendEx( LPDPSP_SENDEXDATA data );
+HRESULT WINAPI DPWSCB_SendToGroupEx( LPDPSP_SENDTOGROUPEXDATA data );
+HRESULT WINAPI DPWSCB_Cancel( LPDPSP_CANCELDATA data );
+HRESULT WINAPI DPWSCB_GetMessageQueue( LPDPSP_GETMESSAGEQUEUEDATA data );
+
+
+void DPWS_SetupCallbacks( LPDPSP_SPCALLBACKS lpCB )
+{
+    lpCB->EnumSessions           = DPWSCB_EnumSessions;
+    lpCB->Reply                  = DPWSCB_Reply;
+    lpCB->Send                   = DPWSCB_Send;
+    lpCB->CreatePlayer           = DPWSCB_CreatePlayer;
+    lpCB->DeletePlayer           = DPWSCB_DeletePlayer;
+    lpCB->GetAddress             = DPWSCB_GetAddress;
+    lpCB->GetCaps                = DPWSCB_GetCaps;
+    lpCB->Open                   = DPWSCB_Open;
+    lpCB->CloseEx                = DPWSCB_CloseEx;
+    lpCB->ShutdownEx             = DPWSCB_ShutdownEx;
+    lpCB->GetAddressChoices      = DPWSCB_GetAddressChoices;
+    lpCB->SendEx                 = DPWSCB_SendEx;
+    lpCB->SendToGroupEx          = DPWSCB_SendToGroupEx;
+    lpCB->Cancel                 = DPWSCB_Cancel;
+    lpCB->GetMessageQueue        = DPWSCB_GetMessageQueue;
+
+    lpCB->AddPlayerToGroup       = NULL;
+    lpCB->Close                  = NULL;
+    lpCB->CreateGroup            = NULL;
+    lpCB->DeleteGroup            = NULL;
+    lpCB->RemovePlayerFromGroup  = NULL;
+    lpCB->SendToGroup            = NULL;
+    lpCB->Shutdown               = NULL;
+}
+
+HRESULT WINAPI DPWSCB_EnumSessions( LPDPSP_ENUMSESSIONSDATA data )
+{
+    FIXME( "(%p,%d,%p,%u) stub\n",
+           data->lpMessage, data->dwMessageSize,
+           data->lpISP, data->bReturnStatus );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_Reply( LPDPSP_REPLYDATA data )
+{
+    FIXME( "(%p,%p,%d,%d,%p) stub\n",
+           data->lpSPMessageHeader, data->lpMessage, data->dwMessageSize,
+           data->idNameServer, data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_Send( LPDPSP_SENDDATA data )
+{
+    FIXME( "(0x%08x,%d,%d,%p,%d,%u,%p) stub\n",
+           data->dwFlags, data->idPlayerTo, data->idPlayerFrom,
+           data->lpMessage, data->dwMessageSize,
+           data->bSystemMessage, data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_CreatePlayer( LPDPSP_CREATEPLAYERDATA data )
+{
+    FIXME( "(%d,0x%08x,%p,%p) stub\n",
+           data->idPlayer, data->dwFlags,
+           data->lpSPMessageHeader, data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_DeletePlayer( LPDPSP_DELETEPLAYERDATA data )
+{
+    FIXME( "(%d,0x%08x,%p) stub\n",
+           data->idPlayer, data->dwFlags, data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_GetAddress( LPDPSP_GETADDRESSDATA data )
+{
+    FIXME( "(%d,0x%08x,%p,%p,%p) stub\n",
+           data->idPlayer, data->dwFlags, data->lpAddress,
+           data->lpdwAddressSize, data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_GetCaps( LPDPSP_GETCAPSDATA data )
+{
+    TRACE( "(%d,%p,0x%08x,%p)\n",
+           data->idPlayer, data->lpCaps, data->dwFlags, data->lpISP );
+
+    /* TODO: Find out how to calculate all theese values.
+     *       For now I'm copying the values the original implementation
+     *       throws in the tests.
+     */
+
+    data->lpCaps->dwFlags = ( DPCAPS_ASYNCSUPPORTED |
+                              DPCAPS_GUARANTEEDOPTIMIZED |
+                              DPCAPS_GUARANTEEDSUPPORTED );
+    data->lpCaps->dwMaxQueueSize      = 0;
+    data->lpCaps->dwHundredBaud       = 0;
+    data->lpCaps->dwLatency           = 500;
+    data->lpCaps->dwMaxLocalPlayers   = 65536;
+    data->lpCaps->dwHeaderLength      = sizeof(DPSP_MSG_HEADER);
+    data->lpCaps->dwTimeout           = 5000;
+
+    if ( data->dwFlags & DPGETCAPS_GUARANTEED )
+    {
+        data->lpCaps->dwMaxBufferSize = 1048547;
+        data->lpCaps->dwMaxPlayers    = 64;
+    }
+    else
+    {
+        data->lpCaps->dwMaxBufferSize = 65479;
+        data->lpCaps->dwMaxPlayers    = data->lpCaps->dwMaxLocalPlayers;
+    }
+
+    return DP_OK;
+}
+
+HRESULT WINAPI DPWSCB_Open( LPDPSP_OPENDATA data )
+{
+    FIXME( "(%u,%p,%p,%u,0x%08x,0x%08x) stub\n",
+           data->bCreate, data->lpSPMessageHeader, data->lpISP,
+           data->bReturnStatus, data->dwOpenFlags, data->dwSessionFlags );
+    return DP_OK;
+}
+
+HRESULT WINAPI DPWSCB_CloseEx( LPDPSP_CLOSEDATA data )
+{
+    FIXME( "(%p) stub\n", data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_ShutdownEx( LPDPSP_SHUTDOWNDATA data )
+{
+    FIXME( "(%p) stub\n", data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_GetAddressChoices( LPDPSP_GETADDRESSCHOICESDATA data )
+{
+    FIXME( "(%p,%p,%p) stub\n",
+           data->lpAddress, data->lpdwAddressSize, data->lpISP );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_SendEx( LPDPSP_SENDEXDATA data )
+{
+    FIXME( "(%p,0x%08x,%d,%d,%p,%d,%d,%d,%d,%p,%p,%u) stub\n",
+           data->lpISP, data->dwFlags, data->idPlayerTo, data->idPlayerFrom,
+           data->lpSendBuffers, data->cBuffers, data->dwMessageSize,
+           data->dwPriority, data->dwTimeout, data->lpDPContext,
+           data->lpdwSPMsgID, data->bSystemMessage );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_SendToGroupEx( LPDPSP_SENDTOGROUPEXDATA data )
+{
+    FIXME( "(%p,0x%08x,%d,%d,%p,%d,%d,%d,%d,%p,%p) stub\n",
+           data->lpISP, data->dwFlags, data->idGroupTo, data->idPlayerFrom,
+           data->lpSendBuffers, data->cBuffers, data->dwMessageSize,
+           data->dwPriority, data->dwTimeout, data->lpDPContext,
+           data->lpdwSPMsgID );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_Cancel( LPDPSP_CANCELDATA data )
+{
+    FIXME( "(%p,0x%08x,%p,%d,0x%08x,0x%08x) stub\n",
+           data->lpISP, data->dwFlags, data->lprglpvSPMsgID, data->cSPMsgID,
+           data->dwMinPriority, data->dwMaxPriority );
+    return DPERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI DPWSCB_GetMessageQueue( LPDPSP_GETMESSAGEQUEUEDATA data )
+{
+    FIXME( "(%p,0x%08x,%d,%d,%p,%p) stub\n",
+           data->lpISP, data->dwFlags, data->idFrom, data->idTo,
+           data->lpdwNumMsgs, data->lpdwNumBytes );
+    return DPERR_UNSUPPORTED;
+}
diff --git a/dlls/dpwsockx/dpwsockx.h b/dlls/dpwsockx/dpwsockx.h
new file mode 100644
index 0000000..d9a041a
--- /dev/null
+++ b/dlls/dpwsockx/dpwsockx.h
@@ -0,0 +1,76 @@
+/* Internet TCP/IP and IPX Connection For DirectPlay
+ *
+ * Copyright 2008 Ismael Barros Barros
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_DPWSOCKX_H
+#define __WINE_DPWSOCKX_H
+
+#include "windef.h"
+#include "winbase.h"
+#include "dpwsockx_dll.h"
+#include "wine/debug.h"
+#include "dplay.h"
+#include "wine/dplaysp.h"
+
+
+
+#define DPWS_PORT_RANGE_START 2300
+#define DPWS_PORT_RANGE_END   2400
+#define DPWS_DPLAYSRV_PORT    47624
+
+
+typedef struct tagDPWS_THREADDATA
+{
+    BOOL            isRunning;
+    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;
+
+typedef struct tagDPWS_PLAYER_DATA
+{
+    SOCKADDR_IN  tcpAddr;
+    SOCKADDR_IN  udpAddr;
+} DPWS_PLAYER_DATA, *LPDPWS_PLAYER_DATA;
+
+typedef struct tagDPSP_MSG_HEADER
+{
+    DWORD        size; /* size & 0x000FFFF, token & 0xFFF00000 */
+    SOCKADDR_IN  SockAddr;
+} DPSP_MSG_HEADER, *LPDPSP_MSG_HEADER;
+typedef const DPSP_MSG_HEADER* LPCDPSP_MSG_HEADER;
+
+/* DPSP_MSG_HEADER->token */
+#define DPSP_MSG_TOKEN_REMOTE     0xFAB00000
+#define DPSP_MSG_TOKEN_FORWARDED  0xCAB00000
+#define DPSP_MSG_TOKEN_SERVER     0xBAB00000
+
+void DPWS_SetupCallbacks( LPDPSP_SPCALLBACKS lpCB );
+
+
+
+#endif	/* __WINE_DPWSOCKX_H */
diff --git a/dlls/dpwsockx/dpwsockx_main.c b/dlls/dpwsockx/dpwsockx_main.c
index 271915a..f95cfcc 100644
--- a/dlls/dpwsockx/dpwsockx_main.c
+++ b/dlls/dpwsockx/dpwsockx_main.c
@@ -21,12 +21,15 @@
 
 #include <stdarg.h>
 
+#define INITGUID
 #include "windef.h"
 #include "winbase.h"
+#include "winsock2.h"
 #include "dpwsockx_dll.h"
 #include "wine/debug.h"
 #include "dplay.h"
 #include "wine/dplaysp.h"
+#include "dpwsockx.h"
 
 
 WINE_DEFAULT_DEBUG_CHANNEL(dplay);
@@ -58,6 +61,20 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  */
 HRESULT WINAPI SPInit( LPSPINITDATA lpspData )
 {
-    /* TODO: Initialize callbacks and needed fields in lpspData */
-    return DPERR_UNSUPPORTED;
+    TRACE( "Initializing library for %s (%s)\n",
+           wine_dbgstr_guid(lpspData->lpGuid), debugstr_w(lpspData->lpszName) );
+
+    if ( !IsEqualGUID(lpspData->lpGuid, &DPSPGUID_TCPIP) )
+    {
+        /* We only support TCP/IP service */
+        return DPERR_UNAVAILABLE;
+    }
+
+    DPWS_SetupCallbacks( lpspData->lpCB );
+
+    /* TODO:
+       The original implementation calls SetSPData,
+       check what it really stores */
+
+    return DP_OK;
 }
-- 
1.6.3.3




More information about the wine-patches mailing list