diff options
Diffstat (limited to 'Src/Plugins/Library/ml_online/OMCOM.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_online/OMCOM.cpp | 821 |
1 files changed, 821 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_online/OMCOM.cpp b/Src/Plugins/Library/ml_online/OMCOM.cpp new file mode 100644 index 00000000..8a00b456 --- /dev/null +++ b/Src/Plugins/Library/ml_online/OMCOM.cpp @@ -0,0 +1,821 @@ +#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; +} +*/
\ No newline at end of file |