[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