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

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

Issue 29332848: Issue #3432 - Manage COM events with a resource class
Patch Set: Created Dec. 17, 2015, 6:08 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
« no previous file with comments | « src/plugin/PluginClass.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH 3 * Copyright (C) 2006-2015 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 } 83 }
84 84
85 int Width() const 85 int Width() const
86 { 86 {
87 return right - left; 87 return right - left;
88 } 88 }
89 }; 89 };
90 } 90 }
91 91
92 CPluginClass::CPluginClass() 92 CPluginClass::CPluginClass()
93 : m_webBrowser2(nullptr) 93 : m_webBrowser2(nullptr),
94 detachedInitializationFailed(false)
94 { 95 {
95 //Use this line to debug memory leaks 96 //Use this line to debug memory leaks
96 // _CrtDumpMemoryLeaks(); 97 // _CrtDumpMemoryLeaks();
97 98
98 m_isAdvised = false;
99 m_hTabWnd = NULL; 99 m_hTabWnd = NULL;
100 m_hStatusBarWnd = NULL; 100 m_hStatusBarWnd = NULL;
101 m_hPaneWnd = NULL; 101 m_hPaneWnd = NULL;
102 m_nPaneWidth = 0; 102 m_nPaneWidth = 0;
103 m_pWndProcStatus = NULL; 103 m_pWndProcStatus = NULL;
104 m_hTheme = NULL; 104 m_hTheme = NULL;
105 m_isInitializedOk = false; 105 m_isInitializedOk = false;
106 106
107 107
108 m_tab = new CPluginTab(this); 108 m_tab = new CPluginTab(this);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr owser2 == nullptr"); 166 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr owser2 == nullptr");
167 url = m_tab->GetDocumentUrl(); 167 url = m_tab->GetDocumentUrl();
168 } 168 }
169 return url; 169 return url;
170 } 170 }
171 171
172 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) 172 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr)
173 { 173 {
174 if (thisPtr == NULL) 174 if (thisPtr == NULL)
175 return 0; 175 return 0;
176 if (!((CPluginClass*)thisPtr)->InitObject()) 176 auto self = static_cast<CPluginClass*>(thisPtr);
177 if (!self->InitObject())
177 { 178 {
178 ((CPluginClass*)thisPtr)->Unadvise(); 179 self->detachedInitializationFailed = true;
179 } 180 }
180
181 return 0; 181 return 0;
182 } 182 }
183 183
184 /* 184 /*
185 * IE calls this when it creates a new browser window or tab, immediately after it also 185 * IE calls this when it creates a new browser window or tab, immediately after it also
186 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob ject, 186 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob ject,
187 * which is an IWebBrowser2 interface associated with the window/tab. 187 * which is an IWebBrowser2 interface associated with the window/tab.
188 * 188 *
189 * IE also ordinarily calls this again when its window/tab is closed, in which c ase 189 * IE also ordinarily calls this again when its window/tab is closed, in which c ase
190 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w hen IE 190 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w hen IE
191 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru ctor, 191 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru ctor,
192 * but it is not a proper substitute for one. 192 * but it is not a proper substitute for one.
193 */ 193 */
194 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) 194 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite)
195 { 195 {
196 try 196 try
197 { 197 {
198 if (unknownSite) 198 if (unknownSite)
199 { 199 {
200 200
201 DEBUG_GENERAL(L"========================================================== ======================\nNEW TAB UI\n============================================ ====================================") 201 DEBUG_GENERAL(L"========================================================== ======================\nNEW TAB UI\n============================================ ====================================")
202 202
203 HRESULT hr = ::CoInitialize(NULL); 203 HRESULT hr = ::CoInitialize(NULL);
204 if (FAILED(hr)) 204 if (FAILED(hr))
205 { 205 {
206 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize"); 206 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize");
207 } 207 }
208
209 /* 208 /*
210 * We were instantiated as a BHO, so our site is always of type IWebBrowse r2. 209 * We were instantiated as a BHO, so our site is always of type IWebBrowse r2.
211 */ 210 */
212 m_webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite); 211 m_webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite);
213 if (!m_webBrowser2) 212 if (!m_webBrowser2)
214 { 213 {
215 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p ointer to IWebBrowser2*"); 214 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p ointer to IWebBrowser2*");
216 } 215 }
217 216
218 //register the mimefilter 217 //register the mimefilter
219 //and only mimefilter 218 //and only mimefilter
220 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread 219 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread
221 s_criticalSectionLocal.Lock(); 220 s_criticalSectionLocal.Lock();
222 { 221 {
223 // Always register on startup, then check if we need to unregister in a separate thread 222 // Always register on startup, then check if we need to unregister in a separate thread
224 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); 223 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
225 s_asyncWebBrowser2 = unknownSite; 224 s_asyncWebBrowser2 = unknownSite;
226 s_instances.insert(this); 225 s_instances.insert(this);
227 } 226 }
228 s_criticalSectionLocal.Unlock(); 227 s_criticalSectionLocal.Unlock();
229 228
229 DEBUG_GENERAL("Loaded as BHO");
230 try 230 try
231 { 231 {
232 DEBUG_GENERAL("Loaded as BHO"); 232 std::thread startInitObjectThread(StartInitObject, this);
233 HRESULT hr = DispEventAdvise(m_webBrowser2); 233 startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr.
234 if (SUCCEEDED(hr))
235 {
236 m_isAdvised = true;
237 try
238 {
239 std::thread startInitObjectThread(StartInitObject, this);
240 startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr.
241 }
242 catch (const std::system_error& ex)
243 {
244 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH READ_CREATE_PROCESS,
245 "Class::Thread - Failed to create StartInitObject thread");
246 }
247 }
248 else
249 {
250 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVIC E, "Class::SetSite - Advise");
251 }
252 } 234 }
253 catch (const std::runtime_error& ex) 235 catch (const std::system_error& ex)
254 { 236 {
255 DEBUG_EXCEPTION(ex); 237 detachedInitializationFailed = true;
256 Unadvise(); 238 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_THREAD _CREATE_PROCESS,
239 "Class::Thread - Failed to create StartInitObject thread");
257 } 240 }
241
242 // Start event last, after everything is ready to go
243 browserEvents.Start(this, m_webBrowser2);
258 } 244 }
259 else 245 else
260 { 246 {
261 Unadvise(); 247 browserEvents.Stop();
262 248
263 // Destroy window 249 // Destroy window
264 if (m_pWndProcStatus) 250 if (m_pWndProcStatus)
265 { 251 {
266 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn dProcStatus); 252 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn dProcStatus);
267 253
268 m_pWndProcStatus = NULL; 254 m_pWndProcStatus = NULL;
269 } 255 }
270 256
271 if (m_hPaneWnd) 257 if (m_hPaneWnd)
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 IDispatch* frameBrowserDisp /**< [in] */, 417 IDispatch* frameBrowserDisp /**< [in] */,
432 VARIANT* urlVariant /**< [in] */, 418 VARIANT* urlVariant /**< [in] */,
433 VARIANT* /**< [in] Flags*/, 419 VARIANT* /**< [in] Flags*/,
434 VARIANT* /**< [in] TargetFrameName*/, 420 VARIANT* /**< [in] TargetFrameName*/,
435 VARIANT* /**< [in] PostData*/, 421 VARIANT* /**< [in] PostData*/,
436 VARIANT* /**< [in] Headers*/, 422 VARIANT* /**< [in] Headers*/,
437 VARIANT_BOOL* /**< [in, out] Cancel*/) 423 VARIANT_BOOL* /**< [in, out] Cancel*/)
438 { 424 {
439 try 425 try
440 { 426 {
427 if (detachedInitializationFailed) return;
428
441 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; 429 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp;
442 if (!webBrowser) 430 if (!webBrowser)
443 { 431 {
444 return; 432 return;
445 } 433 }
446 if (!urlVariant || urlVariant->vt != VT_BSTR) 434 if (!urlVariant || urlVariant->vt != VT_BSTR)
447 { 435 {
448 return; 436 return;
449 } 437 }
450 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); 438 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal));
(...skipping 24 matching lines...) Expand all
475 } 463 }
476 } 464 }
477 catch (...) 465 catch (...)
478 { 466 {
479 } 467 }
480 } 468 }
481 469
482 // Entry point 470 // Entry point
483 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() 471 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete()
484 { 472 {
473 if (detachedInitializationFailed) return;
485 try 474 try
486 { 475 {
487 if (!m_webBrowser2) 476 if (!m_webBrowser2)
488 { 477 {
489 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with m_webBrowser2 == nullptr"); 478 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with m_webBrowser2 == nullptr");
490 return; 479 return;
491 } 480 }
492 DEBUG_NAVI(L"Navi::Download Complete") 481 DEBUG_NAVI(L"Navi::Download Complete")
493 m_tab->OnDownloadComplete(m_webBrowser2); 482 m_tab->OnDownloadComplete(m_webBrowser2);
494 } 483 }
495 catch (...) 484 catch (...)
496 { 485 {
497 } 486 }
498 } 487 }
499 488
500 // Entry point 489 // Entry point
501 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD isp, VARIANT* /*urlOrPidl*/) 490 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD isp, VARIANT* /*urlOrPidl*/)
502 { 491 {
492 if (detachedInitializationFailed) return;
503 try 493 try
504 { 494 {
505 DEBUG_NAVI(L"Navi::Document Complete"); 495 DEBUG_NAVI(L"Navi::Document Complete");
506 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; 496 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp;
507 if (!webBrowser2) 497 if (!webBrowser2)
508 { 498 {
509 return; 499 return;
510 } 500 }
511 std::wstring frameSrc = GetLocationUrl(*webBrowser2); 501 std::wstring frameSrc = GetLocationUrl(*webBrowser2);
512 m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2)) ; 502 m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2)) ;
513 } 503 }
514 catch (...) 504 catch (...)
515 { 505 {
516 } 506 }
517 } 507 }
518 508
519 // Entry point 509 // Entry point
520 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u nsigned long validFlagsMask) 510 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u nsigned long validFlagsMask)
521 { 511 {
512 if (detachedInitializationFailed) return;
522 try 513 try
523 { 514 {
524 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); 515 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)");
525 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL ECMDIDF_WINDOWSTATE_ENABLED) 516 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL ECMDIDF_WINDOWSTATE_ENABLED)
526 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA BLED); 517 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA BLED);
527 if (newtabshown) 518 if (newtabshown)
528 { 519 {
529 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find( GetCurrentThreadId()); 520 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find( GetCurrentThreadId());
530 if (it == s_threadInstances.end()) 521 if (it == s_threadInstances.end())
531 { 522 {
(...skipping 10 matching lines...) Expand all
542 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); 533 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end");
543 } 534 }
544 catch (...) 535 catch (...)
545 { 536 {
546 } 537 }
547 } 538 }
548 539
549 // Entry point 540 // Entry point
550 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI ANT_BOOL /*enable*/) 541 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI ANT_BOOL /*enable*/)
551 { 542 {
543 if (detachedInitializationFailed) return;
552 try 544 try
553 { 545 {
554 if (m_hPaneWnd == NULL) 546 if (m_hPaneWnd == NULL)
555 { 547 {
556 CreateStatusBarPane(); 548 CreateStatusBarPane();
557 } 549 }
558 else 550 else
559 { 551 {
560 if (AdblockPlus::IE::InstalledMajorVersion() > 6) 552 if (AdblockPlus::IE::InstalledMajorVersion() > 6)
561 { 553 {
562 RECT rect; 554 RECT rect;
563 //Get the RECT for the leftmost pane (the status text pane) 555 //Get the RECT for the leftmost pane (the status text pane)
564 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re ct); 556 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re ct);
565 if (rectRes == TRUE) 557 if (rectRes == TRUE)
566 { 558 {
567 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec t.bottom - rect.top, TRUE); 559 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec t.bottom - rect.top, TRUE);
568 } 560 }
569 } 561 }
570 } 562 }
571 } 563 }
572 catch (...) 564 catch (...)
573 { 565 {
574 } 566 }
575 } 567 }
576 568
577 // Entry point
578 void STDMETHODCALLTYPE CPluginClass::OnOnQuit()
579 {
580 try
581 {
582 Unadvise();
583 }
584 catch (...)
585 {
586 }
587 }
588
589 bool CPluginClass::InitObject() 569 bool CPluginClass::InitObject()
590 { 570 {
591 DEBUG_GENERAL("InitObject - begin"); 571 DEBUG_GENERAL("InitObject - begin");
592 CPluginSettings* settings = CPluginSettings::GetInstance(); 572 CPluginSettings* settings = CPluginSettings::GetInstance();
593 573
594 if (!settings->GetPluginEnabled()) 574 if (!settings->GetPluginEnabled())
595 { 575 {
596 s_mimeFilter->Unregister(); 576 s_mimeFilter->Unregister();
597 } 577 }
598 578
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 } 947 }
968 } 948 }
969 s_criticalSectionLocal.Unlock(); 949 s_criticalSectionLocal.Unlock();
970 950
971 return tab; 951 return tab;
972 } 952 }
973 953
974 954
975 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O LECMD prgCmds[], OLECMDTEXT* pCmdText) 955 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O LECMD prgCmds[], OLECMDTEXT* pCmdText)
976 { 956 {
957 if (detachedInitializationFailed) return;
977 if (cCmds == 0) return E_INVALIDARG; 958 if (cCmds == 0) return E_INVALIDARG;
978 if (prgCmds == 0) return E_POINTER; 959 if (prgCmds == 0) return E_POINTER;
979 960
980 prgCmds[0].cmdf = OLECMDF_ENABLED; 961 prgCmds[0].cmdf = OLECMDF_ENABLED;
981 962
982 return S_OK; 963 return S_OK;
983 } 964 }
984 965
985 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url) 966 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url)
986 { 967 {
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); 1157 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str());
1177 fmii.cch = static_cast<UINT>(ctext.size()); 1158 fmii.cch = static_cast<UINT>(ctext.size());
1178 ::SetMenuItemInfoW(hMenu, ID_MENU_SETTINGS, FALSE, &fmii); 1159 ::SetMenuItemInfoW(hMenu, ID_MENU_SETTINGS, FALSE, &fmii);
1179 1160
1180 return true; 1161 return true;
1181 } 1162 }
1182 1163
1183 1164
1184 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V ARIANTARG*) 1165 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V ARIANTARG*)
1185 { 1166 {
1167 if (detachedInitializationFailed) return;
1186 HWND hBrowserWnd = GetBrowserHWND(); 1168 HWND hBrowserWnd = GetBrowserHWND();
1187 if (!hBrowserWnd) 1169 if (!hBrowserWnd)
1188 { 1170 {
1189 return E_FAIL; 1171 return E_FAIL;
1190 } 1172 }
1191 1173
1192 // Create menu 1174 // Create menu
1193 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); 1175 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl());
1194 if (!hMenu) 1176 if (!hMenu)
1195 { 1177 {
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 if (m_hPaneWnd == NULL) 1563 if (m_hPaneWnd == NULL)
1582 { 1564 {
1583 CreateStatusBarPane(); 1565 CreateStatusBarPane();
1584 } 1566 }
1585 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) 1567 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE))
1586 { 1568 {
1587 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar"); 1569 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar");
1588 } 1570 }
1589 } 1571 }
1590 1572
1591
1592 void CPluginClass::Unadvise()
1593 {
1594 if (!m_webBrowser2)
1595 {
1596 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with m_webBrowser 2 == nullptr");
1597 return;
1598 }
1599 s_criticalSectionLocal.Lock();
1600 {
1601 if (m_isAdvised)
1602 {
1603 HRESULT hr = DispEventUnadvise(m_webBrowser2);
1604 if (FAILED(hr))
1605 {
1606 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS E, "Class::Unadvise - Unadvise");
1607 }
1608 m_isAdvised = false;
1609 }
1610 }
1611 s_criticalSectionLocal.Unlock();
1612 }
1613
1614 HICON CPluginClass::GetIcon(int type) 1573 HICON CPluginClass::GetIcon(int type)
1615 { 1574 {
1616 HICON icon = NULL; 1575 HICON icon = NULL;
1617 1576
1618 s_criticalSectionLocal.Lock(); 1577 s_criticalSectionLocal.Lock();
1619 { 1578 {
1620 if (!s_hIcons[type]) 1579 if (!s_hIcons[type])
1621 { 1580 {
1622 std::wstring imageToLoad = L"#"; 1581 std::wstring imageToLoad = L"#";
1623 imageToLoad += std::to_wstring(s_hIconTypes[type]); 1582 imageToLoad += std::to_wstring(s_hIconTypes[type]);
1624 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); 1583 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), IMAGE_ICON, iconWidth, iconHeight, LR_SHARED);
1625 if (!s_hIcons[type]) 1584 if (!s_hIcons[type])
1626 { 1585 {
1627 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_ ICON, "Class::GetIcon - LoadIcon"); 1586 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_ ICON, "Class::GetIcon - LoadIcon");
1628 } 1587 }
1629 } 1588 }
1630 1589
1631 icon = s_hIcons[type]; 1590 icon = s_hIcons[type];
1632 } 1591 }
1633 s_criticalSectionLocal.Unlock(); 1592 s_criticalSectionLocal.Unlock();
1634 1593
1635 return icon; 1594 return icon;
1636 } 1595 }
1637 1596
1638 ATOM CPluginClass::GetAtomPaneClass() 1597 ATOM CPluginClass::GetAtomPaneClass()
1639 { 1598 {
1640 return s_atomPaneClass; 1599 return s_atomPaneClass;
1641 } 1600 }
1642 1601
OLDNEW
« no previous file with comments | « src/plugin/PluginClass.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld