mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-10 11:59:58 -05:00
Initial community commit
This commit is contained in:
438
Src/Plugins/General/gen_ml/webinfo_obj.cpp
Normal file
438
Src/Plugins/General/gen_ml/webinfo_obj.cpp
Normal file
@ -0,0 +1,438 @@
|
||||
#include "main.h"
|
||||
#include "./webinfo_obj.h"
|
||||
#include "../winamp/buildtype.h"
|
||||
#include "./resource.h"
|
||||
#include "api__gen_ml.h"
|
||||
#include "../Winamp/buildtype.h"
|
||||
|
||||
#include <exdisp.h>
|
||||
#include <mshtmdid.h>
|
||||
#include <mshtml.h>
|
||||
|
||||
#include <strsafe.h>
|
||||
|
||||
#define WEBINFO_URL L"http://client.winamp.com/nowplaying/mini"
|
||||
#define WEBINFO_FUNCTION L"SongInfoCallback"
|
||||
|
||||
#define WEBINFO_USERAGENT L"Winamp File Info"
|
||||
|
||||
#define WEBINFO_DOWNLOADFLAGS ( DLCTL_DLIMAGES | \
|
||||
/*DLCTL_NO_SCRIPTS |*/ \
|
||||
/*DLCTL_NO_JAVA | */ \
|
||||
DLCTL_NO_DLACTIVEXCTLS | \
|
||||
/*DLCTL_NO_RUNACTIVEXCTLS |*/ \
|
||||
/*DLCTL_RESYNCHRONIZE |*/ \
|
||||
DLCTL_NO_BEHAVIORS | \
|
||||
0)
|
||||
|
||||
#define WEBINFO_HOSTINFODFLAGS ( DOCHOSTUIFLAG_DIALOG | \
|
||||
DOCHOSTUIFLAG_DISABLE_HELP_MENU | \
|
||||
DOCHOSTUIFLAG_NO3DBORDER | \
|
||||
DOCHOSTUIFLAG_SCROLL_NO | \
|
||||
DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE | \
|
||||
DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY | \
|
||||
DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION | \
|
||||
DOCHOSTUIFLAG_THEME | \
|
||||
DOCHOSTUIFLAG_NOPICS | \
|
||||
DOCHOSTUIFLAG_NO3DOUTERBORDER | \
|
||||
DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL | \
|
||||
DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION | \
|
||||
DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL | \
|
||||
0)
|
||||
|
||||
#define WEBINFO_CONTAINERSTYLE (CSTYLE_NAVIGATE2_NOCLICKSOUND | CSTYLE_NOCLICKSOUND)
|
||||
|
||||
|
||||
|
||||
static const wchar_t pszCSSTemplate[] = L"BODY { "
|
||||
L"background-color: #%06X;"
|
||||
L"color: #%06X;"
|
||||
L"scrollbar-face-color: #%06X;"
|
||||
L"scrollbar-track-color: #%06X;"
|
||||
L"scrollbar-3dlight-color: #%06X;"
|
||||
L"scrollbar-shadow-color: #%06X;"
|
||||
L"scrollbar-darkshadow-color: #%06X;"
|
||||
L"scrollbar-highlight-color: #%06X;"
|
||||
L"scrollbar-arrow-color: #%06X"
|
||||
L" }";
|
||||
|
||||
static const wchar_t pszHTMLTemplate[] = L"<HTML><HEAD></HEAD><BODY>"
|
||||
L"<table height=\"100%%\" width=\"100%%\">"
|
||||
L"<tr><td align=center valign=middle height=\"96%%\" width=\"96%%\">"
|
||||
L"<font size=-1 face=\"Arial\">%s</font>"
|
||||
L"</td></tr></table>"
|
||||
L"</BODY></HTML>";
|
||||
|
||||
WebFileInfo *CreateWebFileInfo(HWND hwndParent, IDispatch *pDispWA)
|
||||
{
|
||||
return new WebFileInfo(hwndParent, pDispWA);
|
||||
}
|
||||
|
||||
static COLORREF GetHTMLColor(int nColorIndex);
|
||||
|
||||
WebFileInfo::WebFileInfo(HWND hwndParent, IDispatch *pDispWA) :
|
||||
HTMLContainer2(plugin.hwndParent, hwndParent), nHomePage(HOMEPAGE_NOTLOADED),
|
||||
bstrMessage(NULL), bstrFileName(NULL), nDragMode(DROPEFFECT_NONE)
|
||||
{
|
||||
this->pDispWA = pDispWA;
|
||||
if (NULL != pDispWA)
|
||||
pDispWA->AddRef();
|
||||
}
|
||||
|
||||
WebFileInfo::~WebFileInfo(void)
|
||||
{
|
||||
if (bstrMessage)
|
||||
{
|
||||
SysFreeString(bstrMessage);
|
||||
bstrMessage = NULL;
|
||||
}
|
||||
if (bstrFileName)
|
||||
{
|
||||
SysFreeString(bstrFileName);
|
||||
bstrFileName = NULL;
|
||||
}
|
||||
if (NULL != pDispWA)
|
||||
pDispWA->Release();
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::QueryInterface(REFIID riid, PVOID *ppvObject)
|
||||
{
|
||||
if (IsEqualIID(riid, IID_IDropTarget))
|
||||
{
|
||||
*ppvObject = (IDropTarget*)this;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return HTMLContainer2::QueryInterface(riid, ppvObject);
|
||||
}
|
||||
|
||||
ULONG WebFileInfo::AddRef(void)
|
||||
{
|
||||
return HTMLContainer2::AddRef();
|
||||
}
|
||||
|
||||
ULONG WebFileInfo::Release(void)
|
||||
{
|
||||
return HTMLContainer2::Release();
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::TranslateAccelerator(LPMSG lpMsg, const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID)
|
||||
{
|
||||
if ((WM_KEYDOWN == lpMsg->message || WM_KEYUP == lpMsg->message) && lpMsg->wParam >= VK_F1 && lpMsg->wParam <= VK_F24)
|
||||
{
|
||||
HWND hHost = GetParentHWND();
|
||||
if (hHost && IsWindow(hHost)) PostMessageW(hHost, lpMsg->message, lpMsg->wParam, lpMsg->lParam);
|
||||
return S_OK;
|
||||
}
|
||||
return HTMLContainer2::TranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID);
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::ShowContextMenu(DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved)
|
||||
{
|
||||
#ifdef WINAMP_FINAL_BUILD
|
||||
return S_OK; // block menu
|
||||
#else
|
||||
return E_NOTIMPL;
|
||||
#endif
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::ShowMessage(HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption, DWORD dwType, LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT *plResult)
|
||||
{
|
||||
wchar_t szBuffer[256] = {0};
|
||||
lpstrCaption = WASABI_API_LNGSTRINGW_BUF(IDS_WEBINFO_MESSAGEBOX_TITLE, szBuffer,
|
||||
sizeof(szBuffer)/sizeof(wchar_t));
|
||||
*plResult = MessageBoxW(hwnd, lpstrText, lpstrCaption, dwType);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
COLORREF WebFileInfo::OnGetHostBkColor(void)
|
||||
{
|
||||
return WADlg_getColor(WADLG_ITEMBG);
|
||||
}
|
||||
|
||||
DWORD WebFileInfo::OnGetHostInfoFlags(void)
|
||||
{
|
||||
return WEBINFO_HOSTINFODFLAGS;
|
||||
}
|
||||
|
||||
OLECHAR *WebFileInfo::OnGetHostCSS(void)
|
||||
{
|
||||
LPWSTR pszCSS;
|
||||
pszCSS = (LPWSTR)CoTaskMemAlloc(sizeof(wchar_t)*4096);
|
||||
if (pszCSS && S_OK != StringCchPrintfW(pszCSS, 4096, pszCSSTemplate,
|
||||
GetHTMLColor(WADLG_ITEMBG),
|
||||
GetHTMLColor(WADLG_ITEMFG),
|
||||
GetHTMLColor(WADLG_LISTHEADER_BGCOLOR),
|
||||
GetHTMLColor(WADLG_SCROLLBAR_BGCOLOR),
|
||||
GetHTMLColor(WADLG_LISTHEADER_FRAME_TOPCOLOR),
|
||||
GetHTMLColor(WADLG_LISTHEADER_BGCOLOR),
|
||||
GetHTMLColor(WADLG_LISTHEADER_FRAME_BOTTOMCOLOR),
|
||||
GetHTMLColor(WADLG_LISTHEADER_BGCOLOR),
|
||||
GetHTMLColor(WADLG_BUTTONFG)))
|
||||
{
|
||||
CoTaskMemFree(pszCSS);
|
||||
pszCSS = NULL;
|
||||
}
|
||||
|
||||
return pszCSS;
|
||||
}
|
||||
|
||||
DWORD WebFileInfo::OnGetDownlodFlags(void)
|
||||
{
|
||||
|
||||
return WEBINFO_DOWNLOADFLAGS
|
||||
#ifdef WINAMP_FINAL_BUILD
|
||||
|DLCTL_SILENT
|
||||
#endif
|
||||
;
|
||||
}
|
||||
|
||||
LPCWSTR WebFileInfo::OnGetUserAgent(void)
|
||||
{
|
||||
return WEBINFO_USERAGENT;
|
||||
}
|
||||
|
||||
DWORD WebFileInfo::GetContainerStyle(void)
|
||||
{
|
||||
return WEBINFO_CONTAINERSTYLE;
|
||||
}
|
||||
HRESULT WebFileInfo::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
|
||||
{
|
||||
if (NULL == ppDispatch)
|
||||
return E_POINTER;
|
||||
|
||||
if (NULL != pDispWA)
|
||||
{
|
||||
*ppDispatch = pDispWA;
|
||||
pDispWA->AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
return HTMLContainer2::GetExternal(ppDispatch);
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::GetDropTarget(IDropTarget __RPC_FAR *pDropTarget, IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
|
||||
{
|
||||
if (ppDropTarget)
|
||||
{
|
||||
*ppDropTarget = (IDropTarget*)this;
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
return HTMLContainer2::GetDropTarget(pDropTarget, ppDropTarget);
|
||||
}
|
||||
|
||||
void WebFileInfo::OnBeforeNavigate(IDispatch *pDispatch, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers, VARIANT_BOOL *Cancel)
|
||||
{
|
||||
HTMLContainer2::OnBeforeNavigate(pDispatch, URL, Flags, TargetFrameName, PostData, Headers, Cancel);
|
||||
if (HOMEPAGE_LOADED == nHomePage) nHomePage = HOMEPAGE_NOTLOADED;
|
||||
|
||||
}
|
||||
void WebFileInfo::OnNewWindow3(IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl)
|
||||
{
|
||||
HTMLContainer2::OnNewWindow3(ppDisp, Cancel, dwFlags, bstrUrlContext, bstrUrl);
|
||||
if (bstrUrl)
|
||||
{
|
||||
HWND hwndHost;
|
||||
hwndHost = GetHostHWND();
|
||||
ShellExecuteW(hwndHost, NULL, bstrUrl, NULL, L".", 0); // lets open all annoying popups in default browser
|
||||
}
|
||||
*ppDisp = NULL;
|
||||
*Cancel = VARIANT_TRUE;
|
||||
}
|
||||
|
||||
void WebFileInfo::OnNavigateError(IDispatch *pDispatch, VARIANT *URL, VARIANT *TargetFrameName, VARIANT *StatusCode, VARIANT_BOOL *Cancel)
|
||||
{
|
||||
HTMLContainer2::OnNavigateError(pDispatch, URL, TargetFrameName, StatusCode, Cancel);
|
||||
|
||||
*Cancel = VARIANT_TRUE;
|
||||
|
||||
if (bstrFileName)
|
||||
{
|
||||
SysFreeString(bstrFileName);
|
||||
bstrFileName = NULL;
|
||||
}
|
||||
|
||||
IWebBrowser2 *pWeb2;
|
||||
|
||||
if (pDispatch && SUCCEEDED(pDispatch->QueryInterface(IID_IWebBrowser2, (void**)&pWeb2)))
|
||||
{
|
||||
pWeb2->Stop();
|
||||
pWeb2->Release();
|
||||
}
|
||||
|
||||
wchar_t szErrorString[128] = {0};
|
||||
WASABI_API_LNGSTRINGW_BUF(IDS_WEBINFO_NAVIGATE_ERROR, szErrorString, sizeof(szErrorString)/sizeof(wchar_t));
|
||||
DisplayMessage(szErrorString, TRUE);
|
||||
nHomePage = HOMEPAGE_FAILED;
|
||||
}
|
||||
|
||||
void WebFileInfo::OnDocumentReady(IDispatch *pDispatch, VARIANT *URL)
|
||||
{
|
||||
HTMLContainer2::OnDocumentReady(pDispatch, URL);
|
||||
|
||||
if (bstrMessage)
|
||||
{
|
||||
if (URL && VT_BSTR == URL->vt && URL->bstrVal && 0 == lstrcmpW(URL->bstrVal, L"about:blank"))
|
||||
{
|
||||
wchar_t szHTML[4096] = {0};
|
||||
if (S_OK == StringCchPrintfW(szHTML, sizeof(szHTML)/sizeof(wchar_t), pszHTMLTemplate, bstrMessage))
|
||||
{
|
||||
WriteHTML(szHTML);
|
||||
}
|
||||
}
|
||||
SysFreeString(bstrMessage);
|
||||
bstrMessage = NULL;
|
||||
}
|
||||
|
||||
if (HOMEPAGE_LOADING == nHomePage)
|
||||
{
|
||||
nHomePage = HOMEPAGE_LOADED;
|
||||
if (bstrFileName)
|
||||
{
|
||||
InvokeFileInfo(bstrFileName);
|
||||
SysFreeString(bstrFileName);
|
||||
bstrFileName = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::InvokeFileInfo(LPCWSTR pszFileName)
|
||||
{
|
||||
HRESULT hr;
|
||||
DISPPARAMS dispParams;
|
||||
LCID lcid;
|
||||
|
||||
if (HOMEPAGE_NOTLOADED == nHomePage)
|
||||
{
|
||||
if (bstrFileName)
|
||||
{
|
||||
SysFreeString(bstrFileName);
|
||||
bstrFileName = NULL;
|
||||
}
|
||||
bstrFileName = (pszFileName) ? SysAllocString(pszFileName) : NULL;
|
||||
return NavigateToPage();
|
||||
}
|
||||
|
||||
lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
|
||||
ZeroMemory(&dispParams, sizeof(DISPPARAMS));
|
||||
dispParams.cArgs = 1;
|
||||
dispParams.rgvarg = (VARIANTARG*)calloc(dispParams.cArgs, sizeof(VARIANTARG));
|
||||
if (!dispParams.rgvarg) hr = E_OUTOFMEMORY;
|
||||
else
|
||||
{
|
||||
VariantInit(&dispParams.rgvarg[0]);
|
||||
dispParams.rgvarg[0].vt = VT_BSTR;
|
||||
dispParams.rgvarg[0].bstrVal = SysAllocString(pszFileName);
|
||||
wTRACE_FMT(L"WebInfo: Requesting song info for '%s'.\n", pszFileName);
|
||||
hr = InvokeScriptFunction(WEBINFO_FUNCTION, lcid, &dispParams, NULL, NULL, NULL);
|
||||
if (S_OK != hr) TRACE_FMT(TEXT("Error sending webinfo (0x%08X)\n"), hr);
|
||||
VariantClear(&dispParams.rgvarg[0]);
|
||||
free(dispParams.rgvarg);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::NavigateToPage(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
nHomePage = HOMEPAGE_LOADING;
|
||||
hr = NavigateToName(WEBINFO_URL, navNoHistory);
|
||||
if (FAILED(hr)) nHomePage = HOMEPAGE_FAILED;
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::UpdateColors(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
IWebBrowser2 *pWeb2;
|
||||
|
||||
if (HOMEPAGE_LOADED == nHomePage) return S_OK;
|
||||
|
||||
hr = GetIWebBrowser2(&pWeb2);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = pWeb2->Refresh();
|
||||
pWeb2->Release();
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::DisplayMessage(LPCWSTR pszMessage, BOOL bPostIt)
|
||||
{
|
||||
HRESULT hr;
|
||||
VARIANT Flags, URL;
|
||||
if (bstrMessage)
|
||||
{
|
||||
SysFreeString(bstrMessage);
|
||||
bstrMessage = NULL;
|
||||
}
|
||||
bstrMessage = (pszMessage) ? SysAllocString(pszMessage) : NULL;
|
||||
|
||||
VariantInit(&URL);
|
||||
VariantInit(&Flags);
|
||||
|
||||
Flags.vt = VT_I4;
|
||||
V_I4(&Flags) = navNoHistory | navNoReadFromCache | navNoWriteToCache;
|
||||
URL.vt = VT_BSTR;
|
||||
V_BSTR(&URL) = SysAllocString(L"about:blank");
|
||||
|
||||
nHomePage = HOMEPAGE_NOTLOADED;
|
||||
hr = (bPostIt) ? PostNavigate2(&URL, &Flags, NULL, NULL, NULL) : Navigate2(&URL, &Flags, NULL, NULL, NULL);
|
||||
|
||||
VariantClear(&Flags);
|
||||
VariantClear(&URL);
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
|
||||
{
|
||||
HRESULT hr;
|
||||
FORMATETC format = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
|
||||
|
||||
hr = pDataObject->QueryGetData(&format);
|
||||
nDragMode = ((hr == S_OK) ? DROPEFFECT_COPY : DROPEFFECT_NONE);
|
||||
*pdwEffect = nDragMode;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
|
||||
{
|
||||
*pdwEffect = nDragMode;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::DragLeave(void)
|
||||
{
|
||||
nDragMode = DROPEFFECT_NONE;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT WebFileInfo::Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
|
||||
{
|
||||
STGMEDIUM medium;
|
||||
FORMATETC format = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
|
||||
|
||||
if (nDragMode)
|
||||
{
|
||||
HRESULT hr = pDataObject->QueryGetData(&format);
|
||||
if (S_OK == hr)
|
||||
{
|
||||
hr = pDataObject->GetData (&format, &medium);
|
||||
if (S_OK == hr)
|
||||
{
|
||||
wchar_t szFileName[4096] = {0};
|
||||
HDROP hdrop = (HDROP)medium.hGlobal;
|
||||
if (hdrop && DragQueryFileW(hdrop, 0, szFileName, sizeof(szFileName)/sizeof(wchar_t))) InvokeFileInfo(szFileName);
|
||||
}
|
||||
}
|
||||
nDragMode = DROPEFFECT_NONE;
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static COLORREF GetHTMLColor(int nColorIndex)
|
||||
{
|
||||
COLORREF rgb = WADlg_getColor(nColorIndex);
|
||||
return ((rgb >> 16)&0xff|(rgb&0xff00)|((rgb<<16)&0xff0000));
|
||||
}
|
Reference in New Issue
Block a user