aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/MergePlaylist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/MergePlaylist.cpp')
-rw-r--r--Src/Winamp/MergePlaylist.cpp247
1 files changed, 247 insertions, 0 deletions
diff --git a/Src/Winamp/MergePlaylist.cpp b/Src/Winamp/MergePlaylist.cpp
new file mode 100644
index 00000000..98bda46c
--- /dev/null
+++ b/Src/Winamp/MergePlaylist.cpp
@@ -0,0 +1,247 @@
+#include "main.h"
+#include "MergePlaylist.h"
+#include <strsafe.h>
+
+merge_pl_entry::merge_pl_entry( const wchar_t *p_filename, const wchar_t *p_title, int p_length_ms )
+{
+ SetFilename( p_filename );
+ SetTitle( p_title );
+ SetLengthMilliseconds( p_length_ms );
+}
+
+merge_pl_entry::~merge_pl_entry()
+{
+ plstring_release( this->filename );
+ plstring_release( this->filetitle );
+}
+
+
+size_t merge_pl_entry::GetFilename( wchar_t *p_filename, size_t filenameCch )
+{
+ if ( !this->filename )
+ return 0;
+
+ if ( !p_filename )
+ return wcslen( this->filename );
+
+ if ( !this->filename[ 0 ] )
+ return 0;
+
+ StringCchCopyW( p_filename, filenameCch, this->filename );
+
+ return 1;
+}
+
+size_t merge_pl_entry::GetTitle( wchar_t *p_title, size_t titleCch )
+{
+ if ( !this->filetitle )
+ return 0;
+
+ if ( !p_title )
+ return wcslen( this->filetitle );
+
+ if ( !this->filetitle[ 0 ] )
+ return 0;
+
+ StringCchCopyW( p_title, titleCch, this->filetitle );
+
+ return 1;
+}
+
+int merge_pl_entry::GetLengthInMilliseconds()
+{
+ return length;
+}
+
+size_t merge_pl_entry::GetExtendedInfo( const wchar_t *metadata, wchar_t *info, size_t infoCch )
+{
+ return 0;
+}
+
+
+void merge_pl_entry::SetFilename( const wchar_t *p_filename )
+{
+ plstring_release( this->filename );
+
+ if ( p_filename && p_filename[ 0 ] )
+ this->filename = plstring_wcsdup( p_filename );
+ else
+ this->filename = 0;
+}
+
+void merge_pl_entry::SetTitle( const wchar_t *p_title )
+{
+ plstring_release( filetitle );
+
+ if ( p_title && p_title[ 0 ] )
+ {
+ this->filetitle = plstring_wcsdup( p_title );
+ this->cached = true;
+ }
+ else
+ filetitle = 0;
+}
+
+void merge_pl_entry::SetLengthMilliseconds( int p_length_ms )
+{
+ if ( p_length_ms <= 0 )
+ this->length = -1000;
+ else
+ this->length = p_length_ms;
+}
+
+
+
+MergePlaylist::MergePlaylist()
+{
+ total_time = 0;
+}
+
+void MergePlaylist::Clear()
+{
+ for ( merge_pl_entry *l_merged_entry : entries )
+ delete l_merged_entry;
+
+ entries.clear();
+}
+
+void MergePlaylist::OnFile( const wchar_t *p_filename, const wchar_t *p_title, int lengthInMS, ifc_plentryinfo *info )
+{
+ if ( lengthInMS > 0 )
+ total_time += lengthInMS;
+
+ entries.push_back( new merge_pl_entry( p_filename, p_title, lengthInMS ) );
+}
+
+void MergePlaylist::AppendWithInfo( const wchar_t *p_filename, const wchar_t *p_title, int lengthInMS )
+{
+ if ( lengthInMS > 0 )
+ total_time += lengthInMS;
+
+ entries.push_back( new merge_pl_entry( p_filename, p_title, lengthInMS ) );
+}
+
+MergePlaylist::~MergePlaylist()
+{
+ Clear();
+}
+
+size_t MergePlaylist::GetNumItems()
+{
+ return entries.size();
+}
+
+size_t MergePlaylist::GetItem( size_t item, wchar_t *p_filename, size_t filenameCch )
+{
+ if ( item >= entries.size() )
+ return 0;
+
+ return entries[ item ]->GetFilename( p_filename, filenameCch );
+}
+
+size_t MergePlaylist::GetItemTitle( size_t item, wchar_t *p_title, size_t titleCch )
+{
+ if ( item >= entries.size() )
+ return 0;
+
+ return entries[ item ]->GetTitle( p_title, titleCch );
+}
+
+const wchar_t *MergePlaylist::ItemTitle( size_t item )
+{
+ if ( item >= entries.size() )
+ return 0;
+
+ return entries[ item ]->filetitle;
+}
+
+const wchar_t *MergePlaylist::ItemName( size_t item )
+{
+ if ( item >= entries.size() )
+ return 0;
+
+ return entries[ item ]->filename;
+}
+
+int MergePlaylist::GetItemLengthMilliseconds( size_t item )
+{
+ if ( item >= entries.size() )
+ return -1;
+
+ return entries[ item ]->GetLengthInMilliseconds();
+}
+
+size_t MergePlaylist::GetItemExtendedInfo( size_t item, const wchar_t *metadata, wchar_t *info, size_t infoCch )
+{
+ if ( item >= entries.size() )
+ return 0;
+
+ return entries[ item ]->GetExtendedInfo( metadata, info, infoCch );
+}
+
+
+void MergePlaylist::SetItemFilename( size_t item, const wchar_t *p_filename )
+{
+ if ( item < entries.size() )
+ entries[ item ]->SetFilename( p_filename );
+}
+
+void MergePlaylist::SetItemTitle( size_t item, const wchar_t *p_title )
+{
+ if ( item < entries.size() )
+ entries[ item ]->SetTitle( p_title );
+}
+
+void MergePlaylist::SetItemLengthMilliseconds( size_t item, int p_length_ms )
+{
+ if ( item < entries.size() )
+ entries[ item ]->SetLengthMilliseconds( p_length_ms );
+}
+
+void MergePlaylist::AppendPlaylist( MergePlaylist &copy )
+{
+ for ( merge_pl_entry *l_merged_entry : copy.entries )
+ {
+ if ( l_merged_entry->filename && !HasFilename( l_merged_entry->filename ) )
+ {
+ if ( l_merged_entry->length > 0 )
+ total_time += l_merged_entry->length;
+
+ entries.push_back( l_merged_entry );
+ }
+ }
+
+ copy.entries.clear();
+}
+
+bool MergePlaylist::HasFilename( const wchar_t *p_filename )
+{
+ for ( merge_pl_entry *l_merged_entry : entries )
+ {
+ if ( l_merged_entry->filename && !_wcsicmp( p_filename, l_merged_entry->filename ) )
+ return true;
+ }
+
+ return false;
+}
+
+#ifdef CBCLASS
+#undef CBCLASS
+#endif
+
+#define CBCLASS MergePlaylist
+
+START_MULTIPATCH;
+START_PATCH(patch_playlist)
+M_VCB(patch_playlist, ifc_playlist, IFC_PLAYLIST_CLEAR, Clear)
+//M_VCB(patch_playlist, ifc_playlist, IFC_PLAYLIST_APPENDWITHINFO, AppendWithInfo)
+//M_VCB(patch_playlist, ifc_playlist, IFC_PLAYLIST_APPEND, Append)
+M_CB(patch_playlist, ifc_playlist, IFC_PLAYLIST_GETNUMITEMS, GetNumItems)
+M_CB(patch_playlist, ifc_playlist, IFC_PLAYLIST_GETITEM, GetItem)
+M_CB(patch_playlist, ifc_playlist, IFC_PLAYLIST_GETITEMTITLE, GetItemTitle)
+M_CB(patch_playlist, ifc_playlist, IFC_PLAYLIST_GETITEMLENGTHMILLISECONDS, GetItemLengthMilliseconds)
+M_CB(patch_playlist, ifc_playlist, IFC_PLAYLIST_GETITEMEXTENDEDINFO, GetItemExtendedInfo)
+NEXT_PATCH(patch_playlistloadercallback)
+M_VCB(patch_playlistloadercallback, ifc_playlistloadercallback, IFC_PLAYLISTLOADERCALLBACK_ONFILE, OnFile);
+END_PATCH
+END_MULTIPATCH;