master
  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
  9template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS>
 10{
 11public:
 12  typedef CTapiIfCollection<T> _CTapiCollectionBase;
 13  BEGIN_COM_MAP(_CTapiCollectionBase)
 14    COM_INTERFACE_ENTRY(IDispatch)
 15    COM_INTERFACE_ENTRY(ITCollection)
 16  END_COM_MAP()
 17private:
 18  int m_nSize;
 19  CComVariant *m_Var;
 20
 21public:
 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
 99class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl
100{
101public:
102  BEGIN_COM_MAP(CTapiBstrCollection)
103    COM_INTERFACE_ENTRY(IDispatch)
104    COM_INTERFACE_ENTRY(ITCollection)
105    COM_INTERFACE_ENTRY(IObjectSafety)
106  END_COM_MAP()
107private:
108  DWORD m_dwSize;
109  CComVariant *m_Var;
110public:
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