Initial community commit
This commit is contained in:
134
Src/Plugins/Portable/pmp_android/androidplaylist.cpp
Normal file
134
Src/Plugins/Portable/pmp_android/androidplaylist.cpp
Normal file
@@ -0,0 +1,134 @@
|
||||
#include "./androiddevice.h"
|
||||
#include "./AndroidPlaylist.h"
|
||||
|
||||
#include <shlwapi.h>
|
||||
#include <strsafe.h>
|
||||
|
||||
// dtor
|
||||
// cleanup the memory allocated for the vector of songs
|
||||
AndroidPlaylist::~AndroidPlaylist()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// this is the constructor that gets called
|
||||
AndroidPlaylist::AndroidPlaylist(AndroidDevice& d, LPCTSTR fileName, BOOL m)
|
||||
: device(d), master(m), dirty(false)
|
||||
{
|
||||
StringCbCopyW(filename, sizeof(filename), fileName);
|
||||
StringCbCopyW(playlistName, sizeof(playlistName), PathFindFileName(fileName));
|
||||
StringCbCopyW(playlistPath, sizeof(playlistName), fileName);
|
||||
PathRemoveFileSpec(playlistPath);
|
||||
}
|
||||
|
||||
|
||||
void AndroidPlaylist::OnFile( const wchar_t *filename, const wchar_t *title, int lengthInMS, ifc_plentryinfo *info )
|
||||
{
|
||||
if ( filename == NULL )
|
||||
return;
|
||||
|
||||
AndroidSong *song = NULL;
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
song = device.findSongInMasterPlaylist( filename );
|
||||
songs.push_back( song );
|
||||
}
|
||||
|
||||
size_t AndroidPlaylist::size()
|
||||
{
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
return songs.size();
|
||||
}
|
||||
|
||||
AndroidSong *&AndroidPlaylist::at(size_t index)
|
||||
{
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
return songs.at(index);
|
||||
}
|
||||
|
||||
void AndroidPlaylist::push_back(AndroidSong *callback)
|
||||
{
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
songs.push_back(callback);
|
||||
dirty=TRUE;
|
||||
}
|
||||
|
||||
void AndroidPlaylist::RemoveSong(AndroidSong *song)
|
||||
{
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
size_t old_size = songs.size();
|
||||
|
||||
//songs.eraseAll(song);
|
||||
auto it = songs.begin();
|
||||
while (it != songs.end())
|
||||
{
|
||||
if (*it != song)
|
||||
{
|
||||
it++;
|
||||
continue;
|
||||
}
|
||||
|
||||
it = songs.erase(it);
|
||||
}
|
||||
|
||||
if (old_size != songs.size())
|
||||
dirty=TRUE;
|
||||
}
|
||||
|
||||
void AndroidPlaylist::swap(size_t index1, size_t index2)
|
||||
{
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
AndroidSong *temp = songs[index1];
|
||||
songs[index1] = songs[index2];
|
||||
songs[index2] = temp;
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
void AndroidPlaylist::eraseAt(size_t index)
|
||||
{
|
||||
// Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
songs.erase(songs.begin() + index);
|
||||
dirty=true;
|
||||
}
|
||||
|
||||
static int filenamecmp( const wchar_t *f1, const wchar_t *f2 )
|
||||
{
|
||||
for ( ;;)
|
||||
{
|
||||
wchar_t c1 = *f1++;
|
||||
wchar_t c2 = *f2++;
|
||||
if ( !c1 && !c2 )
|
||||
return 0;
|
||||
if ( !c1 )
|
||||
return -1;
|
||||
if ( !c2 )
|
||||
return 1;
|
||||
c1 = towupper( c1 );
|
||||
c2 = towupper( c2 );
|
||||
if ( c1 == '\\' )
|
||||
c1 = '/';
|
||||
if ( c2 == '\\' )
|
||||
c2 = '/';
|
||||
if ( c1 < c2 )
|
||||
return -1;
|
||||
else if ( c1 > c2 )
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
AndroidSong *AndroidPlaylist::FindSong(const wchar_t *filename)
|
||||
{
|
||||
//Nullsoft::Utility::AutoLock songs_lock(songs_guard);
|
||||
for (SongList::iterator e = songs.begin(); e != songs.end(); e++)
|
||||
{
|
||||
if (filenamecmp(filename, (*e)->filename) == 0)
|
||||
{
|
||||
return (*e);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define CBCLASS AndroidPlaylist
|
||||
START_DISPATCH;
|
||||
VCB(IFC_PLAYLISTLOADERCALLBACK_ONFILE, OnFile)
|
||||
END_DISPATCH;
|
||||
Reference in New Issue
Block a user