436 lines
9.3 KiB
C++
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;
|
||
|
}
|
||
|
|