tr_core_add_torrent( data->core, data->gtor, FALSE );
if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( data->trash_check ) ) )
+ gtr_file_trash_or_remove( data->filename );
- tr_file_trash_or_remove( data->filename );
save_recent_destination( data->core, data->downloadDir );
}
}
}
}
+struct remove_torrent_idle_data
+{
+ TrCore * core;
+ int id;
+};
+
+static gboolean
+remove_torrent_idle( gpointer gdata )
+{
+ struct remove_torrent_idle_data * data = gdata;
+ tr_core_remove_torrent_from_id( data->core, data->id, FALSE );
+ g_free( data );
+ return FALSE; /* tell g_idle not to call this func twice */
+}
+
static void
setupsighandlers( void )
{
struct tr_torrent * tor,
void * gdata )
{
+ tr_rpc_callback_status status = TR_RPC_OK;
struct cbdata * cbdata = gdata;
gdk_threads_enter( );
tr_core_add_torrent( cbdata->core, tr_torrent_new_preexisting( tor ), TRUE );
break;
- case TR_RPC_TORRENT_REMOVING:
- tr_core_torrent_destroyed( cbdata->core, tr_torrentId( tor ) );
+ case TR_RPC_TORRENT_REMOVING: {
+ struct remove_torrent_idle_data * data = g_new0( struct remove_torrent_idle_data, 1 );
+ data->id = tr_torrentId( tor );
+ data->core = cbdata->core;
+ gtr_idle_add( remove_torrent_idle, data );
+ status = TR_RPC_NOREMOVE;
break;
+ }
case TR_RPC_SESSION_CHANGED:
tr_sessionGetSettings( session, pref_get_all( ) );
}
gdk_threads_leave( );
- return TR_RPC_OK;
+ return status;
}
static GSList *
}
static void
-accumulateSelectedTorrents( GtkTreeModel * model,
+accumulateSelectedTorrents( GtkTreeModel * model,
GtkTreePath * path UNUSED,
- GtkTreeIter * iter,
- gpointer gdata )
+ GtkTreeIter * iter,
+ gpointer gdata )
{
- GSList ** data = ( GSList** ) gdata;
- TrTorrent * tor = NULL;
+ GSList ** data = ( GSList** ) gdata;
+ TrTorrent * gtor = NULL;
- gtk_tree_model_get( model, iter, MC_TORRENT, &tor, -1 );
- *data = g_slist_prepend( *data, tor );
+ gtk_tree_model_get( model, iter, MC_TORRENT, >or, -1 );
+ *data = g_slist_prepend( *data, gtor );
+ g_object_unref( G_OBJECT( gtor ) );
}
static void
-removeSelected( struct cbdata * data,
- gboolean delete_files )
+removeSelected( struct cbdata * data, gboolean delete_files )
{
GSList * l = NULL;
GtkTreeSelection * s = tr_window_get_selection( data->wind );
p->progress_renderer = gtk_cell_renderer_progress_new( );
p->icon_renderer = gtk_cell_renderer_pixbuf_new( );
g_object_set( p->text_renderer_err, "foreground", "red", NULL );
- tr_object_ref_sink( p->text_renderer );
- tr_object_ref_sink( p->text_renderer_err );
- tr_object_ref_sink( p->progress_renderer );
- tr_object_ref_sink( p->icon_renderer );
+ gtr_object_ref_sink( p->text_renderer );
+ gtr_object_ref_sink( p->text_renderer_err );
+ gtr_object_ref_sink( p->progress_renderer );
+ gtr_object_ref_sink( p->icon_renderer );
p->bar_height = DEFAULT_BAR_HEIGHT;
}
}
void
-tr_core_torrent_destroyed( TrCore * core,
- int id )
+tr_core_remove_torrent( TrCore * core, TrTorrent * gtor, gboolean deleteFiles )
{
- GtkTreeIter iter;
+ const tr_torrent * tor = tr_torrent_handle( gtor );
- if( findTorrentInModel( core, id, &iter ) )
- {
- TrTorrent * gtor;
- GtkTreeModel * model = tr_core_model( core );
- gtk_tree_model_get( model, &iter, MC_TORRENT, >or, -1 );
- tr_torrent_clear( gtor );
- gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
- g_object_unref( G_OBJECT( gtor ) );
- }
+ if( tor != NULL )
+ tr_core_remove_torrent_from_id( core, tr_torrentId( tor ), deleteFiles );
}
void
-tr_core_remove_torrent( TrCore * core,
- TrTorrent * gtor,
- int deleteFiles )
+tr_core_remove_torrent_from_id( TrCore * core, int id, gboolean deleteFiles )
{
- const tr_torrent * tor = tr_torrent_handle( gtor );
+ GtkTreeIter iter;
- if( tor )
+ if( findTorrentInModel( core, id, &iter ) )
{
- int id = tr_torrentId( tor );
- GtkTreeIter iter;
- if( findTorrentInModel( core, id, &iter ) )
- {
- GtkTreeModel * model = tr_core_model( core );
+ TrTorrent * gtor = NULL;
+ tr_torrent * tor = NULL;
+ GtkTreeModel * model = tr_core_model( core );
- /* remove from the gui */
- gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
+ gtk_tree_model_get( model, &iter, MC_TORRENT, >or,
+ MC_TORRENT_RAW, &tor,
+ -1 );
- /* maybe delete the downloaded files */
- if( deleteFiles )
- tr_torrent_delete_files( gtor );
+ /* remove from the gui */
+ gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
- /* remove the torrent */
- tr_torrent_set_remove_flag( gtor, TRUE );
- g_object_unref( G_OBJECT( gtor ) );
- }
+ /* maybe delete the downloaded files */
+ if( deleteFiles )
+ tr_torrentDeleteLocalData( tor, gtr_file_trash_or_remove );
+
+ /* remove the torrent */
+ tr_torrent_set_remove_flag( gtor, TRUE );
+ g_warn_if_fail( G_OBJECT( gtor )->ref_count == 1 );
+ g_object_unref( G_OBJECT( gtor ) ); /* remove the last refcount */
}
}
*******
******/
-/* we've gotten notice from RPC that a torrent has been destroyed;
- update our gui accordingly */
-void tr_core_torrent_destroyed( TrCore * self, int torrentId );
-
/* remove a torrent */
-void tr_core_remove_torrent( TrCore * self, TrTorrent * gtor, int deleteFiles );
+void tr_core_remove_torrent( TrCore * self, TrTorrent * gtor, gboolean deleteFiles );
+void tr_core_remove_torrent_from_id( TrCore * self, int id, gboolean deleteFiles );
/* update the model with current torrent status */
void tr_core_update( TrCore * self );
parent->dispose( o );
}
-void
-tr_torrent_clear( TrTorrent * tor )
-{
- g_return_if_fail( tor );
- g_return_if_fail( tor->priv );
-
- tor->priv->handle = NULL;
-}
-
static void
tr_torrent_class_init( gpointer g_class,
gpointer g_class_data UNUSED )
/* #1294: don't delete the source .torrent file if it's our internal copy */
if( !is_internal )
- tr_file_trash_or_remove( source );
+ gtr_file_trash_or_remove( source );
}
return tor ? maketorrent( tor ) : NULL;
gtor->priv->do_remove = do_remove;
}
-void
-tr_torrent_delete_files( TrTorrent * gtor )
-{
- tr_torrentDeleteLocalData( tr_torrent_handle( gtor ), tr_file_trash_or_remove );
-}
-
void
tr_torrent_open_folder( TrTorrent * gtor )
{
GType tr_torrent_get_type( void );
-void tr_torrent_clear( TrTorrent * tor );
-
tr_torrent * tr_torrent_handle( TrTorrent *tor );
const tr_stat *tr_torrent_stat( TrTorrent *tor );
const tr_info *tr_torrent_info( TrTorrent *tor );
-void tr_torrent_delete_files( TrTorrent * tor );
-
void tr_torrent_open_folder( TrTorrent * tor );
TrTorrent * tr_torrent_new_preexisting( tr_torrent * tor );
}
gpointer
-tr_object_ref_sink( gpointer object )
+gtr_object_ref_sink( gpointer object )
{
#if GLIB_CHECK_VERSION( 2, 10, 0 )
g_object_ref_sink( object );
}
int
-tr_file_trash_or_remove( const char * filename )
+gtr_file_trash_or_remove( const char * filename )
{
if( filename && *filename )
{
void gtr_widget_set_tooltip_text( GtkWidget * w, const char * tip );
/* backwards-compatible wrapper around g_object_ref_sink() */
-gpointer tr_object_ref_sink( gpointer object );
+gpointer gtr_object_ref_sink( gpointer object );
/***
****
/* move a file to the trashcan if GIO is available; otherwise, delete it */
-int tr_file_trash_or_remove( const char * filename );
+int gtr_file_trash_or_remove( const char * filename );
#endif /* GTR_UTIL_H */