| /* 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; |
| } |