/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#ifndef _MSPCOLL_H_
#define _MSPCOLL_H_
template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS>
{
public:
typedef CTapiIfCollection<T> _CTapiCollectionBase;
BEGIN_COM_MAP(_CTapiCollectionBase)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ITCollection)
END_COM_MAP()
private:
int m_nSize;
CComVariant *m_Var;
public:
CTapiIfCollection(void) : m_nSize(0),m_Var(NULL) { }
HRESULT WINAPI Initialize(DWORD dwSize,T *pBegin,T *pEnd) {
int i;
HRESULT hr;
T *iter;
LOG((MSP_TRACE,"CTapiCollection::Initialize - enter"));
m_nSize = dwSize;
m_Var = new CComVariant[m_nSize];
if(!m_Var) return E_OUTOFMEMORY;
i = 0;
for(iter = pBegin;iter!=pEnd;iter++) {
IDispatch *pDisp = NULL;
hr = (*iter)->QueryInterface(IID_IDispatch,(void**)&pDisp);
if(hr!=S_OK) return hr;
CComVariant& var = m_Var[i];
VariantInit(&var);
var.vt = VT_DISPATCH;
var.pdispVal = pDisp;
i++;
}
LOG((MSP_TRACE,"CTapiCollection::Initialize - exit"));
return S_OK;
}
void FinalRelease() {
LOG((MSP_TRACE,"CTapiCollection::FinalRelease - enter"));
delete [] m_Var;
LOG((MSP_TRACE,"CTapiCollection::FinalRelease - exit"));
}
STDMETHOD(get_Count)(__LONG32 *retval) {
HRESULT hr = S_OK;
LOG((MSP_TRACE,"CTapiCollection::get_Count - enter"));
try {
*retval = m_nSize;
} catch(...) {
hr = E_INVALIDARG;
}
LOG((MSP_TRACE,"CTapiCollection::get_Count - exit"));
return hr;
}
STDMETHOD(get_Item)(__LONG32 Index,VARIANT *retval) {
HRESULT hr = S_OK;
LOG((MSP_TRACE,"CTapiCollection::get_Item - enter"));
if(!retval) return E_POINTER;
try {
VariantInit(retval);
} catch(...) {
hr = E_INVALIDARG;
}
if(hr!=S_OK) return hr;
retval->vt = VT_UNKNOWN;
retval->punkVal = NULL;
if((Index < 1) || (Index > m_nSize)) return E_INVALIDARG;
hr = VariantCopy(retval,&m_Var[Index-1]);
if(FAILED(hr)) {
LOG((MSP_ERROR,"CTapiCollection::get_Item - VariantCopy failed. hr = %lx",hr));
return hr;
}
LOG((MSP_TRACE,"CTapiCollection::get_Item - exit"));
return S_OK;
}
HRESULT WINAPI get__NewEnum(IUnknown **retval) {
HRESULT hr;
LOG((MSP_TRACE,"CTapiCollection::new__Enum - enter"));
if(!retval) return E_POINTER;
*retval = NULL;
typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
enumvar *p;
hr = enumvar::CreateInstance(&p);
if(FAILED(hr)) return hr;
hr = p->Init(&m_Var[0],&m_Var[m_nSize],NULL,AtlFlagCopy);
if(SUCCEEDED(hr)) hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
if(FAILED(hr)) delete p;
LOG((MSP_TRACE,"CTapiCollection::new__Enum - exit"));
return hr;
}
};
class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl
{
public:
BEGIN_COM_MAP(CTapiBstrCollection)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ITCollection)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
private:
DWORD m_dwSize;
CComVariant *m_Var;
public:
CTapiBstrCollection(void) : m_dwSize(0),m_Var(NULL) { }
HRESULT WINAPI Initialize(DWORD dwSize,BSTR *pBegin,BSTR *pEnd) {
BSTR *i;
DWORD dw = 0;
LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - enter"));
m_dwSize = dwSize;
m_Var = new CComVariant[m_dwSize];
if(!m_Var) return E_OUTOFMEMORY;
for(i = pBegin;i!=pEnd;i++) {
CComVariant& var = m_Var[dw];
var.vt = VT_BSTR;
var.bstrVal = *i;
dw++;
}
LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - exit"));
return S_OK;
}
STDMETHOD(get_Count)(__LONG32 *retval) {
HRESULT hr = S_OK;
LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - enter"));
try {
*retval = m_dwSize;
} catch(...) {
hr = E_INVALIDARG;
}
LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - exit"));
return hr;
}
STDMETHOD(get_Item)(__LONG32 Index,VARIANT *retval) {
HRESULT hr = S_OK;
LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - enter"));
if(!retval) return E_POINTER;
try {
VariantInit(retval);
} catch(...) {
hr = E_INVALIDARG;
}
if(hr!=S_OK) return hr;
retval->vt = VT_BSTR;
retval->bstrVal = NULL;
if((Index < 1) || ((DWORD) Index > m_dwSize)) return E_INVALIDARG;
hr = VariantCopy(retval,&m_Var[Index-1]);
if(FAILED(hr)) {
LOG((MSP_ERROR,"CTapiBstrCollection::get_Item - VariantCopy failed. hr = %lx",hr));
return hr;
}
LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - exit"));
return S_OK;
}
HRESULT WINAPI get__NewEnum(IUnknown **retval) {
HRESULT hr;
LOG((MSP_TRACE,"CTapiBstrCollection::get__NumEnum - enter"));
if(!retval) return E_POINTER;
*retval = NULL;
typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
enumvar *p = new enumvar;
if(!p) return E_OUTOFMEMORY;
hr = p->Init(&m_Var[0],&m_Var[m_dwSize],NULL,AtlFlagCopy);
if(SUCCEEDED(hr)) {
hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
}
if(FAILED(hr)) delete p;
LOG((MSP_TRACE,"CTapiBstrCollection::get__NewEnum - exit"));
return hr;
}
void FinalRelease() {
LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - enter"));
delete [] m_Var;
LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - exit"));
}
};
#endif