SessionInfo.h
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:10k
源码类别:

游戏

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: SessionInfo.h
  3. //
  4. // Desc: Header file for the CSessionInfo utility class. This utility stores
  5. //       player, group, and message information gathered from the application's
  6. //       DirectPlay message handler, and provides a dialog UI to display the
  7. //       data.
  8. //
  9. // Copyright (C) Microsoft Corporation. All Rights Reserved.
  10. //-----------------------------------------------------------------------------
  11. #ifndef _SESSIONINFO_H_
  12. #define _SESSIONINFO_H_
  13. #include <dplay8.h>
  14. #include <commctrl.h>
  15. #include <string.h>
  16. #include <stdio.h>
  17. #include <tchar.h>
  18. #include "dxutil.h"
  19. // Global option defines
  20. #define SI_MAX_MESSAGES     100
  21. #define SI_REFRESH_INTERVAL 3000
  22. // Thread creation is platform-specific
  23. #ifdef UNDER_CE
  24. #define chBEGINTHREADEX CreateThread
  25. #else
  26. #include <process.h>
  27. typedef unsigned (__stdcall *PTHREAD_START) (void *);
  28. #define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, pvParam, fdwCreate, pdwThreadID) ((HANDLE) _beginthreadex( (void *) (psa), (unsigned) (cbStack), (PTHREAD_START) (pfnStartAddr), (void *) (pvParam), (unsigned) (fdwCreate), (unsigned *) (pdwThreadID))) 
  29. #endif // UNDER_CE
  30.  
  31. #ifdef _WIN64
  32. #define SI_HEXVAL TEXT("0x%x")
  33. #else
  34. #define SI_HEXVAL TEXT("0x%I64x")
  35. #endif // _WIN64
  36. #define IDD_SI_MAIN                     15000
  37. #define IDD_SI_PLAYERS                  15001
  38. #define IDD_SI_MESSAGES                 15002
  39. #define IDC_SI_PLAYERS                  16000
  40. #define IDC_SI_GROUPS                   16001
  41. #define IDC_SI_DESCRIPTION              16002
  42. #define IDC_SI_NAME_BORDER              16003
  43. #define IDC_SI_NAME                     16004
  44. #define IDC_SI_MEMBERSHIP               16005
  45. #define IDC_SI_MEMBERSHIP_TEXT          16006
  46. #define IDC_SI_NAME_ICON                16007
  47. #define IDC_SI_DPLAYMSG                 16008
  48. #define IDC_SI_APPMSG                   16009
  49. #define IDC_SI_TAB                      16010
  50. #define SI_REFRESH_TIMER                1
  51. // Message type IDs
  52. #define SI_MSGID_PLAYERINFO     0xDD01             
  53. #define SI_MSGID_GROUPINFO      0xDD02
  54. #define SI_ASYNC_CONTEXT        ((VOID*)0xDD00)
  55. // Change compiler pack alignment to be BYTE aligned
  56. #pragma pack( push, 1 )
  57. // Application message formats
  58. struct SI_MSG
  59. {
  60.     DWORD dwMsgID;
  61. };
  62. struct SI_MSG_PLAYERINFO : public SI_MSG
  63. {
  64.     DPNID dpnID;
  65.     DWORD dwFlags;
  66.     DWORD dwNameLength;
  67. };
  68. struct SI_MSG_GROUPINFO : public SI_MSG
  69. {
  70.     DPNID dpnID;
  71.     DWORD dwNameLength;
  72. };
  73. #pragma pack( pop )
  74. //-----------------------------------------------------------------------------
  75. // Name: class CSIPlayer
  76. // Desc: Describes a DirectPlay player.
  77. //-----------------------------------------------------------------------------
  78. class CSIPlayer
  79. {
  80. public:
  81.     // Constructors/Destructors
  82.     CSIPlayer( DPNID dpnid );
  83.     
  84.     // Member variables
  85.     DPNID id;              // Unique DPNID value
  86.     BOOL  bIsHost;         // Host flag
  87.     TCHAR strName[ 256 ];  // Name string
  88.     TCHAR strURL[ 256 ];   // URL string
  89. };
  90. //-----------------------------------------------------------------------------
  91. // Name: class CSIGroup
  92. // Desc: Describes a DirectPlay group. Contains a DPNID list of member players.
  93. //-----------------------------------------------------------------------------
  94. class CSIGroup
  95. {
  96. public:
  97.     // Constructors/Destructors
  98.     CSIGroup( DPNID dpnid );
  99.     ~CSIGroup();
  100.    
  101.     HRESULT AddMember( DPNID id );
  102.     HRESULT RemoveMember( DPNID id );
  103.     BOOL    IsMember( DPNID id ) { return pMembers->Contains( &id ); }
  104.     // Member variables
  105.     DPNID       id;                  // Unique DPNID value
  106.     TCHAR       strName[ 256 ];      // Name string
  107.     CArrayList* pMembers;            // List of player IDs
  108. };
  109. //-----------------------------------------------------------------------------
  110. // Name: class CMessageList
  111. // Desc: Circular array implementation of a string list
  112. //-----------------------------------------------------------------------------
  113. class CMessageList
  114. {
  115. public:
  116.     // Constructor/Destructor
  117.     CMessageList();
  118.     ~CMessageList();
  119.     // Accessor methods
  120.     DWORD   GetNumOfMessages() { return m_dwNumMessages; }
  121.     BOOL    IsFull() { return m_dwNumMessages == SI_MAX_MESSAGES; }
  122.     TCHAR*  GetMessage( DWORD dwMessageNum );
  123.     TCHAR*  AddMessage( LPCTSTR strMessage );
  124.     // Critical section access
  125.     VOID Lock() { EnterCriticalSection( &m_csLock ); }
  126.     VOID Unlock() { LeaveCriticalSection( &m_csLock ); }
  127. private:
  128.     DWORD m_dwStartIndex;   // Starting index in the circular array
  129.     DWORD m_dwNumMessages;  // Total number of stored messages
  130.     TCHAR m_rStrMessage[ SI_MAX_MESSAGES ][ 256 ];  // Array of message strings
  131.     CRITICAL_SECTION m_csLock;  // Access lock for multithreading
  132. };
  133. //-----------------------------------------------------------------------------
  134. // Name: class CSessionInfo
  135. // Desc: Utility class to track players and groups within a session
  136. //-----------------------------------------------------------------------------
  137. class CSessionInfo
  138. {
  139. public:
  140.     // Constructors/Destructor
  141.     CSessionInfo( IDirectPlay8Peer*   pPeer );
  142.     CSessionInfo( IDirectPlay8Client* pClient );
  143.     CSessionInfo( IDirectPlay8Server* pServer );
  144.     ~CSessionInfo();
  145.     // DirectPlay message handler
  146.     BOOL    MessageHandler( DWORD dwMessageId, PVOID pMsgBuffer );
  147.     
  148.     // Dialog display
  149.     HRESULT ShowDialog( HWND hParent );
  150. private:
  151.     // Private initialization
  152.     VOID    Initialize();
  153.     HRESULT InitializeLocalPlayer( DPNID idLocal );
  154.     
  155.     // Accessor methods
  156.     CSIPlayer* FindPlayer( DPNID id );
  157.     CSIGroup*  FindGroup( DPNID id );
  158.     // Message handler helper functions
  159.     HRESULT CreatePlayer( DPNID id );
  160.     HRESULT CreateGroup( DPNID id );
  161.     HRESULT DestroyPlayer( DPNID id );
  162.     HRESULT DestroyGroup( DPNID id );
  163.     HRESULT AddPlayerToGroup( DPNID idPlayer, DPNID idGroup );
  164.     HRESULT RemovePlayerFromGroup( DPNID idPlayer, DPNID idGroup );
  165.     HRESULT OnPlayerInfoReceive( SI_MSG_PLAYERINFO* pPlayerInfo );
  166.     HRESULT OnGroupInfoReceive( SI_MSG_GROUPINFO* pGroupInfo );
  167.     HRESULT OnDpInfoChange( DPNID dpnid );
  168.     // Network communication methods
  169.     HRESULT SendPlayerInfoToAll( DPNID idPlayer ) { return SendPlayerInfoToPlayer( idPlayer, DPNID_ALL_PLAYERS_GROUP ); }
  170.     HRESULT SendPlayerInfoToPlayer( DPNID idPlayer, DPNID idTarget );
  171.     
  172.     HRESULT SendGroupInfoToAll( DPNID idGroup ) { return SendGroupInfoToPlayer( idGroup, DPNID_ALL_PLAYERS_GROUP ); }
  173.     HRESULT SendGroupInfoToPlayer( DPNID idGroup, DPNID idTarget );
  174.     HRESULT SynchronizeWithPlayer( DPNID idPlayer );
  175.     HRESULT RefreshPlayerInfo( DPNID idPlayer );
  176.     HRESULT RefreshGroupInfo( DPNID idGroup );
  177.     
  178.     // DirectPlay helper functions
  179.     HRESULT GetDpPlayerInfo( DPNID dpnid, DPN_PLAYER_INFO** ppPlayerInfo );
  180.     HRESULT GetDpGroupInfo( DPNID dpnid, DPN_GROUP_INFO** ppGroupInfo );
  181.     HRESULT GetDpAppDesc( DPN_APPLICATION_DESC** ppAppDesc );
  182.     
  183.     // Message pump and dialog procedures
  184.     static  INT_PTR CALLBACK StaticDlgProcMain( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
  185.     static  INT_PTR CALLBACK StaticDlgProcPlayers( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
  186.     static  INT_PTR CALLBACK StaticDlgProcMessages( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
  187.     
  188.     static  DWORD WINAPI StaticDialogThread( void* pvRef );
  189.      
  190.     INT_PTR CALLBACK DlgProcMain( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
  191.     INT_PTR CALLBACK DlgProcPlayers( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
  192.     INT_PTR CALLBACK DlgProcMessages( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
  193.     // Dialog UI methods
  194.     VOID    PaintDialog( HWND hDlg );
  195.     
  196.     HRESULT DisplayPlayer( DPNID idPlayer, HWND hDlg );
  197.     HRESULT DisplayGroup( DPNID idGroup, HWND hDlg );
  198.     
  199.     HRESULT PrintPlayerInfo( HWND hWndEdit, CSIPlayer* pPlayer );
  200.     HRESULT PrintGroupInfo( HWND hWndEdit, CSIGroup* pGroup );
  201.     // Thread synchronization
  202.     VOID    Lock() { EnterCriticalSection( &m_csLock ); }
  203.     VOID    Unlock() { LeaveCriticalSection( &m_csLock ); }
  204.     // Helper functions
  205.     static  HRESULT SelectListboxItem( HWND hListBox, DWORD dwData, const TCHAR* strItem );
  206.     static  VOID    SafeDestroyThread( LPHANDLE phThread );  
  207.     // Private member variables
  208.     CArrayList*        m_pPlayers;    // List of players
  209.     CArrayList*        m_pGroups;     // List of groups
  210.     CMessageList m_DPlayMessages;     // List of received DirectPlay message strings
  211.     CMessageList m_AppMessages;       // List of received Application messages
  212.  
  213.     IDirectPlay8Peer*   m_pPeer;      // Interface for peers
  214.     IDirectPlay8Client* m_pClient;    // Interface for clients
  215.     IDirectPlay8Server* m_pServer;    // Interface for servers
  216.     enum TYPE { INVALID, PEER, CLIENT, SERVER } m_eType;       // Specifies the connection type
  217.     DPNID  m_dpnidLocal;              // DPNID for local player
  218.     DPNID  m_dpnidHost;               // DPNID for host player
  219.     
  220.     HWND   m_hDlg;                    // Dialog window handle
  221.     BOOL   m_bDlgValid;               // Invalid flag
  222.     HANDLE m_hDlgThread;              // Thread handle
  223.     
  224.     HWND   m_hDlgParent;              // Parent window handle
  225.     HWND   m_hDlgPlayers;             // Players window handle
  226.     HWND   m_hDlgMessages;            // Messages window handle
  227.     HFONT  m_hNameFont;               // Player/group name font
  228.     HFONT  m_hConnectionFont;         // Description box font
  229.     HICON  m_hPlayerIcon;             // Player icon
  230.     HICON  m_hGroupIcon;              // Group icon
  231.     CRITICAL_SECTION m_csLock;        // Access lock for multithreading
  232. };
  233. #endif // _SESSIONINFO_H_