winamp/Src/Winamp/Pls.cpp
2024-09-24 14:54:57 +02:00

170 lines
4.2 KiB
C++

/** (c) Nullsoft, Inc. C O N F I D E N T I A L
** Filename:
** Project:
** Description:
** Author:
** Created:
**/
#include "Main.h"
#include <io.h>
#include <sys/stat.h>
#include "api.h"
#include "WinampPlaylist.h"
#include "../nu/AutoChar.h"
#include <strsafe.h>
void saveplsfn(const wchar_t *_fn)
{
int pos = PlayList_getPosition();
PlayList_setposition(0);
FILE *plsFile = _wfopen(_fn, L"wt");
if(plsFile)
{
int x = 0;
fprintf(plsFile, "[playlist]\r\n");
for (;;)
{
int plspos = PlayList_getPosition();
if (!PlayList_gethidden(plspos) && !PlayList_hasanycurtain(plspos))
{
wchar_t fnbuf[FILENAME_SIZE] = {0}, ftbuf[FILETITLE_SIZE] = {0};
PlayList_getitem2W(plspos, fnbuf, ftbuf);
PlayList_makerelative(_fn, fnbuf, 0);
fprintf(plsFile, "File%d=%s\r\n", ++x, (char *)AutoChar(fnbuf));
/*
const char *sBrowser = PlayList_getbrowser(plspos);
if (sBrowser)
fprintf(plsFile, "Browser%d=%s\r\n", x, sBrowser);
*/
if (PlayList_getcached(plspos))
{
fprintf(plsFile, "Title%d=%s\r\n", x, (char *)AutoChar(ftbuf));
fprintf(plsFile, "Length%d=%d\r\n", x, PlayList_getcurrentlength());
}
int repeat = PlayList_getrepeatcount(plspos);
if (repeat > 0)
fprintf(plsFile, "Repeat%d=%d\r\n", x, repeat);
}
if (PlayList_advance(1) < 0) break;
}
fprintf(plsFile, "NumberOfEntries=%d\r\n", x);
fprintf(plsFile, "Version=2\r\n");
PlayList_setposition(pos);
fclose(plsFile);
}
return ;
}
int loadpls(HWND hwnd, int whattodo)
{
if (!playlistManager)
{
LPMessageBox(hwnd, IDS_PLAYLIST_SUPPORT_NOT_INSTALLED,IDS_PLAYLIST_LOAD_ERROR, MB_OK);
return 0;
}
wchar_t filter[1024] = {0};
playlistManager->GetFilterList(filter, 1024);
wchar_t temp[FILENAME_SIZE] = {0}, oldCurPath[MAX_PATH] = {0}, titleStr[128] = {0};
GetCurrentDirectoryW(MAX_PATH, oldCurPath);
OPENFILENAMEW l = {sizeof(OPENFILENAMEW),0};
static int q;
int retv = 0;
if (q) return 0;
q = 1;
l.hwndOwner = DIALOG_PARENT(hMainWindow); //hwnd;
l.hInstance = hMainInstance;
l.lpstrFilter = filter;
l.lpstrFile = temp;
temp[0] = 0;
l.nMaxFile = FILENAME_SIZE;
l.lpstrInitialDir = WASABI_API_APP->path_getWorkingPath();
if (whattodo == 0) l.lpstrTitle = getStringW(IDS_OPEN_PLAYLIST,titleStr,128);
else if (whattodo == 1) l.lpstrTitle = getStringW(IDS_ADD_PLAYLIST,titleStr,128);
else l.lpstrTitle = getStringW(IDS_OPEN_PLAYLIST,titleStr,128);
l.lpstrDefExt = L"pls";
l.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER;
UninitDragDrops();
if (GetOpenFileNameW(&l))
{
wchar_t newCurPath[MAX_PATH] = {0};
GetCurrentDirectoryW(MAX_PATH, newCurPath);
WASABI_API_APP->path_setWorkingPath(newCurPath);
q = 0;
if (LoadPlaylist(temp, whattodo, 0) != 0)
retv = 0;
//else // TODO: this wasn't there in the old code, so we'll leave it out for now
retv = 1;
}
SetCurrentDirectoryW(oldCurPath);
q = 0;
InitDragDrops();
return retv;
}
static void checkplswritable(wchar_t *filename)
{
if (!_waccess(filename, 0))
{
if (_waccess(filename, 2))
{
_wchmod(filename, _S_IREAD | _S_IWRITE);
}
}
}
int savepls(HWND hwnd)
{
wchar_t oldCurPath[MAX_PATH] = {0};
GetCurrentDirectoryW(MAX_PATH, oldCurPath);
static wchar_t temp[MAX_PATH] = {0};
OPENFILENAMEW l = {sizeof(OPENFILENAMEW),0};
static int q;
if (q) return 0;
int ret = 0;
q = 1;
l.hwndOwner = hwnd;
l.hInstance = hMainInstance;
l.lpstrFilter = (LPCWSTR)SendMessageW(hMainWindow, WM_WA_IPC, 3, IPC_GET_PLAYLIST_EXTLISTW);
l.nFilterIndex = _r_i("plsflt", 3);
l.lpstrFile = temp;
l.nMaxFile = MAX_PATH - 1;
l.lpstrTitle = getStringW(IDS_SAVE_PLAYLIST,NULL,0);
l.lpstrDefExt = L"m3u";
l.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_OVERWRITEPROMPT;
if (GetSaveFileNameW(&l))
{
wchar_t newCurPath[MAX_PATH] = {0};
GetCurrentDirectoryW(MAX_PATH, newCurPath);
WASABI_API_APP->path_setWorkingPath(newCurPath);
SetCurrentDirectoryW(oldCurPath);
checkplswritable(temp);
q = 0;
ret = 1;
if (!_wcsicmp(extensionW(temp), L"pls"))
{
DeleteFileW(temp);
saveplsfn(temp);
}
else // if it's not PLS, then it's m3u or m3u8, both of which are handled by the same function
{
savem3ufn(temp, 0, 0);
}
}
_w_i("plsflt", l.nFilterIndex);
SetCurrentDirectoryW(oldCurPath);
q = 0;
return ret;
}