aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp')
-rw-r--r--Src/Plugins/Library/ml_nowplaying/wasabiCallback.cpp90
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