215 lines
6.0 KiB
C
215 lines
6.0 KiB
C
/*
|
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#ifndef __WINE_DPLAY_GLOBAL_INCLUDED
|
|
#define __WINE_DPLAY_GLOBAL_INCLUDED
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include "windef.h"
|
|
#include "winbase.h"
|
|
#include "wine/dplaysp.h"
|
|
#include "lobbysp.h"
|
|
#include "dplayx_queue.h"
|
|
|
|
extern HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback,
|
|
LPCVOID lpAddress, DWORD dwAddressSize,
|
|
LPVOID lpContext ) DECLSPEC_HIDDEN;
|
|
|
|
typedef struct tagEnumSessionAsyncCallbackData
|
|
{
|
|
LPSPINITDATA lpSpData;
|
|
GUID requestGuid;
|
|
DWORD dwEnumSessionFlags;
|
|
DWORD dwTimeout;
|
|
HANDLE hSuicideRequest;
|
|
} EnumSessionAsyncCallbackData;
|
|
|
|
typedef struct tagDP_MSG_REPLY_STRUCT
|
|
{
|
|
HANDLE hReceipt;
|
|
WORD wExpectedReply;
|
|
LPVOID lpReplyMsg;
|
|
DWORD dwMsgBodySize;
|
|
/* FIXME: Is the message header required as well? */
|
|
} DP_MSG_REPLY_STRUCT, *LPDP_MSG_REPLY_STRUCT;
|
|
|
|
typedef struct tagDP_MSG_REPLY_STRUCT_LIST
|
|
{
|
|
DPQ_ENTRY(tagDP_MSG_REPLY_STRUCT_LIST) repliesExpected;
|
|
DP_MSG_REPLY_STRUCT replyExpected;
|
|
} DP_MSG_REPLY_STRUCT_LIST, *LPDP_MSG_REPLY_STRUCT_LIST;
|
|
|
|
struct PlayerData
|
|
{
|
|
/* Individual player information */
|
|
DPID dpid;
|
|
|
|
DPNAME name;
|
|
HANDLE hEvent;
|
|
|
|
ULONG uRef; /* What is the reference count on this data? */
|
|
|
|
/* View of local data */
|
|
LPVOID lpLocalData;
|
|
DWORD dwLocalDataSize;
|
|
|
|
/* View of remote data */
|
|
LPVOID lpRemoteData;
|
|
DWORD dwRemoteDataSize;
|
|
|
|
/* SP data on a per player basis */
|
|
LPVOID lpSPPlayerData;
|
|
|
|
DWORD dwFlags; /* Special remarks about the type of player */
|
|
};
|
|
typedef struct PlayerData* lpPlayerData;
|
|
|
|
struct PlayerList
|
|
{
|
|
DPQ_ENTRY(PlayerList) players;
|
|
|
|
lpPlayerData lpPData;
|
|
};
|
|
typedef struct PlayerList* lpPlayerList;
|
|
|
|
struct GroupData
|
|
{
|
|
/* Internal information */
|
|
DPID parent; /* If parent == 0 it's a top level group */
|
|
|
|
ULONG uRef; /* Reference count */
|
|
|
|
DPQ_HEAD(GroupList) groups; /* A group has [0..n] groups */
|
|
DPQ_HEAD(PlayerList) players; /* A group has [0..n] players */
|
|
|
|
DPID idGroupOwner; /* ID of player who owns the group */
|
|
|
|
DWORD dwFlags; /* Flags describing anything special about the group */
|
|
|
|
DPID dpid;
|
|
DPNAME name;
|
|
|
|
/* View of local data */
|
|
LPVOID lpLocalData;
|
|
DWORD dwLocalDataSize;
|
|
|
|
/* View of remote data */
|
|
LPVOID lpRemoteData;
|
|
DWORD dwRemoteDataSize;
|
|
};
|
|
typedef struct GroupData GroupData;
|
|
typedef struct GroupData* lpGroupData;
|
|
|
|
struct GroupList
|
|
{
|
|
DPQ_ENTRY(GroupList) groups;
|
|
|
|
lpGroupData lpGData;
|
|
};
|
|
typedef struct GroupList* lpGroupList;
|
|
|
|
struct DPMSG
|
|
{
|
|
DPQ_ENTRY( DPMSG ) msgs;
|
|
DPMSG_GENERIC* msg;
|
|
};
|
|
typedef struct DPMSG* LPDPMSG;
|
|
|
|
enum SPSTATE
|
|
{
|
|
NO_PROVIDER = 0,
|
|
DP_SERVICE_PROVIDER = 1,
|
|
DP_LOBBY_PROVIDER = 2
|
|
};
|
|
|
|
/* Contains all data members. FIXME: Rename me */
|
|
typedef struct tagDirectPlay2Data
|
|
{
|
|
BOOL bConnectionOpen;
|
|
|
|
/* For async EnumSessions requests */
|
|
HANDLE hEnumSessionThread;
|
|
HANDLE hKillEnumSessionThreadEvent;
|
|
DWORD dwEnumSessionLock;
|
|
|
|
LPVOID lpNameServerData; /* DPlay interface doesn't know contents */
|
|
|
|
BOOL bHostInterface; /* Did this interface create the session */
|
|
|
|
lpGroupData lpSysGroup; /* System group with _everything_ in it */
|
|
|
|
LPDPSESSIONDESC2 lpSessionDesc;
|
|
|
|
/* I/O Msg queues */
|
|
DPQ_HEAD( DPMSG ) receiveMsgs; /* Msg receive queue */
|
|
DPQ_HEAD( DPMSG ) sendMsgs; /* Msg send pending queue */
|
|
|
|
/* Information about the service provider active on this connection */
|
|
SPINITDATA spData;
|
|
BOOL bSPInitialized;
|
|
|
|
/* Information about the lobby server that's attached to this DP object */
|
|
SPDATA_INIT dplspData;
|
|
BOOL bDPLSPInitialized;
|
|
|
|
/* Our service provider */
|
|
HMODULE hServiceProvider;
|
|
|
|
/* Our DP lobby provider */
|
|
HMODULE hDPLobbyProvider;
|
|
|
|
enum SPSTATE connectionInitialized;
|
|
|
|
/* Expected messages queue */
|
|
DPQ_HEAD( tagDP_MSG_REPLY_STRUCT_LIST ) repliesExpected;
|
|
} DirectPlay2Data;
|
|
|
|
typedef struct IDirectPlayImpl
|
|
{
|
|
IDirectPlay IDirectPlay_iface;
|
|
IDirectPlay2A IDirectPlay2A_iface;
|
|
IDirectPlay2 IDirectPlay2_iface;
|
|
IDirectPlay3A IDirectPlay3A_iface;
|
|
IDirectPlay3 IDirectPlay3_iface;
|
|
IDirectPlay4A IDirectPlay4A_iface;
|
|
IDirectPlay4 IDirectPlay4_iface;
|
|
LONG numIfaces; /* "in use interfaces" refcount */
|
|
LONG ref, ref2A, ref2, ref3A, ref3, ref4A, ref4;
|
|
CRITICAL_SECTION lock;
|
|
DirectPlay2Data *dp2;
|
|
} IDirectPlayImpl;
|
|
|
|
HRESULT DP_HandleMessage( IDirectPlayImpl *This, const void *lpMessageBody,
|
|
DWORD dwMessageBodySize, const void *lpMessageHeader, WORD wCommandId, WORD wVersion,
|
|
void **lplpReply, DWORD *lpdwMsgSize ) DECLSPEC_HIDDEN;
|
|
|
|
/* DP SP external interfaces into DirectPlay */
|
|
extern HRESULT DP_GetSPPlayerData( IDirectPlayImpl *lpDP, DPID idPlayer, void **lplpData ) DECLSPEC_HIDDEN;
|
|
extern HRESULT DP_SetSPPlayerData( IDirectPlayImpl *lpDP, DPID idPlayer, void *lpData ) DECLSPEC_HIDDEN;
|
|
|
|
/* DP external interfaces to call into DPSP interface */
|
|
extern LPVOID DPSP_CreateSPPlayerData(void) DECLSPEC_HIDDEN;
|
|
|
|
extern HRESULT dplay_create( REFIID riid, void **ppv ) DECLSPEC_HIDDEN;
|
|
extern HRESULT dplobby_create( REFIID riid, void **ppv ) DECLSPEC_HIDDEN;
|
|
extern HRESULT DPSP_CreateInterface( REFIID riid, void **ppvObj, IDirectPlayImpl *dp ) DECLSPEC_HIDDEN;
|
|
extern HRESULT dplobbysp_create( REFIID riid, void **ppv, IDirectPlayImpl *dp ) DECLSPEC_HIDDEN;
|
|
|
|
#endif /* __WINE_DPLAY_GLOBAL_INCLUDED */
|