OSDN Git Service

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