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 "COM_Value.h" |
4 #include "PluginSettings.h" | 5 #include "PluginSettings.h" |
5 #include "PluginClient.h" | 6 #include "PluginClient.h" |
6 #include "../shared/Dictionary.h" | 7 #include "../shared/Dictionary.h" |
7 | 8 |
8 static const CString s_GetMessage = L"GetMessage"; | 9 static const CString s_GetMessage = L"GetMessage"; |
9 static const CString s_GetLanguageCount = L"GetLanguageCount"; | 10 static const CString s_GetLanguageCount = L"GetLanguageCount"; |
10 static const CString s_GetLanguageByIndex = L"GetLanguageByIndex"; | 11 static const CString s_GetLanguageByIndex = L"GetLanguageByIndex"; |
11 static const CString s_GetLanguageTitleByIndex = L"GetLanguageTitleByIndex"; | 12 static const CString s_GetLanguageTitleByIndex = L"GetLanguageTitleByIndex"; |
12 static const CString s_SetLanguage = L"SetLanguage"; | 13 static const CString s_SetLanguage = L"SetLanguage"; |
13 static const CString s_GetLanguage = L"GetLanguage"; | 14 static const CString s_GetLanguage = L"GetLanguage"; |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 return E_POINTER; | 124 return E_POINTER; |
124 | 125 |
125 if (pDispparams->cNamedArgs) | 126 if (pDispparams->cNamedArgs) |
126 return DISP_E_NONAMEDARGS; | 127 return DISP_E_NONAMEDARGS; |
127 | 128 |
128 CPluginSettings* settings = CPluginSettings::GetInstance(); | 129 CPluginSettings* settings = CPluginSettings::GetInstance(); |
129 | 130 |
130 if (dispidMember < 0 || dispidMember >= countof(s_Methods)) | 131 if (dispidMember < 0 || dispidMember >= countof(s_Methods)) |
131 return DISP_E_BADINDEX; | 132 return DISP_E_BADINDEX; |
132 | 133 |
| 134 /* |
| 135 * See Issue #1163. |
| 136 * TODO: Rewrite this linear sequence of string comparisons as a switch statem
ent. |
| 137 * TODO: Add a try-catch block at the top level of the switch body to rational
ize argument checking etc. |
| 138 */ |
133 const CString& method = s_Methods[dispidMember]; | 139 const CString& method = s_Methods[dispidMember]; |
134 | |
135 if (s_GetMessage == method) | 140 if (s_GetMessage == method) |
136 { | 141 { |
137 if (2 != pDispparams->cArgs) | 142 /* |
138 return DISP_E_BADPARAMCOUNT; | 143 * If the caller ignores the value, we can elide the body since it has no si
de-effects. |
139 | 144 */ |
140 if (VT_BSTR != pDispparams->rgvarg[0].vt) | |
141 return DISP_E_TYPEMISMATCH; | |
142 if (VT_BSTR != pDispparams->rgvarg[1].vt) | |
143 return DISP_E_TYPEMISMATCH; | |
144 | |
145 if (pVarResult) | 145 if (pVarResult) |
146 { | 146 { |
147 CComBSTR key = pDispparams->rgvarg[0].bstrVal; | 147 if (2 != pDispparams->cArgs) |
148 CComBSTR section = pDispparams->rgvarg[1].bstrVal; | 148 return DISP_E_BADPARAMCOUNT; |
149 CStringW message = sGetMessage((BSTR)section, (BSTR)key); | 149 |
| 150 AdblockPlus::COM::IncomingParam key(pDispparams->rgvarg[0]); |
| 151 AdblockPlus::COM::IncomingParam section(pDispparams->rgvarg[1]); |
| 152 if (!key.wstringConvertible() || !section.wstringConvertible()) |
| 153 { |
| 154 return DISP_E_TYPEMISMATCH; |
| 155 } |
| 156 CStringW message = sGetMessage(to_CString(section.wstringValueNoexcept()),
to_CString(key.wstringValueNoexcept())); |
150 | 157 |
151 pVarResult->vt = VT_BSTR; | 158 pVarResult->vt = VT_BSTR; |
152 pVarResult->bstrVal = SysAllocString(message); | 159 pVarResult->bstrVal = SysAllocString(message); |
153 } | 160 } |
154 } | 161 } |
155 else if (s_GetLanguageCount == method) | 162 else if (s_GetLanguageCount == method) |
156 { | 163 { |
157 if (pDispparams->cArgs) | 164 if (pDispparams->cArgs) |
158 return DISP_E_BADPARAMCOUNT; | 165 return DISP_E_BADPARAMCOUNT; |
159 | 166 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 } | 243 } |
237 } | 244 } |
238 else if (s_SetLanguage == method) | 245 else if (s_SetLanguage == method) |
239 { | 246 { |
240 if (1 != pDispparams->cArgs) | 247 if (1 != pDispparams->cArgs) |
241 return DISP_E_BADPARAMCOUNT; | 248 return DISP_E_BADPARAMCOUNT; |
242 | 249 |
243 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 250 if (VT_BSTR != pDispparams->rgvarg[0].vt) |
244 return DISP_E_TYPEMISMATCH; | 251 return DISP_E_TYPEMISMATCH; |
245 | 252 |
246 CComBSTR url = pDispparams->rgvarg[0].bstrVal; | 253 AdblockPlus::COM::IncomingParam url(pDispparams->rgvarg[0]); |
247 | 254 if (!url.wstringConvertible()) |
248 settings->SetSubscription((BSTR)url); | 255 { |
| 256 return DISP_E_TYPEMISMATCH; |
| 257 } |
| 258 settings->SetSubscription(url.wstringValueNoexcept()); |
249 } | 259 } |
250 else if (s_GetLanguage == method) | 260 else if (s_GetLanguage == method) |
251 { | 261 { |
252 if (pDispparams->cArgs) | 262 if (pDispparams->cArgs) |
253 return DISP_E_BADPARAMCOUNT; | 263 return DISP_E_BADPARAMCOUNT; |
254 | 264 |
255 if (pVarResult) | 265 if (pVarResult) |
256 { | 266 { |
257 CString url = settings->GetSubscription(); | 267 CString url = settings->GetSubscription(); |
258 | 268 |
(...skipping 24 matching lines...) Expand all Loading... |
283 } | 293 } |
284 } | 294 } |
285 else if (s_AddWhitelistDomain == method) | 295 else if (s_AddWhitelistDomain == method) |
286 { | 296 { |
287 if (1 != pDispparams->cArgs) | 297 if (1 != pDispparams->cArgs) |
288 return DISP_E_BADPARAMCOUNT; | 298 return DISP_E_BADPARAMCOUNT; |
289 | 299 |
290 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 300 if (VT_BSTR != pDispparams->rgvarg[0].vt) |
291 return DISP_E_TYPEMISMATCH; | 301 return DISP_E_TYPEMISMATCH; |
292 | 302 |
293 CComBSTR domain = pDispparams->rgvarg[0].bstrVal; | 303 AdblockPlus::COM::IncomingParam domain_arg(pDispparams->rgvarg[0]); |
294 if (domain.Length()) | 304 if (!domain_arg.wstringConvertible()) |
295 { | 305 { |
296 settings->AddWhiteListedDomain((BSTR)domain); | 306 return DISP_E_TYPEMISMATCH; |
| 307 } |
| 308 std::wstring domain = domain_arg.wstringValueNoexcept(); |
| 309 if (!domain.empty()) |
| 310 { |
| 311 settings->AddWhiteListedDomain(to_CString(domain)); |
297 } | 312 } |
298 } | 313 } |
299 else if (s_RemoveWhitelistDomain == method) | 314 else if (s_RemoveWhitelistDomain == method) |
300 { | 315 { |
301 if (1 != pDispparams->cArgs) | 316 if (1 != pDispparams->cArgs) |
302 return DISP_E_BADPARAMCOUNT; | 317 return DISP_E_BADPARAMCOUNT; |
303 | 318 |
304 if (VT_BSTR != pDispparams->rgvarg[0].vt) | 319 if (VT_BSTR != pDispparams->rgvarg[0].vt) |
305 return DISP_E_TYPEMISMATCH; | 320 return DISP_E_TYPEMISMATCH; |
306 | 321 |
307 CComBSTR domain = pDispparams->rgvarg[0].bstrVal; | 322 AdblockPlus::COM::IncomingParam domain_arg(pDispparams->rgvarg[0]); |
308 if (domain.Length()) | 323 if (!domain_arg.wstringConvertible()) |
309 { | 324 { |
310 settings->RemoveWhiteListedDomain((BSTR)domain); | 325 return DISP_E_TYPEMISMATCH; |
| 326 } |
| 327 std::wstring domain = domain_arg.wstringValueNoexcept(); |
| 328 if (!domain.empty()) |
| 329 { |
| 330 settings->RemoveWhiteListedDomain(to_CString(domain)); |
311 } | 331 } |
312 } | 332 } |
313 else if (s_GetAppLocale == method) | 333 else if (s_GetAppLocale == method) |
314 { | 334 { |
315 if (0 != pDispparams->cArgs) | 335 if (0 != pDispparams->cArgs) |
316 return DISP_E_BADPARAMCOUNT; | 336 return DISP_E_BADPARAMCOUNT; |
317 | 337 |
318 pVarResult->vt = VT_BSTR; | 338 pVarResult->vt = VT_BSTR; |
319 pVarResult->bstrVal = SysAllocString(settings->GetAppLocale()); | 339 pVarResult->bstrVal = SysAllocString(settings->GetAppLocale()); |
320 } | 340 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 CPluginClient* client = CPluginClient::GetInstance(); | 374 CPluginClient* client = CPluginClient::GetInstance(); |
355 client->RemoveSubscription(client->GetPref(L"subscriptions_exceptionsurl",
L"")); | 375 client->RemoveSubscription(client->GetPref(L"subscriptions_exceptionsurl",
L"")); |
356 } | 376 } |
357 } | 377 } |
358 else | 378 else |
359 return DISP_E_MEMBERNOTFOUND; | 379 return DISP_E_MEMBERNOTFOUND; |
360 | 380 |
361 return S_OK; | 381 return S_OK; |
362 } | 382 } |
363 | 383 |
OLD | NEW |