Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef _MSPCOLL_H_
      7 #define _MSPCOLL_H_
      8 
      9 template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS>
     10 {
     11 public:
     12   typedef CTapiIfCollection<T> _CTapiCollectionBase;
     13   BEGIN_COM_MAP(_CTapiCollectionBase)
     14     COM_INTERFACE_ENTRY(IDispatch)
     15     COM_INTERFACE_ENTRY(ITCollection)
     16   END_COM_MAP()
     17 private:
     18   int m_nSize;
     19   CComVariant *m_Var;
     20 
     21 public:
     22   CTapiIfCollection(void) : m_nSize(0),m_Var(NULL) { }
     23   HRESULT WINAPI Initialize(DWORD dwSize,T *pBegin,T *pEnd) {
     24     int i;
     25     HRESULT hr;
     26     T *iter;
     27     LOG((MSP_TRACE,"CTapiCollection::Initialize - enter"));
     28     m_nSize = dwSize;
     29     m_Var = new CComVariant[m_nSize];
     30     if(!m_Var) return E_OUTOFMEMORY;
     31     i = 0;
     32     for(iter = pBegin;iter!=pEnd;iter++) {
     33       IDispatch *pDisp = NULL;
     34       hr = (*iter)->QueryInterface(IID_IDispatch,(void**)&pDisp);
     35       if(hr!=S_OK) return hr;
     36       CComVariant& var = m_Var[i];
     37       VariantInit(&var);
     38       var.vt = VT_DISPATCH;
     39       var.pdispVal = pDisp;
     40       i++;
     41     }
     42     LOG((MSP_TRACE,"CTapiCollection::Initialize - exit"));
     43     return S_OK;
     44   }
     45   void FinalRelease() {
     46     LOG((MSP_TRACE,"CTapiCollection::FinalRelease - enter"));
     47     delete [] m_Var;
     48     LOG((MSP_TRACE,"CTapiCollection::FinalRelease - exit"));
     49   }
     50   STDMETHOD(get_Count)(__LONG32 *retval) {
     51     HRESULT hr = S_OK;
     52     LOG((MSP_TRACE,"CTapiCollection::get_Count - enter"));
     53     try {
     54       *retval = m_nSize;
     55     } catch(...) {
     56       hr = E_INVALIDARG;
     57     }
     58     LOG((MSP_TRACE,"CTapiCollection::get_Count - exit"));
     59     return hr;
     60   }
     61   STDMETHOD(get_Item)(__LONG32 Index,VARIANT *retval) {
     62     HRESULT hr = S_OK;
     63     LOG((MSP_TRACE,"CTapiCollection::get_Item - enter"));
     64     if(!retval) return E_POINTER;
     65     try {
     66       VariantInit(retval);
     67     } catch(...) {
     68       hr = E_INVALIDARG;
     69     }
     70     if(hr!=S_OK) return hr;
     71     retval->vt = VT_UNKNOWN;
     72     retval->punkVal = NULL;
     73     if((Index < 1) || (Index > m_nSize)) return E_INVALIDARG;
     74     hr = VariantCopy(retval,&m_Var[Index-1]);
     75     if(FAILED(hr)) {
     76       LOG((MSP_ERROR,"CTapiCollection::get_Item - VariantCopy failed. hr = %lx",hr));
     77       return hr;
     78     }
     79     LOG((MSP_TRACE,"CTapiCollection::get_Item - exit"));
     80     return S_OK;
     81   }
     82   HRESULT WINAPI get__NewEnum(IUnknown **retval) {
     83     HRESULT hr;
     84     LOG((MSP_TRACE,"CTapiCollection::new__Enum - enter"));
     85     if(!retval) return E_POINTER;
     86     *retval = NULL;
     87     typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
     88     enumvar *p;
     89     hr = enumvar::CreateInstance(&p);
     90     if(FAILED(hr)) return hr;
     91     hr = p->Init(&m_Var[0],&m_Var[m_nSize],NULL,AtlFlagCopy);
     92     if(SUCCEEDED(hr)) hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
     93     if(FAILED(hr)) delete p;
     94     LOG((MSP_TRACE,"CTapiCollection::new__Enum - exit"));
     95     return hr;
     96   }
     97 };
     98 
     99 class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl
    100 {
    101 public:
    102   BEGIN_COM_MAP(CTapiBstrCollection)
    103     COM_INTERFACE_ENTRY(IDispatch)
    104     COM_INTERFACE_ENTRY(ITCollection)
    105     COM_INTERFACE_ENTRY(IObjectSafety)
    106   END_COM_MAP()
    107 private:
    108   DWORD m_dwSize;
    109   CComVariant *m_Var;
    110 public:
    111   CTapiBstrCollection(void) : m_dwSize(0),m_Var(NULL) { }
    112   HRESULT WINAPI Initialize(DWORD dwSize,BSTR *pBegin,BSTR *pEnd) {
    113     BSTR *i;
    114     DWORD dw = 0;
    115     LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - enter"));
    116     m_dwSize = dwSize;
    117     m_Var = new CComVariant[m_dwSize];
    118     if(!m_Var) return E_OUTOFMEMORY;
    119     for(i = pBegin;i!=pEnd;i++) {
    120       CComVariant& var = m_Var[dw];
    121       var.vt = VT_BSTR;
    122       var.bstrVal = *i;
    123       dw++;
    124     }
    125     LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - exit"));
    126     return S_OK;
    127   }
    128   STDMETHOD(get_Count)(__LONG32 *retval) {
    129     HRESULT hr = S_OK;
    130     LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - enter"));
    131     try {
    132       *retval = m_dwSize;
    133     } catch(...) {
    134       hr = E_INVALIDARG;
    135     }
    136     LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - exit"));
    137     return hr;
    138   }
    139   STDMETHOD(get_Item)(__LONG32 Index,VARIANT *retval) {
    140     HRESULT hr = S_OK;
    141     LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - enter"));
    142     if(!retval) return E_POINTER;
    143     try {
    144       VariantInit(retval);
    145     } catch(...) {
    146       hr = E_INVALIDARG;
    147     }
    148     if(hr!=S_OK) return hr;
    149     retval->vt = VT_BSTR;
    150     retval->bstrVal = NULL;
    151     if((Index < 1) || ((DWORD) Index > m_dwSize)) return E_INVALIDARG;
    152     hr = VariantCopy(retval,&m_Var[Index-1]);
    153     if(FAILED(hr)) {
    154       LOG((MSP_ERROR,"CTapiBstrCollection::get_Item - VariantCopy failed. hr = %lx",hr));
    155       return hr;
    156     }
    157     LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - exit"));
    158     return S_OK;
    159   }
    160   HRESULT WINAPI get__NewEnum(IUnknown **retval) {
    161     HRESULT hr;
    162     LOG((MSP_TRACE,"CTapiBstrCollection::get__NumEnum - enter"));
    163     if(!retval) return E_POINTER;
    164     *retval = NULL;
    165     typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
    166     enumvar *p = new enumvar;
    167     if(!p) return E_OUTOFMEMORY;
    168     hr = p->Init(&m_Var[0],&m_Var[m_dwSize],NULL,AtlFlagCopy);
    169     if(SUCCEEDED(hr)) {
    170       hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
    171     }
    172     if(FAILED(hr)) delete p;
    173     LOG((MSP_TRACE,"CTapiBstrCollection::get__NewEnum - exit"));
    174     return hr;
    175   }
    176   void FinalRelease() {
    177     LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - enter"));
    178     delete [] m_Var;
    179     LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - exit"));
    180   }
    181 };
    182 #endif
    183