www.pudn.com > terrainSimple.rar > SessionInfo.h


//----------------------------------------------------------------------------- 
// File: SessionInfo.h 
// 
// Desc: Header file for the CSessionInfo utility class. This utility stores 
//       player, group, and message information gathered from the application's 
//       DirectPlay message handler, and provides a dialog UI to display the 
//       data. 
// 
// Copyright (C) 2000-2001 Microsoft Corporation. All Rights Reserved. 
//----------------------------------------------------------------------------- 
 
#ifndef _SESSIONINFO_H_ 
#define _SESSIONINFO_H_ 
 
#include  
#include  
#include  
#include  
#include  
#include "dxutil.h" 
 
// Global option defines 
#define SI_MAX_MESSAGES     100 
#define SI_REFRESH_INTERVAL 3000 
 
// Thread creation is platform-specific 
#ifdef UNDER_CE 
#define chBEGINTHREADEX CreateThread 
#else 
#include  
typedef unsigned (__stdcall *PTHREAD_START) (void *); 
#define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, pvParam, fdwCreate, pdwThreadID) ((HANDLE) _beginthreadex( (void *) (psa), (unsigned) (cbStack), (PTHREAD_START) (pfnStartAddr), (void *) (pvParam), (unsigned) (fdwCreate), (unsigned *) (pdwThreadID)))  
#endif // UNDER_CE 
  
#ifdef _WIN64 
#define SI_HEXVAL TEXT("0x%x") 
#else 
#define SI_HEXVAL TEXT("0x%I64x") 
#endif // _WIN64 
 
#define IDD_SI_MAIN                     15000 
#define IDD_SI_PLAYERS                  15001 
#define IDD_SI_MESSAGES                 15002 
#define IDC_SI_PLAYERS                  16000 
#define IDC_SI_GROUPS                   16001 
#define IDC_SI_DESCRIPTION              16002 
#define IDC_SI_NAME_BORDER              16003 
#define IDC_SI_NAME                     16004 
#define IDC_SI_MEMBERSHIP               16005 
#define IDC_SI_MEMBERSHIP_TEXT          16006 
#define IDC_SI_NAME_ICON                16007 
#define IDC_SI_DPLAYMSG                 16008 
#define IDC_SI_APPMSG                   16009 
#define IDC_SI_TAB                      16010 
 
#define SI_REFRESH_TIMER                1 
 
// Message type IDs 
#define SI_MSGID_PLAYERINFO     0xDD01              
#define SI_MSGID_GROUPINFO      0xDD02 
 
#define SI_ASYNC_CONTEXT        ((VOID*)0xDD00) 
 
// Change compiler pack alignment to be BYTE aligned 
#pragma pack( push, 1 ) 
 
// Application message formats 
struct SI_MSG 
{ 
    DWORD dwMsgID; 
}; 
 
struct SI_MSG_PLAYERINFO : public SI_MSG 
{ 
    DPNID dpnID; 
    DWORD dwFlags; 
    DWORD dwNameLength; 
}; 
 
struct SI_MSG_GROUPINFO : public SI_MSG 
{ 
    DPNID dpnID; 
    DWORD dwNameLength; 
}; 
 
#pragma pack( pop ) 
 
 
 
//----------------------------------------------------------------------------- 
// Name: class CSIPlayer 
// Desc: Describes a DirectPlay player. 
//----------------------------------------------------------------------------- 
class CSIPlayer 
{ 
public: 
    // Constructors/Destructors 
    CSIPlayer( DPNID dpnid ); 
     
    // Member variables 
    DPNID id;              // Unique DPNID value 
    BOOL  bIsHost;         // Host flag 
    TCHAR strName[ 256 ];  // Name string 
    TCHAR strURL[ 256 ];   // URL string 
}; 
 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: class CSIGroup 
// Desc: Describes a DirectPlay group. Contains a DPNID list of member players. 
//----------------------------------------------------------------------------- 
class CSIGroup 
{ 
public: 
    // Constructors/Destructors 
    CSIGroup( DPNID dpnid ); 
    ~CSIGroup(); 
    
    HRESULT AddMember( DPNID id ); 
    HRESULT RemoveMember( DPNID id ); 
    BOOL    IsMember( DPNID id ) { return pMembers->Contains( &id ); } 
 
    // Member variables 
    DPNID       id;                  // Unique DPNID value 
    TCHAR       strName[ 256 ];      // Name string 
    CArrayList* pMembers;            // List of player IDs 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: class CMessageList 
// Desc: Circular array implementation of a string list 
//----------------------------------------------------------------------------- 
class CMessageList 
{ 
public: 
    // Constructor/Destructor 
    CMessageList(); 
    ~CMessageList(); 
 
    // Accessor methods 
    DWORD   GetNumOfMessages() { return m_dwNumMessages; } 
    BOOL    IsFull() { return m_dwNumMessages == SI_MAX_MESSAGES; } 
    TCHAR*  GetMessage( DWORD dwMessageNum ); 
    TCHAR*  AddMessage( TCHAR* strMessage ); 
 
    // Critical section access 
    VOID Lock() { EnterCriticalSection( &m_csLock ); } 
    VOID Unlock() { LeaveCriticalSection( &m_csLock ); } 
 
private: 
    DWORD m_dwStartIndex;   // Starting index in the circular array 
    DWORD m_dwNumMessages;  // Total number of stored messages 
 
    TCHAR m_rStrMessage[ SI_MAX_MESSAGES ][ 256 ];  // Array of message strings 
 
    CRITICAL_SECTION m_csLock;  // Access lock for multithreading 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: class CSessionInfo 
// Desc: Utility class to track players and groups within a session 
//----------------------------------------------------------------------------- 
class CSessionInfo 
{ 
public: 
    // Constructors/Destructor 
    CSessionInfo( IDirectPlay8Peer*   pPeer ); 
    CSessionInfo( IDirectPlay8Client* pClient ); 
    CSessionInfo( IDirectPlay8Server* pServer ); 
    ~CSessionInfo(); 
 
    // DirectPlay message handler 
    BOOL    MessageHandler( DWORD dwMessageId, PVOID pMsgBuffer ); 
     
    // Dialog display 
    HRESULT ShowDialog( HWND hParent ); 
 
private: 
    // Private initialization 
    VOID    Initialize(); 
    HRESULT InitializeLocalPlayer( DPNID idLocal ); 
     
    // Accessor methods 
    CSIPlayer* FindPlayer( DPNID id ); 
    CSIGroup*  FindGroup( DPNID id ); 
 
    // Message handler helper functions 
    HRESULT CreatePlayer( DPNID id ); 
    HRESULT CreateGroup( DPNID id ); 
 
    HRESULT DestroyPlayer( DPNID id ); 
    HRESULT DestroyGroup( DPNID id ); 
 
    HRESULT AddPlayerToGroup( DPNID idPlayer, DPNID idGroup ); 
    HRESULT RemovePlayerFromGroup( DPNID idPlayer, DPNID idGroup ); 
 
    HRESULT OnPlayerInfoReceive( SI_MSG_PLAYERINFO* pPlayerInfo ); 
    HRESULT OnGroupInfoReceive( SI_MSG_GROUPINFO* pGroupInfo ); 
    HRESULT OnDpInfoChange( DPNID dpnid ); 
 
    // Network communication methods 
    HRESULT SendPlayerInfoToAll( DPNID idPlayer ) { return SendPlayerInfoToPlayer( idPlayer, DPNID_ALL_PLAYERS_GROUP ); } 
    HRESULT SendPlayerInfoToPlayer( DPNID idPlayer, DPNID idTarget ); 
     
    HRESULT SendGroupInfoToAll( DPNID idGroup ) { return SendGroupInfoToPlayer( idGroup, DPNID_ALL_PLAYERS_GROUP ); } 
    HRESULT SendGroupInfoToPlayer( DPNID idGroup, DPNID idTarget ); 
 
    HRESULT SynchronizeWithPlayer( DPNID idPlayer ); 
 
    HRESULT RefreshPlayerInfo( DPNID idPlayer ); 
    HRESULT RefreshGroupInfo( DPNID idGroup ); 
     
    // DirectPlay helper functions 
    HRESULT GetDpPlayerInfo( DPNID dpnid, DPN_PLAYER_INFO** ppPlayerInfo ); 
    HRESULT GetDpGroupInfo( DPNID dpnid, DPN_GROUP_INFO** ppGroupInfo ); 
    HRESULT GetDpAppDesc( DPN_APPLICATION_DESC** ppAppDesc ); 
     
    // Message pump and dialog procedures 
    static  INT_PTR CALLBACK StaticDlgProcMain( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    static  INT_PTR CALLBACK StaticDlgProcPlayers( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    static  INT_PTR CALLBACK StaticDlgProcMessages( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
     
    static  DWORD WINAPI StaticDialogThread( void* pvRef ); 
      
    INT_PTR CALLBACK DlgProcMain( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    INT_PTR CALLBACK DlgProcPlayers( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
    INT_PTR CALLBACK DlgProcMessages( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); 
 
    // Dialog UI methods 
    VOID    PaintDialog( HWND hDlg ); 
     
    HRESULT DisplayPlayer( DPNID idPlayer, HWND hDlg ); 
    HRESULT DisplayGroup( DPNID idGroup, HWND hDlg ); 
     
    HRESULT PrintPlayerInfo( HWND hWndEdit, CSIPlayer* pPlayer ); 
    HRESULT PrintGroupInfo( HWND hWndEdit, CSIGroup* pGroup ); 
 
    // Thread synchronization 
    VOID    Lock() { EnterCriticalSection( &m_csLock ); } 
    VOID    Unlock() { LeaveCriticalSection( &m_csLock ); } 
 
    // Helper functions 
    static  HRESULT SelectListboxItem( HWND hListBox, DWORD dwData, const TCHAR* strItem ); 
    static  VOID    SafeDestroyThread( LPHANDLE phThread );   
 
    // Private member variables 
    CArrayList*        m_pPlayers;    // List of players 
    CArrayList*        m_pGroups;     // List of groups 
 
    CMessageList m_DPlayMessages;     // List of received DirectPlay message strings 
    CMessageList m_AppMessages;       // List of received Application messages 
  
    IDirectPlay8Peer*   m_pPeer;      // Interface for peers 
    IDirectPlay8Client* m_pClient;    // Interface for clients 
    IDirectPlay8Server* m_pServer;    // Interface for servers 
 
    enum TYPE { INVALID, PEER, CLIENT, SERVER } m_eType;       // Specifies the connection type 
 
    DPNID  m_dpnidLocal;              // DPNID for local player 
    DPNID  m_dpnidHost;               // DPNID for host player 
     
    HWND   m_hDlg;                    // Dialog window handle 
    BOOL   m_bDlgValid;               // Invalid flag 
    HANDLE m_hDlgThread;              // Thread handle 
     
    HWND   m_hDlgParent;              // Parent window handle 
    HWND   m_hDlgPlayers;             // Players window handle 
    HWND   m_hDlgMessages;            // Messages window handle 
 
    HFONT  m_hNameFont;               // Player/group name font 
    HFONT  m_hConnectionFont;         // Description box font 
    HICON  m_hPlayerIcon;             // Player icon 
    HICON  m_hGroupIcon;              // Group icon 
 
    CRITICAL_SECTION m_csLock;        // Access lock for multithreading 
}; 
 
 
#endif // _SESSIONINFO_H_