windows-nt/Source/XPSP1/NT/multimedia/directx/dxvb/dx8vb/dplayaddressobj.cpp
2020-09-26 16:20:57 +08:00

436 lines
9.3 KiB
C++

#include "stdafx.h"
#include "Direct.h"
#include "dms.h"
#include "DPlayAddressObj.h"
extern void *g_dxj_DirectPlayAddress;
extern BSTR GUIDtoBSTR(LPGUID);
extern HRESULT DPLAYBSTRtoGUID(LPGUID,BSTR);
extern BOOL IsEmptyString(BSTR szString);
#define SAFE_DELETE(p) { if(p) { delete (p); p=NULL; } }
#define SAFE_RELEASE(p) { __try { if(p) { int i = 0; i = (p)->Release(); DPF1(1,"--DirectPlayAddress SafeRelease (RefCount = %d)\n",i); if (!i) { (p)=NULL;}} } __except(EXCEPTION_EXECUTE_HANDLER) { (p) = NULL;} }
///////////////////////////////////////////////////////////////////
// InternalAddRef
///////////////////////////////////////////////////////////////////
DWORD C_dxj_DirectPlayAddressObject::InternalAddRef(){
DWORD i;
i=CComObjectRoot::InternalAddRef();
DPF2(1,"------ DXVB: DirectPlayAddress8 [%d] AddRef %d \n",creationid,i);
return i;
}
///////////////////////////////////////////////////////////////////
// InternalRelease
///////////////////////////////////////////////////////////////////
DWORD C_dxj_DirectPlayAddressObject::InternalRelease(){
DWORD i;
i=CComObjectRoot::InternalRelease();
DPF2(1,"------ DXVB: DirectPlayAddress8 [%d] Release %d \n",creationid,i);
return i;
}
///////////////////////////////////////////////////////////////////
// C_dxj_DirectPlayAddressObject
///////////////////////////////////////////////////////////////////
C_dxj_DirectPlayAddressObject::C_dxj_DirectPlayAddressObject(){
DPF1(1,"------ DXVB: Constructor Creation DirectPlayAddress8 Object[%d] \n ",g_creationcount);
m__dxj_DirectPlayAddress = NULL;
m_pUserData = NULL;
m_dwUserDataSize = 0;
g_dxj_DirectPlayAddress = (void *)this;
}
///////////////////////////////////////////////////////////////////
// ~C_dxj_DirectPlayAddressObject
///////////////////////////////////////////////////////////////////
C_dxj_DirectPlayAddressObject::~C_dxj_DirectPlayAddressObject()
{
DPF(1,"Entering ~C_dxj_DirectPlayAddressObject destructor \n");
__try {
SAFE_RELEASE(m__dxj_DirectPlayAddress);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
m__dxj_DirectPlayAddress = NULL;
}
SAFE_DELETE(m_pUserData);
}
HRESULT C_dxj_DirectPlayAddressObject::InternalGetObject(IUnknown **pUnk){
*pUnk=(IUnknown*)m__dxj_DirectPlayAddress;
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::InternalSetObject(IUnknown *pUnk){
m__dxj_DirectPlayAddress=(IDirectPlay8Address*)pUnk;
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::BuildFromURL(BSTR SourceURL)
{
HRESULT hr;
__try {
if (FAILED(hr = m__dxj_DirectPlayAddress->BuildFromURLW(SourceURL) ) )
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::Duplicate(I_dxj_DirectPlayAddress **NewAddress)
{
HRESULT hr;
IDirectPlay8Address *lpDup = NULL;
__try {
if (FAILED (hr = m__dxj_DirectPlayAddress->Duplicate(&lpDup) ) )
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayAddress, lpDup, NewAddress);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::Clear()
{
HRESULT hr;
__try {
if (FAILED ( hr = m__dxj_DirectPlayAddress->Clear() ) )
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetURL(BSTR *URL)
{
HRESULT hr;
WCHAR wszUrl[MAX_PATH];
DWORD dwNumChars = 0;
__try {
hr = m__dxj_DirectPlayAddress->GetURLW(NULL, &dwNumChars);
if( FAILED(hr) && hr != DPNERR_BUFFERTOOSMALL)
return hr;
if (FAILED (hr = m__dxj_DirectPlayAddress->GetURLW(&wszUrl[0],&dwNumChars) ) )
return hr;
*URL = SysAllocString(&wszUrl[0]);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetSP(BSTR *guidSP)
{
HRESULT hr;
GUID guidDev;
__try {
if (FAILED (hr = m__dxj_DirectPlayAddress->GetSP(&guidDev ) ) )
return hr;
GUID* pGuid = new GUID;
if (!pGuid)
return E_OUTOFMEMORY;
memcpy( pGuid, &guidDev, sizeof(GUID) );
*guidSP = GUIDtoBSTR(pGuid);
SAFE_DELETE(pGuid);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetUserData(void *UserData, long *lBufferSize)
{
__try {
DPF(1,"-----Entering (DplayAddress) GetUserData call...\n");
//Copy the memory over to our new variable
memcpy(UserData,m_pUserData,m_dwUserDataSize);
lBufferSize = (long*)&m_dwUserDataSize;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::SetSP(BSTR guidSP)
{
HRESULT hr;
GUID guidDev;
__try {
if (guidSP)
{
if (FAILED( hr = DPLAYBSTRtoGUID(&guidDev, guidSP) ) )
return hr;
}
else
return E_INVALIDARG;
if (FAILED ( hr = m__dxj_DirectPlayAddress->SetSP(&guidDev) ))
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::SetUserData(void *UserData, long lDataSize)
{
__try {
DPF(1,"-----Entering (DplayAddress) SetUserData call...\n");
if (m_pUserData)
SAFE_DELETE(m_pUserData);
m_pUserData = (void*)new BYTE[lDataSize];
if (!m_pUserData)
return E_OUTOFMEMORY;
memcpy((void*) m_pUserData, (void*)UserData, lDataSize);
m_dwUserDataSize = (DWORD)lDataSize;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetNumComponents(long *lNumComponents)
{
HRESULT hr;
__try {
if (FAILED (hr = m__dxj_DirectPlayAddress->GetNumComponents((DWORD*) lNumComponents) ) )
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetDevice(BSTR *guidDevice)
{
HRESULT hr;
GUID guidDev;
__try {
if (FAILED (hr = m__dxj_DirectPlayAddress->GetDevice(&guidDev ) ) )
return hr;
GUID* pGuid = new GUID;
if (!pGuid)
return E_OUTOFMEMORY;
memcpy( pGuid, &guidDev, sizeof(GUID) );
*guidDevice = GUIDtoBSTR(pGuid);
SAFE_DELETE(pGuid);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::SetDevice(BSTR guidDevice)
{
HRESULT hr;
GUID guidDev;
__try {
if (guidDevice)
{
if (FAILED( hr = DPLAYBSTRtoGUID(&guidDev, guidDevice) ) )
return hr;
}
else
return E_INVALIDARG;
if (FAILED ( hr = m__dxj_DirectPlayAddress->SetDevice(&guidDev) ))
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::SetEqual(I_dxj_DirectPlayAddress *Address)
{
HRESULT hr;
__try {
DO_GETOBJECT_NOTNULL( IDirectPlay8Address*, lpAddress, Address);
if (FAILED (hr = m__dxj_DirectPlayAddress->SetEqual( lpAddress) ))
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::AddComponentLong(BSTR sComponent, long lValue)
{
HRESULT hr;
WCHAR wszComponent[MAX_PATH];
__try {
if (!IsEmptyString(sComponent)) wcscpy(wszComponent, sComponent);
if (FAILED (hr = m__dxj_DirectPlayAddress->AddComponent(wszComponent, (DWORD*) &lValue, sizeof(DWORD), DPNA_DATATYPE_DWORD ) ) )
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::AddComponentString(BSTR sComponent, BSTR sValue)
{
HRESULT hr;
WCHAR wszComponent[MAX_PATH];
WCHAR wszValue[MAX_PATH];
__try {
if (!IsEmptyString(sComponent)) wcscpy(wszComponent, sComponent);
if (!IsEmptyString(sValue)) wcscpy(wszValue, sValue);
if (FAILED (hr = m__dxj_DirectPlayAddress->AddComponent(wszComponent, (WCHAR*) &wszValue, (((DWORD*)sValue)[-1]) + sizeof(WCHAR), DPNA_DATATYPE_STRING ) ) )
return hr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetComponentLong(BSTR sComponent, long *lValue)
{
HRESULT hr;
WCHAR wszComponent[MAX_PATH];
DWORD dwSize = 0;
DWORD dwDataType = DPNA_DATATYPE_DWORD;
DWORD dwData = 0;
__try {
if (!IsEmptyString(sComponent))
{
wcscpy(wszComponent, sComponent);
}
else
return E_INVALIDARG;
hr = m__dxj_DirectPlayAddress->GetComponentByName(wszComponent, NULL, &dwSize, &dwDataType);
if (FAILED(hr) && (hr != DPNERR_BUFFERTOOSMALL))
return hr;
if (FAILED (hr = m__dxj_DirectPlayAddress->GetComponentByName(wszComponent, &dwData, &dwSize, &dwDataType) ) )
return hr;
*lValue = dwData;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}
HRESULT C_dxj_DirectPlayAddressObject::GetComponentString(BSTR sComponent, BSTR *sValue)
{
HRESULT hr;
WCHAR wszComponent[MAX_PATH];
DWORD dwSize = 0;
DWORD dwDataType = DPNA_DATATYPE_STRING;
WCHAR *wszRet = NULL;
__try {
if (!IsEmptyString(sComponent))
{
wcscpy(wszComponent, sComponent);
}
else
return E_INVALIDARG;
hr = m__dxj_DirectPlayAddress->GetComponentByName(wszComponent, NULL, &dwSize, &dwDataType);
if (FAILED(hr) && (hr != DPNERR_BUFFERTOOSMALL))
return hr;
wszRet = (WCHAR*)new BYTE[dwSize];
if (!wszRet)
return E_OUTOFMEMORY;
hr = m__dxj_DirectPlayAddress->GetComponentByName(wszComponent, wszRet, &dwSize, &dwDataType);
if (FAILED(hr))
return hr;
*sValue = SysAllocString(wszRet);
SAFE_DELETE(wszRet);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return E_FAIL;
}
return S_OK;
}