Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

496 lines
12 KiB

/*==========================================================================
*
* Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dplobbya.c
* Content: ANSI Methods for IDirectPlayLobby
*
* History:
* Date By Reason
* ======= ======= ======
* 5/24/96 myronth Created it
* 9/09/96 kipo Pass UNICODE IDirectPlayLobby interface to
* DPL_Connect() instead of ANSI interface. Bug #3790.
* 10/23/96 myronth Added client/server methods
* 12/12/96 myronth Fixed DPLCONNECTION validation
* 2/12/97 myronth Mass DX5 changes
* 2/26/97 myronth #ifdef'd out DPASYNCDATA stuff (removed dependency)
* 5/8/97 myronth Get/SetGroupConnectionSettings, removed dead code
* 9/29/97 myronth Fixed DPLCONNECTION package size bug (#12475)
* 11/5/97 myronth Fixed locking macro
* 11/13/97 myronth Added stop async check for asynchronous Connect (#12541)
* 12/2/97 myronth Added DPL_A_RegisterApplication
* 12/3/97 myronth Changed DPCONNECT flag to DPCONNECT_RETURNSTATUS (#15451)
* 6/25/98 a-peterz Added DPL_A_ConnectEx
***************************************************************************/
#include "dplobpr.h"
//--------------------------------------------------------------------------
//
// Functions
//
//--------------------------------------------------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_Connect"
HRESULT DPLAPI DPL_A_Connect(LPDIRECTPLAYLOBBY lpDPL, DWORD dwFlags,
LPDIRECTPLAY2 * lplpDP2A, IUnknown FAR * lpUnk)
{
HRESULT hr;
LPDIRECTPLAY2 lpDP2;
LPDIRECTPLAYLOBBY lpDPLW;
DPF(7, "Entering DPL_A_Connect");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDPL, dwFlags, lplpDP2A, lpUnk);
ENTER_DPLOBBY();
TRY
{
if( !VALID_WRITE_PTR( lplpDP2A, sizeof(LPDIRECTPLAY2 *) ) )
{
LEAVE_DPLOBBY();
return DPERR_INVALIDPARAMS;
}
}
EXCEPT( EXCEPTION_EXECUTE_HANDLER )
{
LEAVE_DPLOBBY();
DPF_ERR( "Exception encountered validating parameters" );
return DPERR_INVALIDPARAMS;
}
LEAVE_DPLOBBY();
// QueryInterface for the UNICODE DirectPlayLobby interface
hr = lpDPL->lpVtbl->QueryInterface(lpDPL, &IID_IDirectPlayLobby, &lpDPLW);
if(FAILED(hr))
{
DPF_ERR("Unable to QueryInterface for the UNICODE DirectPlayLobby interface");
return (hr);
}
// Use the UNICODE IDirectPlayLobby interface (fixes bug #3790)
hr = DPL_Connect(lpDPLW, dwFlags, &lpDP2, lpUnk);
// release UNICODE IDirectPlayLobby interface
lpDPLW->lpVtbl->Release(lpDPLW);
lpDPLW = NULL;
if(SUCCEEDED(hr))
{
ENTER_DPLOBBY();
// QueryInterface for the ANSI interface
hr = lpDP2->lpVtbl->QueryInterface(lpDP2, &IID_IDirectPlay2A, lplpDP2A);
if(FAILED(hr))
{
DPF_ERR("Unable to QueryInterface for the ANSI DirectPlay interface");
}
// Release the Unicode interface
lpDP2->lpVtbl->Release(lpDP2);
LEAVE_DPLOBBY();
}
return hr;
} // DPL_A_Connect
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_ConnectEx"
HRESULT DPLAPI DPL_A_ConnectEx(LPDIRECTPLAYLOBBY lpDPL, DWORD dwFlags,
REFIID riid, LPVOID * ppvObj, IUnknown FAR * lpUnk)
{
LPDIRECTPLAY2 lpDP2A = NULL;
HRESULT hr;
DPF(7, "Entering DPL_A_ConnectEx");
DPF(9, "Parameters: 0x%08x, 0x%08x, iid, 0x%08x, 0x%08x",
lpDPL, dwFlags, ppvObj, lpUnk);
hr = DPL_A_Connect(lpDPL, dwFlags, &lpDP2A, lpUnk);
if(SUCCEEDED(hr))
{
hr = DP_QueryInterface((LPDIRECTPLAY)lpDP2A, riid, ppvObj);
if(FAILED(hr))
{
DPF_ERRVAL("Failed calling QueryInterface, hr = 0x%08x", hr);
}
// Release the DP2 object
DP_Release((LPDIRECTPLAY)lpDP2A);
}
return hr;
} // DPL_A_ConnectEx
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_EnumLocalApplications"
HRESULT DPLAPI DPL_A_EnumLocalApplications(LPDIRECTPLAYLOBBY lpDPL,
LPDPLENUMLOCALAPPLICATIONSCALLBACK lpCallback,
LPVOID lpContext, DWORD dwFlags)
{
HRESULT hr;
DPF(7, "Entering DPL_A_EnumLocalApplications");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDPL, lpCallback, lpContext, dwFlags);
ENTER_DPLOBBY();
// Set the ANSI flag to TRUE and call the internal function
hr = PRV_EnumLocalApplications(lpDPL, lpCallback, lpContext,
dwFlags, TRUE);
LEAVE_DPLOBBY();
return hr;
} // DPL_A_EnumLocalApplications
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_GetConnectionSettings"
HRESULT DPLAPI DPL_A_GetConnectionSettings(LPDIRECTPLAYLOBBY lpDPL,
DWORD dwGameID, LPVOID lpData, LPDWORD lpdwSize)
{
HRESULT hr;
DPF(7, "Entering DPL_A_GetConnectionSettings");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDPL, dwGameID, lpData, lpdwSize);
ENTER_DPLOBBY();
// Set the ANSI flag to TRUE and call the internal function
hr = PRV_GetConnectionSettings(lpDPL, dwGameID, lpData,
lpdwSize, TRUE);
LEAVE_DPLOBBY();
return hr;
} // DPL_A_GetConnectionSettings
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_GetGroupConnectionSettings"
HRESULT DPLAPI DPL_A_GetGroupConnectionSettings(LPDIRECTPLAY lpDP,
DWORD dwFlags, DPID idGroup, LPVOID lpData, LPDWORD lpdwSize)
{
HRESULT hr;
DPF(7, "Entering DPL_A_GetGroupConnectionSettings");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDP, dwFlags, idGroup, lpData, lpdwSize);
ENTER_LOBBY_ALL();
// Set the ANSI flag to TRUE and call the internal function
hr = PRV_GetGroupConnectionSettings(lpDP, dwFlags, idGroup,
lpData, lpdwSize);
if(SUCCEEDED(hr))
{
// Now convert the DPLCONNECTION to ANSI in place
hr = PRV_ConvertDPLCONNECTIONToAnsiInPlace((LPDPLCONNECTION)lpData,
lpdwSize, 0);
if(FAILED(hr))
{
DPF_ERRVAL("Failed converting DPLCONNECTION struct to ANSI, hr = 0x%08x", hr);
}
}
LEAVE_LOBBY_ALL();
return hr;
} // DPL_A_GetGroupConnectionSettings
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_RegisterApplication"
HRESULT DPLAPI DPL_A_RegisterApplication(LPDIRECTPLAYLOBBY lpDPL,
DWORD dwFlags, LPVOID lpvDesc)
{
LPDPLOBBYI_DPLOBJECT this;
LPDPAPPLICATIONDESC lpDescW = NULL;
HRESULT hr = DP_OK;
LPDPAPPLICATIONDESC lpDesc=(LPDPAPPLICATIONDESC)lpvDesc;
DPF(7, "Entering DPL_A_RegisterApplication");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x",
lpDPL, dwFlags, lpDesc);
ENTER_DPLOBBY();
TRY
{
// We only need to validate the interface pointer here. Everything else
// will get validated by the main function.
if( !VALID_DPLOBBY_INTERFACE( lpDPL ))
{
LEAVE_DPLOBBY();
return DPERR_INVALIDINTERFACE;
}
this = DPLOBJECT_FROM_INTERFACE(lpDPL);
if( !VALID_DPLOBBY_PTR( this ) )
{
LEAVE_DPLOBBY();
return DPERR_INVALIDOBJECT;
}
if(dwFlags)
{
LEAVE_DPLOBBY();
return DPERR_INVALIDFLAGS;
}
// Validate the ApplicationDesc struct
hr = PRV_ValidateDPAPPLICATIONDESC(lpDesc, TRUE);
if(FAILED(hr))
{
LEAVE_DPLOBBY();
DPF_ERR("Invalid DPAPPLICATIONDESC structure");
return hr;
}
}
EXCEPT( EXCEPTION_EXECUTE_HANDLER )
{
LEAVE_DPLOBBY();
DPF_ERR( "Exception encountered validating parameters" );
return DPERR_INVALIDPARAMS;
}
// If we're on an ANSI platform, just write the stuff in the registry.
// If it's not, we need to convert the DPAPPLICATIONDESC struct to Unicode
if(OS_IsPlatformUnicode())
{
// Convert the APPDESC struct to Unicode
hr = PRV_ConvertDPAPPLICATIONDESCToUnicode(lpDesc, &lpDescW);
if(FAILED(hr))
{
DPF_ERRVAL("Unable to convert DPAPPLICATIONDESC to Unicode, hr = 0x%08x", hr);
goto ERROR_REGISTERAPPLICATION;
}
// Write to the registry
hr = PRV_WriteAppDescInRegistryUnicode(lpDescW);
// Free our APPDESC structure
PRV_FreeLocalDPAPPLICATIONDESC(lpDescW);
}
else
{
// Just write to the registry
hr = PRV_WriteAppDescInRegistryAnsi(lpDesc);
}
if(FAILED(hr))
{
DPF_ERRVAL("Failed writing ApplicationDesc to registry, hr = 0x%08x", hr);
}
ERROR_REGISTERAPPLICATION:
LEAVE_DPLOBBY();
return hr;
} // DPL_A_RegisterApplication
#undef DPF_MODNAME
#define DPF_MODNAME "PRV_FreeInternalDPLCONNECTION"
void PRV_FreeInternalDPLCONNECTION(LPDPLCONNECTION lpConn)
{
LPDPSESSIONDESC2 lpsd;
LPDPNAME lpn;
DPF(7, "Entering PRV_FreeInternalDPLCONNECTION");
DPF(9, "Parameters: 0x%08x", lpConn);
if(!lpConn)
return;
if(lpConn->lpSessionDesc)
{
lpsd = lpConn->lpSessionDesc;
if(lpsd->lpszSessionName)
DPMEM_FREE(lpsd->lpszSessionName);
if(lpsd->lpszPassword)
DPMEM_FREE(lpsd->lpszPassword);
DPMEM_FREE(lpsd);
}
if(lpConn->lpPlayerName)
{
lpn = lpConn->lpPlayerName;
if(lpn->lpszShortName)
DPMEM_FREE(lpn->lpszShortName);
if(lpn->lpszLongName)
DPMEM_FREE(lpn->lpszLongName);
DPMEM_FREE(lpn);
}
DPMEM_FREE(lpConn);
} // PRV_FreeInternalDPLCONNECTION
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_RunApplication"
HRESULT DPLAPI DPL_A_RunApplication(LPDIRECTPLAYLOBBY lpDPL, DWORD dwFlags,
LPDWORD lpdwGameID, LPDPLCONNECTION lpConnA,
HANDLE hReceiveEvent)
{
LPDPLCONNECTION lpConnW = NULL;
HRESULT hr;
DPF(7, "Entering DPL_A_RunApplication");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDPL, dwFlags, lpdwGameID, lpConnA, hReceiveEvent);
ENTER_DPLOBBY();
// Validate the DPLCONNECTION structure and it's members
hr = PRV_ValidateDPLCONNECTION(lpConnA, TRUE);
if(FAILED(hr))
{
LEAVE_DPLOBBY();
return hr;
}
// Convert the ANSI DPLCONNECTION structure to Unicode
hr = PRV_ConvertDPLCONNECTIONToUnicode(lpConnA, &lpConnW);
if(FAILED(hr))
{
DPF_ERR("Failed to convert ANSI DPLCONNECTION structure to Unicode (temp)");
LEAVE_DPLOBBY();
return hr;
}
LEAVE_DPLOBBY();
hr = DPL_RunApplication(lpDPL, dwFlags, lpdwGameID, lpConnW,
hReceiveEvent);
ENTER_DPLOBBY();
// Free our temporary Unicode DPLCONNECTION structure
PRV_FreeInternalDPLCONNECTION(lpConnW);
LEAVE_DPLOBBY();
return hr;
} // DPL_A_RunApplication
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_SetConnectionSettings"
HRESULT DPLAPI DPL_A_SetConnectionSettings(LPDIRECTPLAYLOBBY lpDPL,
DWORD dwFlags, DWORD dwGameID,
LPDPLCONNECTION lpConnA)
{
HRESULT hr;
LPDPLCONNECTION lpConnW = NULL;
DPF(7, "Entering DPL_A_SetConnectionSettings");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDPL, dwFlags, dwGameID, lpConnA);
ENTER_DPLOBBY();
// Validate the DPLCONNECTION structure and it's members
hr = PRV_ValidateDPLCONNECTION(lpConnA, TRUE);
if(FAILED(hr))
{
LEAVE_DPLOBBY();
return hr;
}
// Conver the ANSI DPLCONNECTION struct to Unicode
hr = PRV_ConvertDPLCONNECTIONToUnicode(lpConnA, &lpConnW);
if(FAILED(hr))
{
DPF_ERR("Unable to convert DPLCONNECTION structure to Unicode");
LEAVE_DPLOBBY();
return hr;
}
// Set the ANSI flag to TRUE and call the internal function
hr = PRV_SetConnectionSettings(lpDPL, dwFlags, dwGameID, lpConnW);
// Free our temporary Unicode DPLCONNECTION structure
PRV_FreeInternalDPLCONNECTION(lpConnW);
LEAVE_DPLOBBY();
return hr;
} // DPL_A_SetConnectionSettings
#undef DPF_MODNAME
#define DPF_MODNAME "DPL_A_SetGroupConnectionSettings"
HRESULT DPLAPI DPL_A_SetGroupConnectionSettings(LPDIRECTPLAY lpDP,
DWORD dwFlags, DPID idGroup,
LPDPLCONNECTION lpConnA)
{
HRESULT hr;
LPDPLCONNECTION lpConnW = NULL;
DPF(7, "Entering DPL_A_SetGroupConnectionSettings");
DPF(9, "Parameters: 0x%08x, 0x%08x, 0x%08x, 0x%08x",
lpDP, dwFlags, idGroup, lpConnA);
ENTER_LOBBY_ALL();
// Validate the DPLCONNECTION structure and it's members
hr = PRV_ValidateDPLCONNECTION(lpConnA, TRUE);
if(FAILED(hr))
{
LEAVE_LOBBY_ALL();
return hr;
}
// Conver the ANSI DPLCONNECTION struct to Unicode
hr = PRV_ConvertDPLCONNECTIONToUnicode(lpConnA, &lpConnW);
if(FAILED(hr))
{
DPF_ERR("Unable to convert DPLCONNECTION structure to Unicode");
LEAVE_LOBBY_ALL();
return hr;
}
// Set the ANSI flag to TRUE and call the internal function
hr = PRV_SetGroupConnectionSettings(lpDP, dwFlags, idGroup,
lpConnW, TRUE);
// Free our temporary Unicode DPLCONNECTION structure
PRV_FreeInternalDPLCONNECTION(lpConnW);
LEAVE_LOBBY_ALL();
return hr;
} // DPL_A_SetGroupConnectionSettings