home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / directx / duel / comm.c < prev    next >
C/C++ Source or Header  |  1997-07-14  |  7KB  |  363 lines

  1.  /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File:       comm.c
  6.  *  Content:    DirectPlay related code
  7.  *
  8.  *
  9.  ***************************************************************************/
  10. #include "comm.h"
  11. #include "lobby.h"
  12.  
  13. /*
  14.  * Externals
  15.  */
  16. extern LPGUID                        glpGuid;            // duel's guid
  17. extern LPDPLCONNECTION                glpdplConnection;    // connection settings
  18.  
  19. /*
  20.  * Globals
  21.  */
  22. LPDPSESSIONDESC2                    glpdpSD;            // current session description
  23. LPDIRECTPLAY2                        glpDP    = NULL;        // directplay object pointer
  24. LPDIRECTPLAY3A                        glpDP3A    = NULL;
  25.  
  26. /*
  27.  * DPlayClose
  28.  *
  29.  * Wrapper for DirectPlay Close API
  30.  */
  31. HRESULT DPlayClose(void)
  32. {
  33.     HRESULT hr=E_FAIL;
  34.  
  35.     if (glpDP) 
  36.         hr = IDirectPlay2_Close(glpDP);
  37.     
  38.     return hr;
  39. }
  40.  
  41. /*
  42.  * DPlayCreate
  43.  *
  44.  * Wrapper for DirectPlay Create API. Retrieves a DirectPlay2/DirectPlay2A interface
  45.  * based on the UNICODE flag
  46.  * 
  47.  */
  48. HRESULT DPlayCreate(LPVOID lpCon)
  49. {
  50.     HRESULT            hr        = E_FAIL;
  51.     LPDIRECTPLAY3    lpDP3    = NULL;
  52.  
  53.     hr = CoCreateInstance(    &CLSID_DirectPlay, NULL, CLSCTX_INPROC_SERVER,
  54.                             &IID_IDirectPlay3A, (LPVOID *) &glpDP3A );
  55.     
  56.     if ( DP_OK == hr )
  57.     {
  58.         if (lpCon)
  59.         {
  60.             hr = IDirectPlay3_InitializeConnection( glpDP3A, lpCon, 0);
  61.         }
  62.  
  63.         // query for a DirectPlay2(A) interface
  64. #ifdef UNICODE
  65.         hr = IDirectPlay_QueryInterface(glpDP3A,&IID_IDirectPlay2,(LPVOID *)&glpDP);
  66. #else
  67.         hr = IDirectPlay_QueryInterface(glpDP3A,&IID_IDirectPlay2A,(LPVOID *)&glpDP);
  68. #endif
  69.  
  70.     }
  71.  
  72.     return hr;
  73. }
  74.  
  75. /*
  76.  * DPlayCreatePlayer
  77.  *
  78.  * Wrapper for DirectPlay CreatePlayer API. 
  79.  */
  80.  
  81. HRESULT DPlayCreatePlayer(LPDPID lppidID, LPTSTR lptszPlayerName, HANDLE hEvent, 
  82.                           LPVOID lpData, DWORD dwDataSize)
  83. {
  84.     HRESULT hr=E_FAIL;
  85.     DPNAME name;
  86.     
  87.     ZeroMemory(&name,sizeof(name));
  88.     name.dwSize = sizeof(DPNAME);
  89.  
  90. #ifdef UNICODE
  91.     name.lpszShortName = lptszPlayerName;
  92. #else
  93.     name.lpszShortNameA = lptszPlayerName;
  94. #endif
  95.  
  96.     if (glpDP)
  97.         hr = IDirectPlay2_CreatePlayer(glpDP, lppidID, &name, hEvent, lpData, 
  98.                                       dwDataSize, 0);
  99.                                     
  100.     return hr;
  101. }
  102.  
  103. /*
  104.  * DPlayCreateSession
  105.  *
  106.  * Wrapper for DirectPlay CreateSession API.Uses the global application guid (glpGuid).
  107.  */
  108. HRESULT DPlayCreateSession(LPTSTR lptszSessionName)
  109. {
  110.     HRESULT hr = E_FAIL;
  111.     DPSESSIONDESC2 dpDesc;
  112.  
  113.     ZeroMemory(&dpDesc, sizeof(dpDesc));
  114.     dpDesc.dwSize = sizeof(dpDesc);
  115.     dpDesc.dwFlags = DPSESSION_MIGRATEHOST | DPSESSION_KEEPALIVE;
  116.  
  117. #ifdef UNICODE
  118.     dpDesc.lpszSessionName = lptszSessionName;
  119. #else
  120.     dpDesc.lpszSessionNameA = lptszSessionName;
  121. #endif
  122.  
  123.     // set the application guid
  124.     if (glpGuid)
  125.         dpDesc.guidApplication = *glpGuid;
  126.  
  127.     if (glpDP)
  128.         hr = IDirectPlay2_Open(glpDP, &dpDesc, DPOPEN_CREATE);
  129.  
  130.     return hr;
  131. }
  132.  
  133. /*
  134.  * DPlayDestroyPlayer
  135.  * 
  136.  * Wrapper for DirectPlay DestroyPlayer API. 
  137.  */
  138. HRESULT DPlayDestroyPlayer(DPID pid)
  139. {
  140.     HRESULT hr=E_FAIL;
  141.     
  142.     if (glpDP)
  143.         hr = IDirectPlay2_DestroyPlayer(glpDP, pid);
  144.  
  145.     return hr;
  146. }
  147.  
  148. /*
  149.  * DPlayEnumPlayers
  150.  *
  151.  * Wrapper for DirectPlay API EnumPlayers
  152.  */
  153. HRESULT DPlayEnumPlayers(LPGUID lpSessionGuid, LPDPENUMPLAYERSCALLBACK2 lpEnumCallback, 
  154.                          LPVOID lpContext, DWORD dwFlags)
  155. {
  156.     HRESULT hr=E_FAIL;
  157.  
  158.     if (glpDP)
  159.         hr = IDirectPlay2_EnumPlayers(glpDP, lpSessionGuid, lpEnumCallback, lpContext, dwFlags);
  160.  
  161.     return hr;
  162. }
  163.  
  164. /*
  165.  * DPlayEnumSessions
  166.  *
  167.  * Wrapper for DirectPlay EnumSessions API.
  168.  */
  169. HRESULT DPlayEnumSessions(DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumCallback, 
  170.                           LPVOID lpContext, DWORD dwFlags)
  171. {
  172.     HRESULT hr = E_FAIL;
  173.     DPSESSIONDESC2 dpDesc;
  174.  
  175.     ZeroMemory(&dpDesc, sizeof(dpDesc));
  176.     dpDesc.dwSize = sizeof(dpDesc);
  177.     if (glpGuid)
  178.         dpDesc.guidApplication = *glpGuid;
  179.  
  180.     if (glpDP)
  181.         hr = IDirectPlay2_EnumSessions(glpDP, &dpDesc, dwTimeout, lpEnumCallback,
  182.                                         lpContext, dwFlags);
  183.  
  184.  
  185.     return hr;
  186. }
  187.  
  188. /*
  189.  * DPlayGetPlayerData
  190.  * 
  191.  * Wrapper for DirectPlay GetPlayerData API.
  192.  */
  193. HRESULT DPlayGetPlayerData(DPID pid, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags)
  194. {
  195.     HRESULT hr=E_FAIL;
  196.  
  197.     if (glpDP) 
  198.         hr = IDirectPlay2_GetPlayerData(glpDP, pid, lpData, lpdwDataSize, dwFlags);
  199.  
  200.     return hr;
  201. }
  202.  
  203. /*
  204.  * DPlayGetSessionDesc
  205.  *
  206.  * Wrapper for DirectPlay GetSessionDesc API. 
  207.  */
  208. HRESULT DPlayGetSessionDesc(void)
  209. {
  210.     HRESULT hr=E_FAIL;
  211.     DWORD dwSize;
  212.  
  213.     // free old session desc, if any
  214.     if (glpdpSD)
  215.     {
  216.         free(glpdpSD);
  217.         glpdpSD = NULL;
  218.     }
  219.  
  220.     if (glpDP)
  221.     {
  222.         // first get the size for the session desc
  223.         if ((hr = IDirectPlay2_GetSessionDesc(glpDP, NULL, &dwSize)) == DPERR_BUFFERTOOSMALL)
  224.         {
  225.             // allocate memory for it
  226.             glpdpSD = (LPDPSESSIONDESC2) malloc(dwSize);
  227.             if (glpdpSD)
  228.             {
  229.                 // now get the session desc
  230.                 hr = IDirectPlay2_GetSessionDesc(glpDP, glpdpSD, &dwSize);
  231.             }
  232.             else
  233.             {
  234.                 hr = E_OUTOFMEMORY;
  235.             }
  236.         }
  237.     }
  238.  
  239.     return hr;
  240. }
  241.  
  242. /*
  243.  * IsDPlay
  244.  *
  245.  * Returns TRUE if a DirectPlay interface exists, otherwise FALSE.
  246.  */
  247. BOOL IsDPlay(void)
  248. {
  249.     return (glpDP ? TRUE:FALSE);
  250. }
  251.  
  252. /*
  253.  * DPlayOpenSession
  254.  *
  255.  * Wrapper for DirectPlay OpenSession API. 
  256.  */
  257. HRESULT DPlayOpenSession(LPGUID lpSessionGuid)
  258. {
  259.     HRESULT hr = E_FAIL;
  260.     DPSESSIONDESC2 dpDesc;
  261.  
  262.     ZeroMemory(&dpDesc, sizeof(dpDesc));
  263.     dpDesc.dwSize = sizeof(dpDesc);
  264.  
  265.     // set the session guid
  266.     if (lpSessionGuid)
  267.         dpDesc.guidInstance = *lpSessionGuid;
  268.     // set the application guid
  269.     if (glpGuid)
  270.         dpDesc.guidApplication = *glpGuid;
  271.  
  272.     // open it
  273.     if (glpDP)
  274.         hr = IDirectPlay2_Open(glpDP, &dpDesc, DPOPEN_JOIN);
  275.  
  276.     return hr;
  277. }
  278.  
  279.  
  280. /*
  281.  * DPlayReceive
  282.  *
  283.  * Wrapper for DirectPlay Receive API
  284.  */
  285. HRESULT DPlayReceive(LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize)
  286. {
  287.     HRESULT hr = E_FAIL;
  288.  
  289.     if (glpDP)
  290.         hr = IDirectPlay2_Receive(glpDP, lpidFrom, lpidTo, dwFlags, lpData, lpdwDataSize);
  291.     
  292.     return hr;
  293. }
  294.  
  295. /*
  296.  * DPlayRelease
  297.  *
  298.  * Wrapper for DirectPlay Release API.
  299.  */
  300. HRESULT DPlayRelease(void)
  301. {
  302.     HRESULT hr = E_FAIL;
  303.  
  304.     if (glpDP)
  305.     {
  306.         // free session desc, if any
  307.         if (glpdpSD) 
  308.         {
  309.             free(glpdpSD);
  310.             glpdpSD = NULL;
  311.         }
  312.  
  313.         // free connection settings structure, if any (lobby stuff)
  314.         if (glpdplConnection)
  315.         {
  316.             free(glpdplConnection);
  317.             glpdplConnection = NULL;
  318.         }
  319.         // release dplay
  320.         hr = IDirectPlay2_Release(glpDP);
  321.         glpDP = NULL;
  322.     }
  323.  
  324.     if (glpDP3A)
  325.     {
  326.         hr = IDirectPlay3_Release(glpDP3A);
  327.         glpDP3A = NULL;
  328.     }
  329.  
  330.     return hr;
  331. }
  332.  
  333. /*
  334.  * DPlaySend
  335.  * 
  336.  * Wrapper for DirectPlay Send API.
  337.  */
  338. HRESULT DPlaySend(DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize)
  339. {
  340.     HRESULT hr = E_FAIL;
  341.  
  342.     if (glpDP)
  343.         hr = IDirectPlay2_Send(glpDP, idFrom, idTo, dwFlags, lpData, dwDataSize);
  344.     
  345.     return hr;
  346. }
  347.  
  348. /*
  349.  * DPlaySetPlayerData
  350.  *
  351.  * Wrapper for DirectPlay SetPlayerData API
  352.  */
  353. HRESULT DPlaySetPlayerData(DPID pid, LPVOID lpData, DWORD dwSize, DWORD dwFlags)
  354. {
  355.     HRESULT hr=E_FAIL;
  356.  
  357.     if (glpDP)
  358.         hr = IDirectPlay2_SetPlayerData(glpDP, pid, lpData, dwSize, dwFlags);
  359.     
  360.     return hr;
  361. }
  362.  
  363.