123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- #include "./common.h"
- #include "./api__ml_online.h"
- #include "./main.h"
- #include "../winamp/wa_ipc.h"
- #include <strsafe.h>
- LPWSTR Plugin_MallocString(size_t cchLen)
- {
- return (LPWSTR)calloc(cchLen, sizeof(WCHAR));
- }
- void Plugin_FreeString(LPWSTR pszString)
- {
- if (NULL != pszString)
- {
- free(pszString);
- pszString = NULL;
- }
- }
- LPWSTR Plugin_ReAllocString(LPWSTR pszString, size_t cchLen)
- {
- return (LPWSTR)realloc(pszString, sizeof(WCHAR) * cchLen);
- }
- LPWSTR Plugin_CopyString(LPCWSTR pszSource)
- {
- if (NULL == pszSource)
- return NULL;
- INT cchSource = lstrlenW(pszSource) + 1;
-
- LPWSTR copy = Plugin_MallocString(cchSource);
- if (NULL != copy)
- {
- CopyMemory(copy, pszSource, sizeof(WCHAR) * cchSource);
- }
- return copy;
- }
- LPSTR Plugin_MallocAnsiString(size_t cchLen)
- {
- return (LPSTR)calloc(cchLen, sizeof(CHAR));
- }
- LPSTR Plugin_CopyAnsiString(LPCSTR pszSource)
- {
- if (NULL == pszSource)
- return NULL;
- INT cchSource = lstrlenA(pszSource) + 1;
-
- LPSTR copy = Plugin_MallocAnsiString(cchSource);
- if (NULL != copy)
- {
- CopyMemory(copy, pszSource, sizeof(CHAR) * cchSource);
- }
- return copy;
- }
- void Plugin_FreeAnsiString(LPSTR pszString)
- {
- Plugin_FreeString((LPWSTR)pszString);
- }
- LPSTR Plugin_WideCharToMultiByte(UINT codePage, DWORD dwFlags, LPCWSTR lpWideCharStr, INT cchWideChar, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar)
- {
- INT cchBuffer = WideCharToMultiByte(codePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar);
- if (0 == cchBuffer) return NULL;
-
- LPSTR buffer = Plugin_MallocAnsiString(cchBuffer);
- if (NULL == buffer) return NULL;
-
- if (0 == WideCharToMultiByte(codePage, dwFlags, lpWideCharStr, cchWideChar, buffer, cchBuffer, lpDefaultChar, lpUsedDefaultChar))
- {
- Plugin_FreeAnsiString(buffer);
- return NULL;
- }
- return buffer;
- }
- LPWSTR Plugin_MultiByteToWideChar(UINT codePage, DWORD dwFlags, LPCSTR lpMultiByteStr, INT cbMultiByte)
- {
- if (NULL == lpMultiByteStr) return NULL;
- INT cchBuffer = MultiByteToWideChar(codePage, dwFlags, lpMultiByteStr, cbMultiByte, NULL, 0);
- if (NULL == cchBuffer) return NULL;
-
- if (cbMultiByte > 0) cchBuffer++;
-
- LPWSTR buffer = Plugin_MallocString(cchBuffer);
- if (NULL == buffer) return NULL;
- if (0 == MultiByteToWideChar(codePage, dwFlags, lpMultiByteStr, cbMultiByte, buffer, cchBuffer))
- {
- Plugin_FreeString(buffer);
- return NULL;
- }
- if (cbMultiByte > 0)
- {
- buffer[cchBuffer - 1] = L'\0';
- }
- return buffer;
- }
- LPWSTR Plugin_DuplicateResString(LPCWSTR pszResource)
- {
- return (IS_INTRESOURCE(pszResource)) ?
- (LPWSTR)pszResource :
- Plugin_CopyString(pszResource);
- }
- void Plugin_FreeResString(LPWSTR pszResource)
- {
- if (!IS_INTRESOURCE(pszResource))
- Plugin_FreeString(pszResource);
- }
- HRESULT Plugin_CopyResString(LPWSTR pszBuffer, INT cchBufferMax, LPCWSTR pszString)
- {
- if (NULL == pszBuffer)
- return E_INVALIDARG;
- HRESULT hr = S_OK;
- if (NULL == pszString)
- {
- pszBuffer[0] = L'\0';
- }
- else if (IS_INTRESOURCE(pszString))
- {
- if (NULL == WASABI_API_LNG)
- hr = E_FAIL;
- else
- WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)pszString, pszBuffer, cchBufferMax);
- }
- else
- {
- hr = StringCchCopy(pszBuffer, cchBufferMax, pszString);
- }
- return hr;
- }
- void Plugin_SafeRelease(IUnknown *pUnk)
- {
- if (NULL != pUnk)
- pUnk->Release();
- }
- HRESULT Plugin_MakeResourcePath(LPWSTR pszBuffer, INT cchBufferMax, LPCWSTR pszType, LPCWSTR pszName, UINT flags)
- {
- HINSTANCE hInstance = WASABI_API_LNG_HINST;
- if (NULL == hInstance || NULL == FindResource(hInstance, pszName, pszType))
- hInstance = Plugin_GetInstance();
- if (NULL == OMUTILITY)
- return E_UNEXPECTED;
- return OMUTILITY->MakeResourcePath(pszBuffer, cchBufferMax, hInstance, pszType, pszName, flags);
- }
- HWND Plugin_GetDialogOwner(void)
- {
- HWND hOwner= Plugin_GetLibrary();
- if (NULL == hOwner || FALSE == IsWindowVisible(hOwner) ||
- FALSE == IsWindowEnabled(hOwner))
- {
- hOwner = Plugin_GetWinamp();
- if (NULL != hOwner)
- {
- HWND hDlgParent = (HWND)SENDWAIPC(hOwner, IPC_GETDIALOGBOXPARENT, 0L);
- if (NULL != hDlgParent)
- hOwner = hDlgParent;
- }
- }
- return hOwner;
- }
- HRESULT Plugin_AppendFileFilter(LPTSTR pszBuffer, size_t cchBufferMax, LPCTSTR pName, LPCTSTR pFilter, LPTSTR *ppBufferOut, size_t *pRemaining, BOOL bShowFilter)
- {
- HRESULT hr;
-
- LPTSTR pCursor = pszBuffer;
- if (NULL != ppBufferOut)
- *ppBufferOut = pszBuffer;
- if (NULL != pRemaining)
- *pRemaining = cchBufferMax;
- if (NULL == pszBuffer || NULL == pName || NULL == pFilter)
- return E_INVALIDARG;
- pszBuffer[0] = TEXT('\0');
- hr = StringCchCopyEx(pCursor, cchBufferMax, pName, &pCursor, &cchBufferMax,
- STRSAFE_IGNORE_NULLS | STRSAFE_NULL_ON_FAILURE);
- if (bShowFilter && SUCCEEDED(hr))
- {
- LPTSTR p = pCursor;
- hr = StringCchPrintfEx(pCursor, cchBufferMax, &pCursor, &cchBufferMax,
- STRSAFE_IGNORE_NULLS | STRSAFE_NULL_ON_FAILURE, TEXT(" (%s)"), pFilter);
- if (SUCCEEDED(hr) && p != pCursor)
- CharLowerBuff(p, (INT)(INT_PTR)(pCursor - p));
- }
- if (SUCCEEDED(hr))
- {
- pCursor++;
- cchBufferMax--;
- hr = StringCchCopyEx(pCursor, cchBufferMax, pFilter, &pCursor, &cchBufferMax,
- STRSAFE_IGNORE_NULLS | STRSAFE_NULL_ON_FAILURE);
- }
- if (cchBufferMax < 1)
- hr = STRSAFE_E_INSUFFICIENT_BUFFER;
-
- pCursor++;
- cchBufferMax--;
- if (SUCCEEDED(hr))
- {
- pCursor[0] = TEXT('\0');
- if (NULL != ppBufferOut)
- *ppBufferOut = pCursor;
- if (NULL != pRemaining)
- *pRemaining = cchBufferMax;
- }
- else
- {
- pszBuffer[0] = TEXT('\0');
- pszBuffer[1] = TEXT('\0');
- }
- return hr;
- }
- HRESULT Plugin_BuildActionUrl(LPWSTR *ppStringOut, LPCWSTR pszAction, UINT *pServiceUid, size_t cchServiceUid)
- {
- if (NULL == ppStringOut)
- return E_POINTER;
-
- *ppStringOut = NULL;
- if (NULL == pszAction || L'\0' == *pszAction ||
- NULL == pServiceUid || 0 == cchServiceUid)
- {
- return E_INVALIDARG;
- }
-
- const WCHAR szPrefix[] = L"http://services.winamp.com/svc/action?action=%s\0";
- const WCHAR szService[] = L"&svc_id=%u\0";
- const WCHAR szClient[] = L"&unique_id=%s\0";
- size_t cchBuffer = ARRAYSIZE(szPrefix) + ARRAYSIZE(szService) + ARRAYSIZE(szClient);
- cchBuffer += lstrlen(pszAction);
- cchBuffer += (cchServiceUid * 11);
- cchBuffer += 32; // unique id
-
- LPWSTR buffer = Plugin_MallocString(cchBuffer);
- if (NULL == buffer)
- return E_OUTOFMEMORY;
- HRESULT hr;
- LPWSTR cursor = buffer;
- size_t remaining = cchBuffer;
- hr = StringCchPrintfEx(cursor, remaining, &cursor, &remaining, STRSAFE_NULL_ON_FAILURE,
- szPrefix, pszAction);
-
- for (size_t i = 0; i < cchServiceUid && SUCCEEDED(hr); i++)
- {
- hr = StringCchPrintfEx(cursor, remaining, &cursor, &remaining, STRSAFE_NULL_ON_FAILURE,
- ((0 == i) ? szService : L",%u"), pServiceUid[i]);
- }
- if (SUCCEEDED(hr))
- {
- WCHAR szTemp[128] = {0};
- hr = OMBROWSERMNGR->GetClientId(szTemp, ARRAYSIZE(szTemp));
- if (SUCCEEDED(hr))
- {
- hr = StringCchPrintfEx(cursor, remaining, &cursor, &remaining, STRSAFE_NULL_ON_FAILURE, szClient, szTemp);
- }
- }
-
- if (FAILED(hr))
- {
- Plugin_FreeString(buffer);
- hr = E_FAIL;
- }
- else
- {
- *ppStringOut = buffer;
- }
- return hr;
- }
- INT Plugin_ParseKeywords(LPCWSTR input, INT cchInput, WCHAR separator, BOOL eatSpace, KWPARSERPROC callback, ULONG_PTR user)
- {
- if (NULL == input)
- return 0;
- if (cchInput < 0)
- cchInput = lstrlen(input);
-
- if (cchInput <= 0)
- return 0;
- LPCWSTR end = (input + cchInput);
- if(eatSpace)
- while(input < end && L' ' == *input) input++;
- if (L'\0' == *input)
- return 0;
- INT found = 0;
-
- for (;;)
- {
- LPCWSTR pBlock = input;
- while(input <= end && separator != *input) input++;
- LPCWSTR last = (input - 1);
- if (eatSpace)
- while(last >= pBlock && L' ' == *last) last--;
-
- if (last >= pBlock)
- {
- UINT code = callback(pBlock, (INT)(INT_PTR)(last - pBlock) + 1, user);
- if (KWPARSER_FOUND & code) found++;
- if (KWPARSER_ABORT == (0x01 & code))
- return found;
- }
- if (input >= end || L'\0' == *input)
- return found;
- input++;
- if(eatSpace)
- while(input < end && L' ' == *input) input++;
- }
- return found;
- }
- INT Plugin_MessageBox(LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
- {
- HWND hHost, hLibrary = Plugin_GetLibrary();
- if (NULL != hLibrary && FALSE != IsWindowVisible(hLibrary))
- {
- hHost = (HWND)SENDMLIPC(hLibrary, ML_IPC_GETCURRENTVIEW, 0);
- if (NULL == hHost || FALSE == IsWindowVisible(hHost))
- hHost = hLibrary;
- }
- else
- hHost = Plugin_GetDialogOwner();
- if(IS_INTRESOURCE(lpText) && NULL != lpText)
- {
- WCHAR szText[2048] = {0};
- lpText = WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)lpText, szText, ARRAYSIZE(szText));
- }
- if(IS_INTRESOURCE(lpCaption) && NULL != lpCaption)
- {
- WCHAR szCaption[128] = {0};
- lpCaption = WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)lpCaption, szCaption, ARRAYSIZE(szCaption));
- }
- return MessageBox(hHost, lpText, lpCaption, uType);
- }
|