diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/playlist/SPlaylists.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/playlist/SPlaylists.cpp')
-rw-r--r-- | Src/playlist/SPlaylists.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/Src/playlist/SPlaylists.cpp b/Src/playlist/SPlaylists.cpp new file mode 100644 index 00000000..953b8ed2 --- /dev/null +++ b/Src/playlist/SPlaylists.cpp @@ -0,0 +1,157 @@ +#include "SPlaylists.h" +#include "api__playlist.h" +#include "Playlists.h" +#include "SPlaylistsEnumerator.h" +#include "SPlaylist.h" +#include "PlaylistManager.h" + +extern Playlists playlists; + +extern ScriptObjectController *script_root; +extern PlaylistsScriptController playlistsController; + +// {5829EE15-3648-4c6e-B2FE-8736CBBF39DB} +static const GUID makiPlaylistsGUID = +{ 0x5829ee15, 0x3648, 0x4c6e, { 0xb2, 0xfe, 0x87, 0x36, 0xcb, 0xbf, 0x39, 0xdb } }; + +// -- Functions table ------------------------------------- +function_descriptor_struct PlaylistsScriptController::exportedFunction[] = { + {L"GetEnumerator", 0, (void*)SPlaylists::script_vcpu_GetEnumerator }, + {L"OpenPlaylist", 1, (void*)SPlaylists::script_vcpu_OpenPlaylist }, + {L"SavePlaylist", 2, (void*)SPlaylists::script_vcpu_SavePlaylist }, +}; +// -------------------------------------------------------- + +const wchar_t *PlaylistsScriptController::getClassName() +{ + return L"Playlists"; +} + +const wchar_t *PlaylistsScriptController::getAncestorClassName() +{ + return L"Object"; +} + +ScriptObjectController *PlaylistsScriptController::getAncestorController() +{ + return script_root; +} + +int PlaylistsScriptController::getInstantiable() +{ + return 0; +} + +int PlaylistsScriptController::getReferenceable() +{ + return 0; +} + +ScriptObject *PlaylistsScriptController::instantiate() +{ + SPlaylists *xd = new SPlaylists; + ASSERT(xd != NULL); + return xd->getScriptObject(); +} + +void PlaylistsScriptController::destroy(ScriptObject *o) +{ + SPlaylists *xd = static_cast<SPlaylists *>(o->vcpu_getInterface(makiPlaylistsGUID)); + ASSERT(xd != NULL); + delete xd; +} + +void *PlaylistsScriptController::encapsulate(ScriptObject *o) +{ + return NULL; +} + +void PlaylistsScriptController::deencapsulate(void *o) +{} + +int PlaylistsScriptController::getNumFunctions() +{ + return sizeof(exportedFunction) / sizeof(function_descriptor_struct); +} + +const function_descriptor_struct *PlaylistsScriptController::getExportedFunctions() +{ + return exportedFunction; +} + +GUID PlaylistsScriptController::getClassGuid() +{ + return makiPlaylistsGUID; +} + +/* --- */ + +SPlaylists::SPlaylists() +{ + getScriptObject()->vcpu_setInterface(makiPlaylistsGUID, static_cast<SPlaylists *>(this)); + getScriptObject()->vcpu_setClassName(L"Playlists"); + getScriptObject()->vcpu_setController(&playlistsController); +} + +scriptVar SPlaylists::script_vcpu_GetEnumerator(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) +{ + SCRIPT_FUNCTION_INIT; + SPlaylistsEnumerator *enumerator = new SPlaylistsEnumerator(); + playlists.Lock(); + size_t count = playlists.GetCount(); + enumerator->Reserve(count); + for (size_t i=0;i!=count;i++) + { + const PlaylistInfo &info = playlists.GetPlaylistInfo(i); + enumerator->AppendPlaylist(info); + } + playlists.Unlock(); + return MAKE_SCRIPT_OBJECT(enumerator->getScriptObject()); +} + +scriptVar SPlaylists::script_vcpu_OpenPlaylist( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar scriptPlaylistGUID ) +{ + SCRIPT_FUNCTION_INIT; + GUID playlist_guid = nsGUID::fromCharW( GET_SCRIPT_STRING( scriptPlaylistGUID ) ); + SPlaylist *playlist = 0; + + playlists.Lock(); + size_t index; + if ( playlists.GetPosition( playlist_guid, &index ) == API_PLAYLISTS_SUCCESS ) + { + const wchar_t *filename = playlists.GetFilename( index ); + if ( filename ) + { + playlist = new SPlaylist; + if ( playlistManager.Load( filename, &playlist->playlist ) != PLAYLISTMANAGER_SUCCESS ) + { + delete playlist; + playlist = 0; + } + } + } + playlists.Unlock(); + + return MAKE_SCRIPT_OBJECT( playlist ? playlist->getScriptObject() : 0 ); +} + +scriptVar SPlaylists::script_vcpu_SavePlaylist( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar scriptPlaylistGUID, scriptVar scriptPlaylist ) +{ + SCRIPT_FUNCTION_INIT; + GUID playlist_guid = nsGUID::fromCharW( GET_SCRIPT_STRING( scriptPlaylistGUID ) ); + SPlaylist *playlist = static_cast<SPlaylist *>( GET_SCRIPT_OBJECT_AS( scriptPlaylist, makiPlaylistGUID ) ); + if ( playlist ) + { + playlists.Lock(); + size_t index; + if ( playlists.GetPosition( playlist_guid, &index ) == API_PLAYLISTS_SUCCESS ) + { + const wchar_t *filename = playlists.GetFilename( index ); + if ( filename ) + playlistManager.Save( filename, &playlist->playlist ); + } + playlists.Unlock(); + } + + return MAKE_SCRIPT_OBJECT( playlist ? playlist->getScriptObject() : 0 ); +} |