mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-12 07:11:01 -05:00
159 lines
No EOL
3.6 KiB
C++
159 lines
No EOL
3.6 KiB
C++
#include "PLSLoader.h"
|
|
|
|
#include "../nu/AutoChar.h"
|
|
#include "../nu/AutoWide.h"
|
|
#include <shlwapi.h>
|
|
#include <strsafe.h>
|
|
|
|
|
|
class PLSInfo : public ifc_plentryinfo
|
|
{
|
|
public:
|
|
PLSInfo( const wchar_t *_filename, int _entryNum ) : filename( _filename ), entryNum( _entryNum )
|
|
{}
|
|
|
|
const wchar_t *GetExtendedInfo( const wchar_t *parameter )
|
|
{
|
|
static wchar_t data[ 1024 ];
|
|
wchar_t fieldbuf[ 100 ] = { 0 };
|
|
|
|
StringCchPrintfW( fieldbuf, 100, L"%s%d", parameter, entryNum );
|
|
|
|
GetPrivateProfileStringW( L"playlist", fieldbuf, L"", data, 1024, filename );
|
|
|
|
if ( data[ 0 ] )
|
|
return data;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
private:
|
|
RECVS_DISPATCH;
|
|
|
|
const wchar_t *filename;
|
|
int entryNum;
|
|
};
|
|
|
|
#define CBCLASS PLSInfo
|
|
START_DISPATCH;
|
|
CB( IFC_PLENTRYINFO_GETEXTENDEDINFO, GetExtendedInfo )
|
|
END_DISPATCH;
|
|
#undef CBCLASS
|
|
|
|
int PLSLoader::OnFileHelper( ifc_playlistloadercallback *playlist, const wchar_t *trackName, const wchar_t *title, int length, const wchar_t *rootPath, ifc_plentryinfo *extraInfo )
|
|
{
|
|
if ( length == -1000 )
|
|
length = -1;
|
|
|
|
int ret;
|
|
if ( wcsstr( trackName, L"://" ) || PathIsRootW( trackName ) )
|
|
{
|
|
ret = playlist->OnFile( trackName, title, length, extraInfo );
|
|
}
|
|
else
|
|
{
|
|
wchar_t fullPath[ MAX_PATH ] = { 0 };
|
|
if ( PathCombineW( fullPath, rootPath, trackName ) )
|
|
{
|
|
wchar_t canonicalizedPath[ MAX_PATH ] = { 0 };
|
|
PathCanonicalizeW( canonicalizedPath, fullPath );
|
|
ret = playlist->OnFile( canonicalizedPath, title, length, extraInfo );
|
|
}
|
|
else
|
|
{
|
|
ret = ifc_playlistloadercallback::LOAD_CONTINUE;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int PLSLoader::Load( const wchar_t *filename, ifc_playlistloadercallback *playlist )
|
|
{
|
|
int x, numfiles;
|
|
int ext = 0;
|
|
char fieldbuf[ 100 ] = { 0 };
|
|
char fnbuf[ FILENAME_SIZE ] = { 0 };
|
|
char tmp[ MAX_PATH ] = { 0 };
|
|
|
|
wchar_t rootPath[ MAX_PATH ] = { 0 };
|
|
const wchar_t *callbackPath = playlist->GetBasePath();
|
|
if ( callbackPath )
|
|
lstrcpynW( rootPath, callbackPath, MAX_PATH );
|
|
else
|
|
{
|
|
lstrcpynW( rootPath, filename, MAX_PATH );
|
|
PathRemoveFileSpecW( rootPath );
|
|
}
|
|
|
|
tmp[ 0 ] = (char)rootPath[ 0 ];
|
|
tmp[ 1 ] = (char)rootPath[ 1 ];
|
|
tmp[ 2 ] = (char)rootPath[ 2 ];
|
|
|
|
AutoChar fn( filename );
|
|
|
|
numfiles = GetPrivateProfileIntA( "playlist", "NumberOfEntries", 0, fn );
|
|
ext = GetPrivateProfileIntA( "playlist", "Version", 1, fn );
|
|
if ( numfiles == 0 )
|
|
return IFC_PLAYLISTLOADER_FAILED;
|
|
|
|
for ( x = 1; x <= numfiles; x++ )
|
|
{
|
|
int flen = -1;
|
|
char ftitle[ FILETITLE_SIZE ] = "";
|
|
StringCchPrintfA( fieldbuf, 100, "File%d", x );
|
|
GetPrivateProfileStringA( "playlist", fieldbuf, "", fnbuf, FILENAME_SIZE, fn );
|
|
if ( ext )
|
|
{
|
|
StringCchPrintfA( fieldbuf, 100, "Title%d", x );
|
|
GetPrivateProfileStringA( "playlist", fieldbuf, "", ftitle, FILETITLE_SIZE, fn );
|
|
StringCchPrintfA( fieldbuf, 100, "Length%d", x );
|
|
flen = GetPrivateProfileIntA( "playlist", fieldbuf, -1, fn );
|
|
}
|
|
|
|
if ( *fnbuf )
|
|
{
|
|
char *p;
|
|
char buf[ 512 ] = { 0 };
|
|
|
|
p = fnbuf;
|
|
|
|
if ( strncmp( p, "\\\\", 2 ) && strncmp( p + 1, ":\\", 2 ) && !strstr( p, ":/" ) )
|
|
{
|
|
if ( p[ 0 ] == '\\' )
|
|
{
|
|
buf[ 0 ] = tmp[ 0 ];
|
|
buf[ 1 ] = tmp[ 1 ];
|
|
lstrcpynA( buf + 2, p, 510 );
|
|
buf[ 511 ] = 0;
|
|
p = buf;
|
|
}
|
|
}
|
|
|
|
PLSInfo info( filename, x );
|
|
|
|
int ret;
|
|
if ( ftitle[ 0 ] )
|
|
{
|
|
ret = OnFileHelper( playlist, AutoWide( p ), AutoWide( ftitle ), flen * 1000, rootPath, &info );
|
|
}
|
|
else
|
|
{
|
|
ret = OnFileHelper( playlist, AutoWide( p ), 0, -1, rootPath, &info );
|
|
}
|
|
|
|
if ( ret != ifc_playlistloadercallback::LOAD_CONTINUE )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return IFC_PLAYLISTLOADER_SUCCESS;
|
|
}
|
|
|
|
#define CBCLASS PLSLoader
|
|
START_DISPATCH;
|
|
CB( IFC_PLAYLISTLOADER_LOAD, Load )
|
|
END_DISPATCH;
|
|
#undef CBCLASS |