OSDN Git Service

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