123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include "PlaylistsXML.h"
- #include "api__playlist.h"
- #include "../nu/AutoLock.h"
- #include "Playlists.h"
- #include <shlwapi.h>
- #include <stdint.h>
- using namespace Nullsoft::Utility;
- void PlaylistsXML::StartTag( const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params )
- {
- const wchar_t *filename = params->getItemValue( L"filename" );
- const wchar_t *title = params->getItemValue( L"title" );
- const wchar_t *countString = params->getItemValue( L"songs" );
- size_t numItems = 0;
- if ( countString && *countString )
- numItems = _wtoi( countString );
- const wchar_t *lengthString = params->getItemValue( L"seconds" );
- size_t length = 0;
- if ( lengthString && *lengthString )
- length = _wtoi( lengthString );
- const wchar_t *iTunesIDString = params->getItemValue( L"iTunesID" );
- uint64_t iTunesID = 0;
- if ( iTunesIDString && *iTunesIDString )
- iTunesID = _wtoi64( iTunesIDString );
- const wchar_t *cloudString = params->getItemValue( L"cloud" );
- size_t cloud = 0;
- if ( cloudString && *cloudString )
- cloud = _wtoi( cloudString );
- // parse GUID
- GUID guid = INVALID_GUID;
- const wchar_t *guidString = params->getItemValue( L"id" );
- if ( guidString && *guidString )
- {
- int Data1, Data2, Data3;
- int Data4[ 8 ];
- int n = swscanf( guidString, L" { %08x - %04x - %04x - %02x%02x - %02x%02x%02x%02x%02x%02x } ",
- &Data1, &Data2, &Data3, Data4 + 0, Data4 + 1,
- Data4 + 2, Data4 + 3, Data4 + 4, Data4 + 5, Data4 + 6, Data4 + 7 );
- if ( n == 11 ) // GUID was
- {
- // Cross assign all the values
- guid.Data1 = Data1;
- guid.Data2 = Data2;
- guid.Data3 = Data3;
- guid.Data4[ 0 ] = Data4[ 0 ];
- guid.Data4[ 1 ] = Data4[ 1 ];
- guid.Data4[ 2 ] = Data4[ 2 ];
- guid.Data4[ 3 ] = Data4[ 3 ];
- guid.Data4[ 4 ] = Data4[ 4 ];
- guid.Data4[ 5 ] = Data4[ 5 ];
- guid.Data4[ 6 ] = Data4[ 6 ];
- guid.Data4[ 7 ] = Data4[ 7 ];
- }
- }
- if ( PathIsFileSpecW( filename ) )
- {
- wchar_t playlistFilename[ MAX_PATH ] = { 0 };
- PathCombineW( playlistFilename, rootPath, filename );
- playlists->AddPlaylist_internal( playlistFilename, title, guid, numItems, length, iTunesID, cloud );
- }
- else
- {
- playlists->AddPlaylist_internal( filename, title, guid, numItems, length, iTunesID, cloud );
- }
- }
- int PlaylistsXML::LoadFile( const wchar_t *filename )
- {
- if ( !parser )
- return PLAYLISTSXML_NO_PARSER; // no sense in continuing if there's no parser available
- HANDLE file = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL );
- if ( file == INVALID_HANDLE_VALUE )
- return PLAYLISTSXML_NO_FILE;
- while ( true )
- {
- int8_t data[ 1024 ] = { 0 };
- DWORD bytesRead = 0;
- if ( ReadFile( file, data, 1024, &bytesRead, NULL ) && bytesRead )
- {
- if ( parser->xmlreader_feed( data, bytesRead ) != API_XML_SUCCESS )
- {
- CloseHandle( file );
- return PLAYLISTSXML_XML_PARSE_ERROR;
- }
- }
- else
- break;
- }
- CloseHandle( file );
- parser->xmlreader_feed( 0, 0 );
- return PLAYLISTSXML_SUCCESS;
- }
- PlaylistsXML::PlaylistsXML( Playlists *_playlists ) : playlists( _playlists )
- {
- const wchar_t *g_path = WASABI_API_APP->path_getUserSettingsPath();
- PathCombineW( rootPath, g_path, L"plugins\\ml\\playlists" );
- playlists->AddRef();
- parserFactory = WASABI_API_SVC->service_getServiceByGuid( obj_xmlGUID );
- if ( parserFactory )
- parser = (obj_xml *)parserFactory->getInterface();
- if ( parser )
- {
- parser->xmlreader_setCaseSensitive();
- parser->xmlreader_registerCallback( L"Winamp:Playlists\fplaylist", this );
- parser->xmlreader_registerCallback( L"playlists\fplaylist", this );
- parser->xmlreader_open();
- }
- }
- PlaylistsXML::~PlaylistsXML()
- {
- playlists->Release();
- if ( parser )
- {
- parser->xmlreader_unregisterCallback( this );
- parser->xmlreader_close();
- }
- if ( parserFactory && parser )
- parserFactory->releaseInterface( parser );
- parserFactory = 0;
- parser = 0;
- }
- #define CBCLASS PlaylistsXML
- START_DISPATCH;
- VCB( ONSTARTELEMENT, StartTag )
- END_DISPATCH;
- #undef CBCLASS
|