 Issue 5979857238360064:
  Issues #1163, #1173 - refactor CPluginUserSettings  (Closed)
    
  
    Issue 5979857238360064:
  Issues #1163, #1173 - refactor CPluginUserSettings  (Closed) 
  | Left: | ||
| Right: | 
| OLD | NEW | 
|---|---|
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" | 
| 2 #include "PluginUserSettings.h" | 2 #include "PluginUserSettings.h" | 
| 3 #include <algorithm> | 3 #include <algorithm> | 
| 4 #include "PluginSettings.h" | 4 #include "PluginSettings.h" | 
| 5 #include "PluginClient.h" | 5 #include "PluginClient.h" | 
| 6 #include "../shared/Dictionary.h" | 6 #include "../shared/Dictionary.h" | 
| 7 | 7 #include <unordered_map> | 
| 8 static const CString s_GetMessage = L"GetMessage"; | 8 | 
| 9 static const CString s_GetLanguageCount = L"GetLanguageCount"; | 9 namespace | 
| 10 static const CString s_GetLanguageByIndex = L"GetLanguageByIndex"; | 10 { | 
| 11 static const CString s_GetLanguageTitleByIndex = L"GetLanguageTitleByIndex"; | 11 enum UserSettingsMethods | 
| 12 static const CString s_SetLanguage = L"SetLanguage"; | 12 { | 
| 13 static const CString s_GetLanguage = L"GetLanguage"; | 13 dispatchID_GetMessage = 0, | 
| 14 static const CString s_GetWhitelistDomains = L"GetWhitelistDomains"; | 14 dispatchID_GetLanguageCount, | 
| 15 static const CString s_AddWhitelistDomain = L"AddWhitelistDomain"; | 15 dispatchID_GetLanguageByIndex, | 
| 16 static const CString s_RemoveWhitelistDomain = L"RemoveWhitelistDomain"; | 16 dispatchID_GetLanguageTitleByIndex, | 
| 17 static const CString s_GetAppLocale = L"GetAppLocale"; | 17 dispatchID_SetLanguage, | 
| 18 static const CString s_GetDocumentationLink = L"GetDocumentationLink"; | 18 dispatchID_GetLanguage, | 
| 19 static const CString s_IsAcceptableAdsEnabled = L"IsAcceptableAdsEnabled"; | 19 dispatchID_GetWhitelistDomains, | 
| 20 static const CString s_SetAcceptableAdsEnabled = L"SetAcceptableAdsEnabled"; | 20 dispatchID_AddWhitelistDomain, | 
| 21 static const CString s_IsUpdate = L"IsUpdate"; | 21 dispatchID_RemoveWhitelistDomain, | 
| 22 static const CString s_Methods[] = {s_GetMessage, s_GetLanguageCount, s_GetLangu ageByIndex, s_GetLanguageTitleByIndex, s_SetLanguage, s_GetLanguage, s_GetWhitel istDomains, s_AddWhitelistDomain, s_RemoveWhitelistDomain, s_GetAppLocale, s_Get DocumentationLink, s_IsAcceptableAdsEnabled, s_SetAcceptableAdsEnabled, s_IsUpda te}; | 22 dispatchID_GetAppLocale, | 
| 23 | 23 dispatchID_GetDocumentationLink, | 
| 24 CPluginUserSettings::CPluginUserSettings() | 24 dispatchID_IsAcceptableAdsEnabled, | 
| 25 { | 25 dispatchID_SetAcceptableAdsEnabled, | 
| 26 } | 26 dispatchID_IsUpdate, | 
| 27 | 27 }; | 
| 28 | 28 | 
| 29 /** | |
| 30 * Auxiliary for static initialization | |
| 31 */ | |
| 32 std::unordered_map<std::wstring, DISPID> InitMethodIndex() | |
| 33 { | |
| 34 std::unordered_map<std::wstring, DISPID> m; | |
| 35 // try-block for safety during static initialization | |
| 36 try | |
| 37 { | |
| 38 m.emplace(L"GetMessage", dispatchID_GetMessage); | |
| 39 m.emplace(L"GetLanguageCount", dispatchID_GetLanguageCount); | |
| 40 m.emplace(L"GetLanguageByIndex", dispatchID_GetLanguageByIndex); | |
| 41 m.emplace(L"GetLanguageTitleByIndex", dispatchID_GetLanguageTitleByIndex); | |
| 42 m.emplace(L"SetLanguage", dispatchID_SetLanguage); | |
| 43 m.emplace(L"GetLanguage", dispatchID_GetLanguage); | |
| 44 m.emplace(L"GetWhitelistDomains", dispatchID_GetWhitelistDomains); | |
| 45 m.emplace(L"AddWhitelistDomain", dispatchID_AddWhitelistDomain); | |
| 46 m.emplace(L"RemoveWhitelistDomain", dispatchID_RemoveWhitelistDomain); | |
| 47 m.emplace(L"GetAppLocale", dispatchID_GetAppLocale); | |
| 48 m.emplace(L"GetDocumentationLink", dispatchID_GetDocumentationLink); | |
| 49 m.emplace(L"IsAcceptableAdsEnabled", dispatchID_IsAcceptableAdsEnabled); | |
| 50 m.emplace(L"SetAcceptableAdsEnabled", dispatchID_SetAcceptableAdsEnabled); | |
| 51 m.emplace(L"IsUpdate", dispatchID_IsUpdate); | |
| 52 } | |
| 53 catch(...) | |
| 54 { | |
| 55 } | |
| 56 return m; | |
| 57 } | |
| 58 | |
| 59 /** | |
| 60 * Static map from method names to dispatch identifiers. | |
| 61 */ | |
| 62 std::unordered_map<std::wstring, DISPID> methodIndex = InitMethodIndex(); | |
| 63 } | |
| 64 | |
| 65 // ENTRY POINT | |
| 29 STDMETHODIMP CPluginUserSettings::QueryInterface(REFIID riid, void **ppvObj) | 66 STDMETHODIMP CPluginUserSettings::QueryInterface(REFIID riid, void **ppvObj) | 
| 30 { | 67 { | 
| 31 if (IID_IUnknown == riid || IID_IDispatch == riid) | 68 if (!ppvObj) | 
| 32 { | 69 { | 
| 33 *ppvObj = (LPVOID)this; | 70 return E_POINTER; | 
| 34 return NOERROR; | 71 } | 
| 35 } | 72 if (riid == IID_IUnknown || riid == IID_IDispatch) // GUID comparison does not throw | 
| 36 | 73 { | 
| 74 *ppvObj = static_cast<void *>(this); | |
| 75 return S_OK; | |
| 76 } | |
| 37 return E_NOINTERFACE; | 77 return E_NOINTERFACE; | 
| 38 } | 78 } | 
| 39 | 79 | 
| 40 | 80 /** | 
| 41 /* | 81 * \par Limitation | 
| 42 Since CPluginUserSettings is not allocated on the heap, 'AddRef' and 'Release' d on't need reference counting, | 82 * CPluginUserSettings is not allocated on the heap. | 
| 43 because CPluginUserSettings won't be deleted when reference counter == 0 | 83 * It appears only as a member variable in CPluginTabBase. | 
| 44 */ | 84 * 'AddRef' and 'Release' don't need reference counting because they don't pre sent COM factories. | 
| 45 | 85 */ | 
| 46 ULONG __stdcall CPluginUserSettings::AddRef() | 86 ULONG __stdcall CPluginUserSettings::AddRef() | 
| 47 { | 87 { | 
| 48 return 1; | 88 return 1; | 
| 49 } | 89 } | 
| 50 | 90 | 
| 51 | |
| 52 ULONG __stdcall CPluginUserSettings::Release() | 91 ULONG __stdcall CPluginUserSettings::Release() | 
| 53 { | 92 { | 
| 54 return 1; | 93 return 1; | 
| 55 } | 94 } | 
| 56 | 95 | 
| 57 | |
| 58 STDMETHODIMP CPluginUserSettings::GetTypeInfoCount(UINT* pctinfo) | 96 STDMETHODIMP CPluginUserSettings::GetTypeInfoCount(UINT* pctinfo) | 
| 59 { | 97 { | 
| 60 return E_NOTIMPL; | 98 return E_NOTIMPL; | 
| 61 } | 99 } | 
| 62 | 100 | 
| 63 | |
| 64 STDMETHODIMP CPluginUserSettings::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo* * pptinfo) | 101 STDMETHODIMP CPluginUserSettings::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo* * pptinfo) | 
| 65 { | 102 { | 
| 66 return E_NOTIMPL; | 103 return E_NOTIMPL; | 
| 67 } | 104 } | 
| 68 | 105 | 
| 69 | 106 /** | 
| 70 STDMETHODIMP CPluginUserSettings::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames , UINT cNames, LCID lcid, DISPID* rgdispid) | 107 * \par Limitation | 
| 71 { | 108 * The specification for this method in IDispatch maps an array of names to an array of identifiers. | 
| 72 if (!rgszNames) | 109 * This version only supports single-element arrays, which is enough for IE's JavaScript interpreter. | 
| 73 return E_POINTER; | 110 */ | 
| 74 | 111 STDMETHODIMP CPluginUserSettings::GetIDsOfNames(REFIID, LPOLESTR* name, UINT cou nt, LCID, DISPID* id) | 
| 75 if (!rgdispid) | 112 { | 
| 76 return E_POINTER; | 113 try | 
| 77 | 114 { | 
| 78 if (1 != cNames) | 115 if (!name || !id) | 
| 116 { | |
| 117 return E_POINTER; | |
| 118 } | |
| 119 if (count != 1) | |
| 120 { | |
| 121 return E_FAIL; | |
| 122 } | |
| 123 auto item = methodIndex.find(*name); // unordered_map::find is not declared noexcept | |
| 124 if (item==methodIndex.end()) | |
| 125 { | |
| 126 return DISP_E_UNKNOWNNAME; | |
| 127 } | |
| 128 *id = item->second; | |
| 129 } | |
| 130 catch (...) | |
| 131 { | |
| 79 return E_FAIL; | 132 return E_FAIL; | 
| 80 | 133 } | 
| 81 size_t indxMethod = 0; | |
| 82 for (; indxMethod < countof(s_Methods); indxMethod++) | |
| 83 { | |
| 84 if (*rgszNames == s_Methods[indxMethod]) | |
| 85 break; | |
| 86 } | |
| 87 | |
| 88 if (indxMethod == countof(s_Methods)) | |
| 89 return DISP_E_MEMBERNOTFOUND; | |
| 90 | |
| 91 *rgdispid = static_cast<DISPID>(indxMethod); | |
| 92 | |
| 93 return S_OK; | 134 return S_OK; | 
| 94 } | 135 } | 
| 95 | 136 | 
| 96 | |
| 97 static CString sGetLanguage() | |
| 98 { | |
| 99 CPluginSettings* settings = CPluginSettings::GetInstance(); | |
| 100 return settings->GetSubscription(); | |
| 101 } | |
| 102 | |
| 103 | |
| 104 CStringW sGetMessage(const CString& section, const CString& key) | 137 CStringW sGetMessage(const CString& section, const CString& key) | 
| 105 { | 138 { | 
| 106 Dictionary* dictionary = Dictionary::GetInstance(); | 139 Dictionary* dictionary = Dictionary::GetInstance(); | 
| 107 return CStringW(dictionary->Lookup(std::string(CW2A(section)), std::string(CW2 A(key))).c_str()); | 140 return CStringW(dictionary->Lookup(std::string(CW2A(section)), std::string(CW2 A(key))).c_str()); | 
| 108 } | 141 } | 
| 109 | 142 | 
| 110 std::wstring sGetMessage(const std::string& section, const std::string& key) | |
| 111 { | |
| 112 Dictionary* dictionary = Dictionary::GetInstance(); | |
| 113 return dictionary->Lookup(section, key); | |
| 114 } | |
| 115 | |
| 116 | |
| 117 STDMETHODIMP CPluginUserSettings::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispparams, VARIANT* pVarResult, | 143 STDMETHODIMP CPluginUserSettings::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispparams, VARIANT* pVarResult, | 
| 118 EXCEPINFO* pExcepinfo, UINT* pArgErr) | 144 EXCEPINFO* pExcepinfo, UINT* pArgErr) | 
| 119 { | 145 { | 
| 120 if (!pDispparams) | 146 try | 
| 121 return E_POINTER; | 147 { | 
| 122 | 148 if (!pDispparams || !pExcepinfo) | 
| 
sergei
2015/01/09 15:42:54
pExcepinfo can be nullptr, it's not an error.
 
Eric
2015/01/09 16:25:24
I'm mostly trying to add an exception handler in t
 | |
| 123 if (!pExcepinfo) | 149 { | 
| 124 return E_POINTER; | 150 return E_POINTER; | 
| 125 | 151 } | 
| 126 if (pDispparams->cNamedArgs) | 152 if (pDispparams->cNamedArgs != 0) | 
| 127 return DISP_E_NONAMEDARGS; | 153 { | 
| 128 | 154 return DISP_E_NONAMEDARGS; | 
| 129 CPluginSettings* settings = CPluginSettings::GetInstance(); | 155 } | 
| 130 | 156 CPluginSettings* settings = CPluginSettings::GetInstance(); | 
| 131 if (dispidMember < 0 || dispidMember >= countof(s_Methods)) | 157 switch (dispidMember) | 
| 132 return DISP_E_BADINDEX; | 158 { | 
| 133 | 159 case dispatchID_GetMessage: | 
| 134 const CString& method = s_Methods[dispidMember]; | 160 { | 
| 135 | 161 if (pDispparams->cArgs != 2) | 
| 136 if (s_GetMessage == method) | 162 { | 
| 137 { | 163 return DISP_E_BADPARAMCOUNT; | 
| 138 if (2 != pDispparams->cArgs) | 164 } | 
| 139 return DISP_E_BADPARAMCOUNT; | 165 if (pDispparams->rgvarg[0].vt != VT_BSTR || pDispparams->rgvarg[1].vt != VT_BSTR) | 
| 140 | 166 { | 
| 141 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 167 return DISP_E_TYPEMISMATCH; | 
| 142 return DISP_E_TYPEMISMATCH; | 168 } | 
| 143 | 169 if (pVarResult) | 
| 
sergei
2015/01/09 15:42:54
Wouldn't it better here and below to have
if (!pVa
 
Eric
2015/01/09 16:25:24
No. It's not an error to ignore the return value.
 
sergei
2015/01/30 16:01:40
What is about GetAppLocale and below? We should te
 
Eric
2015/02/02 14:46:39
Indeed, there were four defect where 'pVarResult'
 | |
| 144 if (pVarResult) | 170 { | 
| 145 { | 171 CComBSTR key = pDispparams->rgvarg[0].bstrVal; | 
| 146 CComBSTR key = pDispparams->rgvarg[0].bstrVal; | 172 CComBSTR section = pDispparams->rgvarg[1].bstrVal; | 
| 147 CComBSTR section = pDispparams->rgvarg[1].bstrVal; | 173 CStringW message = sGetMessage((BSTR)section, (BSTR)key); | 
| 148 CStringW message = sGetMessage((BSTR)section, (BSTR)key); | 174 | 
| 149 | 175 pVarResult->vt = VT_BSTR; | 
| 150 pVarResult->vt = VT_BSTR; | 176 pVarResult->bstrVal = SysAllocString(message); | 
| 151 pVarResult->bstrVal = SysAllocString(message); | 177 } | 
| 152 } | 178 } | 
| 153 } | 179 break; | 
| 154 else if (s_GetLanguageCount == method) | 180 case dispatchID_GetLanguageCount: | 
| 155 { | 181 { | 
| 156 if (pDispparams->cArgs) | 182 if (pDispparams->cArgs != 0) | 
| 157 return DISP_E_BADPARAMCOUNT; | 183 { | 
| 158 | 184 return DISP_E_BADPARAMCOUNT; | 
| 159 if (pVarResult) | 185 } | 
| 160 { | 186 if (pVarResult) | 
| 161 std::map<CString, CString> languageList = settings->GetFilterLanguageTitle List(); | 187 { | 
| 162 | 188 std::map<CString, CString> languageList = settings->GetFilterLanguageT itleList(); | 
| 163 pVarResult->vt = VT_I4; | 189 | 
| 164 pVarResult->lVal = static_cast<LONG>(languageList.size()); | 190 pVarResult->vt = VT_I4; | 
| 165 } | 191 pVarResult->lVal = static_cast<LONG>(languageList.size()); | 
| 166 } | 192 } | 
| 167 else if (s_GetLanguageByIndex == method) | 193 } | 
| 168 { | 194 break; | 
| 169 if (1 != pDispparams->cArgs) | 195 case dispatchID_GetLanguageByIndex: | 
| 170 return DISP_E_BADPARAMCOUNT; | 196 { | 
| 171 | 197 if (pDispparams->cArgs != 1) | 
| 172 if (VT_I4 != pDispparams->rgvarg[0].vt) | 198 { | 
| 173 return DISP_E_TYPEMISMATCH; | 199 return DISP_E_BADPARAMCOUNT; | 
| 174 | 200 } | 
| 175 if (pVarResult) | 201 if (VT_I4 != pDispparams->rgvarg[0].vt) | 
| 176 { | 202 { | 
| 177 int indx = pDispparams->rgvarg[0].lVal; | 203 return DISP_E_TYPEMISMATCH; | 
| 178 | 204 } | 
| 179 std::map<CString, CString> languageTitleList = settings->GetFilterLanguage TitleList(); | 205 if (pVarResult) | 
| 180 | 206 { | 
| 181 if (indx < 0 || indx >= (int)languageTitleList.size()) | 207 int indx = pDispparams->rgvarg[0].lVal; | 
| 182 return DISP_E_EXCEPTION; | 208 | 
| 183 | 209 std::map<CString, CString> languageTitleList = settings->GetFilterLang uageTitleList(); | 
| 184 CString language; | 210 | 
| 185 | 211 if (indx < 0 || indx >= (int)languageTitleList.size()) | 
| 186 int curIndx = 0; | 212 return DISP_E_EXCEPTION; | 
| 187 for(std::map<CString, CString>::const_iterator it = languageTitleList.begi n(); it != languageTitleList.end(); ++it) | 213 | 
| 188 { | 214 CString language; | 
| 189 if (curIndx == indx) | 215 | 
| 190 { | 216 int curIndx = 0; | 
| 191 language = it->first; | 217 for(std::map<CString, CString>::const_iterator it = languageTitleList. begin(); it != languageTitleList.end(); ++it) | 
| 192 break; | 218 { | 
| 193 } | 219 if (curIndx == indx) | 
| 194 | 220 { | 
| 195 curIndx++; | 221 language = it->first; | 
| 196 } | 222 break; | 
| 197 | 223 } | 
| 198 pVarResult->vt = VT_BSTR; | 224 curIndx++; | 
| 199 pVarResult->bstrVal = SysAllocString(language); | 225 } | 
| 200 } | 226 | 
| 201 } | 227 pVarResult->vt = VT_BSTR; | 
| 202 else if (s_GetLanguageTitleByIndex == method) | 228 pVarResult->bstrVal = SysAllocString(language); | 
| 203 { | 229 } | 
| 204 if (1 != pDispparams->cArgs) | 230 } | 
| 205 return DISP_E_BADPARAMCOUNT; | 231 break; | 
| 206 | 232 case dispatchID_GetLanguageTitleByIndex: | 
| 207 if (VT_I4 != pDispparams->rgvarg[0].vt) | 233 { | 
| 208 return DISP_E_TYPEMISMATCH; | 234 if (pDispparams->cArgs != 1) | 
| 209 | 235 { | 
| 210 if (pVarResult) | 236 return DISP_E_BADPARAMCOUNT; | 
| 211 { | 237 } | 
| 212 int indx = pDispparams->rgvarg[0].lVal; | 238 if (VT_I4 != pDispparams->rgvarg[0].vt) | 
| 213 | 239 { | 
| 214 std::map<CString, CString> languageTitleList = settings->GetFilterLanguage TitleList(); | 240 return DISP_E_TYPEMISMATCH; | 
| 215 | 241 } | 
| 216 if (indx < 0 || indx >= (int)languageTitleList.size()) | 242 if (pVarResult) | 
| 217 return DISP_E_EXCEPTION; | 243 { | 
| 218 | 244 int indx = pDispparams->rgvarg[0].lVal; | 
| 219 CString languageTitle; | 245 | 
| 220 | 246 std::map<CString, CString> languageTitleList = settings->GetFilterLang uageTitleList(); | 
| 221 int curIndx = 0; | 247 | 
| 222 for(std::map<CString, CString>::const_iterator it = languageTitleList.begi n(); it != languageTitleList.end(); ++it) | 248 if (indx < 0 || indx >= (int)languageTitleList.size()) | 
| 223 { | 249 return DISP_E_EXCEPTION; | 
| 224 if (curIndx == indx) | 250 | 
| 225 { | 251 CString languageTitle; | 
| 226 languageTitle = it->second; | 252 | 
| 227 break; | 253 int curIndx = 0; | 
| 228 } | 254 for(std::map<CString, CString>::const_iterator it = languageTitleList. begin(); it != languageTitleList.end(); ++it) | 
| 229 | 255 { | 
| 230 curIndx++; | 256 if (curIndx == indx) | 
| 231 } | 257 { | 
| 232 | 258 languageTitle = it->second; | 
| 233 pVarResult->vt = VT_BSTR; | 259 break; | 
| 234 pVarResult->bstrVal = SysAllocString(languageTitle); | 260 } | 
| 235 } | 261 curIndx++; | 
| 236 } | 262 } | 
| 237 else if (s_SetLanguage == method) | 263 | 
| 238 { | 264 pVarResult->vt = VT_BSTR; | 
| 239 if (1 != pDispparams->cArgs) | 265 pVarResult->bstrVal = SysAllocString(languageTitle); | 
| 240 return DISP_E_BADPARAMCOUNT; | 266 } | 
| 241 | 267 } | 
| 242 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 268 break; | 
| 243 return DISP_E_TYPEMISMATCH; | 269 case dispatchID_SetLanguage: | 
| 244 | 270 { | 
| 245 CComBSTR url = pDispparams->rgvarg[0].bstrVal; | 271 if (pDispparams->cArgs != 1) | 
| 246 | 272 { | 
| 247 settings->SetSubscription((BSTR)url); | 273 return DISP_E_BADPARAMCOUNT; | 
| 248 } | 274 } | 
| 249 else if (s_GetLanguage == method) | 275 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 
| 250 { | 276 { | 
| 251 if (pDispparams->cArgs) | 277 return DISP_E_TYPEMISMATCH; | 
| 252 return DISP_E_BADPARAMCOUNT; | 278 } | 
| 253 | 279 CComBSTR url = pDispparams->rgvarg[0].bstrVal; | 
| 254 if (pVarResult) | 280 settings->SetSubscription((BSTR)url); | 
| 255 { | 281 } | 
| 256 CString url = settings->GetSubscription(); | 282 break; | 
| 257 | 283 case dispatchID_GetLanguage: | 
| 258 pVarResult->vt = VT_BSTR; | 284 { | 
| 259 pVarResult->bstrVal = SysAllocString(url); | 285 if (pDispparams->cArgs != 0) | 
| 260 } | 286 { | 
| 261 } | 287 return DISP_E_BADPARAMCOUNT; | 
| 262 else if (s_GetWhitelistDomains == method) | 288 } | 
| 263 { | 289 if (pVarResult) | 
| 264 if (pDispparams->cArgs) | 290 { | 
| 265 return DISP_E_BADPARAMCOUNT; | 291 CString url = settings->GetSubscription(); | 
| 266 | 292 pVarResult->vt = VT_BSTR; | 
| 267 if (pVarResult) | 293 pVarResult->bstrVal = SysAllocString(url); | 
| 268 { | 294 } | 
| 269 std::vector<std::wstring> whiteList = settings->GetWhiteListedDomainList() ; | 295 } | 
| 270 CString sWhiteList; | 296 break; | 
| 271 for (size_t i = 0; i < whiteList.size(); i++) | 297 case dispatchID_GetWhitelistDomains: | 
| 272 { | 298 { | 
| 273 if (!sWhiteList.IsEmpty()) | 299 if (pDispparams->cArgs != 0) | 
| 274 { | 300 { | 
| 275 sWhiteList += ','; | 301 return DISP_E_BADPARAMCOUNT; | 
| 276 } | 302 } | 
| 277 sWhiteList += CString(whiteList[i].c_str()); | 303 if (pVarResult) | 
| 278 } | 304 { | 
| 279 | 305 std::vector<std::wstring> whiteList = settings->GetWhiteListedDomainLi st(); | 
| 280 pVarResult->vt = VT_BSTR; | 306 CString sWhiteList; | 
| 281 pVarResult->bstrVal = SysAllocString(sWhiteList); | 307 for (size_t i = 0; i < whiteList.size(); i++) | 
| 282 } | 308 { | 
| 283 } | 309 if (!sWhiteList.IsEmpty()) | 
| 284 else if (s_AddWhitelistDomain == method) | 310 { | 
| 285 { | 311 sWhiteList += ','; | 
| 286 if (1 != pDispparams->cArgs) | 312 } | 
| 287 return DISP_E_BADPARAMCOUNT; | 313 sWhiteList += CString(whiteList[i].c_str()); | 
| 288 | 314 } | 
| 289 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 315 pVarResult->vt = VT_BSTR; | 
| 290 return DISP_E_TYPEMISMATCH; | 316 pVarResult->bstrVal = SysAllocString(sWhiteList); | 
| 291 | 317 } | 
| 292 CComBSTR domain = pDispparams->rgvarg[0].bstrVal; | 318 } | 
| 293 if (domain.Length()) | 319 break; | 
| 294 { | 320 case dispatchID_AddWhitelistDomain: | 
| 295 settings->AddWhiteListedDomain((BSTR)domain); | 321 { | 
| 296 } | 322 if (pDispparams->cArgs != 1) | 
| 297 } | 323 { | 
| 298 else if (s_RemoveWhitelistDomain == method) | 324 return DISP_E_BADPARAMCOUNT; | 
| 299 { | 325 } | 
| 300 if (1 != pDispparams->cArgs) | 326 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 
| 301 return DISP_E_BADPARAMCOUNT; | 327 { | 
| 302 | 328 return DISP_E_TYPEMISMATCH; | 
| 303 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 329 } | 
| 304 return DISP_E_TYPEMISMATCH; | 330 CComBSTR domain = pDispparams->rgvarg[0].bstrVal; | 
| 305 | 331 if (domain.Length()) | 
| 306 CComBSTR domain = pDispparams->rgvarg[0].bstrVal; | 332 { | 
| 307 if (domain.Length()) | 333 settings->AddWhiteListedDomain((BSTR)domain); | 
| 308 { | 334 } | 
| 309 settings->RemoveWhiteListedDomain((BSTR)domain); | 335 } | 
| 310 } | 336 break; | 
| 311 } | 337 case dispatchID_RemoveWhitelistDomain: | 
| 312 else if (s_GetAppLocale == method) | 338 { | 
| 313 { | 339 if (pDispparams->cArgs != 1) | 
| 314 if (0 != pDispparams->cArgs) | 340 { | 
| 315 return DISP_E_BADPARAMCOUNT; | 341 return DISP_E_BADPARAMCOUNT; | 
| 316 | 342 } | 
| 317 pVarResult->vt = VT_BSTR; | 343 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 
| 318 pVarResult->bstrVal = SysAllocString(settings->GetAppLocale()); | 344 { | 
| 319 } | 345 return DISP_E_TYPEMISMATCH; | 
| 320 else if (s_GetDocumentationLink == method) | 346 } | 
| 321 { | 347 CComBSTR domain = pDispparams->rgvarg[0].bstrVal; | 
| 322 if (0 != pDispparams->cArgs) | 348 if (domain.Length()) | 
| 323 return DISP_E_BADPARAMCOUNT; | 349 { | 
| 324 | 350 settings->RemoveWhiteListedDomain((BSTR)domain); | 
| 325 pVarResult->vt = VT_BSTR; | 351 } | 
| 326 pVarResult->bstrVal = SysAllocString(settings->GetDocumentationLink()); | 352 } | 
| 327 } | 353 break; | 
| 328 else if (s_IsAcceptableAdsEnabled == method) | 354 case dispatchID_GetAppLocale: | 
| 329 { | 355 { | 
| 330 if (0 != pDispparams->cArgs) | 356 if (pDispparams->cArgs != 0) | 
| 331 return DISP_E_BADPARAMCOUNT; | 357 { | 
| 332 | 358 return DISP_E_BADPARAMCOUNT; | 
| 333 pVarResult->vt = VT_BOOL; | 359 } | 
| 334 pVarResult->boolVal = CPluginClient::GetInstance()->IsAcceptableAdsEnabled() ? VARIANT_TRUE : VARIANT_FALSE; | 360 pVarResult->vt = VT_BSTR; | 
| 335 } | 361 pVarResult->bstrVal = SysAllocString(settings->GetAppLocale()); | 
| 336 else if (s_SetAcceptableAdsEnabled == method) | 362 } | 
| 337 { | 363 break; | 
| 338 if (1 != pDispparams->cArgs) | 364 case dispatchID_GetDocumentationLink: | 
| 339 return DISP_E_BADPARAMCOUNT; | 365 { | 
| 340 | 366 if (pDispparams->cArgs != 0) | 
| 341 if (VT_BOOL != pDispparams->rgvarg[0].vt) | 367 { | 
| 342 return DISP_E_TYPEMISMATCH; | 368 return DISP_E_BADPARAMCOUNT; | 
| 343 | 369 } | 
| 344 bool enable = VARIANT_FALSE != pDispparams->rgvarg[0].boolVal; | 370 pVarResult->vt = VT_BSTR; | 
| 345 | 371 pVarResult->bstrVal = SysAllocString(settings->GetDocumentationLink()); | 
| 346 if (enable) | 372 } | 
| 347 { | 373 break; | 
| 348 CPluginClient* client = CPluginClient::GetInstance(); | 374 case dispatchID_IsAcceptableAdsEnabled: | 
| 349 client->AddSubscription(client->GetPref(L"subscriptions_exceptionsurl", L" ")); | 375 { | 
| 350 } | 376 if (pDispparams->cArgs != 0) | 
| 351 else | 377 { | 
| 352 { | 378 return DISP_E_BADPARAMCOUNT; | 
| 353 CPluginClient* client = CPluginClient::GetInstance(); | 379 } | 
| 354 client->RemoveSubscription(client->GetPref(L"subscriptions_exceptionsurl", L"")); | 380 pVarResult->vt = VT_BOOL; | 
| 355 } | 381 pVarResult->boolVal = CPluginClient::GetInstance()->IsAcceptableAdsEnabl ed() ? VARIANT_TRUE : VARIANT_FALSE; | 
| 356 } | 382 } | 
| 357 else if (s_IsUpdate == method) | 383 break; | 
| 358 { | 384 case dispatchID_SetAcceptableAdsEnabled: | 
| 359 if (0 != pDispparams->cArgs) | 385 { | 
| 360 return DISP_E_BADPARAMCOUNT; | 386 if (pDispparams->cArgs != 1) | 
| 361 | 387 { | 
| 362 pVarResult->vt = VT_BOOL; | 388 return DISP_E_BADPARAMCOUNT; | 
| 363 pVarResult->boolVal = CPluginClient::GetInstance()->GetPref(L"displayUpdateP age", false); | 389 } | 
| 364 } | 390 if (pDispparams->rgvarg[0].vt != VT_BOOL) | 
| 365 else | 391 { | 
| 366 return DISP_E_MEMBERNOTFOUND; | 392 return DISP_E_TYPEMISMATCH; | 
| 367 | 393 } | 
| 394 if (pDispparams->rgvarg[0].boolVal != VARIANT_FALSE) | |
| 395 { | |
| 396 CPluginClient* client = CPluginClient::GetInstance(); | |
| 397 client->AddSubscription(client->GetPref(L"subscriptions_exceptionsurl" , L"")); | |
| 398 } | |
| 399 else | |
| 400 { | |
| 401 CPluginClient* client = CPluginClient::GetInstance(); | |
| 402 client->RemoveSubscription(client->GetPref(L"subscriptions_exceptionsu rl", L"")); | |
| 403 } | |
| 404 } | |
| 405 break; | |
| 406 case dispatchID_IsUpdate: | |
| 407 { | |
| 408 if (pDispparams->cArgs != 0) | |
| 409 { | |
| 410 return DISP_E_BADPARAMCOUNT; | |
| 411 } | |
| 412 pVarResult->vt = VT_BOOL; | |
| 413 pVarResult->boolVal = CPluginClient::GetInstance()->GetPref(L"displayUpd atePage", false) ? VARIANT_TRUE : VARIANT_FALSE; | |
| 414 } | |
| 415 break; | |
| 416 default: | |
| 417 return DISP_E_MEMBERNOTFOUND; | |
| 418 break; | |
| 419 } | |
| 420 } | |
| 421 catch(...) | |
| 422 { | |
| 423 return E_FAIL; | |
| 424 } | |
| 368 return S_OK; | 425 return S_OK; | 
| 369 } | 426 } | 
| 370 | 427 | 
| OLD | NEW |