mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-11-28 11:30:48 +01:00
322 lines
8.3 KiB
C++
322 lines
8.3 KiB
C++
#include "main.h"
|
|
#include "./browserUiHook.h"
|
|
#include "./browserUiCommon.h"
|
|
#include "./browserUiInternal.h"
|
|
#include "./browserPopup.h"
|
|
#include "./browserHost.h"
|
|
|
|
#include "./ifc_omservice.h"
|
|
#include "./ifc_omserviceeventmngr.h"
|
|
#include "./ifc_omservicecommand.h"
|
|
#include "./ifc_omtoolbarconfig.h"
|
|
#include "./ifc_omstatusbarconfig.h"
|
|
#include "./ifc_omserviceeditor.h"
|
|
#include "./ifc_omconfig.h"
|
|
#include "./obj_ombrowser.h"
|
|
|
|
#include "./toolbar.h"
|
|
#include "./statusbar.h"
|
|
|
|
#include "../winamp/IWasabiDispatchable.h"
|
|
#include "../winamp/JSAPI_Info.h"
|
|
|
|
#include <strsafe.h>
|
|
|
|
BrowserUiHook::BrowserUiHook(HWND hTarget, BOOL fPopupMode)
|
|
: ref(1), popupMode(fPopupMode), hwnd(hTarget), winampCookie(NULL), configCookie(NULL)
|
|
{
|
|
}
|
|
|
|
BrowserUiHook::~BrowserUiHook()
|
|
{
|
|
}
|
|
|
|
HRESULT BrowserUiHook::CreateInstance(HWND hTarget, BOOL fPopupMode, BrowserUiHook **instance)
|
|
{
|
|
if (NULL == instance) return E_POINTER;
|
|
*instance = NULL;
|
|
|
|
if (NULL == hTarget || FALSE == IsWindow(hTarget))
|
|
return E_INVALIDARG;
|
|
|
|
*instance = new BrowserUiHook(hTarget, fPopupMode);
|
|
if (NULL == *instance) return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
size_t BrowserUiHook::AddRef()
|
|
{
|
|
return InterlockedIncrement((LONG*)&ref);
|
|
}
|
|
|
|
size_t BrowserUiHook::Release()
|
|
{
|
|
if (0 == ref)
|
|
return ref;
|
|
|
|
LONG r = InterlockedDecrement((LONG*)&ref);
|
|
if (0 == r)
|
|
delete(this);
|
|
|
|
return r;
|
|
}
|
|
|
|
int BrowserUiHook::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 if (IsEqualIID(interface_guid, IFC_OmServiceEvent))
|
|
*object = static_cast<ifc_omserviceevent*>(this);
|
|
else if (IsEqualIID(interface_guid, IFC_OmConfigCallback))
|
|
*object = static_cast<ifc_omconfigcallback*>(this);
|
|
else
|
|
{
|
|
*object = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
if (NULL == *object)
|
|
return E_UNEXPECTED;
|
|
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT BrowserUiHook::SkinChanging(void)
|
|
{
|
|
if (FALSE != popupMode)
|
|
{
|
|
BrowserPopup_SkinRefreshing(hwnd);
|
|
PostMessage(hwnd, NBPM_SKINREFRESHED, 0, 0L);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT BrowserUiHook::SkinChanged(const wchar_t *skinName)
|
|
{
|
|
PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT BrowserUiHook::SkinColorChange(const wchar_t *colorTheme)
|
|
{
|
|
PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT BrowserUiHook::ResetFont(void)
|
|
{
|
|
PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE);
|
|
return S_OK;
|
|
}
|
|
|
|
void BrowserUiHook::ServiceChange(ifc_omservice *service, UINT nModified)
|
|
{
|
|
ifc_omservice *windowService;
|
|
if (FALSE == (BOOL)SendMessage(hwnd, NBCM_GETSERVICE, 0, (LPARAM)&windowService) || NULL == windowService)
|
|
return;
|
|
|
|
if (windowService != service) return;
|
|
|
|
if (0 != (ifc_omserviceeditor::modifiedName & nModified))
|
|
{
|
|
IDispatch *pDispatch;
|
|
if (SUCCEEDED(windowService->GetExternal(&pDispatch) && NULL != pDispatch))
|
|
{
|
|
IWasabiDispatchable *pWasabi;
|
|
if (SUCCEEDED(pDispatch->QueryInterface(IID_IWasabiDispatchable, (void**)&pWasabi)))
|
|
{
|
|
JSAPI::ifc_info *info = NULL;
|
|
if (SUCCEEDED(pWasabi->QueryDispatchable(JSAPI::IID_JSAPI_ifc_info, (Dispatchable**)&info)))
|
|
{
|
|
WCHAR szName[512] = {0};
|
|
if (FAILED(service->GetName(szName, ARRAYSIZE(szName))))
|
|
StringCchCopy(szName, ARRAYSIZE(szName), L"Unknown");
|
|
|
|
info->SetName(szName);
|
|
info->Release();
|
|
}
|
|
pWasabi->Release();
|
|
}
|
|
pDispatch->Release();
|
|
}
|
|
|
|
if (FALSE != popupMode)
|
|
PostMessage(hwnd, NBPM_REFRESHTITLE, 0, 0L);
|
|
}
|
|
|
|
if (0 != (ifc_omserviceeditor::modifiedRating & nModified))
|
|
{
|
|
HWND hToolbar = BrowserControl_GetToolbar(hwnd);
|
|
if (NULL != hToolbar)
|
|
{
|
|
UINT rating;
|
|
if(SUCCEEDED(service->GetRating(&rating)))
|
|
{
|
|
Toolbar_SetItemInt(hToolbar, TOOLITEM_USERRATING, rating);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (0 != (ifc_omserviceeditor::modifiedGeneration & nModified))
|
|
{
|
|
HWND hHost = BrowserControl_GetHost(hwnd);
|
|
if (NULL != hHost) PostMessage(hHost, NBHM_UPDATEEXTERNAL, 0 , 0L);
|
|
}
|
|
|
|
}
|
|
|
|
void BrowserUiHook::CommandStateChange(ifc_omservice *service, const GUID *commandGroup, unsigned int commandId)
|
|
{
|
|
if (NULL != commandGroup)
|
|
{
|
|
if (IsEqualGUID(CMDGROUP_SERVICE, *commandGroup))
|
|
{
|
|
switch(commandId)
|
|
{
|
|
case SVCCOMMAND_BLOCKNAV:
|
|
CheckBlockedState(service);
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
HRESULT BrowserUiHook::ValueChanged(const GUID *configUid, UINT valueId, ULONG_PTR value)
|
|
{
|
|
if (NULL == configUid)
|
|
return E_UNEXPECTED;
|
|
|
|
if (IsEqualIID(IFC_OmToolbarConfig, *configUid))
|
|
{
|
|
HWND hToolbar = (HWND)SendMessage(hwnd, NBCM_GETTOOLBAR, 0, 0L);
|
|
if (NULL == hToolbar) return S_FALSE;
|
|
|
|
switch(valueId)
|
|
{
|
|
case CFGID_TOOLBAR_BOTTOMDOCK: Toolbar_EnableBottomDock(hToolbar, (BOOL)value); break;
|
|
case CFGID_TOOLBAR_AUTOHIDE: Toolbar_EnableAutoHide(hToolbar, (BOOL)value); break;
|
|
case CFGID_TOOLBAR_TABSTOP: Toolbar_EnableTabStop(hToolbar, (BOOL)value); break;
|
|
case CFGID_TOOLBAR_FORCEADDRESS: Toolbar_EnableForceAddress(hToolbar, (BOOL)value); break;
|
|
case CFGID_TOOLBAR_FANCYADDRESS: Toolbar_EnableFancyAddress(hToolbar, (BOOL)value); break;
|
|
}
|
|
}
|
|
else if (IsEqualIID(IFC_OmStatusbarConfig, *configUid))
|
|
{
|
|
HWND hStatusbar = (HWND)SendMessage(hwnd, NBCM_GETSTATUSBAR, 0, 0L);
|
|
if (NULL == hStatusbar) return S_FALSE;
|
|
|
|
switch(valueId)
|
|
{
|
|
case CFGID_STATUSBAR_ENABLED: Statusbar_Enable(hStatusbar, (BOOL)value); break;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT BrowserUiHook::Register(obj_ombrowser *browserManager, ifc_omservice *service)
|
|
{
|
|
|
|
Plugin_RegisterWinampHook(this, &winampCookie);
|
|
|
|
ifc_omconfig *config;
|
|
if (NULL != browserManager && SUCCEEDED(browserManager->GetConfig(NULL, (void**)&config)))
|
|
{
|
|
config->RegisterCallback(this, &configCookie);
|
|
config->Release();
|
|
}
|
|
|
|
ifc_omserviceeventmngr *eventManager;
|
|
if (NULL != service && SUCCEEDED(service->QueryInterface(IFC_OmServiceEventMngr, (void**)&eventManager)))
|
|
{
|
|
eventManager->RegisterHandler(this);
|
|
eventManager->Release();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT BrowserUiHook::Unregister(obj_ombrowser *browserManager, ifc_omservice *service)
|
|
{
|
|
if (0 != configCookie)
|
|
{
|
|
ifc_omconfig *config;
|
|
if (NULL != browserManager && SUCCEEDED(browserManager->GetConfig(NULL, (void**)&config)))
|
|
{
|
|
config->UnregisterCallback(configCookie);
|
|
config->Release();
|
|
}
|
|
configCookie = 0;
|
|
}
|
|
|
|
ifc_omserviceeventmngr *eventManager;
|
|
if (NULL != service && SUCCEEDED(service->QueryInterface(IFC_OmServiceEventMngr, (void**)&eventManager)))
|
|
{
|
|
eventManager->UnregisterHandler(this);
|
|
eventManager->Release();
|
|
}
|
|
|
|
|
|
if (0 != winampCookie)
|
|
{
|
|
Plugin_UnregisterWinampHook(winampCookie);
|
|
winampCookie = 0;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT BrowserUiHook::CheckBlockedState(ifc_omservice *service)
|
|
{
|
|
if (NULL == service)
|
|
return E_INVALIDARG;
|
|
|
|
HRESULT hr;
|
|
|
|
ifc_omservicecommand *serviceCommand;
|
|
hr = service->QueryInterface(IFC_OmServiceCommand, (void**)&serviceCommand);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HRESULT state = serviceCommand->QueryState(hwnd, &CMDGROUP_SERVICE, SVCCOMMAND_BLOCKNAV);
|
|
PostMessage(hwnd, NBCM_BLOCK, 0, (CMDSTATE_ENABLED == state));
|
|
serviceCommand->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
#define CBCLASS BrowserUiHook
|
|
START_MULTIPATCH;
|
|
START_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_SKINCHANGING, SkinChanging);
|
|
M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCHANGED, SkinChanged);
|
|
M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCOLORCHANGE, SkinColorChange);
|
|
M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_RESETFONT, ResetFont);
|
|
NEXT_PATCH(MPIID_SERVICEEVENT)
|
|
M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, ADDREF, AddRef);
|
|
M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, RELEASE, Release);
|
|
M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, QUERYINTERFACE, QueryInterface);
|
|
M_VCB(MPIID_SERVICEEVENT, ifc_omserviceevent, API_SERVICECHANGE, ServiceChange);
|
|
M_VCB(MPIID_SERVICEEVENT, ifc_omserviceevent, API_COMMANDSTATECHANGE, CommandStateChange);
|
|
|
|
NEXT_PATCH(MPIID_CONFIGCALLBACK)
|
|
M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, ADDREF, AddRef);
|
|
M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, RELEASE, Release);
|
|
M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, QUERYINTERFACE, QueryInterface);
|
|
M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, API_VALUECHANGED, ValueChanged);
|
|
END_PATCH
|
|
END_MULTIPATCH;
|
|
#undef CBCLASS
|
|
|
|
|
|
|