| Left: | ||
| Right: |
| LEFT | RIGHT |
|---|---|
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
| 2 | 2 |
| 3 #include "PluginClass.h" | 3 #include "PluginClass.h" |
| 4 #include "PluginSettings.h" | 4 #include "PluginSettings.h" |
| 5 #include "PluginSystem.h" | 5 #include "PluginSystem.h" |
| 6 #ifdef SUPPORT_FILTER | 6 #ifdef SUPPORT_FILTER |
| 7 #include "PluginFilter.h" | 7 #include "PluginFilter.h" |
| 8 #endif | 8 #endif |
| 9 #include "PluginMimeFilterClient.h" | 9 #include "PluginMimeFilterClient.h" |
| 10 #include "PluginClient.h" | 10 #include "PluginClient.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 m_hStatusBarWnd = NULL; | 63 m_hStatusBarWnd = NULL; |
| 64 m_hPaneWnd = NULL; | 64 m_hPaneWnd = NULL; |
| 65 m_nPaneWidth = 0; | 65 m_nPaneWidth = 0; |
| 66 m_pWndProcStatus = NULL; | 66 m_pWndProcStatus = NULL; |
| 67 m_hTheme = NULL; | 67 m_hTheme = NULL; |
| 68 m_isInitializedOk = false; | 68 m_isInitializedOk = false; |
| 69 | 69 |
| 70 | 70 |
| 71 m_tab = new CPluginTab(this); | 71 m_tab = new CPluginTab(this); |
| 72 | 72 |
| 73 // Load / create settings | |
| 74 CPluginSettings* settings = CPluginSettings::GetInstance(); | |
| 75 | |
| 76 CPluginSystem* system = CPluginSystem::GetInstance(); | 73 CPluginSystem* system = CPluginSystem::GetInstance(); |
| 77 | 74 |
| 78 std::wstring locale((LPCWSTR)system->GetBrowserLanguage()); | 75 std::wstring locale((LPCWSTR)system->GetBrowserLanguage()); |
| 79 Dictionary::Create(locale); | 76 Dictionary::Create(locale); |
| 80 | |
| 81 bool isMainTab = settings->IncrementTabCount(); | |
| 82 | |
| 83 if (isMainTab) | |
| 84 { | |
| 85 // Prepare settings | |
| 86 settings->SetMainProcessId(); | |
| 87 settings->SetMainUiThreadId(); | |
| 88 #ifdef ENABLE_DEBUG_RESULT | |
| 89 CPluginDebug::DebugResultClear(); | |
| 90 #endif | |
| 91 } | |
| 92 } | 77 } |
| 93 | 78 |
| 94 CPluginClass::~CPluginClass() | 79 CPluginClass::~CPluginClass() |
| 95 { | 80 { |
| 96 delete m_tab; | 81 delete m_tab; |
| 97 | |
| 98 CPluginSettings* settings = CPluginSettings::GetInstance(); | |
| 99 | |
| 100 settings->DecrementTabCount(); | |
| 101 } | 82 } |
| 102 | 83 |
| 103 | 84 |
| 104 ///////////////////////////////////////////////////////////////////////////// | 85 ///////////////////////////////////////////////////////////////////////////// |
| 105 // Initialization | 86 // Initialization |
| 106 | 87 |
| 107 HRESULT CPluginClass::FinalConstruct() | 88 HRESULT CPluginClass::FinalConstruct() |
| 108 { | 89 { |
| 109 return S_OK; | 90 return S_OK; |
| 110 } | 91 } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 url = bstrURL; | 202 url = bstrURL; |
| 222 CPluginClient::UnescapeUrl(url); | 203 CPluginClient::UnescapeUrl(url); |
| 223 } | 204 } |
| 224 } | 205 } |
| 225 else | 206 else |
| 226 { | 207 { |
| 227 url = m_tab->GetDocumentUrl(); | 208 url = m_tab->GetDocumentUrl(); |
| 228 } | 209 } |
| 229 | 210 |
| 230 return url; | 211 return url; |
| 231 } | |
| 232 | |
| 233 void CPluginClass::LaunchUpdater(const CString& strPath) | |
| 234 { | |
| 235 PROCESS_INFORMATION pi; | |
| 236 ::ZeroMemory(&pi, sizeof(pi)); | |
| 237 | |
| 238 STARTUPINFO si; | |
| 239 ::ZeroMemory(&si, sizeof(si)); | |
| 240 si.cb = sizeof(si); | |
| 241 si.wShowWindow = FALSE; | |
| 242 CString cpath; | |
| 243 if (strPath.Find(L".exe") == strPath.GetLength() - 4) | |
| 244 { | |
| 245 cpath = strPath; | |
| 246 } | |
| 247 else | |
| 248 { | |
| 249 cpath = _T("\"msiexec.exe\" /i \"") + strPath + _T("\" UPDATEPLUGIN=\"True\" "); | |
| 250 } | |
| 251 | |
| 252 if (!::CreateProcess(NULL, cpath.GetBuffer(), NULL, NULL, FALSE, CREATE_BREAKA WAY_FROM_JOB, NULL, NULL, &si, &pi)) | |
| 253 { | |
| 254 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UPDATER, PLUGIN_ERROR_UPDATER _CREATE_PROCESS, "Class::Updater - Failed to start process"); | |
| 255 return; | |
| 256 } | |
| 257 #ifndef AUTOMATIC_SHUTDOWN | |
| 258 else | |
| 259 { | |
| 260 ::WaitForSingleObject(pi.hProcess, INFINITE); | |
| 261 } | |
| 262 #endif // not AUTOMATIC_SHUTDOWN | |
| 263 | |
| 264 ::CloseHandle(pi.hProcess); | |
| 265 ::CloseHandle(pi.hThread); | |
| 266 } | 212 } |
| 267 | 213 |
| 268 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 214 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 269 { | 215 { |
| 270 if (thisPtr == NULL) | 216 if (thisPtr == NULL) |
| 271 return 0; | 217 return 0; |
| 272 if (!((CPluginClass*)thisPtr)->InitObject(true)) | 218 if (!((CPluginClass*)thisPtr)->InitObject(true)) |
| 273 { | 219 { |
| 274 ((CPluginClass*)thisPtr)->Unadvice(); | 220 ((CPluginClass*)thisPtr)->Unadvice(); |
| 275 } | 221 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 290 // so we should handle that it is called this way several times during a session | 236 // so we should handle that it is called this way several times during a session |
| 291 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) | 237 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
| 292 { | 238 { |
| 293 CPluginSettings* settings = CPluginSettings::GetInstance(); | 239 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 294 CPluginSystem* system = CPluginSystem::GetInstance(); | 240 CPluginSystem* system = CPluginSystem::GetInstance(); |
| 295 | 241 |
| 296 MULTIPLE_VERSIONS_CHECK(); | 242 MULTIPLE_VERSIONS_CHECK(); |
| 297 | 243 |
| 298 if (unknownSite) | 244 if (unknownSite) |
| 299 { | 245 { |
| 300 if (settings->IsMainProcess() && settings->IsMainUiThread()) | 246 DEBUG_GENERAL(L"============================================================ ====================\nNEW TAB UI\n============================================== ==================================") |
| 301 { | |
| 302 DEBUG_GENERAL(L"========================================================== ======================\nMAIN TAB UI\n=========================================== =====================================") | |
| 303 } | |
| 304 else | |
| 305 { | |
| 306 DEBUG_GENERAL(L"========================================================== ======================\nNEW TAB UI\n============================================ ====================================") | |
| 307 } | |
| 308 | 247 |
| 309 HRESULT hr = ::CoInitialize(NULL); | 248 HRESULT hr = ::CoInitialize(NULL); |
| 310 if (FAILED(hr)) | 249 if (FAILED(hr)) |
| 311 { | 250 { |
| 312 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, " Class::SetSite - CoInitialize"); | 251 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, " Class::SetSite - CoInitialize"); |
| 313 } | 252 } |
| 314 | 253 |
| 315 s_criticalSectionBrowser.Lock(); | 254 s_criticalSectionBrowser.Lock(); |
| 316 { | 255 { |
| 317 m_webBrowser2 = unknownSite; | 256 m_webBrowser2 = unknownSite; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 422 m_hStatusBarWnd = NULL; | 361 m_hStatusBarWnd = NULL; |
| 423 | 362 |
| 424 // Remove instance from the list, shutdown threads | 363 // Remove instance from the list, shutdown threads |
| 425 HANDLE hMainThread = NULL; | 364 HANDLE hMainThread = NULL; |
| 426 HANDLE hTabThread = NULL; | 365 HANDLE hTabThread = NULL; |
| 427 | 366 |
| 428 s_criticalSectionLocal.Lock(); | 367 s_criticalSectionLocal.Lock(); |
| 429 { | 368 { |
| 430 s_instances.Remove(this); | 369 s_instances.Remove(this); |
| 431 | 370 |
| 432 if (s_instances.GetSize() == 0) | |
| 433 { | |
| 434 if (settings->IsMainProcess() && settings->IsMainUiThread()) | |
| 435 { | |
| 436 hMainThread = s_hMainThread; | |
| 437 s_hMainThread = NULL; | |
| 438 } | |
| 439 } | |
| 440 | |
| 441 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetC urrentThreadId()); | 371 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetC urrentThreadId()); |
| 442 if (it != s_threadInstances.end()) | 372 if (it != s_threadInstances.end()) |
| 443 { | 373 { |
| 444 s_threadInstances.erase(it); | 374 s_threadInstances.erase(it); |
| 445 } | 375 } |
| 446 if (s_instances.GetSize() == 0) | 376 if (s_instances.GetSize() == 0) |
| 447 { | 377 { |
| 448 CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 378 CPluginClientFactory::ReleaseMimeFilterClientInstance(); |
| 449 } | 379 } |
| 450 } | 380 } |
| 451 s_criticalSectionLocal.Unlock(); | 381 s_criticalSectionLocal.Unlock(); |
| 452 | 382 |
| 453 if (hMainThread != NULL) | |
| 454 { | |
| 455 s_isMainThreadDone = true; | |
| 456 | |
| 457 ::WaitForSingleObject(hMainThread, INFINITE); | |
| 458 ::CloseHandle(hMainThread); | |
| 459 } | |
| 460 | |
| 461 // Release browser interface | 383 // Release browser interface |
| 462 s_criticalSectionBrowser.Lock(); | 384 s_criticalSectionBrowser.Lock(); |
| 463 { | 385 { |
| 464 m_webBrowser2.Release(); | 386 m_webBrowser2.Release(); |
| 465 } | 387 } |
| 466 s_criticalSectionBrowser.Unlock(); | 388 s_criticalSectionBrowser.Unlock(); |
| 467 | 389 |
| 468 if (settings->IsMainProcess() && settings->IsMainUiThread()) | 390 DEBUG_GENERAL("============================================================= ===================\nNEW TAB UI - END\n========================================= =======================================") |
| 469 { | |
| 470 DEBUG_GENERAL("=========================================================== =====================\nMAIN TAB UI - END\n====================================== ==========================================") | |
| 471 } | |
| 472 else | |
| 473 { | |
| 474 DEBUG_GENERAL("=========================================================== =====================\nNEW TAB UI - END\n======================================= =========================================") | |
| 475 } | |
| 476 | 391 |
| 477 ::CoUninitialize(); | 392 ::CoUninitialize(); |
| 478 } | 393 } |
| 479 | 394 |
| 480 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | 395 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); |
| 481 } | 396 } |
| 482 | 397 |
| 483 bool CPluginClass::IsStatusBarEnabled() | 398 bool CPluginClass::IsStatusBarEnabled() |
| 484 { | 399 { |
| 485 HKEY pHkey; | 400 HKEY pHkey; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 513 | 428 |
| 514 CComQIPtr<IWebBrowser2> browser = GetAsyncBrowser(); | 429 CComQIPtr<IWebBrowser2> browser = GetAsyncBrowser(); |
| 515 if (browser) | 430 if (browser) |
| 516 { | 431 { |
| 517 HRESULT hr = S_OK; | 432 HRESULT hr = S_OK; |
| 518 hr = browser->get_StatusBar(&isVisible); | 433 hr = browser->get_StatusBar(&isVisible); |
| 519 if (SUCCEEDED(hr)) | 434 if (SUCCEEDED(hr)) |
| 520 { | 435 { |
| 521 if (!isVisible) | 436 if (!isVisible) |
| 522 { | 437 { |
| 523 if (!settings->GetStatusBarAsked()) | 438 if (!settings->GetStatusBarAsked()) |
|
Oleksandr
2013/07/05 03:33:55
This is the only case where we might have still ne
Wladimir Palant
2013/07/05 09:26:45
I suggest storing it in prefs.json instead - via t
| |
| 524 { | 439 { |
| 525 SHANDLE_PTR pBrowserHWnd; | 440 SHANDLE_PTR pBrowserHWnd; |
| 526 browser->get_HWND((SHANDLE_PTR*)&pBrowserHWnd); | 441 browser->get_HWND((SHANDLE_PTR*)&pBrowserHWnd); |
| 527 Dictionary* dictionary = Dictionary::GetInstance(); | 442 Dictionary* dictionary = Dictionary::GetInstance(); |
| 528 settings->SetStatusBarAsked(true); | 443 settings->SetStatusBarAsked(); |
| 529 | 444 |
| 530 HKEY pHkey; | 445 HKEY pHkey; |
| 531 HKEY pHkeySub; | 446 HKEY pHkeySub; |
| 532 LSTATUS regRes = 0; | 447 LSTATUS regRes = 0; |
| 533 regRes = RegOpenCurrentUser(KEY_WRITE, &pHkey); | 448 regRes = RegOpenCurrentUser(KEY_WRITE, &pHkey); |
| 534 | 449 |
| 535 // Do we have enough rights to enable a status bar? | 450 // Do we have enough rights to enable a status bar? |
| 536 if (regRes != 0) | 451 if (regRes != 0) |
| 537 { | 452 { |
| 538 // We use the tab window here and in the next few calls, since the b rowser window may still not be available | 453 // We use the tab window here and in the next few calls, since the b rowser window may still not be available |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 898 // Create status pane | 813 // Create status pane |
| 899 if (bBHO) | 814 if (bBHO) |
| 900 { | 815 { |
| 901 if (!CreateStatusBarPane()) | 816 if (!CreateStatusBarPane()) |
| 902 { | 817 { |
| 903 return false; | 818 return false; |
| 904 } | 819 } |
| 905 } | 820 } |
| 906 | 821 |
| 907 CPluginSettings* settings = CPluginSettings::GetInstance(); | 822 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 908 | |
| 909 // Create main thread | |
| 910 if (GetMainThreadHandle() == NULL && settings->IsMainProcess() && settings->Is MainUiThread()) | |
| 911 { | |
| 912 DWORD id; | |
| 913 HANDLE handle = ::CreateThread(NULL, 0, MainThreadProc, (LPVOID)m_tab, CREAT E_SUSPENDED, &id); | |
| 914 if (handle == NULL) | |
| 915 { | |
| 916 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_T HREAD_CREATE_PROCESS, "Class::Thread - Failed to create main thread"); | |
| 917 } | |
| 918 | |
| 919 s_hMainThread = handle; | |
| 920 | |
| 921 ::ResumeThread(handle); | |
| 922 } | |
| 923 | |
| 924 return true; | 823 return true; |
| 925 } | 824 } |
| 926 | 825 |
| 927 bool CPluginClass::CreateStatusBarPane() | 826 bool CPluginClass::CreateStatusBarPane() |
| 928 { | 827 { |
| 929 DEBUG_GENERAL(L"Getting client"); | 828 DEBUG_GENERAL(L"Getting client"); |
| 930 | 829 |
| 931 CPluginClient* client = CPluginClient::GetInstance(); | 830 CPluginClient* client = CPluginClient::GetInstance(); |
| 932 | 831 |
| 933 DEBUG_GENERAL(L"Getting ieversion"); | 832 DEBUG_GENERAL(L"Getting ieversion"); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1090 | 989 |
| 1091 ::SendMessage(m_hStatusBarWnd, SB_GETPARTS, nPartCount, (LPARAM)pData); | 990 ::SendMessage(m_hStatusBarWnd, SB_GETPARTS, nPartCount, (LPARAM)pData); |
| 1092 ::SendMessage(m_hStatusBarWnd, SB_SETPARTS, nPartCount, (LPARAM)pData); | 991 ::SendMessage(m_hStatusBarWnd, SB_SETPARTS, nPartCount, (LPARAM)pData); |
| 1093 | 992 |
| 1094 delete[] pData; | 993 delete[] pData; |
| 1095 } | 994 } |
| 1096 HDC hdc = GetWindowDC(m_hStatusBarWnd); | 995 HDC hdc = GetWindowDC(m_hStatusBarWnd); |
| 1097 SendMessage(m_hStatusBarWnd, WM_PAINT, (WPARAM)hdc, 0); | 996 SendMessage(m_hStatusBarWnd, WM_PAINT, (WPARAM)hdc, 0); |
| 1098 ReleaseDC(m_hStatusBarWnd, hdc); | 997 ReleaseDC(m_hStatusBarWnd, hdc); |
| 1099 return true; | 998 return true; |
| 1100 }///////////////////////////////////////////////////////////////////////////// | 999 } |
| 1101 // Implementation | |
| 1102 | 1000 |
| 1103 void CPluginClass::CloseTheme() | 1001 void CPluginClass::CloseTheme() |
| 1104 { | 1002 { |
| 1105 if (m_hTheme) | 1003 if (m_hTheme) |
| 1106 { | 1004 { |
| 1107 if (pfnClose) | 1005 if (pfnClose) |
| 1108 { | 1006 { |
| 1109 pfnClose(m_hTheme); | 1007 pfnClose(m_hTheme); |
| 1110 } | 1008 } |
| 1111 | 1009 |
| (...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2062 } | 1960 } |
| 2063 } | 1961 } |
| 2064 } | 1962 } |
| 2065 | 1963 |
| 2066 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1964 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); |
| 2067 } | 1965 } |
| 2068 | 1966 |
| 2069 return hTabWnd; | 1967 return hTabWnd; |
| 2070 | 1968 |
| 2071 } | 1969 } |
| LEFT | RIGHT |