| /* | 
 |  * Copyright 2001 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 |  */ | 
 |  | 
 | #ifndef __WINE_LOBBY_SP_H | 
 | #define __WINE_LOBBY_SP_H | 
 |  | 
 | #include <stdarg.h> | 
 |  | 
 | #include "windef.h" | 
 | #include "winbase.h" | 
 | #include "winuser.h" | 
 | #include "dplobby.h" | 
 |  | 
 | /* GUID for IDPLobbySP {5A4E5A20-2CED-11d0-A889-00A0C905433C} */ | 
 | DEFINE_GUID(IID_IDPLobbySP, 0x5a4e5a20, 0x2ced, 0x11d0, 0xa8, 0x89, 0x0, 0xa0, 0xc9, 0x5, 0x43, 0x3c); | 
 | typedef struct IDPLobbySP *LPDPLOBBYSP; | 
 |  | 
 | /* For SP. Top 16 bits is dplay, bottom 16 is SP */ | 
 | #define DPLSP_MAJORVERSION               0x00050000 | 
 |  | 
 | typedef struct SPDATA_ADDGROUPTOGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwParentID; | 
 |   DWORD       dwGroupID; | 
 | } SPDATA_ADDGROUPTOGROUP, *LPSPDATA_ADDGROUPTOGROUP; | 
 |  | 
 | typedef struct SPDATA_ADDPLAYERTOGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   DWORD       dwPlayerID; | 
 | } SPDATA_ADDPLAYERTOGROUP, *LPSPDATA_ADDPLAYERTOGROUP; | 
 |  | 
 | typedef struct SPDATA_ADDREMOTEGROUPTOGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD	      dwAnchorID; | 
 |   DWORD       dwGroupID; | 
 |   DWORD	      dwParentID; | 
 |   LPDPNAME    lpName; | 
 |   DWORD       dwGroupFlags; | 
 | } SPDATA_ADDREMOTEGROUPTOGROUP, *LPSPDATA_ADDREMOTEGROUPTOGROUP; | 
 |  | 
 | typedef struct SPDATA_ADDREMOTEPLAYERTOGROUP | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD	      dwGroupID; | 
 |   DWORD	      dwPlayerID; | 
 |   DWORD	      dwPlayerFlags; | 
 |   LPDPNAME    lpName; | 
 | } SPDATA_ADDREMOTEPLAYERTOGROUP, *LPSPDATA_ADDREMOTEPLAYERTOGROUP; | 
 |  | 
 | typedef struct SPDATA_BUILDPARENTALHEIRARCHY | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   DWORD       dwMessage; | 
 |   DWORD       dwParentID; | 
 | } SPDATA_BUILDPARENTALHEIRARCHY, *LPSPDATA_BUILDPARENTALHEIRARCHY; | 
 |  | 
 | typedef struct SPDATA_CLOSE | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 | } SPDATA_CLOSE, *LPSPDATA_CLOSE; | 
 |  | 
 | typedef struct SPDATA_CREATEGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPDPNAME    lpName; | 
 |   LPVOID      lpData; | 
 |   DWORD       dwDataSize; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_CREATEGROUP, *LPSPDATA_CREATEGROUP; | 
 |  | 
 | typedef struct SPDATA_CREATEGROUPINGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwParentID; | 
 |   DWORD       dwGroupID; | 
 |   LPDPNAME    lpName; | 
 |   LPVOID      lpData; | 
 |   DWORD       dwDataSize; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_CREATEGROUPINGROUP, *LPSPDATA_CREATEGROUPINGROUP; | 
 |  | 
 | typedef struct SPDATA_CREATEREMOTEGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPDPNAME    lpName; | 
 |   LPVOID      lpData; | 
 |   DWORD       dwDataSize; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_CREATEREMOTEGROUP, *LPSPDATA_CREATEREMOTEGROUP; | 
 |  | 
 | typedef struct SPDATA_CREATEREMOTEGROUPINGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwParentID; | 
 |   DWORD       dwGroupID; | 
 |   LPDPNAME    lpName; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_CREATEREMOTEGROUPINGROUP, *LPSPDATA_CREATEREMOTEGROUPINGROUP; | 
 |  | 
 | typedef struct SPDATA_CREATEPLAYER | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwPlayerID; | 
 |   LPDPNAME    lpName; | 
 |   LPVOID      lpData; | 
 |   DWORD       dwDataSize; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_CREATEPLAYER, *LPSPDATA_CREATEPLAYER; | 
 |  | 
 | typedef struct SPDATA_DELETEGROUPFROMGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwParentID; | 
 |   DWORD       dwGroupID; | 
 | } SPDATA_DELETEGROUPFROMGROUP, *LPSPDATA_DELETEGROUPFROMGROUP; | 
 |  | 
 | typedef struct SPDATA_DELETEPLAYERFROMGROUP | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   DWORD       dwPlayerID; | 
 | } SPDATA_DELETEPLAYERFROMGROUP, *LPSPDATA_DELETEPLAYERFROMGROUP; | 
 |  | 
 | typedef struct SPDATA_DELETEREMOTEGROUPFROMGROUP | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwParentID; | 
 |   DWORD       dwGroupID; | 
 | } SPDATA_DELETEREMOTEGROUPFROMGROUP, *LPSPDATA_DELETEREMOTEGROUPFROMGROUP; | 
 |  | 
 | typedef struct SPDATA_DELETEREMOTEPLAYERFROMGROUP | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   DWORD       dwPlayerID; | 
 | } SPDATA_DELETEREMOTEPLAYERFROMGROUP, *LPSPDATA_DELETEREMOTEPLAYERFROMGROUP; | 
 |  | 
 | typedef struct SPDATA_DESTROYGROUP | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD	      dwGroupID; | 
 | } SPDATA_DESTROYGROUP, *LPSPDATA_DESTROYGROUP; | 
 |  | 
 | typedef struct SPDATA_DESTROYREMOTEGROUP | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 | } SPDATA_DESTROYREMOTEGROUP, *LPSPDATA_DESTROYREMOTEGROUP; | 
 |  | 
 | typedef struct SPDATA_DESTROYPLAYER | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwPlayerID; | 
 | } SPDATA_DESTROYPLAYER, *LPSPDATA_DESTROYPLAYER; | 
 |  | 
 | typedef struct SPDATA_ENUMSESSIONS | 
 | { | 
 |   DWORD            dwSize; | 
 |   LPDPLOBBYSP      lpISP; | 
 |   LPDPSESSIONDESC2 lpsd; | 
 |   DWORD            dwTimeout; | 
 |   DWORD            dwFlags; | 
 | } SPDATA_ENUMSESSIONS, *LPSPDATA_ENUMSESSIONS; | 
 |  | 
 | typedef struct SPDATA_ENUMSESSIONSRESPONSE | 
 | { | 
 |   DWORD            dwSize; | 
 |   LPDPSESSIONDESC2 lpsd; | 
 | } SPDATA_ENUMSESSIONSRESPONSE, *LPSPDATA_ENUMSESSIONSRESPONSE; | 
 |  | 
 | typedef struct SPDATA_GETCAPS | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwFlags; | 
 |   LPDPCAPS    lpcaps; | 
 | } SPDATA_GETCAPS, *LPSPDATA_GETCAPS; | 
 |  | 
 | typedef struct SPDATA_GETGROUPCONNECTIONSETTINGS | 
 | { | 
 |   DWORD       dwSize; | 
 |   DWORD       dwFlags; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPDWORD     lpdwBufferSize; | 
 |   LPVOID      lpBuffer; | 
 | } SPDATA_GETGROUPCONNECTIONSETTINGS, *LPSPDATA_GETGROUPCONNECTIONSETTINGS; | 
 |  | 
 | typedef struct SPDATA_GETGROUPDATA | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPDWORD     lpdwDataSize; | 
 |   LPVOID      lpData; | 
 | } SPDATA_GETGROUPDATA, *LPSPDATA_GETGROUPDATA; | 
 |  | 
 | typedef struct SPDATA_GETPLAYERCAPS | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwFlags; | 
 |   DWORD       dwPlayerID; | 
 |   LPDPCAPS    lpcaps; | 
 | } SPDATA_GETPLAYERCAPS, *LPSPDATA_GETPLAYERCAPS; | 
 |  | 
 | typedef struct SPDATA_GETPLAYERDATA | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwPlayerID; | 
 |   LPDWORD     lpdwDataSize; | 
 |   LPVOID      lpData; | 
 | } SPDATA_GETPLAYERDATA, *LPSPDATA_GETPLAYERDATA; | 
 |  | 
 | typedef struct SPDATA_HANDLEMESSAGE | 
 | { | 
 |   DWORD	 dwSize; | 
 |   DWORD	 dwFromID; | 
 |   DWORD	 dwToID; | 
 |   LPVOID lpBuffer; | 
 |   DWORD	 dwBufSize; | 
 | } SPDATA_HANDLEMESSAGE, *LPSPDATA_HANDLEMESSAGE; | 
 |  | 
 | typedef struct SPDATA_OPEN | 
 | { | 
 |   DWORD	           dwSize; | 
 |   LPDPLOBBYSP      lpISP; | 
 |   LPDPSESSIONDESC2 lpsd; | 
 |   DWORD            dwFlags; | 
 |   LPCDPCREDENTIALS lpCredentials; | 
 | } SPDATA_OPEN, *LPSPDATA_OPEN; | 
 |  | 
 | typedef struct SPDATA_SEND | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwFromID; | 
 |   DWORD       dwToID; | 
 |   DWORD       dwFlags; | 
 |   LPVOID      lpBuffer; | 
 |   DWORD       dwBufSize; | 
 | } SPDATA_SEND, *LPSPDATA_SEND; | 
 |  | 
 | typedef struct SPDATA_CHATMESSAGE | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwFromID; | 
 |   DWORD       dwToID; | 
 |   DWORD       dwFlags; | 
 |   LPDPCHAT    lpChat; | 
 | } SPDATA_CHATMESSAGE, *LPSPDATA_CHATMESSAGE; | 
 |  | 
 | typedef struct SPDATA_SETGROUPCONNECTIONSETTINGS | 
 | { | 
 |   DWORD           dwSize; | 
 |   DWORD           dwFlags; | 
 |   LPDPLOBBYSP     lpISP; | 
 |   DWORD           dwGroupID; | 
 |   LPDPLCONNECTION lpConn; | 
 | } SPDATA_SETGROUPCONNECTIONSETTINGS, *LPSPDATA_SETGROUPCONNECTIONSETTINGS; | 
 |  | 
 | typedef struct SPDATA_SETGROUPDATA | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPVOID      lpData; | 
 |   DWORD       dwDataSize; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_SETGROUPDATA, *LPSPDATA_SETGROUPDATA; | 
 |  | 
 | typedef struct SPDATA_SETGROUPNAME | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPDPNAME    lpName; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_SETGROUPNAME, *LPSPDATA_SETGROUPNAME; | 
 |  | 
 | typedef struct SPDATA_SETREMOTEGROUPNAME | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwGroupID; | 
 |   LPDPNAME    lpName; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_SETREMOTEGROUPNAME, *LPSPDATA_SETREMOTEGROUPNAME; | 
 |  | 
 | typedef struct SPDATA_SETPLAYERDATA | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwPlayerID; | 
 |   LPVOID      lpData; | 
 |   DWORD       dwDataSize; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_SETPLAYERDATA, *LPSPDATA_SETPLAYERDATA; | 
 |  | 
 | typedef struct SPDATA_SETPLAYERNAME | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwPlayerID; | 
 |   LPDPNAME    lpName; | 
 |   DWORD	      dwFlags; | 
 | } SPDATA_SETPLAYERNAME, *LPSPDATA_SETPLAYERNAME; | 
 |  | 
 | typedef struct SPDATA_SETREMOTEPLAYERNAME | 
 | { | 
 |   DWORD	      dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwPlayerID; | 
 |   LPDPNAME    lpName; | 
 |   DWORD       dwFlags; | 
 | } SPDATA_SETREMOTEPLAYERNAME, *LPSPDATA_SETREMOTEPLAYERNAME; | 
 |  | 
 | typedef struct SPDATA_SETSESSIONDESC | 
 | { | 
 |   DWORD            dwSize; | 
 |   LPDPSESSIONDESC2 lpsd; | 
 | } SPDATA_SETSESSIONDESC, *LPSPDATA_SETSESSIONDESC; | 
 |  | 
 | typedef struct SPDATA_SHUTDOWN | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 | } SPDATA_SHUTDOWN, *LPSPDATA_SHUTDOWN; | 
 |  | 
 | typedef struct SPDATA_STARTSESSION | 
 | { | 
 |   DWORD       dwSize; | 
 |   LPDPLOBBYSP lpISP; | 
 |   DWORD       dwFlags; | 
 |   DWORD       dwGroupID; | 
 | } SPDATA_STARTSESSION, *LPSPDATA_STARTSESSION; | 
 |  | 
 | typedef struct SPDATA_STARTSESSIONCOMMAND | 
 | { | 
 |   DWORD           dwFlags; | 
 |   DWORD           dwGroupID; | 
 |   DWORD           dwHostID; | 
 |   LPDPLCONNECTION lpConn; | 
 | } SPDATA_STARTSESSIONCOMMAND, *LPSPDATA_STARTSESSIONCOMMAND; | 
 |  | 
 | /* Prototypes for callbacks returned by DPLSPInit */ | 
 | typedef HRESULT (WINAPI *LPSP_ADDGROUPTOGROUP)(LPSPDATA_ADDGROUPTOGROUP); | 
 | typedef HRESULT	(WINAPI *LPSP_ADDPLAYERTOGROUP)(LPSPDATA_ADDPLAYERTOGROUP); | 
 | typedef HRESULT	(WINAPI *LPSP_BUILDPARENTALHEIRARCHY)(LPSPDATA_BUILDPARENTALHEIRARCHY); | 
 | typedef HRESULT	(WINAPI *LPSP_CLOSE)(LPSPDATA_CLOSE); | 
 | typedef HRESULT	(WINAPI *LPSP_CREATEGROUP)(LPSPDATA_CREATEGROUP); | 
 | typedef HRESULT (WINAPI *LPSP_CREATEGROUPINGROUP)(LPSPDATA_CREATEGROUPINGROUP); | 
 | typedef HRESULT	(WINAPI *LPSP_CREATEPLAYER)(LPSPDATA_CREATEPLAYER); | 
 | typedef HRESULT (WINAPI *LPSP_DELETEGROUPFROMGROUP)(LPSPDATA_DELETEGROUPFROMGROUP); | 
 | typedef HRESULT	(WINAPI *LPSP_DELETEPLAYERFROMGROUP)(LPSPDATA_DELETEPLAYERFROMGROUP); | 
 | typedef HRESULT	(WINAPI *LPSP_DESTROYGROUP)(LPSPDATA_DESTROYGROUP); | 
 | typedef HRESULT	(WINAPI *LPSP_DESTROYPLAYER)(LPSPDATA_DESTROYPLAYER); | 
 | typedef HRESULT	(WINAPI *LPSP_ENUMSESSIONS)(LPSPDATA_ENUMSESSIONS); | 
 | typedef HRESULT (WINAPI *LPSP_GETCAPS)(LPSPDATA_GETCAPS); | 
 | typedef HRESULT (WINAPI *LPSP_GETGROUPCONNECTIONSETTINGS)(LPSPDATA_GETGROUPCONNECTIONSETTINGS); | 
 | typedef HRESULT	(WINAPI *LPSP_GETGROUPDATA)(LPSPDATA_GETGROUPDATA); | 
 | typedef HRESULT (WINAPI *LPSP_GETPLAYERCAPS)(LPSPDATA_GETPLAYERCAPS); | 
 | typedef HRESULT	(WINAPI *LPSP_GETPLAYERDATA)(LPSPDATA_GETPLAYERDATA); | 
 | typedef HRESULT	(WINAPI *LPSP_HANDLEMESSAGE)(LPSPDATA_HANDLEMESSAGE); | 
 | typedef HRESULT	(WINAPI *LPSP_OPEN)(LPSPDATA_OPEN); | 
 | typedef HRESULT	(WINAPI *LPSP_SEND)(LPSPDATA_SEND); | 
 | typedef HRESULT	(WINAPI *LPSP_SENDCHATMESSAGE)(LPSPDATA_CHATMESSAGE); | 
 | typedef HRESULT (WINAPI *LPSP_SETGROUPCONNECTIONSETTINGS)(LPSPDATA_SETGROUPCONNECTIONSETTINGS); | 
 | typedef HRESULT	(WINAPI *LPSP_SETGROUPDATA)(LPSPDATA_SETGROUPDATA); | 
 | typedef HRESULT	(WINAPI *LPSP_SETGROUPNAME)(LPSPDATA_SETGROUPNAME); | 
 | typedef HRESULT	(WINAPI *LPSP_SETPLAYERDATA)(LPSPDATA_SETPLAYERDATA); | 
 | typedef HRESULT	(WINAPI *LPSP_SETPLAYERNAME)(LPSPDATA_SETPLAYERNAME); | 
 | typedef HRESULT	(WINAPI *LPSP_SHUTDOWN)(LPSPDATA_SHUTDOWN); | 
 | typedef HRESULT (WINAPI *LPSP_STARTSESSION)(LPSPDATA_STARTSESSION); | 
 |  | 
 | /* Callback table for dplay to call into service provider */ | 
 | typedef struct SP_CALLBACKS | 
 | { | 
 |   DWORD                            dwSize; | 
 |   DWORD                            dwFlags; | 
 |   LPSP_ADDGROUPTOGROUP             AddGroupToGroup; | 
 |   LPSP_ADDPLAYERTOGROUP            AddPlayerToGroup; | 
 |   LPSP_BUILDPARENTALHEIRARCHY      BuildParentalHeirarchy; | 
 |   LPSP_CLOSE                       Close; | 
 |   LPSP_CREATEGROUP                 CreateGroup; | 
 |   LPSP_CREATEGROUPINGROUP          CreateGroupInGroup; | 
 |   LPSP_CREATEPLAYER                CreatePlayer; | 
 |   LPSP_DELETEGROUPFROMGROUP        DeleteGroupFromGroup; | 
 |   LPSP_DELETEPLAYERFROMGROUP       DeletePlayerFromGroup; | 
 |   LPSP_DESTROYGROUP                DestroyGroup; | 
 |   LPSP_DESTROYPLAYER               DestroyPlayer; | 
 |   LPSP_ENUMSESSIONS                EnumSessions; | 
 |   LPSP_GETCAPS                     GetCaps; | 
 |   LPSP_GETGROUPCONNECTIONSETTINGS  GetGroupConnectionSettings; | 
 |   LPSP_GETGROUPDATA                GetGroupData; | 
 |   LPSP_GETPLAYERCAPS               GetPlayerCaps; | 
 |   LPSP_GETPLAYERDATA               GetPlayerData; | 
 |   LPSP_OPEN                        Open; | 
 |   LPSP_SEND                        Send; | 
 |   LPSP_SENDCHATMESSAGE	           SendChatMessage; | 
 |   LPSP_SETGROUPCONNECTIONSETTINGS  SetGroupConnectionSettings; | 
 |   LPSP_SETGROUPDATA                SetGroupData; | 
 |   LPSP_SETGROUPNAME                SetGroupName; | 
 |   LPSP_SETPLAYERDATA               SetPlayerData; | 
 |   LPSP_SETPLAYERNAME               SetPlayerName; | 
 |   LPSP_SHUTDOWN                    Shutdown; | 
 |   LPSP_STARTSESSION                StartSession; | 
 | } SP_CALLBACKS, *LPSP_CALLBACKS; | 
 |  | 
 | typedef struct SPDATA_INIT | 
 | { | 
 |   LPSP_CALLBACKS lpCB; | 
 |   DWORD          dwSPVersion; | 
 |   LPDPLOBBYSP    lpISP; | 
 |   LPDPADDRESS    lpAddress; | 
 | } SPDATA_INIT, *LPSPDATA_INIT; | 
 |  | 
 | typedef HRESULT (WINAPI *LPSP_INIT)(LPSPDATA_INIT); | 
 | HRESULT WINAPI DPLSPInit(LPSPDATA_INIT) DECLSPEC_HIDDEN; | 
 |  | 
 | /* Define the COM interface */ | 
 | #define INTERFACE IDPLobbySP | 
 | DECLARE_INTERFACE_(IDPLobbySP,IUnknown) | 
 | { | 
 |     /*** IUnknown methods ***/ | 
 |     STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; | 
 |     STDMETHOD_(ULONG,AddRef)(THIS) PURE; | 
 |     STDMETHOD_(ULONG,Release)(THIS) PURE; | 
 |     /*** IDPLobbySP methods ***/ | 
 |     STDMETHOD(AddGroupToGroup)(THIS_ LPSPDATA_ADDREMOTEGROUPTOGROUP  argtg ) PURE; | 
 |     STDMETHOD(AddPlayerToGroup)(THIS_ LPSPDATA_ADDREMOTEPLAYERTOGROUP  arptg ) PURE; | 
 |     STDMETHOD(CreateGroup)(THIS_ LPSPDATA_CREATEREMOTEGROUP  crg ) PURE; | 
 |     STDMETHOD(CreateGroupInGroup)(THIS_ LPSPDATA_CREATEREMOTEGROUPINGROUP  crgig ) PURE; | 
 |     STDMETHOD(DeleteGroupFromGroup)(THIS_ LPSPDATA_DELETEREMOTEGROUPFROMGROUP  drgfg ) PURE; | 
 |     STDMETHOD(DeletePlayerFromGroup)(THIS_ LPSPDATA_DELETEREMOTEPLAYERFROMGROUP  drpfg ) PURE; | 
 |     STDMETHOD(DestroyGroup)(THIS_ LPSPDATA_DESTROYREMOTEGROUP  drg ) PURE; | 
 |     STDMETHOD(EnumSessionsResponse)(THIS_ LPSPDATA_ENUMSESSIONSRESPONSE  er ) PURE; | 
 |     STDMETHOD(GetSPDataPointer)(THIS_ LPVOID * lplpData ) PURE; | 
 |     STDMETHOD(HandleMessage)(THIS_ LPSPDATA_HANDLEMESSAGE  hm ) PURE; | 
 |     STDMETHOD(SendChatMessage)(THIS_ LPSPDATA_CHATMESSAGE  cm ) PURE; | 
 |     STDMETHOD(SetGroupName)(THIS_ LPSPDATA_SETREMOTEGROUPNAME  srgn ) PURE; | 
 |     STDMETHOD(SetPlayerName)(THIS_ LPSPDATA_SETREMOTEPLAYERNAME  srpn ) PURE; | 
 |     STDMETHOD(SetSessionDesc)(THIS_ LPSPDATA_SETSESSIONDESC  ssd ) PURE; | 
 |     STDMETHOD(SetSPDataPointer)(THIS_ LPVOID  lpData ) PURE; | 
 |     STDMETHOD(StartSession)(THIS_ LPSPDATA_STARTSESSIONCOMMAND  ssc ) PURE; | 
 | }; | 
 | #undef INTERFACE | 
 |  | 
 | #if !defined (__cplusplus) || defined(CINTERFACE) | 
 | /*** IUnknown methods ***/ | 
 | #define IDPLobbySP_QueryInterface(p,a,b)         (p)->lpVtbl->QueryInterface(p,a,b) | 
 | #define IDPLobbySP_AddRef(p)                     (p)->lpVtbl->AddRef(p) | 
 | #define IDPLobbySP_Release(p)                    (p)->lpVtbl->Release(p) | 
 |  | 
 | /*** IDPLobbySP methods ***/ | 
 | #define IDPLobbySP_AddGroupToGroup(p,a)          (p)->lpVtbl->AddGroupToGroup(p,a) | 
 | #define IDPLobbySP_AddPlayerToGroup(p,a)         (p)->lpVtbl->AddPlayerToGroup(p,a) | 
 | #define IDPLobbySP_CreateGroup(p,a)              (p)->lpVtbl->CreateGroup(p,a) | 
 | #define IDPLobbySP_CreateGroupInGroup(p,a)       (p)->lpVtbl->CreateGroupInGroup(p,a) | 
 | #define IDPLobbySP_DeleteGroupFromGroup(p,a)     (p)->lpVtbl->DeleteGroupFromGroup(p,a) | 
 | #define IDPLobbySP_DeletePlayerFromGroup(p,a)    (p)->lpVtbl->DeletePlayerFromGroup(p,a) | 
 | #define IDPLobbySP_DestroyGroup(p,a)             (p)->lpVtbl->DestroyGroup(p,a) | 
 | #define IDPLobbySP_EnumSessionsResponse(p,a)     (p)->lpVtbl->EnumSessionsResponse(p,a) | 
 | #define IDPLobbySP_GetSPDataPointer(p,a)         (p)->lpVtbl->GetSPDataPointer(p,a) | 
 | #define IDPLobbySP_HandleMessage(p,a)            (p)->lpVtbl->HandleMessage(p,a) | 
 | #define IDPLobbySP_SetGroupName(p,a)             (p)->lpVtbl->SetGroupName(p,a) | 
 | #define IDPLobbySP_SetPlayerName(p,a)            (p)->lpVtbl->SetPlayerName(p,a) | 
 | #define IDPLobbySP_SetSessionDesc(p,a)           (p)->lpVtbl->SetSessionDesc(p,a) | 
 | #define IDPLobbySP_StartSession(p,a)             (p)->lpVtbl->StartSession(p,a) | 
 | #define IDPLobbySP_SetSPDataPointer(p,a)         (p)->lpVtbl->SetSPDataPointer(p,a) | 
 | #endif | 
 |  | 
 | /* This variable is exported from the DLL at ordinal 6 to be accessed by the | 
 |  * SP directly. This is the same variable that the DP SP will use. | 
 |  */ | 
 | extern DWORD gdwDPlaySPRefCount DECLSPEC_HIDDEN; | 
 |  | 
 | #endif |