404 lines
6.8 KiB
C++
404 lines
6.8 KiB
C++
|
//-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
||
|
//
|
||
|
// File: xfiledataobj.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "Direct.h"
|
||
|
#include "dms.h"
|
||
|
|
||
|
#include "dxfile.h"
|
||
|
#include "XFileBinaryObj.h"
|
||
|
#include "XFileReferenceObj.h"
|
||
|
#include "XFileDataObj.h"
|
||
|
|
||
|
|
||
|
|
||
|
extern HRESULT BSTRtoGUID(LPGUID,BSTR);
|
||
|
extern BSTR GUIDtoBSTR(LPGUID);
|
||
|
extern BSTR XFILEGUIDtoBSTR(LPGUID);
|
||
|
extern HRESULT XFILEBSTRtoGUID(LPGUID,BSTR);
|
||
|
|
||
|
|
||
|
C_dxj_DirectXFileDataObject::C_dxj_DirectXFileDataObject()
|
||
|
{
|
||
|
m_pXFileData=NULL;
|
||
|
}
|
||
|
C_dxj_DirectXFileDataObject::~C_dxj_DirectXFileDataObject()
|
||
|
{
|
||
|
if (m_pXFileData) m_pXFileData->Release();
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT C_dxj_DirectXFileDataObject::create( IDirectXFileData *pData,I_dxj_DirectXFileData **ret)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
if (!ret) return E_INVALIDARG;
|
||
|
|
||
|
|
||
|
C_dxj_DirectXFileDataObject *c=NULL;
|
||
|
c=new CComObject<C_dxj_DirectXFileDataObject>;
|
||
|
if( c == NULL ) return E_OUTOFMEMORY;
|
||
|
|
||
|
hr=c->InternalSetObject((IUnknown*)pData);
|
||
|
if FAILED(hr){
|
||
|
delete c;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hr=IUNK(c)->QueryInterface(IID_I_dxj_DirectXFileData, (void**)ret);
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT C_dxj_DirectXFileDataObject::InternalSetObject(IUnknown *pUnk)
|
||
|
{
|
||
|
m_pXFileData=(IDirectXFileData*)pUnk;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT C_dxj_DirectXFileDataObject::InternalGetObject(IUnknown **pUnk)
|
||
|
{
|
||
|
*pUnk=(IUnknown*)m_pXFileData;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetName(
|
||
|
/* [retval][out] */ BSTR __RPC_FAR *name)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
USES_CONVERSION;
|
||
|
|
||
|
char szName[1024];
|
||
|
DWORD dwSize=1024;
|
||
|
hr=m_pXFileData->GetName(szName,&dwSize);
|
||
|
if FAILED(hr) return hr;
|
||
|
*name=T2BSTR(szName);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetId(
|
||
|
/* [retval][out] */ BSTR __RPC_FAR *name)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
GUID g;
|
||
|
ZeroMemory(&g,sizeof(GUID));
|
||
|
|
||
|
hr=m_pXFileData->GetId(&g);
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
*name=XFILEGUIDtoBSTR(&g);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetDataSize(
|
||
|
/* [in] */ BSTR name,
|
||
|
/* [retval][out] */ long __RPC_FAR *size)
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
HRESULT hr;
|
||
|
|
||
|
|
||
|
LPVOID pvData=NULL;
|
||
|
DWORD dwSize=0;
|
||
|
|
||
|
if (name[0]==0)
|
||
|
{
|
||
|
hr=m_pXFileData->GetData(NULL,&dwSize,&pvData);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LPSTR szName=W2T(name);
|
||
|
hr=m_pXFileData->GetData(szName,&dwSize,&pvData);
|
||
|
}
|
||
|
|
||
|
*size=dwSize;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetData(
|
||
|
/* [in] */ BSTR name,
|
||
|
/* [in] */ void __RPC_FAR *data)
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
HRESULT hr;
|
||
|
|
||
|
|
||
|
LPVOID pvData=NULL;
|
||
|
DWORD dwSize=0;
|
||
|
|
||
|
if (name[0]==0)
|
||
|
{
|
||
|
hr=m_pXFileData->GetData(NULL,&dwSize,&pvData);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LPSTR szName=W2T(name);
|
||
|
hr=m_pXFileData->GetData(szName,&dwSize,&pvData);
|
||
|
}
|
||
|
|
||
|
__try{
|
||
|
memcpy(data,pvData,dwSize);
|
||
|
}
|
||
|
__except(1,1){
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetType(
|
||
|
/* [retval][out] */ BSTR __RPC_FAR *type)
|
||
|
{
|
||
|
|
||
|
|
||
|
HRESULT hr;
|
||
|
const GUID* pGUID;
|
||
|
|
||
|
hr=m_pXFileData->GetType(&pGUID);
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
*type=XFILEGUIDtoBSTR((GUID*)pGUID);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetNextObject(
|
||
|
/* [retval][out] */ I_dxj_DirectXFileObject __RPC_FAR *__RPC_FAR *type)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IDirectXFileObject *pObj=NULL;
|
||
|
hr=m_pXFileData->GetNextObject(&pObj);
|
||
|
|
||
|
if (hr==DXFILEERR_NOMOREOBJECTS){
|
||
|
*type=NULL;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if FAILED(hr) return hr;
|
||
|
|
||
|
LPUNKNOWN pUnk=NULL;
|
||
|
LPUNKNOWN pCover=NULL;
|
||
|
if (!pObj){
|
||
|
*type=NULL;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
hr=pObj->QueryInterface(IID_IDirectXFileData,(void**)&pUnk);
|
||
|
if SUCCEEDED(hr)
|
||
|
{
|
||
|
pObj->Release();
|
||
|
|
||
|
hr=C_dxj_DirectXFileDataObject::create((IDirectXFileData*)pUnk,(I_dxj_DirectXFileData**)&pCover);
|
||
|
if FAILED(hr)
|
||
|
{
|
||
|
pUnk->Release();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hr=pCover->QueryInterface(IID_I_dxj_DirectXFileObject,(void**)type);
|
||
|
pCover->Release();
|
||
|
if FAILED(hr) pUnk->Release();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
hr=pObj->QueryInterface(IID_IDirectXFileBinary,(void**)&pUnk);
|
||
|
if SUCCEEDED(hr)
|
||
|
{
|
||
|
pObj->Release();
|
||
|
|
||
|
hr=C_dxj_DirectXFileBinaryObject::create((IDirectXFileBinary*)pUnk,(I_dxj_DirectXFileBinary**)&pCover);
|
||
|
if FAILED(hr)
|
||
|
{
|
||
|
pUnk->Release();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hr=pCover->QueryInterface(IID_I_dxj_DirectXFileObject,(void**)type);
|
||
|
pCover->Release();
|
||
|
if FAILED(hr) pUnk->Release();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
hr=pObj->QueryInterface(IID_IDirectXFileDataReference,(void**)&pUnk);
|
||
|
if SUCCEEDED(hr)
|
||
|
{
|
||
|
pObj->Release();
|
||
|
|
||
|
hr=C_dxj_DirectXFileReferenceObject::create((IDirectXFileDataReference*)pUnk,(I_dxj_DirectXFileReference**)&pCover);
|
||
|
if FAILED(hr)
|
||
|
{
|
||
|
pUnk->Release();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hr=pCover->QueryInterface(IID_I_dxj_DirectXFileObject,(void**)type);
|
||
|
pCover->Release();
|
||
|
if FAILED(hr) pUnk->Release();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::AddDataObject(
|
||
|
/* [in] */ I_dxj_DirectXFileData __RPC_FAR *data)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
if (!data) return E_INVALIDARG;
|
||
|
IDirectXFileData *pData=NULL;
|
||
|
|
||
|
//note does not addref
|
||
|
data->InternalGetObject((IUnknown**)&pData);
|
||
|
if (!pData) return E_FAIL;
|
||
|
|
||
|
hr=m_pXFileData->AddDataObject(pData);
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::AddDataReference(
|
||
|
/* [in] */ BSTR name,
|
||
|
/* [in] */ BSTR guid)
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
HRESULT hr;
|
||
|
|
||
|
LPSTR szName=NULL;
|
||
|
GUID *lpGuid=NULL;
|
||
|
GUID g;
|
||
|
ZeroMemory(&g,sizeof(GUID));
|
||
|
|
||
|
if (name[0]!=0)
|
||
|
{
|
||
|
szName=W2T(name);
|
||
|
}
|
||
|
|
||
|
if (guid[0]!=0)
|
||
|
{
|
||
|
hr=XFILEBSTRtoGUID(&g,guid);
|
||
|
if FAILED(hr) return hr;
|
||
|
lpGuid=&g;
|
||
|
}
|
||
|
|
||
|
hr=m_pXFileData->AddDataReference(szName,lpGuid);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::AddBinaryObject(
|
||
|
/* [in] */ BSTR name,
|
||
|
/* [in] */ BSTR guidObject,
|
||
|
/* [in] */ BSTR MimeType,
|
||
|
void __RPC_FAR *data,
|
||
|
/* [in] */ long size)
|
||
|
{
|
||
|
|
||
|
USES_CONVERSION;
|
||
|
|
||
|
HRESULT hr;
|
||
|
GUID gObj;
|
||
|
GUID *lpGuid=NULL;
|
||
|
LPSTR szMime=NULL;
|
||
|
LPSTR szName=NULL;
|
||
|
|
||
|
ZeroMemory(&gObj,sizeof(GUID));
|
||
|
|
||
|
if (!data) return E_INVALIDARG;
|
||
|
|
||
|
|
||
|
if ((guidObject) && (guidObject[0]!=0))
|
||
|
{
|
||
|
hr=XFILEBSTRtoGUID(&gObj,guidObject);
|
||
|
if FAILED(hr) return hr;
|
||
|
lpGuid=&gObj;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if ((name) && (name[0]!=0))
|
||
|
{
|
||
|
szName=W2T(name);
|
||
|
}
|
||
|
|
||
|
|
||
|
if ((MimeType) && (MimeType[0]!=0))
|
||
|
{
|
||
|
szMime=W2T(MimeType);
|
||
|
}
|
||
|
|
||
|
IDirectXFileData *pData=NULL;
|
||
|
|
||
|
|
||
|
__try
|
||
|
{
|
||
|
hr=m_pXFileData->AddBinaryObject(szName,lpGuid,szMime,data,size);
|
||
|
}
|
||
|
__except(1,1)
|
||
|
{
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP C_dxj_DirectXFileDataObject::GetDataFromOffset(
|
||
|
/* [in] */ BSTR name,
|
||
|
/* [in] */ long offset,
|
||
|
/* [in] */ long bytecount,
|
||
|
/* [in] */ void *data)
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
HRESULT hr;
|
||
|
|
||
|
|
||
|
LPVOID pvData=NULL;
|
||
|
DWORD dwSize=0;
|
||
|
|
||
|
if (name[0]==0)
|
||
|
{
|
||
|
hr=m_pXFileData->GetData(NULL,&dwSize,&pvData);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LPSTR szName=W2T(name);
|
||
|
hr=m_pXFileData->GetData(szName,&dwSize,&pvData);
|
||
|
}
|
||
|
|
||
|
__try{
|
||
|
memcpy(data,&((char*)pvData)[offset],bytecount);
|
||
|
}
|
||
|
__except(1,1){
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|