123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- #include "main.h"
- #include <vector>
- //#include <crtdbg.h>
- #include <strsafe.h>
- typedef std::vector<PluginUnloadCallback> UnloadCallbackList;
- static int Plugin_Init();
- static void Plugin_Quit();
- static INT_PTR
- Plugin_MessageProc(INT msg, INT_PTR param1, INT_PTR param2, INT_PTR param3);
- extern "C" winampMediaLibraryPlugin plugin =
- {
- MLHDR_VER,
- "nullsoft(ml_devices.dll)",
- Plugin_Init,
- Plugin_Quit,
- Plugin_MessageProc,
- 0,
- 0,
- 0,
- };
- static UnloadCallbackList *unloadCallbacks = NULL;
- static DeviceImageCache *imageCache = NULL;
- static HWND eventRelayWindow = NULL;
- HINSTANCE
- Plugin_GetInstance(void)
- {
- return plugin.hDllInstance;
- }
- HWND
- Plugin_GetWinampWindow(void)
- {
- return plugin.hwndWinampParent;
- }
- HWND
- Plugin_GetLibraryWindow(void)
- {
- return plugin.hwndLibraryParent;
- }
- static void
- Plugin_SetDescription()
- {
- 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;
- }
- static int Plugin_Init()
- {
- unloadCallbacks = NULL;
- // _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF |
- // _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF);
- if (FALSE == Wasabi_InitializeFromWinamp(plugin.hDllInstance, plugin.hwndWinampParent))
- return ML_INIT_FAILURE;
- Wasabi_LoadDefaultServices();
- Plugin_SetDescription();
- imageCache = DeviceImageCache_Create();
- if (NULL == eventRelayWindow)
- {
- eventRelayWindow = EventRelay_CreateWindow();
- if (NULL == eventRelayWindow)
- return 2;
- }
-
- if (FALSE == Navigation_Initialize())
- {
- if (NULL != eventRelayWindow)
- {
- DestroyWindow(eventRelayWindow);
- eventRelayWindow = NULL;
- }
- Wasabi_Release();
- return 3;
- }
-
- DeviceCommands_Register();
- return ML_INIT_SUCCESS;
- }
- static void Plugin_Quit()
- {
- if (NULL != unloadCallbacks)
- {
- size_t index = unloadCallbacks->size();
- while(index--)
- unloadCallbacks->at(index)();
- delete(unloadCallbacks);
- }
- if (NULL != eventRelayWindow)
- {
- DestroyWindow(eventRelayWindow);
- eventRelayWindow = NULL;
- }
- Navigation_Uninitialize();
- if (NULL != imageCache)
- {
- DeviceImageCache_Free(imageCache);
- imageCache = NULL;
- }
- Wasabi_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;
- }
- BOOL
- Plugin_RegisterUnloadCallback(PluginUnloadCallback callback)
- {
- if (NULL == callback)
- return FALSE;
- if (NULL == unloadCallbacks)
- {
- unloadCallbacks = new UnloadCallbackList();
- if (NULL == unloadCallbacks)
- return FALSE;
- }
- unloadCallbacks->push_back(callback);
- return TRUE;
- }
- DeviceImageCache *
- Plugin_GetImageCache()
- {
- return imageCache;
- }
- HWND
- Plugin_GetEventRelayWindow()
- {
- return eventRelayWindow;
- }
- const wchar_t *
- Plugin_GetDefaultDeviceImage(unsigned int width, unsigned int height)
- {
- const ImageInfo *image;
- const ImageInfo deviceImages[] =
- {
- {16, 16, MAKEINTRESOURCE(IDR_GENERIC_DEVICE_16x16_IMAGE)},
- {160, 160, MAKEINTRESOURCE(IDR_GENERIC_DEVICE_160x160_IMAGE)},
- };
- image = Image_GetBestFit(deviceImages, ARRAYSIZE(deviceImages), width, height);
- if (NULL == image)
- return NULL;
- return image->path;
- }
- HRESULT
- Plugin_EnsurePathExist(const wchar_t *path)
- {
- unsigned long errorCode;
- unsigned int errorMode;
-
- errorCode = ERROR_SUCCESS;
- errorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
- if (0 == CreateDirectory(path, NULL))
- {
- errorCode = GetLastError();
- if (ERROR_PATH_NOT_FOUND == errorCode)
- {
- const wchar_t *block, *cursor;
- wchar_t buffer[MAX_PATH] = {0};
-
- block = path;
- cursor = PathFindNextComponent(block);
- errorCode = (cursor == block ||
- S_OK != StringCchCopyN(buffer, ARRAYSIZE(buffer), block, (cursor - block))) ?
- ERROR_INVALID_NAME : ERROR_SUCCESS;
-
- block = cursor;
-
- while(ERROR_SUCCESS == errorCode &&
- NULL != (cursor = PathFindNextComponent(block)))
- {
- if (cursor == block ||
- S_OK != StringCchCatN(buffer, ARRAYSIZE(buffer), block, (cursor - block)))
- {
- errorCode = ERROR_INVALID_NAME;
- }
- if (ERROR_SUCCESS == errorCode &&
- FALSE == CreateDirectory(buffer, NULL))
- {
- errorCode = GetLastError();
- if (ERROR_ALREADY_EXISTS == errorCode)
- errorCode = ERROR_SUCCESS;
- }
- block = cursor;
- }
- }
- if (ERROR_ALREADY_EXISTS == errorCode)
- errorCode = ERROR_SUCCESS;
- }
- SetErrorMode(errorMode);
- SetLastError(errorCode);
- return HRESULT_FROM_WIN32(errorCode);
- }
- BOOL
- Plugin_GetResourceString(const wchar_t *resourceName, const wchar_t *resourceType, wchar_t *buffer, size_t bufferMax)
- {
- unsigned long filenameLength;
- if (NULL == resourceName)
- return FALSE;
- if (FAILED(StringCchCopyEx(buffer, bufferMax, L"res://", &buffer, &bufferMax, 0)))
- return FALSE;
- filenameLength = GetModuleFileName(Plugin_GetInstance(), buffer, (DWORD)bufferMax);
- if (0 == filenameLength || bufferMax == filenameLength)
- return FALSE;
- buffer += filenameLength;
- bufferMax -= filenameLength;
- if (NULL != resourceType)
- {
- if (FALSE != IS_INTRESOURCE(resourceType))
- {
- if (FAILED(StringCchPrintfEx(buffer, bufferMax, &buffer, &bufferMax, 0, L"/#%d", (int)(INT_PTR)resourceType)))
- return FALSE;
- }
- else
- {
- if (FAILED(StringCchPrintfEx(buffer, bufferMax, &buffer, &bufferMax, 0, L"/%s", resourceType)))
- return FALSE;
- }
- }
- if (FALSE != IS_INTRESOURCE(resourceName))
- {
- if (FAILED(StringCchPrintfEx(buffer, bufferMax, &buffer, &bufferMax, 0, L"/#%d", (int)(INT_PTR)resourceName)))
- return FALSE;
- }
- else
- {
- if (FAILED(StringCchPrintfEx(buffer, bufferMax, &buffer, &bufferMax, 0, L"/%s", resourceName)))
- return FALSE;
- }
- return TRUE;
- }
- HMENU
- Plugin_LoadMenu()
- {
- return WASABI_API_LOADMENUW(IDR_PLUGIN_MENU);
- }
- BOOL
- Plugin_ShowHelp()
- {
- BOOL result;
- wchar_t buffer[8192] = {0};
- WASABI_API_LNGSTRINGW_BUF(IDS_PLUGIN_HELP_URL, buffer, ARRAYSIZE(buffer));
- if (L'\0' == buffer[0])
- {
- if (FAILED(StringCchCopy(buffer, ARRAYSIZE(buffer),
- L"https://help.winamp.com/hc/articles/8106455294612-Winamp-Portables-Guide")))
- {
- return FALSE;
- }
- }
- result = MediaLibrary_ShowHelp(plugin.hwndLibraryParent, buffer);
- return result;
- }
- BOOL
- Plugin_BeginDiscovery()
- {
- if (NULL == WASABI_API_DEVICES ||
- FAILED(WASABI_API_DEVICES->BeginDiscovery()))
- {
- return FALSE;
- }
- return TRUE;
- }
- BOOL
- Plugin_OpenUrl(HWND ownerWindow, const wchar_t *url, BOOL forceExternal)
- {
- BOOL result;
- HCURSOR cursor;
- if (NULL == WASABI_API_WINAMP)
- return FALSE;
- cursor = LoadCursor(NULL, IDC_APPSTARTING);
- if (NULL != cursor)
- cursor = SetCursor(cursor);
- if (FALSE != forceExternal)
- {
- HINSTANCE instance = ShellExecute(ownerWindow, L"open", url, NULL, NULL, SW_SHOWNORMAL);
- result = ((INT_PTR)instance > 32) ? TRUE: FALSE;
- }
- else
- {
- HRESULT hr = WASABI_API_WINAMP->OpenUrl(ownerWindow, url);
- result = SUCCEEDED(hr);
- }
-
- if (NULL != cursor)
- SetCursor(cursor);
- return result;
- }
- EXTERN_C __declspec(dllexport) winampMediaLibraryPlugin *
- winampGetMediaLibraryPlugin()
- {
- return &plugin;
- }
|