123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 |
- #include "./main.h"
- #include "./component.h"
- #include "./browserFactory.h"
- #include "./serviceFactory.h"
- #include "./utilityFactory.h"
- #include "./wasabiHelper.h"
- #include "./winampHook.h"
- #include "./skinHelper.h"
- #include "./browserClass.h"
- #include "./internetFeatures.h"
- #include "./ieVersion.h"
- #include <wininet.h>
- #include <strsafe.h>
- static OmBrowserFactory browserFactory;
- static OmServiceFactory serviceFactory;
- static OmUtilityFactory utilityFactory;
- OmBrowserComponent::OmBrowserComponent()
- : wasabiHelper(NULL), winampHook(NULL), skinHelper(NULL), hookCookie(0), internetFeatures(NULL)
- {
- InitializeCriticalSection(&lock);
- }
- OmBrowserComponent::~OmBrowserComponent()
- {
- ReleaseServices();
- if (NULL != internetFeatures)
- {
- delete(internetFeatures);
- internetFeatures = NULL;
- InternetSetOption(NULL, INTERNET_OPTION_END_BROWSER_SESSION, NULL, 0);
- }
- DeleteCriticalSection(&lock);
- }
- size_t OmBrowserComponent::AddRef()
- {
- return 1;
- }
- size_t OmBrowserComponent::Release()
- {
- return 1;
- }
- int OmBrowserComponent::QueryInterface(GUID interface_guid, void **object)
- {
- if (NULL == object) return E_POINTER;
- if (IsEqualIID(interface_guid, IFC_WinampHook))
- *object = static_cast<ifc_winamphook*>(this);
- else
- {
- *object = NULL;
- return E_NOINTERFACE;
- }
- if (NULL == *object)
- return E_UNEXPECTED;
- AddRef();
- return S_OK;
- }
- void OmBrowserComponent::RegisterServices(api_service *service)
- {
- EnterCriticalSection(&lock);
- if (NULL == wasabiHelper)
- WasabiHelper::CreateInstance(service, &wasabiHelper);
- aTRACE_LINE("omBrowser Registered");
- browserFactory.Register(service);
- serviceFactory.Register(service);
- utilityFactory.Register(service);
- LeaveCriticalSection(&lock);
- }
- void OmBrowserComponent::ReleaseServices()
- {
- EnterCriticalSection(&lock);
- if (NULL != wasabiHelper)
- {
- wasabiHelper->Release();
- wasabiHelper = NULL;
- }
- if (NULL != winampHook)
- {
- winampHook->Release();
- winampHook = NULL;
- }
- if (0 != hookCookie)
- {
- UnregisterWinampHook(hookCookie);
- hookCookie = 0;
- }
- if (NULL != skinHelper)
- {
- skinHelper->Release();
- skinHelper = NULL;
- }
- LeaveCriticalSection(&lock);
- }
- int OmBrowserComponent::RegisterServicesSafeModeOk()
- {
- return 1;
- }
- void OmBrowserComponent::DeregisterServices(api_service *service)
- {
- browserFactory.Unregister(service);
- serviceFactory.Unregister(service);
- utilityFactory.Unregister(service);
- ReleaseServices();
- size_t index = unloadCallbacks.size();
- while(index--)
- {
- PLUGINUNLOADCALLBACK callback = unloadCallbacks[index];
- if (NULL != callback) callback();
- }
- unloadCallbacks.clear();
- }
- HRESULT OmBrowserComponent::InitializeComponent(HWND hwndWinamp)
- {
- HRESULT hr(S_FALSE);
- EnterCriticalSection(&lock);
- if(NULL == winampHook)
- {
- HRESULT hookResult = WinampHook::CreateInstance(hwndWinamp, &winampHook);
- if (FAILED(hookResult) && SUCCEEDED(hr)) hr = hookResult;
- }
- if (SUCCEEDED(hr) && 0 == hookCookie)
- {
- hr = winampHook->RegisterCallback(this, &hookCookie);
- }
- if (NULL == skinHelper)
- {
- HRESULT skinResult = SkinHelper::CreateInstance(hwndWinamp, &skinHelper);
- if (FAILED(skinResult) && SUCCEEDED(hr)) hr = skinResult;
- }
- LeaveCriticalSection(&lock);
- return hr;
- }
- HRESULT OmBrowserComponent::GetWasabiHelper( ifc_wasabihelper **wasabiOut )
- {
- if ( NULL == wasabiOut ) return E_POINTER;
- EnterCriticalSection( &lock );
- *wasabiOut = wasabiHelper;
- if ( NULL != wasabiHelper )
- wasabiHelper->AddRef();
- LeaveCriticalSection( &lock );
- return ( NULL != *wasabiOut ) ? S_OK : E_NOINTERFACE;
- }
- HRESULT OmBrowserComponent::GetSkinHelper(ifc_skinhelper **skinOut)
- {
- if (NULL == skinOut) return E_POINTER;
- EnterCriticalSection(&lock);
- *skinOut = skinHelper;
- if (NULL != skinHelper)
- skinHelper->AddRef();
- LeaveCriticalSection(&lock);
- return (NULL != *skinOut) ? S_OK : E_NOINTERFACE;
- }
- HRESULT OmBrowserComponent::RegisterWinampHook(ifc_winamphook *hook, UINT *cookieOut)
- {
- if (NULL == cookieOut) return E_POINTER;
- *cookieOut = NULL;
- EnterCriticalSection(&lock);
- HRESULT hr = (NULL != winampHook) ? winampHook->RegisterCallback(hook, cookieOut) : E_FAIL;
- LeaveCriticalSection(&lock);
- return hr;
- }
- HRESULT OmBrowserComponent::UnregisterWinampHook(UINT cookie)
- {
- EnterCriticalSection(&lock);
- HRESULT hr = (NULL != winampHook) ? winampHook->UnregisterCallback(cookie) : E_FAIL;
- LeaveCriticalSection(&lock);
- return hr;
- }
- HRESULT OmBrowserComponent::GetWinampWnd(HWND *hwndWinamp)
- {
- if (NULL == hwndWinamp) return E_POINTER;
- EnterCriticalSection(&lock);
- *hwndWinamp = (NULL != winampHook) ? winampHook->GetWinamp() : NULL;
- LeaveCriticalSection(&lock);
- HRESULT hr;
- if (NULL == *hwndWinamp)
- hr = E_FAIL;
- else
- hr = S_OK;
- return hr;
- }
- HRESULT OmBrowserComponent::ResetFont(void)
- {
- if (NULL != skinHelper)
- skinHelper->ResetFontCache();
- return S_OK;
- }
- HRESULT OmBrowserComponent::SkinChanged(const wchar_t *skinName)
- {
- UpdateColors();
- return S_OK;
- }
- HRESULT OmBrowserComponent::SkinColorChange(const wchar_t *colorTheme)
- {
- UpdateColors();
- return S_OK;
- }
- HRESULT OmBrowserComponent::RegisterUnloadCallback(PLUGINUNLOADCALLBACK callback)
- {
- if(NULL == callback) return E_INVALIDARG;
- unloadCallbacks.push_back(callback);
- return S_OK;
- }
- HRESULT OmBrowserComponent::GetBrowserClass(LPCWSTR pszName, ifc_ombrowserclass **instance)
- {
- if (NULL == instance) return E_POINTER;
- HRESULT hr(S_OK);
- ifc_ombrowserclass *browserClass = NULL;
- EnterCriticalSection(&lock);
- size_t index = browserClasses.size();
- while(index--)
- {
- browserClass = browserClasses[index];
- if (S_OK == browserClass->IsEqual(pszName))
- {
- browserClass->AddRef();
- break;
- }
- }
- if (((size_t)-1) == index)
- {
- hr = OmBrowserClass::CreateInstance(pszName, (OmBrowserClass**)&browserClass);
- if (SUCCEEDED(hr) && browserClass != NULL)
- {
- if (0 == browserClasses.size())
- {
- SetUserAgent();
- SetInternetFeautures();
- }
- browserClasses.push_back(browserClass);
- }
- }
- *instance = (SUCCEEDED(hr) && browserClass != NULL) ? browserClass : NULL;
- LeaveCriticalSection(&lock);
- return hr;
- }
- HRESULT OmBrowserComponent::UnregisterBrowserClass(LPCWSTR pszName)
- {
- HRESULT hr(S_FALSE);
- EnterCriticalSection(&lock);
- size_t index = browserClasses.size();
- while(index--)
- {
- ifc_ombrowserclass *browserClass = browserClasses[index];
- if (S_OK == browserClass->IsEqual(pszName))
- {
- browserClasses.erase(browserClasses.begin() + index);
- hr = S_OK;
- break;
- }
- }
- LeaveCriticalSection(&lock);
- return hr;
- }
- void OmBrowserComponent::UpdateColors()
- {
- if (NULL != skinHelper)
- skinHelper->ResetColorCache();
- EnterCriticalSection(&lock);
- size_t index = browserClasses.size();
- while(index--)
- {
- browserClasses[index]->UpdateRegColors();
- }
- LeaveCriticalSection(&lock);
- InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0 );
- }
- typedef struct __INTERNETFEATUREREC
- {
- INTERNETFEATURELIST entry;
- DWORD flags;
- BOOL enabled;
- } INTERNETFEATUREREC;
- void OmBrowserComponent::SetInternetFeautures()
- {
- const INTERNETFEATUREREC szFeatures[] =
- {
- { FEATURE_DISABLE_NAVIGATION_SOUNDS, SET_FEATURE_ON_PROCESS, TRUE },
- { FEATURE_TABBED_BROWSING, SET_FEATURE_ON_PROCESS, TRUE },
- { FEATURE_WINDOW_RESTRICTIONS, SET_FEATURE_ON_PROCESS, FALSE },
- { FEATURE_SSLUX, SET_FEATURE_ON_PROCESS, TRUE },
- { FEATURE_FORCE_ADDR_AND_STATUS, SET_FEATURE_ON_PROCESS, FALSE },
- { FEATURE_BLOCK_INPUT_PROMPTS, SET_FEATURE_ON_PROCESS, FALSE },
- { FEATURE_MIME_HANDLING, SET_FEATURE_ON_PROCESS, TRUE },
- { FEATURE_LOCALMACHINE_LOCKDOWN, SET_FEATURE_ON_PROCESS, TRUE },
- };
- EnterCriticalSection(&lock);
- if (NULL == internetFeatures)
- {
- internetFeatures = new InternetFeatures();
- if (NULL == internetFeatures)
- {
- LeaveCriticalSection(&lock);
- return;
- }
- }
- UINT modified = 0;
- HRESULT hr;
- for (INT i = 0; i < ARRAYSIZE(szFeatures); i++)
- {
- const INTERNETFEATUREREC *rec = &szFeatures[i];
- hr = internetFeatures->IsEnabled(rec->entry, rec->flags);
- if ((S_OK == hr && FALSE == rec->enabled) || (S_FALSE == hr && FALSE != rec->enabled))
- {
- if (SUCCEEDED(internetFeatures->SetEnabled(rec->entry, rec->flags, rec->enabled)))
- modified++;
- }
- }
- int majorVersion = 0;
- if (SUCCEEDED(MSIE_GetVersion(&majorVersion, NULL, NULL, NULL)))
- {
- unsigned long browserEmulation = 0;
- if (8 == majorVersion)
- browserEmulation = 8000;
- else if (9 == majorVersion)
- browserEmulation = 9000;
- else if (10 <= majorVersion)
- browserEmulation = 10000;
- else
- browserEmulation = 0;
- unsigned long valueAlreadySet = 0;
- hr = internetFeatures->GetDWORDFeature(L"FEATURE_BROWSER_EMULATION", TRUE, &valueAlreadySet);
- if (FAILED(hr) || valueAlreadySet != browserEmulation)
- {
- if (0 == browserEmulation)
- {
- if (0x80070002 /*ERROR_FILE_NOT_FOUND */ != hr)
- internetFeatures->DeleteFeature(L"FEATURE_BROWSER_EMULATION", TRUE);
- }
- else
- {
- if (SUCCEEDED(internetFeatures->SetDWORDFeature(L"FEATURE_BROWSER_EMULATION", TRUE, browserEmulation)))
- modified++;
- }
- }
- }
- LeaveCriticalSection(&lock);
- if (0 != modified)
- InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0 );
- }
- static HRESULT
- Component_PrintWinampUA(char *buffer, size_t bufferMax)
- {
- char *cursor = buffer;
- size_t remaining = bufferMax;
- HRESULT hr = StringCchPrintfExA(cursor, remaining,
- &cursor, &remaining,
- STRSAFE_NULL_ON_FAILURE,
- "%S/%d.%d",
- OMBROWSER_NAME,
- OMBROWSER_VERSION_MAJOR,
- OMBROWSER_VERSION_MINOR);
- if (SUCCEEDED(hr))
- {
- ifc_wasabihelper *wasabi = NULL;
- if (SUCCEEDED(Plugin_GetWasabiHelper(&wasabi)) && wasabi != NULL)
- {
- api_application *app = NULL;
- if (SUCCEEDED(wasabi->GetApplicationApi(&app)) && app != NULL)
- {
- char *rollback = cursor;
- hr = StringCchPrintfExA(cursor, remaining,
- &cursor, &remaining,
- STRSAFE_NULL_ON_FAILURE,
- " (%S)",
- app->main_getVersionString());
-
- if (FAILED(hr))
- *rollback = '\0';
- app->Release();
- }
- wasabi->Release();
- }
- }
- if (FAILED(hr))
- buffer[0] = '\0';
- return hr;
- }
- BOOL OmBrowserComponent::SetUserAgent(void)
- {
- unsigned long bufferSize = 0;
- HRESULT hr = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT,
- NULL,
- 0,
- &bufferSize,
- 0);
- if(E_OUTOFMEMORY == hr)
- hr = S_OK;
- if (FAILED(hr))
- return FALSE;
- bufferSize += 512;
- char *buffer = (char *)calloc(bufferSize, sizeof(char));
- if (NULL == buffer)
- return FALSE;
- unsigned long bufferLength = 0;
- hr = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT,
- buffer,
- bufferSize,
- &bufferLength,
- 0);
- if (E_OUTOFMEMORY == hr
- && bufferLength <= bufferSize)
- {
- hr = S_OK;
- }
- if (SUCCEEDED(hr))
- {
- if (bufferLength > 0
- && bufferLength < bufferSize)
- {
- buffer[bufferLength - 1] = ' ';
- }
- hr = Component_PrintWinampUA(buffer + bufferLength,
- bufferSize - bufferLength);
- if (FAILED(hr))
- {
- if (bufferLength > 0)
- buffer[bufferLength - 1] = '\0';
- }
- else
- {
- bufferLength = lstrlenA(buffer);
- hr = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT,
- buffer,
- bufferLength,
- 0);
- }
- }
- free(buffer);
- return SUCCEEDED(hr);
- }
- #define CBCLASS OmBrowserComponent
- START_MULTIPATCH;
- START_PATCH(MPIID_WA5COMPONENT)
- M_CB(MPIID_WA5COMPONENT, ifc_wa5component, ADDREF, AddRef);
- M_CB(MPIID_WA5COMPONENT, ifc_wa5component, RELEASE, Release);
- M_CB(MPIID_WA5COMPONENT, ifc_wa5component, QUERYINTERFACE, QueryInterface);
- M_VCB(MPIID_WA5COMPONENT, ifc_wa5component, API_WA5COMPONENT_REGISTERSERVICES, RegisterServices);
- M_CB(MPIID_WA5COMPONENT, ifc_wa5component, 15, RegisterServicesSafeModeOk)
- M_VCB(MPIID_WA5COMPONENT, ifc_wa5component, API_WA5COMPONENT_DEREEGISTERSERVICES, DeregisterServices);
- NEXT_PATCH(MPIID_WINAMPHOOK)
- M_CB(MPIID_WINAMPHOOK, ifc_winamphook, ADDREF, AddRef);
- M_CB(MPIID_WINAMPHOOK, ifc_winamphook, RELEASE, Release);
- M_CB(MPIID_WINAMPHOOK, ifc_winamphook, QUERYINTERFACE, QueryInterface);
- M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_RESETFONT, ResetFont);
- M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCHANGED, SkinChanged);
- M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCOLORCHANGE, SkinColorChange);
- END_PATCH
- END_MULTIPATCH;
- #undef CBCLASS
|