123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821 |
- #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;
- }
- */
|