/* * Copyright 2000 Peter Hunnisett * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __WINE_DIRECT_PLAY_SP_H #define __WINE_DIRECT_PLAY_SP_H #include #include "windef.h" #include "winbase.h" #include "winuser.h" #include "dplay.h" #include "dplobby.h" /* GUID for IDirectPlaySP {0C9F6360-CC61-11cf-ACEC-00AA006886E3} */ DEFINE_GUID(IID_IDirectPlaySP, 0xc9f6360, 0xcc61, 0x11cf, 0xac, 0xec, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3); typedef struct IDirectPlaySP IDirectPlaySP, *LPDIRECTPLAYSP; typedef BOOL (CALLBACK *LPENUMMRUCALLBACK)( LPCVOID lpData, DWORD dwDataSize, LPVOID lpContext ); /* For SP. Top 16 bits is dplay, bottom 16 is SP */ #define DPSP_MAJORVERSION 0x00060000 #define DPSP_DX5VERSION 0x00050000 #define DPSP_DX3VERSION 0x00040000 #define DPSP_MAJORVERSIONMASK 0xFFFF0000 #define DPSP_MINORVERSIONMASK 0x0000FFFF /* Some flags */ #define DPLAYI_PLAYER_SYSPLAYER 0x00000001 #define DPLAYI_PLAYER_NAMESRVR 0x00000002 #define DPLAYI_PLAYER_PLAYERINGROUP 0x00000004 #define DPLAYI_PLAYER_PLAYERLOCAL 0x00000008 #define DPLAYI_GROUP_SYSGROUP 0x00000020 #define DPLAYI_GROUP_DPLAYOWNS 0x00000040 #define DPLAYI_PLAYER_APPSERVER 0x00000080 #define DPLAYI_GROUP_HIDDEN 0x00000400 /* Define the COM interface */ #define INTERFACE IDirectPlaySP #define IDirectPlaySP_METHODS \ IUnknown_METHODS \ STDMETHOD(AddMRUEntry)(THIS_ LPCWSTR lpSection, LPCWSTR lpKey, LPCVOID lpData, DWORD dwDataSize, DWORD dwMaxEntries ) PURE; \ STDMETHOD(CreateAddress)(THIS_ REFGUID guidSP, REFGUID guidDataType, LPCVOID lpData, DWORD dwDataSize, LPVOID lpAddress,LPDWORD lpdwAddressSize) PURE; \ STDMETHOD(EnumAddress)(THIS_ LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, LPCVOID lpAddress, DWORD dwAddressSize, LPVOID lpContext ) PURE; \ STDMETHOD(EnumMRUEntries)(THIS_ LPCWSTR lpSection, LPCWSTR lpKey, LPENUMMRUCALLBACK lpEnumMRUCallback, LPVOID lpContext ) PURE; \ STDMETHOD(GetPlayerFlags)(THIS_ DPID idPlayer, LPDWORD lpdwPlayerFlags ) PURE; \ STDMETHOD(GetSPPlayerData)(THIS_ DPID idPlayer, LPVOID *lplpData, LPDWORD lpdwDataSize, DWORD dwFlags ) PURE; \ STDMETHOD(HandleMessage)(THIS_ LPVOID lpMessageBody, DWORD dwMessageBodySize, LPVOID lpMessageHeader ) PURE; \ STDMETHOD(SetSPPlayerData)(THIS_ DPID idPlayer, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags ) PURE; \ STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT lpElements, DWORD dwElementCount, LPVOID lpAddress, LPDWORD lpdwAddressSize ) PURE; \ STDMETHOD(GetSPData)(THIS_ LPVOID *lplpData, LPDWORD dwDataSize, DWORD dwFlags ) PURE; \ STDMETHOD(SetSPData)(THIS_ LPVOID lpData, DWORD dwDataSize, DWORD dwFlags ) PURE; \ STDMETHOD_(VOID,SendComplete)(THIS_ LPVOID , DWORD ) PURE; DECLARE_INTERFACE_(IDirectPlaySP,IUnknown) { IDirectPlaySP_METHODS }; #undef INTERFACE /* NOTE: The microsoft provided header file doesn't have these access * functions */ #if !defined (__cplusplus) || defined(CINTERFACE) /*** IUnknown methods ***/ #define IDirectPlaySP_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirectPlaySP_AddRef(p) (p)->lpVtbl->AddRef(p) #define IDirectPlaySP_Release(p) (p)->lpVtbl->Release(p) /*** IDirectPlaySP methods ***/ #define IDirectPlaySP_AddMRUEntry(p,a,b,c,d,e) (p)->lpVtbl->AddMRUEntry(p,a,b,c,d,e) #define IDirectPlaySP_CreateAddress(p,a,b,c,d,e,f) (p)->lpVtbl->CreateAddress(p,a,b,c,d,e,f) #define IDirectPlaySP_EnumAddress(p,a,b,c,d) (p)->lpVtbl->EnumAddress(p,a,b,c,d) #define IDirectPlaySP_EnumMRUEntries(p,a,b,c,d) (p)->lpVtbl->EnumMRUEntries(p,a,b,c,d) #define IDirectPlaySP_GetPlayerFlags(p,a,b) (p)->lpVtbl->GetPlayerFlags(p,a,b) #define IDirectPlaySP_GetSPPlayerData(p,a,b,c,d) (p)->lpVtbl->GetSPPlayerData(p,a,b,c,d) #define IDirectPlaySP_HandleMessage(p,a,b,c) (p)->lpVtbl->HandleMessage(p,a,b,c) #define IDirectPlaySP_SetSPPlayerData(p,a,b,c,d) (p)->lpVtbl->SetSPPlayerData(p,a,b,c,d) #define IDirectPlaySP_CreateCompoundAddress(p,a,b,c,d) (p)->lpVtbl->CreateCompoundAddress(p,a,b,c,d) #define IDirectPlaySP_GetSPData(p,a,b,c) (p)->lpVtbl->GetSPData(p,a,b,c) #define IDirectPlaySP_SetSPData(p,a,b,c) (p)->lpVtbl->SetSPData(p,a,b,c) #define IDirectPlaySP_SendComplete(p,a,b) (p)->lpVtbl->SendComplete(p,a,b) #endif /* SP Callback stuff */ typedef struct tagDPSP_ADDPLAYERTOGROUPDATA { DPID idPlayer; DPID idGroup; IDirectPlaySP* lpISP; } DPSP_ADDPLAYERTOGROUPDATA, *LPDPSP_ADDPLAYERTOGROUPDATA; typedef struct tagDPSP_CLOSEDATA { IDirectPlaySP* lpISP; } DPSP_CLOSEDATA, *LPDPSP_CLOSEDATA; typedef struct tagDPSP_CREATEGROUPDATA { DPID idGroup; DWORD dwFlags; LPVOID lpSPMessageHeader; IDirectPlaySP* lpISP; } DPSP_CREATEGROUPDATA, *LPDPSP_CREATEGROUPDATA; typedef struct tagDPSP_CREATEPLAYERDATA { DPID idPlayer; DWORD dwFlags; LPVOID lpSPMessageHeader; IDirectPlaySP* lpISP; } DPSP_CREATEPLAYERDATA, *LPDPSP_CREATEPLAYERDATA; typedef struct tagDPSP_DELETEGROUPDATA { DPID idGroup; DWORD dwFlags; IDirectPlaySP* lpISP; } DPSP_DELETEGROUPDATA, *LPDPSP_DELETEGROUPDATA; typedef struct tagDPSP_DELETEPLAYERDATA { DPID idPlayer; DWORD dwFlags; IDirectPlaySP* lpISP; } DPSP_DELETEPLAYERDATA, *LPDPSP_DELETEPLAYERDATA; typedef struct tagDPSP_ENUMSESSIONSDATA { LPVOID lpMessage; DWORD dwMessageSize; IDirectPlaySP* lpISP; BOOL bReturnStatus; } DPSP_ENUMSESSIONSDATA, *LPDPSP_ENUMSESSIONSDATA; typedef struct _DPSP_GETADDRESSDATA { DPID idPlayer; DWORD dwFlags; LPDPADDRESS lpAddress; LPDWORD lpdwAddressSize; IDirectPlaySP* lpISP; } DPSP_GETADDRESSDATA, *LPDPSP_GETADDRESSDATA; typedef struct tagDPSP_GETADDRESSCHOICESDATA { LPDPADDRESS lpAddress; LPDWORD lpdwAddressSize; IDirectPlaySP* lpISP; } DPSP_GETADDRESSCHOICESDATA, *LPDPSP_GETADDRESSCHOICESDATA; typedef struct tagDPSP_GETCAPSDATA { DPID idPlayer; LPDPCAPS lpCaps; DWORD dwFlags; IDirectPlaySP* lpISP; } DPSP_GETCAPSDATA, *LPDPSP_GETCAPSDATA; typedef struct tagDPSP_OPENDATA { BOOL bCreate; LPVOID lpSPMessageHeader; IDirectPlaySP* lpISP; BOOL bReturnStatus; DWORD dwOpenFlags; DWORD dwSessionFlags; } DPSP_OPENDATA, *LPDPSP_OPENDATA; typedef struct tagDPSP_REMOVEPLAYERFROMGROUPDATA { DPID idPlayer; DPID idGroup; IDirectPlaySP* lpISP; } DPSP_REMOVEPLAYERFROMGROUPDATA, *LPDPSP_REMOVEPLAYERFROMGROUPDATA; typedef struct tagDPSP_REPLYDATA { LPVOID lpSPMessageHeader; LPVOID lpMessage; DWORD dwMessageSize; DPID idNameServer; IDirectPlaySP* lpISP; } DPSP_REPLYDATA, *LPDPSP_REPLYDATA; typedef struct tagDPSP_SENDDATA { DWORD dwFlags; DPID idPlayerTo; DPID idPlayerFrom; LPVOID lpMessage; DWORD dwMessageSize; BOOL bSystemMessage; IDirectPlaySP* lpISP; } DPSP_SENDDATA, *LPDPSP_SENDDATA; typedef struct tagDPSP_SENDTOGROUPDATA { DWORD dwFlags; DPID idGroupTo; DPID idPlayerFrom; LPVOID lpMessage; DWORD dwMessageSize; IDirectPlaySP* lpISP; } DPSP_SENDTOGROUPDATA, *LPDPSP_SENDTOGROUPDATA; typedef struct tagDPSP_SENDEXDATA { IDirectPlaySP* lpISP; DWORD dwFlags; DPID idPlayerTo; DPID idPlayerFrom; LPSGBUFFER lpSendBuffers; DWORD cBuffers; DWORD dwMessageSize; DWORD dwPriority; DWORD dwTimeout; LPVOID lpDPContext; LPDWORD lpdwSPMsgID; BOOL bSystemMessage; } DPSP_SENDEXDATA, *LPDPSP_SENDEXDATA; typedef struct tagDPSP_SENDTOGROUPEXDATA { IDirectPlaySP* lpISP; DWORD dwFlags; DPID idGroupTo; DPID idPlayerFrom; LPSGBUFFER lpSendBuffers; DWORD cBuffers; DWORD dwMessageSize; DWORD dwPriority; DWORD dwTimeout; LPVOID lpDPContext; LPDWORD lpdwSPMsgID; } DPSP_SENDTOGROUPEXDATA, *LPDPSP_SENDTOGROUPEXDATA; typedef struct tagDPSP_GETMESSAGEQUEUEDATA { IDirectPlaySP* lpISP; DWORD dwFlags; DPID idFrom; DPID idTo; LPDWORD lpdwNumMsgs; LPDWORD lpdwNumBytes; } DPSP_GETMESSAGEQUEUEDATA, *LPDPSP_GETMESSAGEQUEUEDATA; #define DPCANCELSEND_PRIORITY 0x00000001 #define DPCANCELSEND_ALL 0x00000002 typedef struct tagDPSP_CANCELDATA { IDirectPlaySP* lpISP; DWORD dwFlags; LPRGLPVOID lprglpvSPMsgID; DWORD cSPMsgID; DWORD dwMinPriority; DWORD dwMaxPriority; } DPSP_CANCELDATA, *LPDPSP_CANCELDATA; typedef struct tagDPSP_SHUTDOWNDATA { IDirectPlaySP* lpISP; } DPSP_SHUTDOWNDATA, *LPDPSP_SHUTDOWNDATA; /* Prototypes returned by SPInit */ typedef HRESULT (WINAPI *LPDPSP_CREATEPLAYER)(LPDPSP_CREATEPLAYERDATA); typedef HRESULT (WINAPI *LPDPSP_DELETEPLAYER)(LPDPSP_DELETEPLAYERDATA); typedef HRESULT (WINAPI *LPDPSP_SEND)(LPDPSP_SENDDATA); typedef HRESULT (WINAPI *LPDPSP_ENUMSESSIONS)(LPDPSP_ENUMSESSIONSDATA); typedef HRESULT (WINAPI *LPDPSP_REPLY)(LPDPSP_REPLYDATA); typedef HRESULT (WINAPI *LPDPSP_SHUTDOWN)(void); typedef HRESULT (WINAPI *LPDPSP_CREATEGROUP)(LPDPSP_CREATEGROUPDATA); typedef HRESULT (WINAPI *LPDPSP_DELETEGROUP)(LPDPSP_DELETEGROUPDATA); typedef HRESULT (WINAPI *LPDPSP_ADDPLAYERTOGROUP)(LPDPSP_ADDPLAYERTOGROUPDATA); typedef HRESULT (WINAPI *LPDPSP_REMOVEPLAYERFROMGROUP)(LPDPSP_REMOVEPLAYERFROMGROUPDATA); typedef HRESULT (WINAPI *LPDPSP_GETCAPS)(LPDPSP_GETCAPSDATA); typedef HRESULT (WINAPI *LPDPSP_GETADDRESS)(LPDPSP_GETADDRESSDATA); typedef HRESULT (WINAPI *LPDPSP_GETADDRESSCHOICES)(LPDPSP_GETADDRESSCHOICESDATA); typedef HRESULT (WINAPI *LPDPSP_OPEN)(LPDPSP_OPENDATA); typedef HRESULT (WINAPI *LPDPSP_CLOSE)(void); typedef HRESULT (WINAPI *LPDPSP_SENDTOGROUP)(LPDPSP_SENDTOGROUPDATA); typedef HRESULT (WINAPI *LPDPSP_SHUTDOWNEX)(LPDPSP_SHUTDOWNDATA); typedef HRESULT (WINAPI *LPDPSP_CLOSEEX)(LPDPSP_CLOSEDATA); typedef HRESULT (WINAPI *LPDPSP_SENDEX)(LPDPSP_SENDEXDATA); typedef HRESULT (WINAPI *LPDPSP_SENDTOGROUPEX)(LPDPSP_SENDTOGROUPEXDATA); typedef HRESULT (WINAPI *LPDPSP_CANCEL)(LPDPSP_CANCELDATA); typedef HRESULT (WINAPI *LPDPSP_GETMESSAGEQUEUE)(LPDPSP_GETMESSAGEQUEUEDATA); typedef struct tagDPSP_SPCALLBACKS { DWORD dwSize; DWORD dwVersion; LPDPSP_ENUMSESSIONS EnumSessions; /* Must be provided */ LPDPSP_REPLY Reply; /* Must be provided */ LPDPSP_SEND Send; /* Must be provided */ LPDPSP_ADDPLAYERTOGROUP AddPlayerToGroup; /* Optional */ LPDPSP_CLOSE Close; /* Optional */ LPDPSP_CREATEGROUP CreateGroup; /* Optional */ LPDPSP_CREATEPLAYER CreatePlayer; /* Optional */ LPDPSP_DELETEGROUP DeleteGroup; /* Optional */ LPDPSP_DELETEPLAYER DeletePlayer; /* Optional */ LPDPSP_GETADDRESS GetAddress; /* Optional */ LPDPSP_GETCAPS GetCaps; /* Optional */ LPDPSP_OPEN Open; /* Optional */ LPDPSP_REMOVEPLAYERFROMGROUP RemovePlayerFromGroup; /* Optional */ LPDPSP_SENDTOGROUP SendToGroup; /* Optional */ LPDPSP_SHUTDOWN Shutdown; /* Optional */ LPDPSP_CLOSEEX CloseEx; /* Optional */ LPDPSP_SHUTDOWNEX ShutdownEx; /* Optional */ LPDPSP_GETADDRESSCHOICES GetAddressChoices; /* Optional */ LPDPSP_SENDEX SendEx; /* Optional */ LPDPSP_SENDTOGROUPEX SendToGroupEx; /* Optional */ LPDPSP_CANCEL Cancel; /* Optional */ LPDPSP_GETMESSAGEQUEUE GetMessageQueue; /* Optional */ } DPSP_SPCALLBACKS, *LPDPSP_SPCALLBACKS; typedef struct tagSPINITDATA { LPDPSP_SPCALLBACKS lpCB; IDirectPlaySP* lpISP; LPWSTR lpszName; LPGUID lpGuid; DWORD dwReserved1; DWORD dwReserved2; DWORD dwSPHeaderSize; LPDPADDRESS lpAddress; DWORD dwAddressSize; DWORD dwSPVersion; } SPINITDATA, *LPSPINITDATA; typedef HRESULT (WINAPI *LPDPSP_SPINIT)(LPSPINITDATA); /* This variable is exported from the DLL at ordinal 6 to be accessed by the * SP directly */ extern DWORD gdwDPlaySPRefCount; #endif