| /* 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" | |
| WINE_DEFAULT_DEBUG_CHANNEL(dplay); | |
| BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) | |
| { | |
| TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); | |
| switch (fdwReason) | |
| { | |
| case DLL_WINE_PREATTACH: | |
| return FALSE; /* prefer native version */ | |
| case DLL_PROCESS_ATTACH: | |
| /* TODO: Initialization */ | |
| DisableThreadLibraryCalls(hinstDLL); | |
| break; | |
| } | |
| return TRUE; | |
| } | |
| static 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; | |
| } | |
| static 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; | |
| } | |
| static 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; | |
| } | |
| static 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; | |
| } | |
| static HRESULT WINAPI DPWSCB_DeletePlayer( LPDPSP_DELETEPLAYERDATA data ) | |
| { | |
| FIXME( "(%d,0x%08x,%p) stub\n", | |
| data->idPlayer, data->dwFlags, data->lpISP ); | |
| return DPERR_UNSUPPORTED; | |
| } | |
| static 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; | |
| } | |
| static HRESULT WINAPI DPWSCB_GetCaps( LPDPSP_GETCAPSDATA data ) | |
| { | |
| TRACE( "(%d,%p,0x%08x,%p)\n", | |
| data->idPlayer, data->lpCaps, data->dwFlags, data->lpISP ); | |
| data->lpCaps->dwFlags = ( DPCAPS_ASYNCSUPPORTED | | |
| DPCAPS_GUARANTEEDOPTIMIZED | | |
| DPCAPS_GUARANTEEDSUPPORTED ); | |
| data->lpCaps->dwMaxQueueSize = DPWS_MAXQUEUESIZE; | |
| data->lpCaps->dwHundredBaud = DPWS_HUNDREDBAUD; | |
| data->lpCaps->dwLatency = DPWS_LATENCY; | |
| data->lpCaps->dwMaxLocalPlayers = DPWS_MAXLOCALPLAYERS; | |
| data->lpCaps->dwHeaderLength = sizeof(DPSP_MSG_HEADER); | |
| data->lpCaps->dwTimeout = DPWS_TIMEOUT; | |
| if ( data->dwFlags & DPGETCAPS_GUARANTEED ) | |
| { | |
| data->lpCaps->dwMaxBufferSize = DPWS_GUARANTEED_MAXBUFFERSIZE; | |
| data->lpCaps->dwMaxPlayers = DPWS_GUARANTEED_MAXPLAYERS; | |
| } | |
| else | |
| { | |
| data->lpCaps->dwMaxBufferSize = DPWS_MAXBUFFERSIZE; | |
| data->lpCaps->dwMaxPlayers = DPWS_MAXPLAYERS; | |
| } | |
| return DP_OK; | |
| } | |
| static 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 DPERR_UNSUPPORTED; | |
| } | |
| static HRESULT WINAPI DPWSCB_CloseEx( LPDPSP_CLOSEDATA data ) | |
| { | |
| FIXME( "(%p) stub\n", data->lpISP ); | |
| return DPERR_UNSUPPORTED; | |
| } | |
| static HRESULT WINAPI DPWSCB_ShutdownEx( LPDPSP_SHUTDOWNDATA data ) | |
| { | |
| FIXME( "(%p) stub\n", data->lpISP ); | |
| return DPERR_UNSUPPORTED; | |
| } | |
| static HRESULT WINAPI DPWSCB_GetAddressChoices( LPDPSP_GETADDRESSCHOICESDATA data ) | |
| { | |
| FIXME( "(%p,%p,%p) stub\n", | |
| data->lpAddress, data->lpdwAddressSize, data->lpISP ); | |
| return DPERR_UNSUPPORTED; | |
| } | |
| static 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; | |
| } | |
| static 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; | |
| } | |
| static 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; | |
| } | |
| static 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; | |
| } | |
| static void setup_callbacks( 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; | |
| } | |
| /****************************************************************** | |
| * SPInit (DPWSOCKX.1) | |
| */ | |
| 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) ); | |
| /* We only support TCP/IP service */ | |
| if ( !IsEqualGUID(lpspData->lpGuid, &DPSPGUID_TCPIP) ) | |
| { | |
| return DPERR_UNAVAILABLE; | |
| } | |
| /* 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; | |
| } |