winamp/Src/Winamp/UpdateWindow.cpp
2024-09-24 14:54:57 +02:00

214 lines
5 KiB
C++

#include "Main.h"
#include "Browser.h"
#include "./api.h"
#include "../nu/ns_wc.h"
#include "menuv5.h"
#include "ExternalCOM.h"
#include "wa_dlg.h"
#include "./updateService.h"
UpdateBrowser *updateBrowser=0;
static WNDPROC oldUpdateProc = 0;
static BOOL fUnicode = FALSE;
static void CALLBACK UpdateBrowser_TimerProc(HWND hwnd, UINT uMsg, UINT_PTR eventId, DWORD elapsed)
{
KillTimer(hwnd, eventId);
if (0 == (WS_VISIBLE & GetWindowLongPtrW(hwnd, GWL_STYLE)))
{
ShowWindow(hwnd, SW_SHOW);
}
embedWindowState *state = (embedWindowState*)(ULONG_PTR)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
if(NULL != state)
{
if (NULL != state->wasabi_window)
{
state->wasabi_window->activate();
return;
}
else if (NULL != g_dialog_box_parent)
{
SetTimer(hwnd, eventId, 200, UpdateBrowser_TimerProc);
return;
}
}
HWND hFrame = hwnd;
while (NULL != hFrame && 0 != (WS_CHILD & GetWindowLongPtrW(hFrame, GWL_STYLE)))
hFrame = GetAncestor(hFrame, GA_PARENT);
if (NULL != hFrame && (g_dialog_box_parent == hFrame || hMainWindow == hFrame))
hFrame = NULL;
if (NULL == hFrame) hFrame = hwnd;
SetWindowPos(hFrame, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
SetForegroundWindow(hFrame);
}
HRESULT UpdateWindow_Show(LPCSTR pszUrl)
{
if (0 != _strnicmp(pszUrl, "http://client.winamp.com", 21))
return E_UNEXPECTED;
UpdateService *service;
if (SUCCEEDED(UpdateService::CreateInstance(pszUrl, &service)))
{
HRESULT hr = service->Show();
service->Release();
if (SUCCEEDED(hr))
return hr;
}
updateBrowser = new UpdateBrowser;
updateBrowser->CreateHWND();
updateBrowser->setVisible(TRUE);
updateBrowser->NavigateToName((LPCTSTR)pszUrl);
SetTimer(updateBrowser->m_hwnd, 1980, 1000, UpdateBrowser_TimerProc);
return S_OK;
}
static LRESULT WINAPI BrowserSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_PAINT:
{
HDC out = GetDC(hwnd);
RECT r;
GetClientRect(hwnd, &r);
r.left=11;
r.top=20;
r.right-=8;
r.bottom-=14;
HBRUSH b = CreateSolidBrush(WADlg_getColor(WADLG_WNDBG));
FillRect(out, &r, b);
DeleteObject(b);
ValidateRect(hwnd, &r);
}
break;
case WM_USER+0x102:
{
if (wParam == 1)
{
ShowWindow(updateBrowser->m_hwnd, SW_SHOW);
}
else
{
ShowWindow(updateBrowser->m_hwnd, SW_HIDE);
}
}
break;
case WM_USER + 101:
{
//updateBrowser->setVisible(FALSE);
ShowWindow(hwnd, SW_HIDE);
ShowWindow(updateBrowser->m_hwnd, SW_HIDE);
return 0;
}
break;
case WM_NCDESTROY:
case WM_DESTROY:
updateBrowser->m_hwnd = 0;
return 0;
break;
}
if (oldUpdateProc)
return (fUnicode) ? CallWindowProcW(oldUpdateProc, hwnd, msg, wParam, lParam) : CallWindowProcA(oldUpdateProc, hwnd, msg, wParam, lParam);
else
return (fUnicode) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam);
}
HWND UpdateBrowser::CreateHWND()
{
if (!m_hwnd)
{
state.flags = EMBED_FLAGS_NOWINDOWMENU;
state.me = 0;
state.r.left = config_wx;
state.r.right = config_wx+300;
state.r.top = config_wy;
state.r.bottom = config_wy+200;
HWND owner = (HWND) SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM) & state, IPC_GET_EMBEDIF);
m_hwnd = owner;
setLocation(11,20, 300-19, 200-34);
fUnicode = IsWindowUnicode(owner);
oldUpdateProc = (WNDPROC) ((fUnicode) ? SetWindowLongPtrW(owner, GWLP_WNDPROC, (LONG_PTR)BrowserSubclassProc) :
SetWindowLongPtrA(owner, GWLP_WNDPROC, (LONG_PTR)BrowserSubclassProc));
SetWindowTextW(owner, getStringW(IDS_WINAMP_UPDATE, NULL, 0));
}
return m_hwnd;
}
// ---------------------------------------------------------------
void UpdateBrowser::NavigateToName(LPCTSTR pszUrl)
{
if (!m_pweb) return ;
DWORD dwChars = lstrlen (pszUrl) + 1;
LPWSTR pwszUrl = (LPWSTR)LocalAlloc (LPTR, dwChars * sizeof (WCHAR));
long moptions = navNoReadFromCache | navNoWriteToCache | navNoHistory;
VARIANT options;
memset( (void*)&options, 0, sizeof(VARIANT));
V_VT(&options) = VT_I4;
V_I4(&options) = moptions;
if (pwszUrl)
{
MultiByteToWideCharSZ(CP_ACP, 0, (LPCSTR)pszUrl, -1, pwszUrl, dwChars);
m_pweb->Navigate (pwszUrl, &options , 0, 0, 0);
LocalFree (pwszUrl);
}
}
#define VIDEO_GENFF_SIZEREQUEST (WM_USER+2048)
void UpdateBrowser::Resized(unsigned long width, unsigned long height)
{
updateBrowser->setLocation(11,20, width, height);
if (GetParent(m_hwnd))
SendMessageW(GetParent(m_hwnd), VIDEO_GENFF_SIZEREQUEST, width, height);
else
SetWindowPos(m_hwnd, 0, 0, 0, width + 19, height + 34, SWP_NOMOVE|SWP_ASYNCWINDOWPOS);
InvalidateRect(m_hwnd, NULL, TRUE);
}
HRESULT UpdateBrowser::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
if (NULL == ppDispatch)
return E_POINTER;
ExternalCOM *external;
HRESULT hr = JSAPI1_GetExternal(&external);
if (FAILED(hr)) external = NULL;
*ppDispatch = (IDispatch*) external;
return S_OK;
}
void UpdateBrowser::OnNavigateComplete()
{
setVisible(TRUE);
RECT r;
GetClientRect(m_hwnd, &r);
setLocation(11,20, r.right-19, r.bottom-34);
}