Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/plugin/PluginUserSettings.cpp

Issue 5979857238360064: Issues #1163, #1173 - refactor CPluginUserSettings (Closed)
Patch Set: Created Jan. 4, 2015, 9 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld