mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-29 18:16:06 +00:00
158 lines
4.3 KiB
C++
158 lines
4.3 KiB
C++
|
#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 );
|
||
|
}
|