aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_nowplaying/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_nowplaying/main.cpp')
-rw-r--r--Src/Plugins/Library/ml_nowplaying/main.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_nowplaying/main.cpp b/Src/Plugins/Library/ml_nowplaying/main.cpp
new file mode 100644
index 00000000..4b5f2944
--- /dev/null
+++ b/Src/Plugins/Library/ml_nowplaying/main.cpp
@@ -0,0 +1,160 @@
+#include "main.h"
+#include "./navigation.h"
+#include "./wasabi.h"
+#include "./resource.h"
+#include "./external.h"
+#include "./wasabiCallback.h"
+#include "../nu/MediaLibraryInterface.h"
+#include "../replicant/nu/AutoChar.h"
+#include "../winamp/wa_ipc.h"
+#include "handler.h"
+#include "../nu/Singleton.h"
+#include "../ml_online/config.h"
+#include <strsafe.h>
+
+static NowPlayingURIHandler uri_handler;
+static SingletonServiceFactory<svc_urihandler, NowPlayingURIHandler> uri_handler_factory;
+
+static DWORD externalCookie = 0;
+static SysCallback *wasabiCallback = NULL;
+C_Config *g_config = NULL;
+
+static INT Plugin_Init(void);
+static void Plugin_Quit(void);
+static INT_PTR Plugin_MessageProc(INT msg, INT_PTR param1, INT_PTR param2, INT_PTR param3);
+
+EXTERN_C winampMediaLibraryPlugin plugin =
+{
+ MLHDR_VER,
+ "nullsoft(ml_nowplaying.dll)",
+ Plugin_Init,
+ Plugin_Quit,
+ Plugin_MessageProc,
+ 0,
+ 0,
+ 0,
+};
+
+HINSTANCE Plugin_GetInstance(void)
+{
+ return plugin.hDllInstance;
+}
+
+HWND Plugin_GetWinamp(void)
+{
+ return plugin.hwndWinampParent;
+}
+
+HWND Plugin_GetLibrary(void)
+{
+ return plugin.hwndLibraryParent;
+}
+
+void initConfigCache()
+{
+ wchar_t iniFileName[2048] = {0};
+ mediaLibrary.BuildPath(L"Plugins\\ml", iniFileName, 2048);
+ CreateDirectory(iniFileName, NULL);
+ mediaLibrary.BuildPath(L"Plugins\\ml\\ml_online.ini", iniFileName, 2048);
+ AutoChar charFn(iniFileName);
+ g_config = new C_Config(AutoChar(iniFileName));
+}
+
+static INT Plugin_Init(void)
+{
+ if (!WasabiApi_Initialize(Plugin_GetInstance()))
+ return 1;
+
+ if (NULL == OMBROWSERMNGR)
+ {
+ WasabiApi_Release();
+ return 2;
+ }
+
+ mediaLibrary.library = plugin.hwndLibraryParent;
+ mediaLibrary.winamp = plugin.hwndWinampParent;
+ mediaLibrary.instance = plugin.hDllInstance;
+
+ initConfigCache();
+
+ if (NULL != WASABI_API_LNG)
+ {
+ static wchar_t szDescription[256];
+ StringCchPrintf(szDescription, ARRAYSIZE(szDescription), WASABI_API_LNGSTRINGW(IDS_PLUGIN_NAME),
+ PLUGIN_VERSION_MAJOR, PLUGIN_VERSION_MINOR);
+ plugin.description = (char*)szDescription;
+ }
+
+ ExternalDispatch *externalDispatch;
+ if (SUCCEEDED(ExternalDispatch::CreateInstance(&externalDispatch)))
+ {
+ DispatchInfo dispatchInfo;
+ dispatchInfo.id = 0;
+ dispatchInfo.name =(LPWSTR)externalDispatch->GetName();
+ dispatchInfo.dispatch = externalDispatch;
+
+ if (0 == SENDWAIPC(Plugin_GetWinamp(), IPC_ADD_DISPATCH_OBJECT, (WPARAM)&dispatchInfo))
+ externalCookie = dispatchInfo.id;
+
+ externalDispatch->Release();
+ }
+
+ if(NULL != WASABI_API_SYSCB && NULL == wasabiCallback &&
+ SUCCEEDED(WasabiCallback::CreateInstance((WasabiCallback**)&wasabiCallback)))
+ {
+ WASABI_API_SYSCB->syscb_registerCallback(wasabiCallback, 0);
+ for (;;)
+ {
+ SysCallback *callback = WASABI_API_SYSCB->syscb_enum(SysCallback::BROWSER, 0);
+ if (NULL == callback || callback == wasabiCallback)
+ {
+ if (NULL != callback)
+ callback->Release();
+ break;
+ }
+
+ WASABI_API_SYSCB->syscb_deregisterCallback(callback);
+ WASABI_API_SYSCB->syscb_registerCallback(callback, 0);
+ callback->Release();
+ }
+ }
+
+ uri_handler_factory.Register(plugin.service, &uri_handler);
+ Navigation_Initialize();
+
+ return 0;
+}
+
+static void Plugin_Quit(void)
+{
+ if (NULL != wasabiCallback)
+ {
+ if (NULL != WASABI_API_SYSCB)
+ WASABI_API_SYSCB->syscb_deregisterCallback(wasabiCallback);
+ wasabiCallback->Release();
+ wasabiCallback = NULL;
+ }
+
+ if (0 != externalCookie)
+ {
+ HWND hWinamp = Plugin_GetWinamp();
+ SENDWAIPC(hWinamp, IPC_REMOVE_DISPATCH_OBJECT, (WPARAM)externalCookie);
+ externalCookie = 0;
+ }
+ uri_handler_factory.Deregister(plugin.service);
+ WasabiApi_Release();
+}
+
+static INT_PTR Plugin_MessageProc(INT msg, INT_PTR param1, INT_PTR param2, INT_PTR param3)
+{
+ INT_PTR result = 0;
+ if (FALSE != Navigation_ProcessMessage(msg, param1, param2, param3, &result))
+ return result;
+
+ return FALSE;
+}
+
+EXTERN_C __declspec(dllexport) winampMediaLibraryPlugin *winampGetMediaLibraryPlugin()
+{
+ return &plugin;
+} \ No newline at end of file