233 lines
5.3 KiB
C++
233 lines
5.3 KiB
C++
#include <assert.h>
|
|
#include <strsafe.h>
|
|
|
|
#include "main.h"
|
|
#include "PlaylistInfo.h"
|
|
#include "nu/AutoLock.h"
|
|
|
|
int uniqueAddress;
|
|
|
|
using namespace Nullsoft::Utility;
|
|
|
|
static INT_PTR FindTreeID( GUID playlist_guid )
|
|
{
|
|
INT_PTR treeId = 0;
|
|
|
|
//if ( tree_to_guid_map.reverseLookup( playlist_guid, &treeId ) )
|
|
// return treeId;
|
|
//else
|
|
// return 0;
|
|
|
|
// Look for values and return the index
|
|
for (auto& item : tree_to_guid_map)
|
|
{
|
|
if (0 == memcmp(&item.second, &playlist_guid, sizeof(GUID)))
|
|
{
|
|
return item.first;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
PlaylistInfo::PlaylistInfo()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
void PlaylistInfo::Clear()
|
|
{
|
|
length = 0;
|
|
numItems = 0;
|
|
treeId = 0;
|
|
index = 0;
|
|
iterator = 0;
|
|
cloud = 0;
|
|
playlist_guid = INVALID_GUID;
|
|
}
|
|
|
|
bool PlaylistInfo::Associate( INT_PTR _treeId )
|
|
{
|
|
Clear();
|
|
|
|
treeId = _treeId;
|
|
playlist_guid = tree_to_guid_map[treeId];
|
|
|
|
if ( AGAVE_API_PLAYLISTS->GetPosition( playlist_guid, &index ) == API_PLAYLISTS_SUCCESS )
|
|
{
|
|
iterator = AGAVE_API_PLAYLISTS->GetIterator();
|
|
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_itemCount, &numItems, sizeof( numItems ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_totalTime, &length, sizeof( length ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_cloud, &cloud, sizeof( cloud ) );
|
|
}
|
|
else
|
|
playlist_guid = INVALID_GUID;
|
|
|
|
return Valid();
|
|
}
|
|
|
|
// as a pre-condition, AGAVE_API_PLAYLISTS needs to be locked
|
|
PlaylistInfo::PlaylistInfo( size_t p_index )
|
|
{
|
|
Clear();
|
|
|
|
index = p_index;
|
|
iterator = AGAVE_API_PLAYLISTS->GetIterator();
|
|
playlist_guid = AGAVE_API_PLAYLISTS->GetGUID( index );
|
|
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_itemCount, &numItems, sizeof( numItems ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_totalTime, &length, sizeof( length ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_cloud, &cloud, sizeof( cloud ) );
|
|
|
|
treeId = FindTreeID( playlist_guid ); // try to find treeId
|
|
}
|
|
|
|
// as a pre-condition, AGAVE_API_PLAYLISTS needs to be locked
|
|
PlaylistInfo::PlaylistInfo( GUID p_playlist_guid )
|
|
{
|
|
Clear();
|
|
|
|
playlist_guid = p_playlist_guid;
|
|
|
|
if ( AGAVE_API_PLAYLISTS->GetPosition( playlist_guid, &index ) == API_PLAYLISTS_SUCCESS )
|
|
{
|
|
iterator = AGAVE_API_PLAYLISTS->GetIterator();
|
|
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_itemCount, &numItems, sizeof( numItems ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_totalTime, &length, sizeof( length ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_cloud, &cloud, sizeof( cloud ) );
|
|
|
|
treeId = FindTreeID( playlist_guid ); // try to find treeId
|
|
}
|
|
else
|
|
playlist_guid = INVALID_GUID;
|
|
}
|
|
|
|
PlaylistInfo::PlaylistInfo( const PlaylistInfo © )
|
|
{
|
|
Clear();
|
|
|
|
index = copy.index;
|
|
iterator = copy.iterator;
|
|
playlist_guid = copy.playlist_guid;
|
|
length = copy.length;
|
|
numItems = copy.numItems;
|
|
treeId = copy.treeId;
|
|
cloud = copy.cloud;
|
|
}
|
|
|
|
size_t PlaylistInfo::GetIndex()
|
|
{
|
|
assert( Valid() );
|
|
|
|
AutoLockT<api_playlists> lock( AGAVE_API_PLAYLISTS );
|
|
size_t curIterator = AGAVE_API_PLAYLISTS->GetIterator();
|
|
if ( curIterator != iterator )
|
|
{
|
|
iterator = curIterator;
|
|
AGAVE_API_PLAYLISTS->GetPosition( playlist_guid, &index );
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
void PlaylistInfo::IssueSaveCallback()
|
|
{
|
|
assert( Valid() );
|
|
|
|
AutoLockT<api_playlists> lock( AGAVE_API_PLAYLISTS );
|
|
WASABI_API_SYSCB->syscb_issueCallback( api_playlists::SYSCALLBACK, api_playlists::PLAYLIST_SAVED, GetIndex(), (intptr_t)&uniqueAddress );
|
|
}
|
|
|
|
void PlaylistInfo::Refresh()
|
|
{
|
|
assert( Valid() );
|
|
|
|
if ( AGAVE_API_PLAYLISTS->GetPosition( playlist_guid, &index ) == API_PLAYLISTS_SUCCESS )
|
|
{
|
|
iterator = AGAVE_API_PLAYLISTS->GetIterator();
|
|
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_itemCount, &numItems, sizeof( numItems ) );
|
|
AGAVE_API_PLAYLISTS->GetInfo( index, api_playlists_totalTime, &length, sizeof( length ) );
|
|
}
|
|
else
|
|
playlist_guid = INVALID_GUID;
|
|
}
|
|
|
|
const wchar_t *PlaylistInfo::GetFilename()
|
|
{
|
|
assert( Valid() );
|
|
|
|
if ( _filename.empty() )
|
|
_filename = AGAVE_API_PLAYLISTS->GetFilename( GetIndex() );
|
|
|
|
return _filename.c_str();
|
|
}
|
|
|
|
// TODO: we should investigate caching the title
|
|
const wchar_t *PlaylistInfo::GetName()
|
|
{
|
|
assert( Valid() );
|
|
|
|
if ( _title.empty() )
|
|
_title = AGAVE_API_PLAYLISTS->GetName( GetIndex() );
|
|
|
|
return _title.c_str();
|
|
}
|
|
|
|
size_t PlaylistInfo::GetLength()
|
|
{
|
|
assert( Valid() );
|
|
|
|
return length;
|
|
}
|
|
|
|
void PlaylistInfo::SetLength( size_t newLength )
|
|
{
|
|
assert( Valid() );
|
|
|
|
length = newLength;
|
|
|
|
AutoLockT<api_playlists> lock( AGAVE_API_PLAYLISTS );
|
|
AGAVE_API_PLAYLISTS->SetInfo( GetIndex(), api_playlists_totalTime, &length, sizeof( length ) );
|
|
}
|
|
|
|
size_t PlaylistInfo::GetSize()
|
|
{
|
|
assert( Valid() );
|
|
|
|
return numItems;
|
|
}
|
|
|
|
size_t PlaylistInfo::GetCloud()
|
|
{
|
|
assert( Valid() );
|
|
|
|
return cloud;
|
|
}
|
|
|
|
void PlaylistInfo::SetCloud(size_t newCloud)
|
|
{
|
|
assert( Valid() );
|
|
|
|
cloud = newCloud;
|
|
|
|
AutoLockT<api_playlists> lock( AGAVE_API_PLAYLISTS );
|
|
AGAVE_API_PLAYLISTS->SetInfo( GetIndex(), api_playlists_cloud, &cloud, sizeof( cloud ) );
|
|
}
|
|
|
|
bool PlaylistInfo::Valid()
|
|
{
|
|
return !!( playlist_guid != INVALID_GUID );
|
|
}
|
|
|
|
void PlaylistInfo::SetSize( size_t newSize )
|
|
{
|
|
assert( Valid() );
|
|
|
|
numItems = newSize;
|
|
|
|
AutoLockT<api_playlists> lock( AGAVE_API_PLAYLISTS );
|
|
AGAVE_API_PLAYLISTS->SetInfo( GetIndex(), api_playlists_itemCount, &numItems, sizeof( numItems ) );
|
|
} |