| /** | 
 |  * This file has no copyright assigned and is placed in the Public Domain. | 
 |  * This file is part of the w64 mingw-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)(long *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)(long 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)(long *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)(long 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 |