winamp/Src/Plugins/Input/in_cdda/EditCDInfo.cpp
2024-09-24 14:54:57 +02:00

447 lines
11 KiB
C++

#include "main.h"
#include "cddb.h"
#include "../nu/ListView.h"
#include "cddbinterface.h"
#include "../Agave/Language/api_language.h"
#include "../Winamp/wa_ipc.h"
#include <atlbase.h>
#include <strsafe.h>
int _g_disable_cddb;
#if 0
static DINFO *p;
static char dialogDevice;
W_ListView trackList;
static void Populate(HWND hDlg)
{
int x;
trackList.Clear();
SetDlgItemTextW(hDlg, IDC_TITLE, p->title);
SetDlgItemTextW(hDlg, IDC_PUBLISHER, p->label);
SetDlgItemTextW(hDlg, IDC_ARTIST, p->artist);
SetDlgItemTextW(hDlg, IDC_GENRE, p->genre);
SetDlgItemTextW(hDlg, IDC_YEAR, p->year);
CheckDlgButton(hDlg, IDC_COMPILATION, p->compilation?BST_CHECKED:BST_UNCHECKED);
for (x = 0; x < p->ntracks; x ++)
{
trackList.InsertItem(x, p->tracks[x].artist, 0);
trackList.SetItemText(x, 1, p->tracks[x].title);
}
}
static HRESULT CALLBACK Cddb_ResultCallback(DWORD cddbId, HRESULT result, ICddbDisc *pDisc, ULONG_PTR user)
{
CBDATA *pData = (CBDATA*)user;
DefaultValues(pData->p);
if(S_OK == result)
{
}
else if (S_FALSE == result)
{
}
else if (S_MULTIPLE == result)
{
}
Populate(pData->hwnd);
return S_OK;
}
static LRESULT CALLBACK EditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NOTIFYFORMAT:
return NFR_UNICODE;
case WM_INITDIALOG:
trackList.setwnd(GetDlgItem(hDlg, IDC_TRACKS));
RECT rect1, rect2;
GetWindowRect(GetDlgItem(hDlg, IDC_EDITARTIST), &rect1);
GetWindowRect(GetDlgItem(hDlg, IDC_EDITTEXT), &rect2);
trackList.AddCol(WASABI_API_LNGSTRINGW(plugin.hDllInstance,IDS_ARTIST), rect2.left-rect1.left-3);
trackList.AddCol(WASABI_API_LNGSTRINGW(plugin.hDllInstance,IDS_TITLE), (rect2.right-rect2.left)-18);
if (_g_disable_cddb) EnableWindow(GetDlgItem(hDlg, IDC_GETCDDB), 0);
SendDlgItemMessage(hDlg, IDC_TITLE, EM_LIMITTEXT, 512, 0);
SendDlgItemMessage(hDlg, IDC_PUBLISHER, EM_LIMITTEXT, 512, 0);
SendDlgItemMessage(hDlg, IDC_ARTIST, EM_LIMITTEXT, 512, 0);
SendDlgItemMessage(hDlg, IDC_YEAR, EM_LIMITTEXT, 8, 0);
SendDlgItemMessage(hDlg, IDC_GENRE, EM_LIMITTEXT, 64, 0);
SendDlgItemMessage(hDlg, IDC_EDITTEXT, EM_LIMITTEXT, 512, 0);
SendDlgItemMessage(hDlg, IDC_EDITARTIST, EM_LIMITTEXT, 512, 0);
if (GetCDDBInfo(p, dialogDevice))
{
int x;
SetDlgItemText(hDlg, IDC_TITLE, WASABI_API_LNGSTRINGW(line.hDllInstance,IDS_TITLE));
SetDlgItemText(hDlg, IDC_ARTIST, WASABI_API_LNGSTRINGW(line.hDllInstance,IDS_ALBUM_ARTIST));
for (x = 0; x < p->ntracks; x ++)
{
wchar_t buf[128] = {0};
StringCchPrintfW(buf, 128, L"Track %d", x + 1);
trackList.InsertItem(x, "Artist", 0);
trackList.SetItemText(x, 1, buf);
}
}
else
{
Populate(hDlg);
}
return 1;
case WM_NOTIFY:
{
LPNMHDR l = (LPNMHDR)lParam;
switch (l->code)
{
case LVN_ITEMCHANGED:
{
LPNMLISTVIEW lvNotif = (LPNMLISTVIEW)l;
if (lvNotif->uNewState & LVIS_SELECTED)
{
wchar_t buf[512] = {0};
trackList.GetText(trackList.GetNextSelected(-1), 0, buf, 512);
SetDlgItemTextW(hDlg, IDC_EDITARTIST, buf);
trackList.GetText(trackList.GetNextSelected(-1), 1, buf, 512);
SetDlgItemTextW(hDlg, IDC_EDITTEXT, buf);
}
}
break;
}
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_GETCDDB:
{
wchar_t szTOC[2048] = {0};
if (Cddb_CalculateTOC(p, szTOC, sizeof(szTOC)/sizeof(wchar_t)))
{
CBDATA data = { p, hDlg };
HRESULT hr = Cddb_DoLookup(p->CDDBID, szTOC, hDlg, Cddb_ResultCallback,
CDDB_NOCACHE | CDDB_MODAL | CDDB_UI_MULTIPLE, (ULONG_PTR)&data);
}
else hr = CDDB_E_BADTOC;
}
break;
case IDC_CDTEXT:
if (DoCDText(p, dialogDevice))
{
Populate(hDlg);
}
break;
case IDCANCEL: EndDialog(hDlg, 1); break;
case IDOK:
{
int x;
GetDlgItemTextW(hDlg, IDC_TITLE, p->title, TITLE_SIZE);
GetDlgItemTextW(hDlg, IDC_PUBLISHER, p->label, 511); p->label[511] = 0;
GetDlgItemTextW(hDlg, IDC_ARTIST, p->artist, ARTIST_SIZE);
GetDlgItemTextW(hDlg, IDC_GENRE, p->genre, 63); p->genre[63] = 0;
GetDlgItemTextW(hDlg, IDC_YEAR, p->year, 8);
p->compilation = !!IsDlgButtonChecked(hDlg, IDC_COMPILATION);
for (x = 0; x < p->ntracks; x ++)
{
trackList.GetText(x, 0, p->tracks[x].artist, ARTIST_SIZE);
trackList.GetText(x, 1, p->tracks[x].title, TITLE_SIZE);
}
AddToDatabase(p);
}
EndDialog(hDlg, 0);
break;
case IDC_REMOVE:
RemoveFromDatabase(p);
EndDialog(hDlg, 1); break;
case IDC_EDITTEXT:
if (HIWORD(wParam) == EN_CHANGE)
{
wchar_t buf[512] = {0};
int p = trackList.GetNextSelected(-1);
if (p != LB_ERR)
{
GetDlgItemTextW(hDlg, IDC_EDITTEXT, buf, 512);
trackList.SetItemText(p, 1, buf);
}
}
break;
case IDC_EDITARTIST:
if (HIWORD(wParam) == EN_CHANGE)
{
wchar_t buf[512] = {0};
int p = trackList.GetNextSelected(-1);
if (p != LB_ERR)
{
GetDlgItemTextW(hDlg, IDC_EDITARTIST, buf, 512);
trackList.SetItemText(p, 0, buf);
if (!IsDlgButtonChecked(hDlg, IDC_COMPILATION))
{
wchar_t buf2[512] = {0};
GetDlgItemTextW(hDlg, IDC_ARTIST, buf2, 512);
if (lstrcmp(buf, buf2))
CheckDlgButton(hDlg, IDC_COMPILATION, BST_CHECKED);
}
}
}
break;
case IDC_ARTIST:
if (HIWORD(wParam) == EN_CHANGE && !IsDlgButtonChecked(hDlg, IDC_COMPILATION))
{
wchar_t buf[512] = {0};
GetDlgItemTextW(hDlg, IDC_ARTIST, buf, 512);
for (int x = 0; x < p->ntracks; x ++)
{
trackList.SetItemText(x, 0, buf);
}
if (trackList.GetNextSelected(-1) != LB_ERR)
{
SetDlgItemTextW(hDlg, IDC_EDITARTIST, buf);
}
}
break;
}
return 0;
}
return 0;
}
void DBEdit(DINFO *ps, HWND hwnd, int l, char device)
{
static int i = 0;
if (i) return ;
i = 1;
p = ps;
dialogDevice = device;
_g_disable_cddb = l;
if (!WASABI_API_DIALOGBOX(IDD_EDIT, hwnd, (DLGPROC)EditProc))
{
PostMessage(line.hMainWindow, WM_USER, (WPARAM)L"cda://", 247 /*IPC_REFRESHPLCACHE*/);
}
i = 0;
}
#endif
#if 0
typedef struct _EDITDATA
{
DINFO *p;
INT modified;
CHAR cDevice;
} EDITDATA;
#define GET_DATA(__hwnd) (EDITDATA*)(LONG_PTR)GetWindowLongPtrW((__hwnd), GWLP_USERDATA);
#define SET_IF(hwndDlg, id, data) if (data) SetDlgItemText(hwndDlg, id, data); else SetDlgItemText(hwndDlg, id, L"");
static void Fill(HWND hwndDlg, const DINFO *info)
{
SET_IF(hwndDlg, IDC_TITLE, info->title);
SET_IF(hwndDlg, IDC_ARTIST, info->artist);
if (info->discnum)
SetDlgItemInt(hwndDlg, IDC_DISC, info->discnum, FALSE);
else
SetDlgItemText(hwndDlg, IDC_DISCS, L"");
if (info->numdiscs)
SetDlgItemInt(hwndDlg, IDC_DISCS, info->numdiscs, FALSE);
else
SetDlgItemText(hwndDlg, IDC_DISCS, L"");
SET_IF(hwndDlg, IDC_YEAR, info->year);
SET_IF(hwndDlg, IDC_LABEL, info->label);
SET_IF(hwndDlg, IDC_NOTES, info->notes);
SET_IF(hwndDlg, IDC_GENRE, info->genre);
CheckDlgButton(hwndDlg, IDC_COMPILATION, (info->compilation)?BST_CHECKED:BST_UNCHECKED);
SendDlgItemMessage(hwndDlg, IDC_TRACKLIST, LB_RESETCONTENT, 0, 0);
for (int x = 0; x < info->ntracks; x ++)
{
wchar_t buf[1100] = {0};
if (!info->tracks[x].title)
StringCchPrintfW(buf, 1100, L"%d.", x+1);
else if (info->tracks[x].artist && info->tracks[x].artist[0] && wcscmp(info->tracks[x].artist, info->artist))
StringCchPrintfW(buf, 1100, L"%d. %s - %s", x+1, info->tracks[x].artist, info->tracks[x].title);
else
StringCchPrintfW(buf, 1100, L"%d. %s", x+1, info->tracks[x].title);
SendDlgItemMessageW(hwndDlg, IDC_TRACKLIST, LB_ADDSTRING, 0, (LPARAM)buf);
}
}
static HRESULT CALLBACK Cddb_LookupCallback(HRESULT result, ICddbDisc *pDisc, DWORD *pdwAutoCloseDelay, ULONG_PTR user)
{
HWND hwnd = (HWND)user;
EDITDATA *pData = GET_DATA(hwnd);
if (!pData) return E_INVALIDARG;
if(S_OK == result)
{
pData->modified = 1;
DefaultValues(pData->p);
GetDiscInfo(pDisc, pData->p);
StoreDisc(pData->p->CDDBID, pDisc);
ICddbCacheManager* pCache;
HRESULT hr = Cddb_GetICacheManger((void**)&pCache);
if (SUCCEEDED(hr))
{
CComBSTR toc;
pDisc->get_Toc(&toc);
hr = pCache->StoreDiscByToc(toc, pDisc);
pCache->Release();
}
Fill(hwnd, pData->p);
}
else
{
*pdwAutoCloseDelay = AUTOCLOSE_NEVER;
}
CddbCache_SetDisc(pData->p, result);
return S_OK;
}
static HRESULT CALLBACK Cddb_EditCallback(HRESULT result, ICddbDisc *pDisc, DWORD *pdwAutoCloseDelay, ULONG_PTR user)
{
HWND hwnd = (HWND)user;
EDITDATA *pData = GET_DATA(hwnd);
if (!pData) return E_INVALIDARG;
if (FAILED(result))
{
*pdwAutoCloseDelay = AUTOCLOSE_NEVER;
return S_OK;
}
if (SUCCEEDED(result))
{
HRESULT hr(S_OK);
wchar_t szTOC[2048] = {0};
ICDDBControl *pControl;
CDDBUIFlags uiFlags = UI_EDITMODE;
if (!Cddb_CalculateTOC(pData->p, szTOC, sizeof(szTOC)/sizeof(wchar_t))) hr = CDDB_E_BADTOC;
if (SUCCEEDED(hr)) hr = Cddb_GetIControl((void**)&pControl);
if (SUCCEEDED(hr))
{
if (!pDisc)
{
uiFlags = UI_SUBMITNEW;
hr = pControl->GetSubmitDisc(szTOC, 0, 0, &pDisc);
if (FAILED(hr)) pDisc = NULL;
}
else pDisc->AddRef();
if (pDisc)
{
Cddb_DisplayDiscInfo(pDisc, &uiFlags, hwnd);
if (uiFlags & UI_DATA_CHANGED)
{
ICddbCacheManager* pCache;
hr = Cddb_GetICacheManger((void**)&pCache);
if (SUCCEEDED(hr))
{
hr = pCache->StoreDiscByToc(szTOC, pDisc);
pCache->Release();
}
pData->modified = 1;
DefaultValues(pData->p);
GetDiscInfo(pDisc, pData->p);
StoreDisc(pData->p->CDDBID, pDisc);
Fill(hwnd, pData->p);
CddbCache_SetDisc(pData->p, S_OK);
}
pDisc->Release();
}
pControl->Release();
}
}
return S_OK;
}
static LRESULT CALLBACK EditProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
EDITDATA *pData;
switch (message)
{
case WM_INITDIALOG:
{
pData = (EDITDATA*)lParam;
if (!pData) { EndDialog(hwndDlg, 0); return 0; }
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam);
pData->modified = 0;
Fill(hwndDlg, pData->p);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_CDDB:
{
wchar_t szTOC[2048] = {0};
pData = GET_DATA(hwndDlg);
if (pData && Cddb_CalculateTOC(pData->p, szTOC, sizeof(szTOC)/sizeof(wchar_t)))
{
UINT flags = CDDB_NOCACHE | CDDB_UI_MODAL | CDDB_UI_MULTIPLE | CDDB_UI_RESULT_MODAL;
HRESULT hr = Cddb_DoLookup(szTOC, hwndDlg, Cddb_LookupCallback, flags, (ULONG_PTR)hwndDlg);
if (FAILED(hr)) Cddb_DisplayResultDlg(hwndDlg, hr, AUTOCLOSE_NEVER, flags);
}
}
break;
case IDC_EDIT:
{
wchar_t szTOC[2048] = {0};
pData = GET_DATA(hwndDlg);
if (pData && Cddb_CalculateTOC(pData->p, szTOC, sizeof(szTOC)/sizeof(wchar_t)))
{
UINT flags = CDDB_UI_MODAL | CDDB_UI_MULTIPLE | CDDB_UI_RESULT_MODAL;
HRESULT hr = Cddb_DoLookup(szTOC, hwndDlg, Cddb_EditCallback, flags, (ULONG_PTR)hwndDlg);
if (FAILED(hr)) Cddb_DisplayResultDlg(hwndDlg, hr, AUTOCLOSE_NEVER, flags);
}
}
break;
case IDCANCEL:
pData = (EDITDATA*)(LONG_PTR)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
EndDialog(hwndDlg, (pData) ? pData->modified : 0);
break;
}
break;
}
return 0;
}
bool CDEdit(CHAR cDevice, DINFO *ps, HWND hwnd)
{
EDITDATA data;
ZeroMemory(&data, sizeof(EDITDATA));
data.cDevice = cDevice;
data.p = ps;
if (WASABI_API_DIALOGBOXPARAM(IDD_EDIT, hwnd, (DLGPROC)EditProc, (LPARAM)&data))
{
PostMessageW(line.hMainWindow, WM_USER, (WPARAM)L"cda://", IPC_REFRESHPLCACHE);
}
return ( 0 != data.modified);
}
#endif