| /* | 
 |  * 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 "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 ICOM_INTERFACE IDirectPlaySP | 
 | #define IDirectPlaySP_METHODS \ | 
 |    ICOM_METHOD5(HRESULT,AddMRUEntry, LPCWSTR,lpSection, LPCWSTR,lpKey, LPCVOID,lpData, DWORD,dwDataSize, DWORD,dwMaxEntries ) \ | 
 |    ICOM_METHOD6(HRESULT,CreateAddress, REFGUID,guidSP, REFGUID,guidDataType, LPCVOID,lpData, DWORD,dwDataSize, LPVOID,lpAddress,LPDWORD,lpdwAddressSize) \ | 
 |    ICOM_METHOD4(HRESULT,EnumAddress, LPDPENUMADDRESSCALLBACK,lpEnumAddressCallback, LPCVOID,lpAddress, DWORD,dwAddressSize, LPVOID,lpContext ) \ | 
 |    ICOM_METHOD4(HRESULT,EnumMRUEntries, LPCWSTR,lpSection, LPCWSTR,lpKey, LPENUMMRUCALLBACK,lpEnumMRUCallback, LPVOID,lpContext ) \ | 
 |    ICOM_METHOD2(HRESULT,GetPlayerFlags,       DPID,idPlayer, LPDWORD,lpdwPlayerFlags ) \ | 
 |    ICOM_METHOD4(HRESULT,GetSPPlayerData,      DPID,idPlayer, LPVOID*,lplpData, LPDWORD,lpdwDataSize, DWORD,dwFlags ) \ | 
 |    ICOM_METHOD3(HRESULT,HandleMessage,        LPVOID,lpMessageBody, DWORD,dwMessageBodySize, LPVOID,lpMessageHeader ) \ | 
 |    ICOM_METHOD4(HRESULT,SetSPPlayerData,      DPID,idPlayer, LPVOID,lpData, DWORD,dwDataSize, DWORD,dwFlags ) \ | 
 |    ICOM_METHOD4(HRESULT,CreateCompoundAddress, LPCDPCOMPOUNDADDRESSELEMENT,lpElements, DWORD,dwElementCount, LPVOID,lpAddress, LPDWORD,lpdwAddressSize ) \ | 
 |    ICOM_METHOD3(HRESULT,GetSPData,                LPVOID*,lplpData, LPDWORD,dwDataSize, DWORD,dwFlags ) \ | 
 |    ICOM_METHOD3(HRESULT,SetSPData,                LPVOID,lpData, DWORD,dwDataSize, DWORD,dwFlags ) \ | 
 |    ICOM_METHOD2(VOID,SendComplete,              LPVOID,, DWORD, ) | 
 |  | 
 | #define IDirectPlaySP_IMETHODS \ | 
 |    IUnknown_IMETHODS \ | 
 |    IDirectPlaySP_METHODS | 
 |  | 
 | ICOM_DEFINE(IDirectPlaySP,IUnknown) | 
 | #undef ICOM_INTERFACE | 
 |  | 
 |  | 
 | /* NOTE: The microsoft provided header file doesn't have these access | 
 |  * functions | 
 |  */ | 
 | /*** IUnknown methods ***/ | 
 | #define IDirectPlaySP_QueryInterface(p,a,b)        ICOM_CALL2(QueryInterface,p,a,b) | 
 | #define IDirectPlaySP_AddRef(p)                    ICOM_CALL (AddRef,p) | 
 | #define IDirectPlaySP_Release(p)                   ICOM_CALL (Release,p) | 
 | /*** IDirectPlaySP methods ***/ | 
 | #define IDirectPlaySP_AddMRUEntry(p,a,b,c,d,e)     ICOM_CALL5(AddMRUEntry,p,a,b,c,d,e) | 
 | #define IDirectPlaySP_CreateAddress(p,a,b,c,d,e,f) ICOM_CALL6(CreateAddress,p,a,b,c,d,e,f) | 
 | #define IDirectPlaySP_EnumAddress(p,a,b,c,d)       ICOM_CALL4(EnumAddress,p,a,b,c,d) | 
 | #define IDirectPlaySP_EnumMRUEntries(p,a,b,c,d)    ICOM_CALL4(EnumMRUEntries,p,a,b,c,d) | 
 | #define IDirectPlaySP_GetPlayerFlags(p,a,b)        ICOM_CALL2(GetPlayerFlags,p,a,b) | 
 | #define IDirectPlaySP_GetSPPlayerData(p,a,b,c,d)   ICOM_CALL4(GetSPPlayerData,p,a,b,c,d) | 
 | #define IDirectPlaySP_HandleMessage(p,a,b,c)       ICOM_CALL3(HandleMessage,p,a,b,c) | 
 | #define IDirectPlaySP_SetSPPlayerData(p,a,b,c,d)   ICOM_CALL4(SetSPPlayerData,p,a,b,c,d) | 
 | #define IDirectPlaySP_CreateCompoundAddress(p,a,b,c,d)  ICOM_CALL4(CreateCompoundAddress,p,a,b,c,d) | 
 | #define IDirectPlaySP_GetSPData(p,a,b,c)           ICOM_CALL3(GetSPData,p,a,b,c) | 
 | #define IDirectPlaySP_SetSPData(p,a,b,c)           ICOM_CALL3(SetSPData,p,a,b,c) | 
 | #define IDirectPlaySP_SendComplete(p,a,b)          ICOM_CALL2(SendComplete,p,a,b) | 
 |  | 
 | /* 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 | 
 |  |