/* 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 #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 ) { FIXME( "(%d,%p,0x%08x,%p)\n", data->idPlayer, data->lpCaps, data->dwFlags, data->lpISP ); return DPERR_UNSUPPORTED; } 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; }