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"
6 #include "profilesection.h"
7 #include "CComEnumDynaVARIANT.h"
11 /////////////////////////////////////////////////////////////////////////////
14 STDMETHODIMP CObjectMap::FindNear(VARIANT key, VARIANT *pVal)
23 if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
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);
37 STDMETHODIMP CObjectMap::get_NearValue(VARIANT key, VARIANT *pVal)
46 if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
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);
58 STDMETHODIMP CObjectMap::get_Value(VARIANT key, VARIANT *pVal)
67 if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
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);
77 //
\8c©
\82Â
\82©
\82ç
\82È
\82©
\82Á
\82½
81 STDMETHODIMP CObjectMap::put_Value(VARIANT key, VARIANT newVal)
85 if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
89 // ByRef
\82ðByVal
\82É
\95Ï
\8a·
\83R
\83s
\81[
\82·
\82é
91 if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
95 VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
96 if (p != m_mapVariant.end()) {
102 m_mapVariant.insert(std::make_pair(varName.bstrVal, tmp));
107 STDMETHODIMP CObjectMap::get_Count(long *pVal)
112 *pVal = m_mapVariant.size();
116 STDMETHODIMP CObjectMap::Clear()
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()) {
124 m_mapVariant.clear();
129 STDMETHODIMP CObjectMap::Duplicate(IUnknown** punkVal)
136 CComObject<CObjectMap>* pMap = NULL;
138 if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
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);
151 return pMap->QueryInterface(punkVal);
154 STDMETHODIMP CObjectMap::CreateMap(IUnknown** punkVal)
161 CComObject<CObjectMap>* pMap = NULL;
163 if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
167 return pMap->QueryInterface(punkVal);
170 STDMETHODIMP CObjectMap::get__NewEnum(IUnknown **pVal)
176 int mx = m_mapVariant.size();
177 std::vector<CComVariant> pvarArray;
178 pvarArray.resize(mx + 1);
180 //
\8ai
\94[
\82³
\82ê
\82Ä
\82¢
\82é
\96¼
\91O
\82Ì
\97ñ
\8b\93
181 VariantMap::iterator p = m_mapVariant.begin();
183 while (p != m_mapVariant.end()) {
184 pvarArray[i] = p->first;
189 //
\97ñ
\8b\93\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\90¶
\90¬
191 CComObject<CComEnumVARIANT>* pCol = NULL;
192 if (FAILED(hr = CComObject<CComEnumVARIANT>::CreateInstance(&pCol))) {
195 pCol->Init(&pvarArray[0], &pvarArray[mx], pCol, AtlFlagCopy);
197 return pCol->QueryInterface(pVal);
200 STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVal)
202 CComVariant varText, varEnv, varResult;
205 if (FAILED(hr = varText.ChangeType(VT_BSTR, &text))) {
209 //
\8aÂ
\8b«
\95Ï
\90\94\82ð
\93W
\8aJ
\82·
\82é
\82©?
211 if (SUCCEEDED(varEnv.ChangeType(VT_I2, &env))) {
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;
219 LPWSTR pExpandBuffer = NULL;
220 for (int phase = 0; phase < 2; phase++) {
221 LPCWSTR str = varText.bstrVal;
222 UINT length = SysStringLen(varText.bstrVal);
224 while (idx < length) {
225 if (str[idx] == '%') {
226 //
\95Ï
\90\94\93W
\8aJ
\83X
\83^
\81[
\83g
227 WCHAR name[MAX_PATH] = {0};
229 //
\98A
\91±
\82·
\82é%
\82É
\82æ
\82é%
\8e©
\90g
\82Ì
\8fo
\97Í
\82Å
\82 \82é
\82©?
231 if (str[idx] == '%') {
236 pExpandBuffer[writeidx++] = str[idx++];
240 //
\95Ï
\90\94\96¼
\82Ì
\8eæ
\82è
\8fo
\82µ
241 while (idx < length && str[idx] != '%') {
242 name[len++] = str[idx++];
245 if (str[idx] == '%') {
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½
253 if (SUCCEEDED(tmp.ChangeType(VT_BSTR, &p->second))) {
255 //
\83t
\83F
\81[
\83Y1
\82Í
\83T
\83C
\83Y
\82ð
\83J
\83E
\83\93\83g
\82·
\82é
\82¾
\82¯
256 expandsize += SysStringLen(tmp.bstrVal);
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];
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½
275 //
\83t
\83G
\81[
\83Y1
\82Í
\83J
\83E
\83\93\83g
\82·
\82é
\82¾
\82¯
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];
290 //
\83t
\83F
\81[
\83Y1
\82Í
\89½
\82à
\82µ
\82È
\82¢
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++];
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];
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;
310 varResult.Detach(pVal);
315 STDMETHODIMP CObjectMap::get_IsExist(VARIANT key, BOOL *pVal)
321 if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
325 VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
326 if (p != m_mapVariant.end()) {
333 STDMETHODIMP CObjectMap::Erase(VARIANT key)
337 if (FAILED(hr = varName.ChangeType(VT_BSTR, &key))) {
341 VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
342 if (p != m_mapVariant.end()) {
343 m_mapVariant.erase(p);
348 STDMETHODIMP CObjectMap::LoadProfile(IUnknown *punkVal)
350 ISeraphyScriptTools_ProfileSection* pSection = NULL;
352 if (FAILED(hr = punkVal->QueryInterface(
353 IID_ISeraphyScriptTools_ProfileSection, (void**)&pSection))) {
357 CComVariant varArray;
358 if (FAILED(hr = pSection->GetKeyNames(&varArray))) {
361 if (!(varArray.vt & VT_ARRAY)) {
363 return DISP_E_UNKNOWNINTERFACE;
366 //
\94z
\97ñ
\82Ì
\8f\87\8f\98\93I
\8eæ
\93¾
368 HRESULT ret = SafeArrayGetUBound(varArray.parray, 1, &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);
387 STDMETHODIMP CObjectMap::SaveProfile(IUnknown *punkVal)
389 ISeraphyScriptTools_ProfileSection* pSection = NULL;
391 if (FAILED(hr = punkVal->QueryInterface(
392 IID_ISeraphyScriptTools_ProfileSection, (void**)&pSection))) {
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()) {
400 if (SUCCEEDED(varTmp.ChangeType(VT_BSTR, &p->second))) {
401 CComVariant varIdx = (BSTR)p->first;
402 pSection->put_Value(varIdx, varTmp);