401 lines
10 KiB
C++
401 lines
10 KiB
C++
// Direct Play object class implementation
|
||
|
||
#ifndef _DP_SPIMP_H
|
||
#define _DP_SPIMP_H
|
||
|
||
#include "..\dplay\dplayi.h"
|
||
|
||
// Begin: declaration of main implementation class for IDirectPlay
|
||
|
||
|
||
#define MAX_MSG (512 + sizeof(DPHDR))
|
||
#define MAX_PLAYERS 16
|
||
#define MAXIMUM_PLAYER_ID 256
|
||
|
||
typedef struct
|
||
{
|
||
DPID pid;
|
||
char chNickName[DPSHORTNAMELEN];
|
||
char chFullName[DPLONGNAMELEN ];
|
||
HANDLE hEvent;
|
||
BOOL bPlayer;
|
||
BOOL bValid;
|
||
BOOL bLocal;
|
||
DPID aGroup[MAX_PLAYERS];
|
||
} PLAYER_RECORD;
|
||
|
||
|
||
class CImpIDP_SP : public IDirectPlaySP {
|
||
public:
|
||
// IUnknown methods
|
||
// IDirectPlay methods
|
||
virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID iid, LPVOID *ppvObj );
|
||
virtual ULONG STDMETHODCALLTYPE AddRef( void);
|
||
virtual ULONG STDMETHODCALLTYPE Release( void );
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE AddPlayerToGroup(
|
||
DPID dwDPIDGroup,
|
||
DPID dwDPIDPlayer);
|
||
virtual HRESULT STDMETHODCALLTYPE Close(DWORD);
|
||
virtual HRESULT STDMETHODCALLTYPE CreatePlayer(
|
||
LPDPID pPlayerID,
|
||
LPSTR pNickName,
|
||
LPSTR pFullName,
|
||
LPHANDLE lpReceiveEvent,
|
||
BOOL bPlayer);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE DeletePlayerFromGroup(
|
||
DPID DPid,
|
||
DPID dwDPIDPlayer);
|
||
virtual HRESULT STDMETHODCALLTYPE DestroyPlayer( DPID pPlayerID, BOOL );
|
||
virtual HRESULT STDMETHODCALLTYPE EnumGroupPlayers(
|
||
DPID dwGroupPid,
|
||
LPDPENUMPLAYERSCALLBACK EnumCallback,
|
||
LPVOID pContext,
|
||
DWORD dwFlags);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE EnumPlayers(
|
||
DWORD dwSessionID,
|
||
LPDPENUMPLAYERSCALLBACK EnumCallback,
|
||
LPVOID pContext,
|
||
DWORD dwFlags);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE EnumSessions(
|
||
LPDPSESSIONDESC,
|
||
DWORD dwTimeout,
|
||
LPDPENUMSESSIONSCALLBACK EnumCallback,
|
||
LPVOID,
|
||
DWORD);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE GetCaps(LPDPCAPS lpDPCaps);
|
||
virtual HRESULT STDMETHODCALLTYPE GetMessageCount(DPID pidPlayer, LPDWORD lpdwCount);
|
||
virtual HRESULT STDMETHODCALLTYPE GetPlayerCaps(
|
||
DPID dwDPId,
|
||
LPDPCAPS lpDPCaps);
|
||
virtual HRESULT STDMETHODCALLTYPE GetPlayerName(DPID dpID,
|
||
LPSTR lpFriendlyName, // buffer to hold name
|
||
LPDWORD pdwFriendlyNameLength, // length of name buffer
|
||
LPSTR lpFormalName,
|
||
LPDWORD pdwFormalNameLength
|
||
);
|
||
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE Initialize(LPGUID);
|
||
virtual HRESULT STDMETHODCALLTYPE Open(
|
||
LPDPSESSIONDESC lpSDesc, HANDLE hEvent);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE Receive(
|
||
LPDPID from,
|
||
LPDPID to,
|
||
DWORD dwReceiveFlags,
|
||
LPVOID,
|
||
LPDWORD);
|
||
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE SaveSession(LPVOID lpv, LPDWORD lpdw);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE SetPrevPlayer(LPSTR lpName, LPVOID lpv, DWORD dw);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE SetPrevSession(LPSTR lpName, LPVOID lpv, DWORD dw);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE EnableNewPlayers(BOOL bEnable);
|
||
|
||
virtual HRESULT STDMETHODCALLTYPE Send(
|
||
DPID from,
|
||
DPID to,
|
||
DWORD dwFlags,
|
||
LPVOID lpvMsg,
|
||
DWORD dwLength);
|
||
virtual HRESULT STDMETHODCALLTYPE SetPlayerName(
|
||
DPID from,
|
||
LPSTR lpFriendlyName,
|
||
LPSTR lpFormalName,
|
||
BOOL bPlayer);
|
||
|
||
|
||
|
||
static CImpIDP_SP* NewCImpIDP_SP();
|
||
|
||
VOID HandleConnect();
|
||
VOID HandleMessage(LPVOID lpv, DWORD dwSize);
|
||
VOID PulseBlock() {PulseEvent(m_hBlockingEvent);}
|
||
VOID SetBlock() {SetEvent(m_hBlockingEvent);}
|
||
VOID SendDesc(LPDPSESSIONDESC);
|
||
VOID SendPing();
|
||
VOID PostHangup();
|
||
VOID ISend(LONG, LONG, DWORD, LPVOID, DWORD);
|
||
VOID LocalMsg(LONG, LPVOID, DWORD);
|
||
VOID RemoteMsg(LONG, LPVOID, DWORD);
|
||
LONG FindInvalidIndex();
|
||
VOID ConnectPlayers();
|
||
VOID DeleteRemotePlayers();
|
||
VOID ResetSessionDesc() {memset(&m_dpDesc, 0x00, sizeof(DPSESSIONDESC));}
|
||
volatile BOOL m_bConnected;
|
||
BOOL m_bPlayer0; // If I created the call, I am player
|
||
// zero.
|
||
volatile DWORD m_dwPendingWrites;
|
||
|
||
void *operator new( size_t size );
|
||
void operator delete( void *ptr );
|
||
|
||
|
||
protected:
|
||
void Lock();
|
||
void Unlock();
|
||
|
||
private:
|
||
LONG GetPlayerIndex(DPID);
|
||
BOOL SetSession(DWORD dw);
|
||
CImpIDP_SP(void);
|
||
~CImpIDP_SP(void);
|
||
|
||
DWORD m_dwPingSent;
|
||
HANDLE m_hBlockingEvent;
|
||
DWORD m_dwNextPlayer;
|
||
BOOL m_bEnablePlayerAdd;
|
||
|
||
PLAYER_RECORD m_aPlayer[MAX_PLAYERS];
|
||
char m_lpDisplay[128];
|
||
char m_lpDialable[128];
|
||
DWORD m_dwID;
|
||
LONG m_iPlayerIndex;
|
||
DPSESSIONDESC m_dpDesc;
|
||
|
||
int m_refCount;
|
||
CRITICAL_SECTION m_critSection;
|
||
DPCAPS m_dpcaps;
|
||
|
||
HANDLE m_hNewPlayerEvent;
|
||
|
||
HANDLE m_hTapiThread;
|
||
DWORD m_dwTapiThreadID;
|
||
char **m_ppSessionArray;
|
||
DWORD m_dwSessionPrev;
|
||
DWORD m_dwSessionAlloc;
|
||
};
|
||
|
||
|
||
BOOL SetIDP_SP( CImpIDP_SP *pSP);
|
||
|
||
|
||
// End : declaration of main implementation class for IDirectPlay
|
||
|
||
|
||
/****************************************************************************
|
||
*
|
||
* DIRECTPLAY MESSAGES
|
||
*
|
||
* Errors are represented by negative values and cannot be combined.
|
||
*
|
||
****************************************************************************/
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// #define DPSYS_ENUM 0x6172 // '4b797261' == 'Kyra' Born 10/21/94
|
||
// #define DPSYS_KYRA 0x6172794b
|
||
// #define DPSYS_HALL 0x6c6c6148
|
||
#define SPSYS_SYS 0x07
|
||
#define SPSYS_USER 0x0b
|
||
#define SPSYS_HIGH 0x0d
|
||
#define SPSYS_CONNECT 0x0f
|
||
// #define SYS_MSG 0x8000
|
||
|
||
typedef struct
|
||
{
|
||
union
|
||
{
|
||
DWORD dwConnect1;
|
||
struct
|
||
{
|
||
UINT to : 8;
|
||
UINT from : 8;
|
||
UINT usCount : 10;
|
||
UINT usCookie : 6;
|
||
};
|
||
};
|
||
} DPHDR;
|
||
|
||
#if 0
|
||
typedef struct
|
||
{
|
||
union
|
||
{
|
||
DWORD dwConnect1;
|
||
struct
|
||
{
|
||
USHORT usCookie;
|
||
BYTE to;
|
||
BYTE from;
|
||
};
|
||
};
|
||
union
|
||
{
|
||
DWORD dwConnect2;
|
||
struct
|
||
{
|
||
USHORT usCount;
|
||
BYTE bHdrCRC;
|
||
BYTE bMsgCRC;
|
||
};
|
||
};
|
||
} DPHDR;
|
||
#endif
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
char chMsgCompose[1000];
|
||
} MSG_BUILDER;
|
||
|
||
#define SP_ENUM_COOKIE 0x794b
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
USHORT usVerMajor;
|
||
USHORT usVerMinor;
|
||
DWORD dwConnect1;
|
||
DWORD dwConnect2;
|
||
} SPMSG_CONNECT;
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DPMSG_GENERIC sMsg;
|
||
} SPMSG_GENERIC;
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
BYTE Group;
|
||
BYTE bytePlayers[16];
|
||
} SPMSG_SETGROUPPLAYERS16;
|
||
|
||
|
||
#define SIZE_GENERIC (sizeof(SPMSG_GENERIC) - sizeof(DPHDR))
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
DPSESSIONDESC dpSessionDesc;
|
||
} SPMSG_ENUM;
|
||
|
||
#define DPSYS_ENUM_REPLY 0x0002
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
DWORD usPort;
|
||
} SPMSG_ENUM_REPLY;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwType;
|
||
DPID dpId;
|
||
} DPMSG_GETPLAYER;
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DPMSG_GETPLAYER sMsg;
|
||
} SPMSG_GETPLAYER;
|
||
#define SIZE_GETPLAYER (sizeof(SPMSG_GETPLAYER) - sizeof(DPHDR))
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DPMSG_ADDPLAYER sMsg;
|
||
} SPMSG_ADDPLAYER;
|
||
|
||
|
||
#define SIZE_ADDPLAYER (sizeof(SPMSG_ADDPLAYER) - sizeof(DPHDR))
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DPMSG_GROUPADD sMsg;
|
||
} SPMSG_GROUPADD;
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
DWORD dwTicks;
|
||
} SPMSG_PING;
|
||
|
||
#define SIZE_PING (sizeof(SPMSG_PING) - sizeof(DPHDR))
|
||
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
GUID guid;
|
||
} SPMSG_INVITE;
|
||
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
DPCAPS dpCaps;
|
||
} SPMSG_GETPLAYERCAPS;
|
||
|
||
#define SIZE_GETPLAYERCAPS (sizeof(SPMSG_GETPLAYERCAPS) - sizeof(DPHDR))
|
||
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DWORD dwType;
|
||
DPSESSIONDESC dpDesc;
|
||
} SPMSG_SENDDESC;
|
||
|
||
#define SIZE_SENDDESC (sizeof(SPMSG_SENDDESC) - sizeof(DPHDR))
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwType;
|
||
BOOL bEnable;
|
||
} DPMSG_ENABLEPLAYER;
|
||
typedef struct
|
||
{
|
||
DPHDR dpHdr;
|
||
DPMSG_ENABLEPLAYER sMsg;
|
||
} SPMSG_ENABLEPLAYER;
|
||
|
||
extern BOOL AddMessage(LPVOID lpvMsg, DWORD dwSize, DPID pidTo, DPID pidFrom, BOOL bHigh);
|
||
extern HRESULT GetQMessage(LPVOID lpvMsg, LPDWORD pdwSize, DPID *ppidTo, DPID *ppidFrom,
|
||
DWORD dwFlags, BOOL bPeek);
|
||
extern VOID FlushQueue(DPID pid);
|
||
extern DWORD GetPlayerCount(DPID spid);
|
||
|
||
#define DPSYS_JOHN 0x6e686f4a
|
||
|
||
|
||
// Enumeration Messages
|
||
|
||
//
|
||
// Thread Messages
|
||
//
|
||
#define PWM_BASE 0x00007000
|
||
#define PWM_COMMWRITE PWM_BASE +1
|
||
#define PWM_SETIDP PWM_BASE +2
|
||
#define PWM_HANGUP PWM_BASE +3
|
||
#define PWM_CLOSE PWM_BASE +4
|
||
|
||
|
||
|
||
|
||
#endif
|
||
|