OSDN Git Service

CLSIDの変更
[seraphyscrtools/SeraphyScriptTools.git] / ObjectVector.cpp
1 // ObjectVector.cpp : CObjectVector \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2 #include "stdafx.h"
3 #include "SeraphyScriptTools.h"
4 #include "ObjectVector.h"
5 #include "generic.h"
6 #include "CComEnumDynaVARIANT.h"
7
8 /////////////////////////////////////////////////////////////////////////////
9 // CObjectVector
10
11 STDMETHODIMP CObjectVector::CreateVector(IUnknown **punkVal)
12 {
13         if (!punkVal) {
14                 return E_POINTER;
15         }
16         *punkVal = NULL;
17
18         CComObject<CObjectVector>* pVct = NULL;
19         HRESULT hr;
20         if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
21                 return hr;
22         }
23
24         if (FAILED(hr = pVct->QueryInterface(punkVal))) {
25                 delete pVct;
26                 return hr;
27         }
28         return S_OK;
29 }
30
31 STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal)
32 {
33         if (!punkVal) {
34                 return E_POINTER;
35         }
36         *punkVal = NULL;
37
38         CComObject<CObjectVector>* pVct = NULL;
39         HRESULT hr;
40         if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
41                 return hr;
42         }
43         if (FAILED(hr = pVct->QueryInterface(punkVal))) {
44                 delete pVct;
45                 return hr;
46         }
47
48         if (!m_vctVariant.empty()) {
49                 // \8ew\92è\88Ê\92u\82æ\82è\8ew\92è\90\94\82Ì\95¡\8eÊ
50                 CComVariant varIdx, varCount;
51                 long nIdx = 0;
52                 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
53                         nIdx = varIdx.lVal;
54                 }
55
56                 long nCount = -1; // 0\96¢\96\9e\82ð\8ew\92è\82·\82é\82Æ\96\96\94ö\82Ü\82Å\82Ì\83J\83E\83\93\83g\82ð\8cv\8eZ\82·\82é
57                 if (SUCCEEDED(varCount.ChangeType(VT_I4, &count))) {
58                         nCount = varCount.lVal;
59                 }
60
61                 long mx = m_vctVariant.size();
62                 if (nCount < 0 || nIdx + nCount >= mx) {
63                         nCount = mx - nIdx;
64                 }
65
66                 if (nIdx < 0) {
67                         nIdx = 0;
68                 }
69
70                 if (nIdx < mx) {
71                         for (long i = 0; i < nCount; i++) {
72                                 pVct->m_vctVariant.push_back(m_vctVariant[nIdx + i]);
73                         }
74                 }
75         }
76         return S_OK;
77 }
78
79 STDMETHODIMP CObjectVector::Clear()
80 {
81         //VARIANT\82Ì\83N\83\8a\83A\82Æ\98A\91z\94z\97ñ\82Ì\89ð\95ú
82         VariantVector::iterator p = m_vctVariant.begin();
83         while (p != m_vctVariant.end()) {
84                 p->Clear();
85                 p++;
86         }
87         m_vctVariant.clear();
88         return S_OK;
89 }
90
91 STDMETHODIMP CObjectVector::Erase(VARIANT idx, VARIANT count)
92 {
93         // \8ew\92è\88Ê\92u\82æ\82è\8ew\92è\90\94\82Ì\8dí\8f\9c
94         CComVariant varIdx, varCount;
95         long nIdx = 0;
96         if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
97                 nIdx = varIdx.lVal;
98         }
99
100         long nCount = 1;
101         if (SUCCEEDED(varCount.ChangeType(VT_I4, &count))) {
102                 nCount = varCount.lVal;
103         }
104
105         long mx = m_vctVariant.size();
106         if (nCount < 0 || nIdx + nCount >= mx) {
107                 nCount = mx - nIdx;
108         }
109         if (nIdx < 0 || nIdx >= mx || nCount < 0) {
110                 return DISP_E_BADINDEX;
111         }
112
113         m_vctVariant.erase(m_vctVariant.begin() + nIdx, m_vctVariant.begin() + nIdx + nCount);
114         return S_OK;
115 }
116
117 STDMETHODIMP CObjectVector::Push(VARIANT newVal)
118 {
119         HRESULT hr;
120
121         CComVariant tmp;
122         if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
123                 return hr;
124         }
125
126         // \96\96\94ö\82É\92Ç\89Á
127         m_vctVariant.push_back(tmp);
128         return S_OK;
129 }
130
131 STDMETHODIMP CObjectVector::Pop(VARIANT *pVal)
132 {
133         // \96\96\94ö\82ð\8eæ\82è\8fo\82µ
134         ::VariantInit(pVal);
135         if (!m_vctVariant.empty()) {
136                 long mx = m_vctVariant.size();
137                 ::VariantInit(pVal);
138                 ::VariantCopy(pVal, &m_vctVariant[mx - 1]);
139                 m_vctVariant.pop_back();
140         }
141         return S_OK;
142 }
143
144 STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal)
145 {
146         // \8ew\92è\88Ê\92u\82É\91}\93ü
147         CComVariant varIdx;
148         long nIdx = 0;
149         if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
150                 nIdx = varIdx.lVal;
151         }
152
153         long mx = m_vctVariant.size();
154         if (nIdx < 0 || nIdx >= mx) {
155                 return DISP_E_BADINDEX;
156         }
157
158         HRESULT hr;
159
160         CComVariant tmp;
161         if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
162                 return hr;
163         }
164
165         m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp);
166         return S_OK;
167 }
168
169 STDMETHODIMP CObjectVector::get_Value(VARIANT idx, VARIANT *pVal)
170 {
171         ::VariantInit(pVal);
172
173         long nIdx = 0;
174         CComVariant varIdx;
175         if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
176                 nIdx = varIdx.lVal;
177         }
178
179         if (nIdx < 0) {
180                 return DISP_E_BADINDEX;
181         }
182
183         long mx = m_vctVariant.size();
184         if (nIdx < mx) {
185                 // \83x\83N\83^\81[\82Ì\94Í\88Í\93à\82È\82ç\92l\82ð\8eæ\93¾\82·\82é
186                 return ::VariantCopy(pVal, &m_vctVariant[nIdx]);
187         }
188         return S_FALSE;
189 }
190
191 STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal)
192 {
193         long nIdx = 0;
194         CComVariant varIdx;
195         if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
196                 nIdx = varIdx.lVal;
197         }
198         if (nIdx < 0) {
199                 return DISP_E_BADINDEX;
200         }
201
202         long mx = m_vctVariant.size();
203         if (nIdx >= mx) {
204                 // \83x\83N\83^\81[\82Ì\94Í\88Í\82ð\92´\82¦\82Ä\82¢\82ê\82Î\8ag\92£\82µ\81A\8f\89\8aú\89»\82³\82ê\82½VARIANT\82Å\96\84\82ß\82é
205                 VARIANT tmp;
206                 ::VariantInit(&tmp);
207                 while (mx <= nIdx) {
208                         m_vctVariant.push_back(tmp);
209                         mx++;
210                 }
211         }
212
213         HRESULT hr;
214
215         CComVariant tmp;
216         if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
217                 return hr;
218         }
219
220         // \83x\83N\83^\81[\82Ì\94Í\88Í\93à\82È\82ç\92l\82ð\8dÄ\90Ý\92è\82·\82é
221         if (FAILED(hr = ::VariantClear(&m_vctVariant.at(nIdx)))) {
222                 return hr;
223         }
224
225         return ::VariantCopy(&m_vctVariant.at(nIdx), &tmp);
226 }
227
228 STDMETHODIMP CObjectVector::get_Count(long *pVal)
229 {
230         *pVal = m_vctVariant.size();
231         return S_OK;
232 }
233
234 STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal)
235 {
236         typedef CComEnumDynaVARIANT<CObjectVector> CComEnumDynaVector;
237         CComObject<CComEnumDynaVector>* pDyna = NULL;
238         HRESULT hr;
239         if (FAILED(hr = CComObject<CComEnumDynaVector>::CreateInstance(&pDyna))) {
240                 return hr;
241         }
242         pDyna->Init(this, 0);
243         return pDyna->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
244 }
245
246 STDMETHODIMP CObjectVector::Merge(VARIANT unkVal)
247 {
248         HRESULT hr;
249
250         CComVariant varUnk;
251         if (SUCCEEDED(varUnk.ChangeType(VT_UNKNOWN, &unkVal))) {
252                 // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8fê\8d\87
253                 CComPtr<IObjectVector> pVect;
254                 if (FAILED(hr = varUnk.punkVal->QueryInterface(&pVect))) {
255                         // \8ew\92è\8aO\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82Å\82 \82é
256                         return hr;
257                 }
258
259                 long mx;
260                 pVect->get_Count(&mx);
261
262                 long i;
263                 for (i = 0; i < mx; i++) {
264                         CComVariant idx((long)i);
265                         VARIANT ret;
266                         ::VariantInit(&ret);
267                         pVect->get_Value(idx, &ret);
268                         m_vctVariant.push_back(ret);
269                 }
270                 pVect.Release();
271                 return S_OK;
272         }
273
274         VARTYPE vt = VT_EMPTY;
275         SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt);
276         if (!pArray || vt != VT_VARIANT) {
277                 return S_FALSE;
278         }
279
280         long lb = 0;
281         long ub = 0;
282         int dm = SafeArrayGetDim(pArray);
283         SafeArrayGetLBound(pArray, 1, &lb); // \8d\91¤\82Ì\93Y\82¦\8e\9a
284         SafeArrayGetUBound(pArray, 1, &ub);
285         if (dm == 1 && lb == 0 && vt == VT_VARIANT) {
286                 // 1\8e\9f\8c³\94z\97ñ\82Å\81A0\83x\81[\83X\82Ì\83o\83\8a\83A\83\93\83g\94z\97ñ\82Å\82 \82é
287                 int cnt;
288                 long dim[1];
289                 for (cnt = 0; cnt <= ub; cnt++) {
290                         // VARIANT\82Ì\94z\97ñ\82Å\82 \82é
291                         VARIANT tmp;
292                         ::VariantInit(&tmp);
293                         dim[0] = cnt;
294                         SafeArrayGetElement(pArray, dim, &tmp);
295                         m_vctVariant.push_back(tmp);
296                 }//next(\94z\97ñ\82Ì\83\8b\81[\83v)
297         }
298         return S_OK;
299 }
300
301 STDMETHODIMP CObjectVector::MakeArray(VARIANT *pVal)
302 {
303         long mx = m_vctVariant.size();
304         SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, mx);
305         if (!pArray) {
306                 return E_OUTOFMEMORY;
307         }
308
309         HRESULT hr;
310
311         VARIANT* pvars;
312         if (FAILED(hr = SafeArrayAccessData(pArray, (void**)&pvars))) {
313                 SafeArrayDestroy(pArray);
314                 return hr;
315         }
316
317         long cnt = 0;
318         for (cnt = 0; cnt < mx; cnt++) {
319                 VariantInit(&pvars[cnt]);
320                 VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt));
321         }
322         SafeArrayUnaccessData(pArray);
323
324         pArray->fFeatures |= FADF_HAVEVARTYPE;
325         pVal->vt = VT_ARRAY | VT_VARIANT;
326         pVal->parray = pArray;
327         return S_OK;
328 }