1 // ObjectMap.cpp : CObjectMap
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
3 #include "SeraphyScriptTools.h"
5 #include "profilesection.h"
8 /////////////////////////////////////////////////////////////////////////////
12 STDMETHODIMP CObjectMap::InterfaceSupportsErrorInfo(REFIID riid)
14 static const IID* arr[] =
18 for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
20 if (IsEqualGUID(*arr[i],riid))
26 STDMETHODIMP CObjectMap::FindNear(VARIANT key, VARIANT *pVal)
30 if(varName.ChangeType(VT_BSTR,&key) != S_OK){
31 return DISP_E_TYPEMISMATCH;
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);
43 STDMETHODIMP CObjectMap::get_NearValue(VARIANT key, VARIANT *pVal)
47 if(varName.ChangeType(VT_BSTR,&key) != S_OK){
48 return DISP_E_TYPEMISMATCH;
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);
58 STDMETHODIMP CObjectMap::get_Value(VARIANT key, VARIANT *pVal)
62 if(varName.ChangeType(VT_BSTR,&key) != S_OK){
63 return DISP_E_TYPEMISMATCH;
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);
73 STDMETHODIMP CObjectMap::put_Value(VARIANT key, VARIANT newVal)
76 if(varName.ChangeType(VT_BSTR,&key) != S_OK){
77 return DISP_E_TYPEMISMATCH;
79 VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
80 if(p != m_mapVariant.end()){
82 VariantCopy(&p->second,&newVal);
88 VariantCopy(&tmp,&newVal);
89 m_mapVariant.insert(pair<_bstr_t,VARIANT>(varName.bstrVal,tmp));
94 STDMETHODIMP CObjectMap::get_Count(long *pVal)
96 *pVal = m_mapVariant.size();
100 STDMETHODIMP CObjectMap::Clear()
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);
108 m_mapVariant.clear();
113 STDMETHODIMP CObjectMap::Duplicate(IUnknown** punkVal)
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);
126 pMap->QueryInterface(IID_IUnknown,(void**)punkVal);
131 STDMETHODIMP CObjectMap::CreateMap(IUnknown** punkVal)
134 CComObject<CObjectMap>* pMap = NULL;
135 if(pMap->CreateInstance(&pMap) == S_OK){
136 pMap->QueryInterface(IID_IUnknown,(void**)punkVal);
141 STDMETHODIMP CObjectMap::get__NewEnum(IUnknown **pVal)
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();
148 while(p != m_mapVariant.end()){
149 ::VariantInit(&pvarArray[i]);
150 pvarArray[i].vt = VT_BSTR;
151 pvarArray[i].bstrVal = SysAllocString(p->first);
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){
159 pCol->Init(&pvarArray[0],&pvarArray[mx],pCol,AtlFlagCopy);
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è)
165 ::VariantClear(&pvarArray[i++]);
171 STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVal)
173 CComVariant varText,varEnv,varResult;
174 if(varText.ChangeType(VT_BSTR,&text) != S_OK){
175 return DISP_E_TYPEMISMATCH;
177 //
\8aÂ
\8b«
\95Ï
\90\94\82ð
\93W
\8aJ
\82·
\82é
\82©?
179 if(varEnv.ChangeType(VT_I2,&env) == S_OK){
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;
186 LPWSTR pExpandBuffer = NULL;
187 for(int phase = 0;phase < 2;phase++){
188 LPCWSTR str = varText.bstrVal;
189 UINT length = SysStringLen(varText.bstrVal);
193 //
\95Ï
\90\94\93W
\8aJ
\83X
\83^
\81[
\83g
194 WCHAR name[MAX_PATH] = {0};
196 //
\98A
\91±
\82·
\82é%
\82É
\82æ
\82é%
\8e©
\90g
\82Ì
\8fo
\97Í
\82Å
\82 \82é
\82©?
203 pExpandBuffer[writeidx++] = str[idx++];
207 //
\95Ï
\90\94\96¼
\82Ì
\8eæ
\82è
\8fo
\82µ
208 while(idx < length && str[idx] != '%'){
209 name[len++] = str[idx++];
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½
220 if(tmp.ChangeType(VT_BSTR,&p->second) == S_OK){
222 //
\83t
\83F
\81[
\83Y1
\82Í
\83T
\83C
\83Y
\82ð
\83J
\83E
\83\93\83g
\82·
\82é
\82¾
\82¯
223 expandsize += SysStringLen(tmp.bstrVal);
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);
230 pExpandBuffer[writeidx++] = tmp.bstrVal[i];
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½
245 //
\83t
\83G
\81[
\83Y1
\82Í
\83J
\83E
\83\93\83g
\82·
\82é
\82¾
\82¯
249 //
\83t
\83F
\81[
\83Y2
\82Í
\8eÀ
\8dÛ
\82É
\8f\91\82«
\8d\9e\82Þ
250 MultiByteToWideChar(GetACP(),0,szBuf,ret,wbuf,MAX_PATH);
253 pExpandBuffer[writeidx++] = wbuf[i];
261 //
\83t
\83F
\81[
\83Y1
\82Í
\89½
\82à
\82µ
\82È
\82¢
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++];
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];
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;
281 varResult.Detach(pVal);
286 STDMETHODIMP CObjectMap::get_IsExist(VARIANT key, BOOL *pVal)
290 if(varName.ChangeType(VT_BSTR,&key) != S_OK){
291 return DISP_E_TYPEMISMATCH;
293 VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
294 if(p != m_mapVariant.end()){
301 STDMETHODIMP CObjectMap::Erase(VARIANT key)
304 if(varName.ChangeType(VT_BSTR,&key) != S_OK){
305 return DISP_E_TYPEMISMATCH;
307 VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
308 if(p != m_mapVariant.end()){
309 m_mapVariant.erase(p);
314 STDMETHODIMP CObjectMap::LoadProfile(IUnknown *punkVal)
316 ISeraphyScriptTools_ProfileSection* pSection = NULL;
317 if(punkVal->QueryInterface(IID_ISeraphyScriptTools_ProfileSection,(void**)&pSection) != S_OK){
318 return DISP_E_UNKNOWNINTERFACE;
321 CComVariant varArray;
322 pSection->GetKeyNames(&varArray);
323 if(!(varArray.vt & VT_ARRAY)){
325 return DISP_E_UNKNOWNINTERFACE;
327 //
\94z
\97ñ
\82Ì
\8f\87\8f\98\93I
\8eæ
\93¾
329 HRESULT ret = SafeArrayGetUBound(varArray.parray,1,&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);
347 STDMETHODIMP CObjectMap::SaveProfile(IUnknown *punkVal)
349 ISeraphyScriptTools_ProfileSection* pSection = NULL;
350 if(punkVal->QueryInterface(IID_ISeraphyScriptTools_ProfileSection,(void**)&pSection) != S_OK){
351 return DISP_E_UNKNOWNINTERFACE;
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()){
357 if(varTmp.ChangeType(VT_BSTR,&p->second) == S_OK){
358 CComVariant varIdx = (BSTR)p->first;
359 pSection->put_Value(varIdx,varTmp);