(trunk) #3675 "Not all .part files are removed" -- added patch for libtransmission...
authorCharles Kerr <charles@transmissionbt.com>
Thu, 16 Dec 2010 03:38:07 +0000 (03:38 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Thu, 16 Dec 2010 03:38:07 +0000 (03:38 +0000)
gtk/tr-core.c
gtk/tr-torrent.c
gtk/tr-torrent.h
libtransmission/rpcimpl.c
libtransmission/torrent.c
libtransmission/transmission.h

index 3e70fb42e338895d039abff81140da0970358227..90838b6da5e29a269e08cb95ad2f43bdf5ac7b4d 100644 (file)
@@ -1266,11 +1266,8 @@ tr_core_remove_torrent_from_id( TrCore * core, int id, gboolean deleteFiles )
         /* remove from the gui */
         gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
 
-        /* maybe delete the downloaded files */
-        if( deleteFiles )
-            tr_torrentDeleteLocalData( tor, gtr_file_trash_or_remove );
-
         /* remove the torrent */
+        tr_torrent_set_delete_local_data_flag( gtor, deleteFiles );
         tr_torrent_set_remove_flag( gtor, TRUE );
         gtr_warn_if_fail( G_OBJECT( gtor )->ref_count == 1 );
         g_object_unref( G_OBJECT( gtor ) ); /* remove the last refcount */
index 3ac0b89152e124455d7b7c5466a0521c8730372b..fe726a09d04f58e6f54b6a2d0f18b308dd91af53 100644 (file)
@@ -41,24 +41,22 @@ struct TrTorrentPrivate
 {
     tr_torrent *  handle;
     gboolean      do_remove;
+    gboolean      delete_local_data;
 };
 
 
 static void
-tr_torrent_init( GTypeInstance *  instance,
-                 gpointer g_class UNUSED )
+tr_torrent_init( GTypeInstance * instance, gpointer g_class UNUSED )
 {
-    TrTorrent *               self = TR_TORRENT( instance );
     struct TrTorrentPrivate * p;
+    TrTorrent * self = TR_TORRENT( instance );
 
-    p = self->priv = G_TYPE_INSTANCE_GET_PRIVATE( self,
-                                                  TR_TORRENT_TYPE,
-                                                  struct TrTorrentPrivate );
+    p = G_TYPE_INSTANCE_GET_PRIVATE( self, TR_TORRENT_TYPE, struct TrTorrentPrivate );
     p->handle = NULL;
+    p->do_remove = FALSE;
+    p->delete_local_data = FALSE;
 
-#ifdef REFDBG
-    g_message( "torrent %p init", self );
-#endif
+    self->priv = p;
 }
 
 static int
@@ -78,7 +76,7 @@ tr_torrent_dispose( GObject * o )
         if( self->priv->handle )
         {
             if( self->priv->do_remove )
-                tr_torrentRemove( self->priv->handle );
+                tr_torrentRemove( self->priv->handle, self->priv->delete_local_data, gtr_file_trash_or_remove );
             else
                 tr_torrentFree( self->priv->handle );
         }
@@ -208,13 +206,20 @@ tr_torrent_new_ctor( tr_session   * session,
 }
 
 void
-tr_torrent_set_remove_flag( TrTorrent * gtor,
-                            gboolean    do_remove )
+tr_torrent_set_remove_flag( TrTorrent * gtor, gboolean flag )
 {
     if( !isDisposed( gtor ) )
-        gtor->priv->do_remove = do_remove;
+        gtor->priv->do_remove = flag;
 }
 
+void
+tr_torrent_set_delete_local_data_flag( TrTorrent * gtor, gboolean flag )
+{
+    if( !isDisposed( gtor ) )
+        gtor->priv->delete_local_data = flag;
+}
+
+
 void
 tr_torrent_open_folder( TrTorrent * gtor )
 {
index f147a44c13af9ae9ae0ff62d8cd7102a6b10196a..88dfe98fbc09b7ce755264e0fe5b79732c50bf9d 100644 (file)
@@ -71,7 +71,9 @@ TrTorrent *    tr_torrent_new_ctor( tr_session  * session,
                                     tr_ctor     * ctor,
                                     int         * errcode );
 
-void           tr_torrent_set_remove_flag( TrTorrent *,
-                                           gboolean );
+void tr_torrent_set_remove_flag( TrTorrent *, gboolean );
+
+void tr_torrent_set_delete_local_data_flag( TrTorrent *, gboolean );
+
 
 #endif
index 8734dce50a3f44e8e886e9d69c429acc6fcfb2b9..1d6bb6e6ad06bcaad54037c28db032a76d64deb3 100644 (file)
@@ -253,11 +253,12 @@ torrentRemove( tr_session               * session,
     {
         tr_torrent * tor = torrents[i];
         const tr_rpc_callback_status status = notify( session, TR_RPC_TORRENT_REMOVING, tor );
-        tr_bool deleteFlag;
-        if( tr_bencDictFindBool( args_in, "delete-local-data", &deleteFlag ) && deleteFlag )
-            tr_torrentDeleteLocalData( tor, NULL );
         if( !( status & TR_RPC_NOREMOVE ) )
-            tr_torrentRemove( tor );
+        {
+            tr_bool deleteFlag = FALSE;
+            tr_bencDictFindBool( args_in, "delete-local-data", &deleteFlag );
+            tr_torrentRemove( tor, deleteFlag, NULL );
+        }
     }
 
     tr_free( torrents );
index 8fecdaedcf2add5c1c3e21c972106308cb0568f9..eb544de5b24b8ff2a22a27aea69b403b318ccf5f 100644 (file)
@@ -1750,13 +1750,41 @@ tr_torrentFree( tr_torrent * tor )
     }
 }
 
+struct remove_data
+{
+    tr_torrent   * tor;
+    tr_bool        deleteFlag;
+    tr_fileFunc  * deleteFunc;
+};
+
+static void
+removeTorrent( void * vdata )
+{
+    struct remove_data * data = vdata;
+
+    if( data->deleteFlag )
+        tr_torrentDeleteLocalData( data->tor, data->deleteFunc );
+
+    tr_torrentClearCompletenessCallback( data->tor );
+    closeTorrent( data->tor );
+    tr_free( data );
+}
+
 void
-tr_torrentRemove( tr_torrent * tor )
+tr_torrentRemove( tr_torrent   * tor,
+                  tr_bool        deleteFlag, 
+                  tr_fileFunc    deleteFunc )
 {
-    assert( tr_isTorrent( tor ) );
+    struct remove_data * data;
 
+    assert( tr_isTorrent( tor ) );
     tor->isDeleting = 1;
-    tr_torrentFree( tor );
+
+    data = tr_new0( struct remove_data, 1 );
+    data->tor = tor;
+    data->deleteFlag = deleteFlag;
+    data->deleteFunc = deleteFunc;
+    tr_runInEventThread( tor->session, removeTorrent, data );
 }
 
 /**
index e114fcddf1332b5c0e094d1e3749854fdfce647c..191570a79f5c59f9ab73f617bcebc9fcee86de4c 100644 (file)
@@ -1031,9 +1031,13 @@ tr_torrent * tr_torrentNew( const tr_ctor   * ctor,
            Running torrents are stopped first.  */
 void tr_torrentFree( tr_torrent * torrent );
 
+typedef int tr_fileFunc( const char * filename );
+
 /** @brief Removes our .torrent and .resume files for
            this torrent, then calls tr_torrentFree(). */
-void tr_torrentRemove( tr_torrent * torrent );
+void tr_torrentRemove( tr_torrent  * torrent,
+                       tr_bool       removeLocalData,
+                       tr_fileFunc   removeFunc );
 
 /** @brief Start a torrent */
 void tr_torrentStart( tr_torrent * torrent );
@@ -1061,8 +1065,6 @@ void tr_torrentSetLocation( tr_torrent  * torrent,
                             double      * setme_progress,
                             int         * setme_state );
 
-typedef int tr_fileFunc( const char * filename );
-
 /**
  * @brief Deletes the torrent's local data.
  * @param torrent