source: Daodan/MSYS2/mingw32/i686-w64-mingw32/include/mspcoll.h@ 1186

Last change on this file since 1186 was 1166, checked in by rossy, 3 years ago

Daodan: Replace MinGW build env with an up-to-date MSYS2 env

File size: 5.7 KB
Line 
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
Note: See TracBrowser for help on using the repository browser.