mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
821 lines
20 KiB
C++
821 lines
20 KiB
C++
|
#include "main.h"
|
||
|
#include "./omcom.h"
|
||
|
#include "./resource.h"
|
||
|
#include "./api__ml_online.h"
|
||
|
|
||
|
#include "JnetCOM.h"
|
||
|
|
||
|
#include "./navigation.h"
|
||
|
#include "./preferences.h"
|
||
|
#include "./serviceHelper.h"
|
||
|
#include "./serviceHost.h"
|
||
|
#include "./config.h"
|
||
|
|
||
|
#include "../nu/ConfigCOM.h"
|
||
|
#include "../nu/MediaLibraryInterface.h"
|
||
|
#include "../nu/AutoChar.h"
|
||
|
#include "../nu/AutoWide.h"
|
||
|
#include "../nu/AutoUrl.h"
|
||
|
|
||
|
|
||
|
#include <ifc_omservice.h>
|
||
|
#include <ifc_omserviceeditor.h>
|
||
|
#include <ifc_omfilestorage.h>
|
||
|
|
||
|
|
||
|
#include "../Winamp/JSAPI.h" // IDispatch helper macros
|
||
|
|
||
|
#include <shlwapi.h>
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
extern MediaLibraryInterface mediaLibrary;
|
||
|
extern C_Config *g_config;
|
||
|
|
||
|
#define CONFIG_SERIALNUMBER "serialNumber"
|
||
|
#define SERIALNUMBER_INVALID ((INT)-1)
|
||
|
#define SERIALNUMBER_DEFAULT ((INT)0)
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
DISPATCH_ISSUBSCRIBED = 12312,
|
||
|
DISPATCH_ADDSUBSCRIBED,
|
||
|
DISPATCH_CLEARSUBSCRIBED,
|
||
|
DISPATCH_SERIALNUMBER,
|
||
|
DISPATCH_JNETCREATE,
|
||
|
DISPATCH_GETWID,
|
||
|
DISPATCH_GETSID,
|
||
|
DISPATCH_PLAY,
|
||
|
DISPATCH_CONFIG,
|
||
|
DISPATCH_ENQUEUE,
|
||
|
DISPATCH_PREF,
|
||
|
DISPATCH_SETSIZE,
|
||
|
DISPATCH_GETX,
|
||
|
DISPATCH_GETY,
|
||
|
DISPATCH_NAVDISPLAY,
|
||
|
DISPATCH_FOCUSURL,
|
||
|
DISPATCH_SETCURRENTGUID,
|
||
|
DISPATCH_ADDTITLEHOOK,
|
||
|
DISPATCH_REMOVETITLEHOOK,
|
||
|
DISPATCH_ADDMETADATAHOOK,
|
||
|
DISPATCH_REMOVEMETADATAHOOK,
|
||
|
DISPATCH_SUBSCRIBE,
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
OMCOM::OMCOM()
|
||
|
: config(NULL), serialNumber(SERIALNUMBER_INVALID), publishCookie(0)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
OMCOM::~OMCOM()
|
||
|
{
|
||
|
if (NULL != config)
|
||
|
config->Release();
|
||
|
|
||
|
if (0 != publishCookie)
|
||
|
{
|
||
|
SENDWAIPC(Plugin_GetWinamp(), IPC_REMOVE_DISPATCH_OBJECT, publishCookie);
|
||
|
publishCookie = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::Publish()
|
||
|
{
|
||
|
if (0 != publishCookie)
|
||
|
return E_FAIL;
|
||
|
|
||
|
DispatchInfo dispatchInfo;
|
||
|
ZeroMemory(&dispatchInfo, sizeof(dispatchInfo));
|
||
|
|
||
|
dispatchInfo.name = L"OnMedia";
|
||
|
dispatchInfo.dispatch = this;
|
||
|
|
||
|
if (0 != SENDWAIPC(Plugin_GetWinamp(), IPC_ADD_DISPATCH_OBJECT, (WPARAM)&dispatchInfo))
|
||
|
return E_FAIL;
|
||
|
|
||
|
publishCookie = dispatchInfo.id;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)
|
||
|
{
|
||
|
bool unknowns = false;
|
||
|
for (unsigned int i = 0;i != cNames;i++)
|
||
|
{
|
||
|
if (wcscmp(rgszNames[i], L"IsOmSubscribed") == 0)
|
||
|
rgdispid[i] = DISPATCH_ISSUBSCRIBED;
|
||
|
else if (wcscmp(rgszNames[i], L"AddOmSubscribed") == 0)
|
||
|
rgdispid[i] = DISPATCH_ADDSUBSCRIBED;
|
||
|
else if (wcscmp(rgszNames[i], L"ClearOmSubscribed") == 0)
|
||
|
rgdispid[i] = DISPATCH_CLEARSUBSCRIBED;
|
||
|
else if (wcscmp(rgszNames[i], L"OmSerialNumber") == 0)
|
||
|
rgdispid[i] = DISPATCH_SERIALNUMBER;
|
||
|
else if (wcscmp(rgszNames[i], L"JnetCreate") == 0)
|
||
|
rgdispid[i] = DISPATCH_JNETCREATE;
|
||
|
else if (wcscmp(rgszNames[i], L"GetUniqueID") == 0)
|
||
|
rgdispid[i] = DISPATCH_GETWID;
|
||
|
else if (wcscmp(rgszNames[i], L"GetSessionID") == 0)
|
||
|
rgdispid[i] = DISPATCH_GETSID;
|
||
|
else if (wcscmp(rgszNames[i], L"PlayUrl") == 0)
|
||
|
rgdispid[i] = DISPATCH_PLAY;
|
||
|
else if (wcscmp(rgszNames[i], L"Config") == 0)
|
||
|
rgdispid[i] = DISPATCH_CONFIG;
|
||
|
else if (wcscmp(rgszNames[i], L"EnqueueUrl") == 0)
|
||
|
rgdispid[i] = DISPATCH_ENQUEUE;
|
||
|
else if (wcscmp(rgszNames[i], L"ShowPreferences") == 0)
|
||
|
rgdispid[i] = DISPATCH_PREF;
|
||
|
else if (wcscmp(rgszNames[i], L"SetSize") == 0)
|
||
|
rgdispid[i] = DISPATCH_SETSIZE;
|
||
|
else if (wcscmp(rgszNames[i], L"GetX") == 0)
|
||
|
rgdispid[i] = DISPATCH_GETX;
|
||
|
else if (wcscmp(rgszNames[i], L"GetY") == 0)
|
||
|
rgdispid[i] = DISPATCH_GETY;
|
||
|
else if (wcscmp(rgszNames[i], L"DisplayNav") == 0)
|
||
|
rgdispid[i] = DISPATCH_NAVDISPLAY;
|
||
|
else if (wcscmp(rgszNames[i], L"FocusUrl") == 0)
|
||
|
rgdispid[i] = DISPATCH_FOCUSURL;
|
||
|
else if (wcscmp(rgszNames[i], L"SetCurrentGUID") == 0)
|
||
|
rgdispid[i] = DISPATCH_SETCURRENTGUID;
|
||
|
else if (wcscmp(rgszNames[i], L"AddTitleHook") == 0)
|
||
|
rgdispid[i] = DISPATCH_ADDTITLEHOOK;
|
||
|
else if (wcscmp(rgszNames[i], L"RemoveTitleHook") == 0)
|
||
|
rgdispid[i] = DISPATCH_REMOVETITLEHOOK;
|
||
|
else if (wcscmp(rgszNames[i], L"AddMetadataHook") == 0)
|
||
|
rgdispid[i] = DISPATCH_ADDMETADATAHOOK;
|
||
|
else if (wcscmp(rgszNames[i], L"RemoveMetadataHook") == 0)
|
||
|
rgdispid[i] = DISPATCH_REMOVEMETADATAHOOK;
|
||
|
else if (wcscmp(rgszNames[i], L"Subscribe") == 0)
|
||
|
rgdispid[i] = DISPATCH_SUBSCRIBE;
|
||
|
else
|
||
|
{
|
||
|
rgdispid[i] = DISPID_UNKNOWN;
|
||
|
unknowns = true;
|
||
|
}
|
||
|
}
|
||
|
if (unknowns)
|
||
|
return DISP_E_UNKNOWNNAME;
|
||
|
else
|
||
|
return S_OK;
|
||
|
}
|
||
|
HRESULT OMCOM::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
|
||
|
{
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::GetTypeInfoCount(unsigned int FAR * pctinfo)
|
||
|
{
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
#define VIDEO_GENFF_SIZEREQUEST (WM_USER+2048)
|
||
|
static void RemoveTitleHook(const wchar_t *url)
|
||
|
{
|
||
|
Nullsoft::Utility::AutoLock lock(urlMapGuard);
|
||
|
DISPATCH_REMOVETITLEHOOK_again:
|
||
|
URLMap::iterator itr;
|
||
|
for (itr=urlMap.begin();itr!=urlMap.end();itr++)
|
||
|
{
|
||
|
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, url, -1, itr->url.c_str(), - 1))
|
||
|
{
|
||
|
urlMap.erase(itr);
|
||
|
goto DISPATCH_REMOVETITLEHOOK_again;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void RemoveMetadataHook(const wchar_t *url)
|
||
|
{
|
||
|
Nullsoft::Utility::AutoLock lock(urlMapGuard);
|
||
|
DISPATCH_REMOVEMETADATAHOOK_again:
|
||
|
MetadataMap::iterator itr;
|
||
|
for (itr=metadataMap.begin();itr!=metadataMap.end();itr++)
|
||
|
{
|
||
|
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, url, -1, itr->url.c_str(), - 1))
|
||
|
{
|
||
|
metadataMap.erase(itr);
|
||
|
goto DISPATCH_REMOVEMETADATAHOOK_again;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void RemoveMetadataHook(const wchar_t *url, const wchar_t *tag)
|
||
|
{
|
||
|
Nullsoft::Utility::AutoLock lock(urlMapGuard);
|
||
|
DISPATCH_REMOVEMETADATAHOOK_again2:
|
||
|
MetadataMap::iterator itr;
|
||
|
for (itr=metadataMap.begin();itr!=metadataMap.end();itr++)
|
||
|
{
|
||
|
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, url, -1, itr->url.c_str(), - 1) &&
|
||
|
CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, tag, -1, itr->tag.c_str(), - 1))
|
||
|
{
|
||
|
metadataMap.erase(itr);
|
||
|
goto DISPATCH_REMOVEMETADATAHOOK_again2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::FindService(VARIANTARG *pArg, ifc_omservice **service)
|
||
|
{
|
||
|
if (NULL == service)
|
||
|
return E_POINTER;
|
||
|
|
||
|
*service = NULL;
|
||
|
if (NULL == pArg)
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
HRESULT hr = E_INVALIDARG;
|
||
|
UINT serviceId;
|
||
|
|
||
|
if (VT_BSTR == pArg->vt)
|
||
|
{
|
||
|
if (FALSE != StrToIntEx(pArg->bstrVal, STIF_SUPPORT_HEX, (INT*)&serviceId))
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else if (VT_I4 == pArg->vt)
|
||
|
{
|
||
|
serviceId = pArg->lVal;
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = ServiceHelper_Find(serviceId, service);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
static HRESULT OmCom_AddServiceToNavigation(ifc_omservice *service)
|
||
|
{
|
||
|
Navigation *navigation;
|
||
|
HRESULT hr = Plugin_GetNavigation(&navigation);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (NULL != navigation->CreateItem(service))
|
||
|
{
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
navigation->Release();
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
static HRESULT OmCom_SubscribeToService(UINT serviceId, LPCWSTR pszName, LPCWSTR pszUrl, INT iconId)
|
||
|
{
|
||
|
ifc_omservice *service = NULL;
|
||
|
HRESULT hr = ServiceHelper_Find(serviceId, &service);
|
||
|
if (FAILED(hr)) return hr;
|
||
|
|
||
|
if (S_FALSE == hr)
|
||
|
{
|
||
|
ServiceHost *serviceHost;
|
||
|
if (FAILED(ServiceHost::GetCachedInstance(&serviceHost)))
|
||
|
serviceHost = NULL;
|
||
|
|
||
|
if (NULL != OMSERVICEMNGR)
|
||
|
{
|
||
|
hr = OMSERVICEMNGR->CreateService(serviceId, serviceHost, &service);
|
||
|
}
|
||
|
else
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
else if (S_OK == ServiceHelper_IsSubscribed(service))
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
ifc_omserviceeditor *editor;
|
||
|
hr = service->QueryInterface(IFC_OmServiceEditor, (void**)&editor);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (NULL != pszName && L'\0' != *pszName)
|
||
|
editor->SetName(pszName, FALSE);
|
||
|
|
||
|
if (NULL != pszUrl && L'\0' != *pszUrl)
|
||
|
editor->SetUrl(pszUrl, FALSE);
|
||
|
|
||
|
WCHAR szIcon[256] = {0};
|
||
|
if (SUCCEEDED(StringCchPrintf(szIcon, ARRAYSIZE(szIcon), L"%u", iconId)))
|
||
|
{
|
||
|
editor->SetIcon(szIcon, FALSE);
|
||
|
}
|
||
|
|
||
|
hr = editor->SetFlags(SVCF_SUBSCRIBED, SVCF_SUBSCRIBED);
|
||
|
if (SUCCEEDED(hr))
|
||
|
ServiceHelper_Save(service);
|
||
|
editor->Release();
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
OmCom_AddServiceToNavigation(service);
|
||
|
}
|
||
|
service->Release();
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr)
|
||
|
{
|
||
|
if (dispid == DISPATCH_ADDTITLEHOOK)
|
||
|
{
|
||
|
if (pdispparams->cArgs == 3)
|
||
|
{
|
||
|
Nullsoft::Utility::AutoLock lock(urlMapGuard);
|
||
|
RemoveTitleHook(pdispparams->rgvarg[2].bstrVal); // ensure no duplicates
|
||
|
url_info info;
|
||
|
info.url = pdispparams->rgvarg[2].bstrVal;
|
||
|
info.url_wcslen = wcslen(info.url.c_str());
|
||
|
info.title=pdispparams->rgvarg[1].bstrVal;
|
||
|
info.length= pdispparams->rgvarg[0].lVal;
|
||
|
urlMap.push_back(info);
|
||
|
return S_OK;
|
||
|
}
|
||
|
}
|
||
|
if (dispid == DISPATCH_REMOVETITLEHOOK)
|
||
|
{
|
||
|
if (pdispparams->cArgs == 1)
|
||
|
{
|
||
|
RemoveTitleHook(pdispparams->rgvarg[0].bstrVal);
|
||
|
return S_OK;
|
||
|
}
|
||
|
else
|
||
|
return DISP_E_BADPARAMCOUNT;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_REMOVEMETADATAHOOK)
|
||
|
{
|
||
|
if (pdispparams->cArgs == 1)
|
||
|
{
|
||
|
RemoveMetadataHook(pdispparams->rgvarg[0].bstrVal);
|
||
|
return S_OK;
|
||
|
}
|
||
|
else if (pdispparams->cArgs == 2)
|
||
|
{
|
||
|
RemoveMetadataHook(pdispparams->rgvarg[1].bstrVal, pdispparams->rgvarg[0].bstrVal);
|
||
|
return S_OK;
|
||
|
}
|
||
|
else
|
||
|
return DISP_E_BADPARAMCOUNT;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_ADDMETADATAHOOK)
|
||
|
{
|
||
|
if (pdispparams->cArgs == 3)
|
||
|
{
|
||
|
Nullsoft::Utility::AutoLock lock(urlMapGuard);
|
||
|
RemoveMetadataHook(pdispparams->rgvarg[2].bstrVal, pdispparams->rgvarg[1].bstrVal); // ensure no duplicates
|
||
|
metadata_info info;
|
||
|
info.url = pdispparams->rgvarg[2].bstrVal;
|
||
|
info.tag = pdispparams->rgvarg[1].bstrVal;
|
||
|
info.metadata= pdispparams->rgvarg[0].bstrVal;
|
||
|
metadataMap.push_back(info);
|
||
|
return S_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_SERIALNUMBER)
|
||
|
{
|
||
|
int serial = GetSerialNumber(FALSE);
|
||
|
if (pdispparams->cArgs == 1)
|
||
|
{
|
||
|
SetSerialNumber(pdispparams->rgvarg[0].lVal);
|
||
|
serial = GetSerialNumber(FALSE);
|
||
|
}
|
||
|
|
||
|
JSAPI_INIT_RESULT(pvarResult, VT_I4);
|
||
|
JSAPI_SET_RESULT(pvarResult, lVal, serial);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_ADDSUBSCRIBED)
|
||
|
{
|
||
|
return AddOmSubscribed(wFlags, pdispparams, pvarResult, puArgErr);
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_SUBSCRIBE)
|
||
|
{
|
||
|
return Subscribe(wFlags, pdispparams, pvarResult, puArgErr);
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_CLEARSUBSCRIBED && pdispparams->cArgs == 1)
|
||
|
{
|
||
|
JSAPI_VERIFY_METHOD(wFlags);
|
||
|
JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1);
|
||
|
JSAPI_INIT_RESULT(pvarResult, VT_I4);
|
||
|
|
||
|
BOOL result = FALSE;
|
||
|
ifc_omservice *service;
|
||
|
if (S_OK == FindService(&JSAPI_PARAM(pdispparams, 1), &service))
|
||
|
{
|
||
|
if (SUCCEEDED(ServiceHelper_Subscribe(service, FALSE, SHF_SAVE /* | SHF_NOTIFY*/)))
|
||
|
result = TRUE;
|
||
|
|
||
|
service->Release();
|
||
|
}
|
||
|
|
||
|
JSAPI_SET_RESULT(pvarResult, lVal, result);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_ISSUBSCRIBED)
|
||
|
{
|
||
|
return IsOmSubscribed(wFlags, pdispparams, pvarResult, puArgErr);
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_JNETCREATE)
|
||
|
{
|
||
|
VariantInit(pvarResult);
|
||
|
V_VT(pvarResult) = VT_DISPATCH;
|
||
|
V_DISPATCH(pvarResult) = new JnetCOM();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_GETWID)
|
||
|
{
|
||
|
WCHAR szBuffer[512] = {0};
|
||
|
if (NULL == OMBROWSERMNGR ||
|
||
|
FAILED(OMBROWSERMNGR->GetClientId(szBuffer, ARRAYSIZE(szBuffer))))
|
||
|
{
|
||
|
szBuffer[0] = L'\0';
|
||
|
}
|
||
|
|
||
|
BSTR tag = SysAllocString(szBuffer);
|
||
|
VariantInit(pvarResult);
|
||
|
V_VT(pvarResult) = VT_BSTR;
|
||
|
V_BSTR(pvarResult) = tag;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_GETSID)
|
||
|
{
|
||
|
WCHAR szBuffer[512] = {0};
|
||
|
if (NULL == OMBROWSERMNGR ||
|
||
|
FAILED(OMBROWSERMNGR->GetSessionId(szBuffer, ARRAYSIZE(szBuffer))))
|
||
|
{
|
||
|
szBuffer[0] = L'\0';
|
||
|
}
|
||
|
|
||
|
BSTR tag = SysAllocString(szBuffer);
|
||
|
VariantInit(pvarResult);
|
||
|
V_VT(pvarResult) = VT_BSTR;
|
||
|
V_BSTR(pvarResult) = tag;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_PLAY && pdispparams->cArgs == 1)
|
||
|
{
|
||
|
if (pdispparams->rgvarg[0].bstrVal)
|
||
|
mediaLibrary.PlayStream(pdispparams->rgvarg[0].bstrVal);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_PREF)
|
||
|
{
|
||
|
Preferences_Show();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_CONFIG)
|
||
|
{
|
||
|
VariantInit(pvarResult);
|
||
|
if(NULL == config && FAILED(ConfigCOM::CreateInstanceA("ml_online_config", g_config->GetPath(), &config)))
|
||
|
{
|
||
|
V_VT(pvarResult) = VT_NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
V_VT(pvarResult) = VT_DISPATCH;
|
||
|
V_DISPATCH(pvarResult) = config;
|
||
|
config->AddRef();
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_ENQUEUE && pdispparams->cArgs == 1)
|
||
|
{
|
||
|
if (pdispparams->rgvarg[0].bstrVal)
|
||
|
mediaLibrary.EnqueueStream(pdispparams->rgvarg[0].bstrVal);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_SETSIZE && pdispparams->cArgs == 2)
|
||
|
{
|
||
|
HWND hView = NULL;
|
||
|
Navigation *navigation;
|
||
|
if (SUCCEEDED(Plugin_GetNavigation(&navigation)))
|
||
|
{
|
||
|
hView = navigation->GetActiveView(NULL);
|
||
|
navigation->Release();
|
||
|
}
|
||
|
|
||
|
if (NULL != hView && mediaLibrary.library &&
|
||
|
GetParent(mediaLibrary.library) &&
|
||
|
g_config->ReadInt("AutoSize",1))
|
||
|
{
|
||
|
HWND hWnd;
|
||
|
bool GenFF = false;
|
||
|
if (GetParent(GetParent(mediaLibrary.library)))
|
||
|
{
|
||
|
hWnd = GetParent(GetParent(mediaLibrary.library));
|
||
|
GenFF = true;
|
||
|
}
|
||
|
else
|
||
|
hWnd = GetParent(mediaLibrary.library);
|
||
|
|
||
|
int width = pdispparams->rgvarg[1].lVal;
|
||
|
int height = pdispparams->rgvarg[0].lVal;
|
||
|
|
||
|
RECT rc;
|
||
|
GetWindowRect(hView, &rc); // Our Html page
|
||
|
int WWidth = rc.right - rc.left;
|
||
|
int WHeight = rc.bottom - rc.top;
|
||
|
|
||
|
GetWindowRect(hWnd, &rc); // Gen ML Size
|
||
|
int PWidth = rc.right - rc.left;
|
||
|
int PHeight = rc.bottom - rc.top;
|
||
|
|
||
|
// Subtract the original window size from the parent(base) size
|
||
|
PWidth -= WWidth;
|
||
|
PHeight -= WHeight;
|
||
|
|
||
|
// Add the target size to the parent(base) size
|
||
|
PWidth += width;
|
||
|
PHeight += height;
|
||
|
|
||
|
if (GenFF)
|
||
|
{
|
||
|
SendMessage(hWnd, VIDEO_GENFF_SIZEREQUEST, PWidth, PHeight);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetWindowPos(hWnd, 0, 0, 0, PWidth, PHeight, SWP_NOMOVE|SWP_ASYNCWINDOWPOS);
|
||
|
// weird? sometimes height isnt set if called once...
|
||
|
SetWindowPos(hWnd, 0, 0, 0, PWidth, PHeight, SWP_NOMOVE|SWP_ASYNCWINDOWPOS);
|
||
|
}
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_GETX)
|
||
|
{
|
||
|
RECT rc;
|
||
|
HWND hView = NULL;
|
||
|
Navigation *navigation;
|
||
|
if (SUCCEEDED(Plugin_GetNavigation(&navigation)))
|
||
|
{
|
||
|
hView = navigation->GetActiveView(NULL);
|
||
|
navigation->Release();
|
||
|
}
|
||
|
|
||
|
if (NULL != hView)
|
||
|
{
|
||
|
GetWindowRect(hView, &rc); // Our Html page
|
||
|
int WWidth = rc.right - rc.left;
|
||
|
|
||
|
if (pvarResult)
|
||
|
{
|
||
|
VariantInit(pvarResult);
|
||
|
V_VT(pvarResult) = VT_I4;
|
||
|
V_I4(pvarResult) = WWidth;
|
||
|
}
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_GETY)
|
||
|
{
|
||
|
RECT rc;
|
||
|
HWND hView = NULL;
|
||
|
Navigation *navigation;
|
||
|
if (SUCCEEDED(Plugin_GetNavigation(&navigation)))
|
||
|
{
|
||
|
hView = navigation->GetActiveView(NULL);
|
||
|
navigation->Release();
|
||
|
}
|
||
|
|
||
|
if (NULL != hView)
|
||
|
{
|
||
|
GetWindowRect(hView, &rc); // Our Html page
|
||
|
int WHeight = rc.bottom - rc.top;
|
||
|
if (pvarResult)
|
||
|
{
|
||
|
VariantInit(pvarResult);
|
||
|
V_VT(pvarResult) = VT_I4;
|
||
|
V_I4(pvarResult) = WHeight;
|
||
|
}
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_NAVDISPLAY && pdispparams->cArgs == 1)
|
||
|
{
|
||
|
//int visible = pdispparams->rgvarg[0].lVal;
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
if (dispid == DISPATCH_FOCUSURL && pdispparams->cArgs == 2)
|
||
|
{
|
||
|
ifc_omservice *service;
|
||
|
if (S_OK == FindService(&pdispparams->rgvarg[1], &service))
|
||
|
{
|
||
|
Navigation *navigation;
|
||
|
if (SUCCEEDED(Plugin_GetNavigation(&navigation)))
|
||
|
{
|
||
|
navigation->ShowService(service->GetId(), pdispparams->rgvarg[0].bstrVal);
|
||
|
navigation->Release();
|
||
|
}
|
||
|
|
||
|
service->Release();
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
return DISP_E_MEMBERNOTFOUND;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP OMCOM::QueryInterface(REFIID riid, PVOID *ppvObject)
|
||
|
{
|
||
|
if (!ppvObject)
|
||
|
return E_POINTER;
|
||
|
else if (IsEqualIID(riid, IID_IDispatch))
|
||
|
*ppvObject = (IDispatch *)this;
|
||
|
else if (IsEqualIID(riid, IID_IUnknown))
|
||
|
*ppvObject = this;
|
||
|
else
|
||
|
{
|
||
|
*ppvObject = NULL;
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
AddRef();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
ULONG OMCOM::AddRef(void)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
ULONG OMCOM::Release(void)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::IsOmSubscribed(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr)
|
||
|
{
|
||
|
JSAPI_VERIFY_METHOD(wFlags);
|
||
|
JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1);
|
||
|
JSAPI_INIT_RESULT(pvarResult, VT_I4);
|
||
|
// 0 No knowledge , 1 Knowledge and Disabled, 2 Knowledge and Enabled
|
||
|
|
||
|
ifc_omservice *service;
|
||
|
if (S_OK == FindService(&JSAPI_PARAM(pdispparams, 1), &service))
|
||
|
{
|
||
|
JSAPI_SET_RESULT(pvarResult, lVal, (S_OK == ServiceHelper_IsSubscribed(service)) ? 2 : 1);
|
||
|
service->Release();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
JSAPI_SET_RESULT(pvarResult, lVal, 0);
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::AddOmSubscribed(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr)
|
||
|
{
|
||
|
JSAPI_VERIFY_METHOD(wFlags);
|
||
|
JSAPI_VERIFY_PARAMCOUNT_OPTIONAL(pdispparams, 3, 4);
|
||
|
|
||
|
JSAPI_INIT_RESULT(pvarResult, VT_I4);
|
||
|
|
||
|
LPCWSTR pszUrl, pszName;
|
||
|
UINT baseArg, serviceId, iconId;
|
||
|
|
||
|
baseArg = 0;
|
||
|
|
||
|
if (pdispparams->cArgs >= 4)
|
||
|
{
|
||
|
JSAPI_GETUNSIGNED_AS_NUMBER(iconId, pdispparams, (baseArg + 1), puArgErr);
|
||
|
baseArg++;
|
||
|
}
|
||
|
else
|
||
|
iconId = 0;
|
||
|
|
||
|
JSAPI_GETUNSIGNED_AS_NUMBER(serviceId, pdispparams, (baseArg + 1), puArgErr);
|
||
|
JSAPI_GETSTRING(pszName, pdispparams, (baseArg + 2), puArgErr);
|
||
|
JSAPI_GETSTRING(pszUrl, pdispparams, (baseArg + 3), puArgErr);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
INT result = OmCom_SubscribeToService(serviceId, pszName, pszUrl, iconId);
|
||
|
JSAPI_SET_RESULT(pvarResult, lVal, result);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
typedef int (*HTTPRETRIEVEFILEW)(HWND hwnd, char *url, wchar_t *file, wchar_t *dlgtitle);
|
||
|
HRESULT OMCOM::Subscribe(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr)
|
||
|
{
|
||
|
// window.external.OnMedia.Subscribe(String name, String url, String id, String icon, String version);
|
||
|
JSAPI_VERIFY_METHOD(wFlags);
|
||
|
JSAPI_VERIFY_PARAMCOUNT(pdispparams, 5);
|
||
|
JSAPI_INIT_RESULT(pvarResult, VT_BOOL);
|
||
|
|
||
|
WCHAR szBuffer[4096] = {0};
|
||
|
LPCWSTR pszName, pszUrl, pszIcon;
|
||
|
UINT serviceId, version;
|
||
|
|
||
|
JSAPI_GETSTRING(pszName, pdispparams, 1, puArgErr);
|
||
|
JSAPI_GETSTRING(pszUrl, pdispparams, 2, puArgErr);
|
||
|
JSAPI_GETUNSIGNED_AS_NUMBER(serviceId, pdispparams, 3, puArgErr);
|
||
|
JSAPI_GETNUMBER_AS_STRING(pszIcon, szBuffer, pdispparams, 4, puArgErr);
|
||
|
JSAPI_GETUNSIGNED_AS_NUMBER(version, pdispparams, 5, puArgErr);
|
||
|
|
||
|
HRESULT hr;
|
||
|
ifc_omservice *service;
|
||
|
hr = ServiceHelper_Find(serviceId, &service);
|
||
|
if (S_OK != hr)
|
||
|
{
|
||
|
hr = ServiceHelper_Create(serviceId, pszName, pszIcon, pszUrl, SVCF_SUBSCRIBED | SVCF_PREAUTHORIZED, 2, TRUE, &service);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
OmCom_AddServiceToNavigation(service);
|
||
|
service->Release();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ServiceHelper_Subscribe(service, TRUE, SHF_SAVE /*| SHF_NOTIFY*/); // do not call SHF_NOTIFY - or it will adjust stats
|
||
|
if (S_OK == hr)
|
||
|
OmCom_AddServiceToNavigation(service);
|
||
|
|
||
|
service->Release();
|
||
|
}
|
||
|
|
||
|
JSAPI_SET_RESULT(pvarResult, boolVal, (SUCCEEDED(hr) ? VARIANT_TRUE : VARIANT_FALSE));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT OMCOM::SetSerialNumber(INT sn)
|
||
|
{
|
||
|
if (SERIALNUMBER_INVALID == sn)
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
if (serialNumber == sn)
|
||
|
return S_FALSE;
|
||
|
|
||
|
serialNumber = sn;
|
||
|
|
||
|
CHAR szBuffer[64] = {0};
|
||
|
HRESULT hr = StringCchPrintfA(szBuffer, ARRAYSIZE(szBuffer), "%d", serialNumber);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = Config_WriteStr(NULL, CONFIG_SERIALNUMBER, szBuffer);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
INT OMCOM::GetSerialNumber(BOOL fForceRead)
|
||
|
{
|
||
|
if (FALSE != fForceRead || SERIALNUMBER_INVALID == serialNumber)
|
||
|
{
|
||
|
serialNumber = Config_ReadInt(NULL, CONFIG_SERIALNUMBER, SERIALNUMBER_DEFAULT);
|
||
|
}
|
||
|
return serialNumber;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
HRESULT OMCOM::Login(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr)
|
||
|
{
|
||
|
// window.external.OnMedia.Login(String url);
|
||
|
JSAPI_VERIFY_METHOD(wFlags);
|
||
|
JSAPI_VERIFY_PARAMCOUNT(pdispparams, 1);
|
||
|
JSAPI_INIT_RESULT(pvarResult, VT_BOOL);
|
||
|
JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_FALSE);
|
||
|
const wchar_t *url = JSAPI_PARAM(pdispparams, 1).bstrVal;
|
||
|
HWND active_view = OmView_GetActive();
|
||
|
if (active_view)
|
||
|
{
|
||
|
OmService *service = OmView_GetService(active_view);
|
||
|
if (service)
|
||
|
{
|
||
|
OMNAVIGATION->SelectService(service, url);
|
||
|
JSAPI_SET_RESULT(pvarResult, boolVal, VARIANT_TRUE);
|
||
|
}
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
*/
|