OSDN Git Service

セットアップの追加、ヘルプの修正
[seraphyscrtools/SeraphyScriptTools.git] / ObjectMap.cpp
1 // ObjectMap.cpp : CObjectMap \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 "ObjectMap.h"
5 #include "generic.h"
6 #include "profilesection.h"
7 #include "CComEnumDynaVARIANT.h"
8
9 #include <vector>
10
11 /////////////////////////////////////////////////////////////////////////////
12 // CObjectMap
13
14 STDMETHODIMP CObjectMap::FindNear(VARIANT key, VARIANT *pVal)
15 {
16         if (!pVal) {
17                 return E_POINTER;
18         }
19         ::VariantInit(pVal);
20
21         CComVariant varName;
22         HRESULT hr;
23         if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
24                 return hr;
25         }
26
27         VariantMap::iterator p = m_mapVariant.lower_bound(varName.bstrVal);
28         if (p != m_mapVariant.end()) {
29                 // \94­\8c©\82³\82ê\82½
30                 CComVariant findkey((LPCWSTR)p->first);
31                 findkey.ChangeType(VT_BSTR);
32                 return findkey.Detach(pVal);
33         }
34         return S_FALSE;
35 }
36
37 STDMETHODIMP CObjectMap::get_NearValue(VARIANT key, VARIANT *pVal)
38 {
39         if (!pVal) {
40                 return E_POINTER;
41         }
42         ::VariantInit(pVal);
43
44         CComVariant varName;
45         HRESULT hr;
46         if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
47                 return hr;
48         }
49
50         VariantMap::iterator p = m_mapVariant.lower_bound(varName.bstrVal);
51         if (p != m_mapVariant.end()) {
52                 // \94­\8c©\82³\82ê\82½
53                 return VariantCopy(pVal, &p->second);
54         }
55         return S_FALSE;
56 }
57
58 STDMETHODIMP CObjectMap::get_Value(VARIANT key, VARIANT *pVal)
59 {
60         if (!pVal) {
61                 return E_POINTER;
62         }
63         ::VariantInit(pVal);
64
65         CComVariant varName;
66         HRESULT hr;
67         if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
68                 return hr;
69         }
70
71         VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
72         if (p != m_mapVariant.end()) {
73                 // \94­\8c©\82³\82ê\82½
74                 return VariantCopy(pVal, &p->second);
75         }
76
77         // \8c©\82Â\82©\82ç\82È\82©\82Á\82½
78         return S_FALSE;
79 }
80
81 STDMETHODIMP CObjectMap::put_Value(VARIANT key, VARIANT newVal)
82 {
83         CComVariant varName;
84         HRESULT hr;
85         if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
86                 return hr;
87         }
88
89         // ByRef\82ðByVal\82É\95Ï\8a·\83R\83s\81[\82·\82é
90         CComVariant tmp;
91         if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
92                 return hr;
93         }
94
95         VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
96         if (p != m_mapVariant.end()) {
97                 // \8aù\91
98                 p->second = tmp;
99         }
100         else {
101                 // \90V\8bK
102                 m_mapVariant.insert(std::make_pair(varName.bstrVal, tmp));
103         }
104         return S_OK;
105 }
106
107 STDMETHODIMP CObjectMap::get_Count(long *pVal)
108 {
109         if (!pVal) {
110                 return E_POINTER;
111         }
112         *pVal = m_mapVariant.size();
113         return S_OK;
114 }
115
116 STDMETHODIMP CObjectMap::Clear()
117 {
118         //VARIANT\82Ì\83N\83\8a\83A\82Æ\98A\91z\94z\97ñ\82Ì\89ð\95ú
119         VariantMap::iterator p = m_mapVariant.begin();
120         while (p != m_mapVariant.end()) {
121                 p->second.Clear();
122                 p++;
123         }
124         m_mapVariant.clear();
125         return S_OK;
126 }
127
128
129 STDMETHODIMP CObjectMap::Duplicate(IUnknown** punkVal)
130 {
131         if (!punkVal) {
132                 return E_POINTER;
133         }
134         *punkVal = NULL;
135
136         CComObject<CObjectMap>* pMap = NULL;
137         HRESULT hr;
138         if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
139                 return hr;
140         }
141
142         // \8c»\8dÝ\82Ì\83I\83u\83W\83F\83N\83g\82ð\95¡\90»\82·\82é
143         VariantMap::iterator p = m_mapVariant.begin();
144         while (p != m_mapVariant.end()) {
145                 CComVariant key(p->first);
146                 key.ChangeType(VT_BSTR);
147                 pMap->put_Value(key, p->second);
148                 p++;
149         }
150
151         return pMap->QueryInterface(punkVal);
152 }
153
154 STDMETHODIMP CObjectMap::CreateMap(IUnknown** punkVal)
155 {
156         if (!punkVal) {
157                 return E_POINTER;
158         }
159         *punkVal = NULL;
160
161         CComObject<CObjectMap>* pMap = NULL;
162         HRESULT hr;
163         if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
164                 return hr;
165         }
166
167         return pMap->QueryInterface(punkVal);
168 }
169
170 STDMETHODIMP CObjectMap::get__NewEnum(IUnknown **pVal)
171 {
172         if (!pVal) {
173                 return E_POINTER;
174         }
175
176         int mx = m_mapVariant.size();
177         std::vector<CComVariant> pvarArray;
178         pvarArray.resize(mx + 1);
179
180         // \8ai\94[\82³\82ê\82Ä\82¢\82é\96¼\91O\82Ì\97ñ\8b\93
181         VariantMap::iterator p = m_mapVariant.begin();
182         int i = 0;
183         while (p != m_mapVariant.end()) {
184                 pvarArray[i] = p->first;
185                 p++;
186                 i++;
187         }
188
189         // \97ñ\8b\93\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
190         HRESULT hr;
191         CComObject<CComEnumVARIANT>* pCol = NULL;
192         if (FAILED(hr = CComObject<CComEnumVARIANT>::CreateInstance(&pCol))) {
193                 return hr;
194         }
195         pCol->Init(&pvarArray[0], &pvarArray[mx], pCol, AtlFlagCopy);
196
197         return pCol->QueryInterface(pVal);
198 }
199
200 STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVal)
201 {
202         CComVariant varText, varEnv, varResult;
203
204         HRESULT hr;
205         if (FAILED(hr = varText.ChangeType(VT_BSTR, &text))) {
206                 return hr;
207         }
208
209         // \8aÂ\8b«\95Ï\90\94\82ð\93W\8aJ\82·\82é\82©?
210         BOOL bEnv = false;
211         if (SUCCEEDED(varEnv.ChangeType(VT_I2, &env))) {
212                 bEnv = varEnv.iVal;
213         }
214
215         // \83t\83F\81[\83Y1 : \8aÜ\82Ü\82ê\82é\95Ï\90\94\82ð\92²\8d¸\82µ\82Ä\95K\97v\82È\83o\83b\83t\83@\83T\83C\83Y\82ð\8b\81\82ß\82é
216         // \83t\83F\81[\83Y2 ; \8eÀ\8dÛ\82É\93W\8aJ\82·\82é
217         DWORD expandsize = 0;
218         UINT writeidx = 0;
219         LPWSTR pExpandBuffer = NULL;
220         for (int phase = 0; phase < 2; phase++) {
221                 LPCWSTR str = varText.bstrVal;
222                 UINT length = SysStringLen(varText.bstrVal);
223                 UINT idx = 0;
224                 while (idx < length) {
225                         if (str[idx] == '%') {
226                                 // \95Ï\90\94\93W\8aJ\83X\83^\81[\83g
227                                 WCHAR name[MAX_PATH] = {0};
228                                 UINT len = 0;
229                                 // \98A\91±\82·\82é%\82É\82æ\82é%\8e©\90g\82Ì\8fo\97Í\82Å\82 \82é\82©?
230                                 idx++;
231                                 if (str[idx] == '%') {
232                                         if (phase == 0) {
233                                                 idx++;
234                                         }
235                                         else {
236                                                 pExpandBuffer[writeidx++] = str[idx++];
237                                         }
238                                         continue;
239                                 }
240                                 // \95Ï\90\94\96¼\82Ì\8eæ\82è\8fo\82µ
241                                 while (idx < length && str[idx] != '%') {
242                                         name[len++] = str[idx++];
243                                 }
244                                 name[len] = 0;
245                                 if (str[idx] == '%') {
246                                         idx++;
247                                 }
248                                 // \95Ï\90\94\82Ì\8eÀ\8dÝ\83`\83F\83b\83N
249                                 VariantMap::iterator p = m_mapVariant.find(name);
250                                 if (p != m_mapVariant.end()) {
251                                         // \94­\8c©\82³\82ê\82½
252                                         CComVariant tmp;
253                                         if (SUCCEEDED(tmp.ChangeType(VT_BSTR, &p->second))) {
254                                                 if (phase == 0) {
255                                                         // \83t\83F\81[\83Y1\82Í\83T\83C\83Y\82ð\83J\83E\83\93\83g\82·\82é\82¾\82¯
256                                                         expandsize += SysStringLen(tmp.bstrVal);
257                                                 }
258                                                 else {
259                                                         // \83t\83F\81[\83Y2\82Í\8c»\8dÝ\88Ê\92u\82É\95Ï\90\94\82ð\93W\8aJ\82·\82é
260                                                         UINT len = SysStringLen(tmp.bstrVal);
261                                                         for (UINT i = 0; i < len; i++) {
262                                                                 pExpandBuffer[writeidx++] = tmp.bstrVal[i];
263                                                         }
264                                                 }
265                                         }
266                                 }
267                                 else if (bEnv) {
268                                         // \98A\91z\94z\97ñ\82É\82Í\91\8dÝ\82¹\82¸\81A\8aÂ\8b«\95Ï\90\94\93W\8aJ\82ª\8ew\8e¦\82³\82ê\82Ä\82¢\82é
269                                         ATL::CString szName(name);
270                                         TCHAR szBuf[MAX_PATH] = {0};
271                                         DWORD ret = GetEnvironmentVariable(szName, szBuf, MAX_PATH);
272                                         if (ret && ret < MAX_PATH) {
273                                                 // \8aÂ\8b«\95Ï\90\94\82ª\94­\8c©\82³\82ê\82½
274                                                 if (phase == 0) {
275                                                         // \83t\83G\81[\83Y1\82Í\83J\83E\83\93\83g\82·\82é\82¾\82¯
276                                                         expandsize += ret;
277                                                 }
278                                                 else {
279                                                         // \83t\83F\81[\83Y2\82Í\8eÀ\8dÛ\82É\8f\91\82«\8d\9e\82Þ
280                                                         ATL::CStringW wbuf(szBuf);
281                                                         for (UINT i = 0; i < ret; i++) {
282                                                                 pExpandBuffer[writeidx++] = wbuf[i];
283                                                         }
284                                                 }
285                                         }
286                                 }
287                                 continue;
288                         }
289                         if (phase == 0) {
290                                 // \83t\83F\81[\83Y1\82Í\89½\82à\82µ\82È\82¢
291                                 idx++;
292                         }
293                         else {
294                                 // \83t\83F\81[\83Y2\82Í\83o\83b\83t\83@\82É\92Ê\8fí\8f\91\82«\8d\9e\82Ý\82·\82é
295                                 pExpandBuffer[writeidx++] = str[idx++];
296                         }
297                 }
298                 //
299                 if (phase == 0) {
300                         // \83t\83F\81[\83Y1\82ª\8fI\97¹\82µ\82½\82Ì\82Å\83o\83b\83t\83@\83T\83C\83Y\82ª\94»\96¾\82µ\82½\81B
301                         pExpandBuffer = new WCHAR[length + expandsize + 1];
302                 }
303                 else {
304                         // \83t\83F\81[\83Y2\82ª\8fI\97¹\82µ\82½\82Ì\82Å\92u\8a·\82ª\8a®\97¹\82µ\82½
305                         pExpandBuffer[writeidx] = 0;
306                         varResult = (LPCWSTR)pExpandBuffer;
307                         delete[] pExpandBuffer;
308                 }
309         }
310         varResult.Detach(pVal);
311         return S_OK;
312 }
313
314
315 STDMETHODIMP CObjectMap::get_IsExist(VARIANT key, BOOL *pVal)
316 {
317         *pVal = VB_FALSE;
318
319         CComVariant varName;
320         HRESULT hr;
321         if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
322                 return hr;
323         }
324
325         VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
326         if (p != m_mapVariant.end()) {
327                 // \91\8dÝ\82·\82é
328                 *pVal = VB_TRUE;
329         }
330         return S_OK;
331 }
332
333 STDMETHODIMP CObjectMap::Erase(VARIANT key)
334 {
335         CComVariant varName;
336         HRESULT hr;
337         if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
338                 return hr;
339         }
340
341         VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
342         if (p != m_mapVariant.end()) {
343                 m_mapVariant.erase(p);
344         }
345         return S_OK;
346 }
347
348 STDMETHODIMP CObjectMap::LoadProfile(IUnknown *punkVal)
349 {
350         ISeraphyScriptTools_ProfileSection* pSection = NULL;
351         HRESULT hr;
352         if (FAILED(hr = punkVal->QueryInterface(
353                 IID_ISeraphyScriptTools_ProfileSection, (void**)&pSection))) {
354                 return hr;
355         }
356
357         CComVariant varArray;
358         if (FAILED(hr = pSection->GetKeyNames(&varArray))) {
359                 return hr;
360         }
361         if (!(varArray.vt & VT_ARRAY)) {
362                 // Internal Error
363                 return DISP_E_UNKNOWNINTERFACE;
364         }
365
366         // \94z\97ñ\82Ì\8f\87\8f\98\93I\8eæ\93¾
367         long mx = 0;
368         HRESULT ret = SafeArrayGetUBound(varArray.parray, 1, &mx);
369         if (ret != S_OK) {
370                 mx = -1;
371         }
372
373         long idx = 0;
374         while (idx <= mx) {
375                 CComVariant varKey, varVal;
376                 if (SUCCEEDED(SafeArrayGetElement(varArray.parray, &idx, &varKey))) {
377                         if (SUCCEEDED(pSection->get_Value(varKey, &varVal))) {
378                                 put_Value(varKey, varVal);
379                         }
380                 }
381                 idx++;
382         }
383         pSection->Release();
384         return S_OK;
385 }
386
387 STDMETHODIMP CObjectMap::SaveProfile(IUnknown *punkVal)
388 {
389         ISeraphyScriptTools_ProfileSection* pSection = NULL;
390         HRESULT hr;
391         if (FAILED(hr = punkVal->QueryInterface(
392                 IID_ISeraphyScriptTools_ProfileSection, (void**)&pSection))) {
393                 return hr;
394         }
395
396         // \8ai\94[\82³\82ê\82Ä\82¢\82é\96¼\91O\82Ì\97ñ\8b\93
397         VariantMap::iterator p = m_mapVariant.begin();
398         while (p != m_mapVariant.end()) {
399                 CComVariant varTmp;
400                 if (SUCCEEDED(varTmp.ChangeType(VT_BSTR, &p->second))) {
401                         CComVariant varIdx = (BSTR)p->first;
402                         pSection->put_Value(varIdx, varTmp);
403                 }
404                 p++;
405         }
406         pSection->Release();
407         return S_OK;
408 }