Commit cb203ca1 authored by Clément Stenac's avatar Clément Stenac

* wx: Ensure that callbacks are not registered twice

* DAAP: don't crash if connection to host timeouts
parent 534a8122
...@@ -395,7 +395,7 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): ...@@ -395,7 +395,7 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ):
var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this ); var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this );
/* Update the playlist */ /* Update the playlist */
Rebuild(); Rebuild( VLC_TRUE );
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
...@@ -812,7 +812,7 @@ wxTreeItemId Playlist::FindItemByName( wxTreeItemId root, wxString search_string ...@@ -812,7 +812,7 @@ wxTreeItemId Playlist::FindItemByName( wxTreeItemId root, wxString search_string
/********************************************************************** /**********************************************************************
* Rebuild the playlist * Rebuild the playlist
**********************************************************************/ **********************************************************************/
void Playlist::Rebuild() void Playlist::Rebuild( vlc_bool_t b_root )
{ {
playlist_view_t *p_view; playlist_view_t *p_view;
playlist_t *p_playlist = playlist_t *p_playlist =
...@@ -825,14 +825,17 @@ void Playlist::Rebuild() ...@@ -825,14 +825,17 @@ void Playlist::Rebuild()
/* We can remove the callbacks before locking, anyway, we won't /* We can remove the callbacks before locking, anyway, we won't
* miss anything */ * miss anything */
var_DelCallback( p_playlist, "item-change", ItemChanged, this ); if( b_root )
var_DelCallback( p_playlist, "playlist-current", PlaylistNext, this ); {
var_DelCallback( p_playlist, "intf-change", PlaylistChanged, this ); var_DelCallback( p_playlist, "item-change", ItemChanged, this );
var_DelCallback( p_playlist, "item-append", ItemAppended, this ); var_DelCallback( p_playlist, "playlist-current", PlaylistNext, this );
var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this ); var_DelCallback( p_playlist, "intf-change", PlaylistChanged, this );
var_DelCallback( p_playlist, "item-append", ItemAppended, this );
var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this );
/* ...and rebuild it */ /* ...and rebuild it */
vlc_mutex_lock( &p_playlist->object_lock ); vlc_mutex_lock( &p_playlist->object_lock );
}
p_view = playlist_ViewFind( p_playlist, i_current_view ); /* FIXME */ p_view = playlist_ViewFind( p_playlist, i_current_view ); /* FIXME */
...@@ -845,35 +848,13 @@ void Playlist::Rebuild() ...@@ -845,35 +848,13 @@ void Playlist::Rebuild()
wxTreeItemId root = treectrl->GetRootItem(); wxTreeItemId root = treectrl->GetRootItem();
UpdateNode( p_playlist, p_view->p_root, root ); UpdateNode( p_playlist, p_view->p_root, root );
/*
wxTreeItemId item;
if( p_playlist->status.p_item != NULL )
{
item = FindItem( root, p_playlist->status.p_item );
}
else if( p_playlist->status.p_node != NULL )
{
item = FindItem( root, p_playlist->status.p_node );
}
else
{
item = root;
}
if( p_playlist->i_size )
{
SetCurrentItem( item );
}
*/
int i_count = CountItems( treectrl->GetRootItem() ); int i_count = CountItems( treectrl->GetRootItem() );
if( i_count < p_playlist->i_size && !b_changed_view ) if( i_count < p_playlist->i_size && !b_changed_view )
{ {
i_current_view = VIEW_CATEGORY; i_current_view = VIEW_CATEGORY;
b_changed_view = VLC_TRUE; b_changed_view = VLC_TRUE;
vlc_mutex_unlock( &p_playlist->object_lock ); Rebuild( VLC_FALSE );
Rebuild();
vlc_mutex_lock( &p_playlist->object_lock );
} }
else if( i_count != p_playlist->i_size ) else if( i_count != p_playlist->i_size )
{ {
...@@ -889,15 +870,17 @@ void Playlist::Rebuild() ...@@ -889,15 +870,17 @@ void Playlist::Rebuild()
p_playlist->i_size ), 0 ); p_playlist->i_size ), 0 );
} }
/* Put callbacks back online */ if( b_root )
var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this ); {
var_AddCallback( p_playlist, "playlist-current", PlaylistNext, this ); /* Put callbacks back online */
var_AddCallback( p_playlist, "item-change", ItemChanged, this ); var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this );
var_AddCallback( p_playlist, "item-append", ItemAppended, this ); var_AddCallback( p_playlist, "playlist-current", PlaylistNext, this );
var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this ); var_AddCallback( p_playlist, "item-change", ItemChanged, this );
var_AddCallback( p_playlist, "item-append", ItemAppended, this );
vlc_mutex_unlock( &p_playlist->object_lock ); var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this );
vlc_mutex_unlock( &p_playlist->object_lock );
}
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
...@@ -905,7 +888,7 @@ void Playlist::Rebuild() ...@@ -905,7 +888,7 @@ void Playlist::Rebuild()
void Playlist::ShowPlaylist( bool show ) void Playlist::ShowPlaylist( bool show )
{ {
if( show ) Rebuild(); if( show ) Rebuild( VLC_TRUE );
Show( show ); Show( show );
} }
...@@ -920,7 +903,7 @@ void Playlist::UpdatePlaylist() ...@@ -920,7 +903,7 @@ void Playlist::UpdatePlaylist()
if( this->b_need_update ) if( this->b_need_update )
{ {
this->b_need_update = VLC_FALSE; this->b_need_update = VLC_FALSE;
Rebuild(); Rebuild( VLC_TRUE );
} }
/* Updating the playing status every 0.5s is enough */ /* Updating the playing status every 0.5s is enough */
...@@ -1094,7 +1077,7 @@ void Playlist::OnSort( wxCommandEvent& event ) ...@@ -1094,7 +1077,7 @@ void Playlist::OnSort( wxCommandEvent& event )
vlc_mutex_unlock( &p_playlist->object_lock ); vlc_mutex_unlock( &p_playlist->object_lock );
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
Rebuild(); Rebuild( VLC_TRUE );
} }
/********************************************************************** /**********************************************************************
...@@ -1143,7 +1126,7 @@ void Playlist::OnInvertSelection( wxCommandEvent& WXUNUSED(event) ) ...@@ -1143,7 +1126,7 @@ void Playlist::OnInvertSelection( wxCommandEvent& WXUNUSED(event) )
void Playlist::OnDeleteSelection( wxCommandEvent& WXUNUSED(event) ) void Playlist::OnDeleteSelection( wxCommandEvent& WXUNUSED(event) )
{ {
Rebuild(); Rebuild( VLC_TRUE );
} }
void Playlist::OnSelectAll( wxCommandEvent& WXUNUSED(event) ) void Playlist::OnSelectAll( wxCommandEvent& WXUNUSED(event) )
...@@ -1314,7 +1297,7 @@ void Playlist::OnMenuEvent( wxCommandEvent& event ) ...@@ -1314,7 +1297,7 @@ void Playlist::OnMenuEvent( wxCommandEvent& event )
b_changed_view = VLC_TRUE; b_changed_view = VLC_TRUE;
i_current_view = i_new_view; i_current_view = i_new_view;
playlist_ViewUpdate( p_playlist, i_new_view ); playlist_ViewUpdate( p_playlist, i_new_view );
Rebuild(); Rebuild( VLC_TRUE );
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
return; return;
} }
...@@ -1327,7 +1310,7 @@ void Playlist::OnMenuEvent( wxCommandEvent& event ) ...@@ -1327,7 +1310,7 @@ void Playlist::OnMenuEvent( wxCommandEvent& event )
i_current_view = i_new_view; i_current_view = i_new_view;
Rebuild(); Rebuild( VLC_TRUE );
} }
} }
else if( event.GetId() >= FirstSD_Event && event.GetId() < LastSD_Event ) else if( event.GetId() >= FirstSD_Event && event.GetId() < LastSD_Event )
...@@ -1670,6 +1653,7 @@ static int ItemAppended( vlc_object_t *p_this, const char *psz_variable, ...@@ -1670,6 +1653,7 @@ static int ItemAppended( vlc_object_t *p_this, const char *psz_variable,
Playlist *p_playlist_dialog = (Playlist *)param; Playlist *p_playlist_dialog = (Playlist *)param;
playlist_add_t *p_add = (playlist_add_t *)malloc(sizeof( playlist_add_t)); playlist_add_t *p_add = (playlist_add_t *)malloc(sizeof( playlist_add_t));
memcpy( p_add, nval.p_address, sizeof( playlist_add_t ) ); memcpy( p_add, nval.p_address, sizeof( playlist_add_t ) );
wxCommandEvent event( wxEVT_PLAYLIST, AppendItem_Event ); wxCommandEvent event( wxEVT_PLAYLIST, AppendItem_Event );
......
...@@ -865,7 +865,7 @@ private: ...@@ -865,7 +865,7 @@ private:
void OnPopupDel( wxMenuEvent& event ); void OnPopupDel( wxMenuEvent& event );
void OnPopupEna( wxMenuEvent& event ); void OnPopupEna( wxMenuEvent& event );
void OnPopupInfo( wxMenuEvent& event ); void OnPopupInfo( wxMenuEvent& event );
void Rebuild(); void Rebuild( vlc_bool_t );
void Preparse( playlist_t *p_playlist ); void Preparse( playlist_t *p_playlist );
......
...@@ -508,6 +508,7 @@ static int EnumerateCallback( DAAP_SClient *p_client, ...@@ -508,6 +508,7 @@ static int EnumerateCallback( DAAP_SClient *p_client,
if( !b_found ) if( !b_found )
{ {
dhost_t *p_vlchost = (dhost_t *)malloc( sizeof( dhost_t ) ); dhost_t *p_vlchost = (dhost_t *)malloc( sizeof( dhost_t ) );
p_vlchost->p_node = NULL;
p_vlchost->p_host = p_host; p_vlchost->p_host = p_host;
p_vlchost->psz_name = psz_buffer; p_vlchost->psz_name = psz_buffer;
p_vlchost->b_new = VLC_TRUE; p_vlchost->b_new = VLC_TRUE;
...@@ -632,7 +633,9 @@ static void FreeHost( services_discovery_t *p_sd, dhost_t *p_host ) ...@@ -632,7 +633,9 @@ static void FreeHost( services_discovery_t *p_sd, dhost_t *p_host )
FIND_ANYWHERE ); FIND_ANYWHERE );
if( p_playlist ) if( p_playlist )
{ {
playlist_NodeDelete( p_playlist, p_host->p_node, VLC_TRUE , VLC_TRUE); if( p_host->p_node )
playlist_NodeDelete( p_playlist, p_host->p_node, VLC_TRUE ,
VLC_TRUE);
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment