diff options
Diffstat (limited to 'Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp b/Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp new file mode 100644 index 00000000..54e9d3a0 --- /dev/null +++ b/Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp @@ -0,0 +1,90 @@ +#include "main.h" +#include "./wasabiCallback.h" +#include "./navigation.h" +#include "./service.h" +#include "../replicant/nu/Autowide.h" + +WasabiCallback::WasabiCallback() + : ref(1) +{ +} + +WasabiCallback::~WasabiCallback() +{ +} + +HRESULT WasabiCallback::CreateInstance(WasabiCallback **instance) +{ + if (NULL == instance) return E_POINTER; + + *instance = new WasabiCallback(); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +size_t WasabiCallback::AddRef() +{ + return InterlockedIncrement((LONG*)&ref); +} + +size_t WasabiCallback::Release() +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + delete(this); + + return r; +} + +int WasabiCallback::QueryInterface(GUID interface_guid, void **object) +{ + return 0; +} + +FOURCC WasabiCallback::GetEventType() +{ + return SysCallback::BROWSER; +} + +int WasabiCallback::Notify(int msg, intptr_t param1, intptr_t param2) +{ + switch (msg) + { + case BrowserCallback::ONOPENURL: + return OpenURL(reinterpret_cast<const wchar_t*>(param1), reinterpret_cast<bool *>(param2)); + } + return 0; +} + +int WasabiCallback::OpenURL(const wchar_t *url, bool *override) +{ + WCHAR szTemplate[1024] = L"http://client.winamp.com/nowplaying"; + INT cchTemplate = ARRAYSIZE(szTemplate) - 1; + lstrcpynW(szTemplate, AutoWide(g_config->ReadString("nowplayingurl", "http://client.winamp.com/nowplaying")), ARRAYSIZE(szTemplate)); + + if (NULL != url && + CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, url, cchTemplate, szTemplate, cchTemplate)) + { + if (SUCCEEDED(Navigation_ShowService(SERVICE_ID, url, + NAVFLAG_FORCEACTIVE | NAVFLAG_ENSUREMLVISIBLE | NAVFLAG_ENSUREITEMVISIBLE))) + { + *override = true; + return 1; + } + } + return 0; +} + +#define CBCLASS WasabiCallback +START_DISPATCH; + CB(ADDREF, AddRef); + CB(RELEASE, Release); + CB(QUERYINTERFACE, QueryInterface); + CB(SYSCALLBACK_GETEVENTTYPE, GetEventType); + CB(SYSCALLBACK_NOTIFY, Notify); +END_DISPATCH; +#undef CBCLASS
\ No newline at end of file |