Changeset 8453


Ignore:
Timestamp:
May 20, 2009, 4:02:12 PM (12 years ago)
Author:
charles
Message:

(trunk) #920 Add "Move Data" to libT so all clients can use it

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/relocate.c

    r8389 r8453  
    3737    const tr_bool done = data->done;
    3838
    39     if( done )
     39    if( done != TR_LOC_MOVING )
    4040    {
    4141        gtk_widget_destroy( GTK_WIDGET( data->dialog ) );
     
    7676        updateData->dialog = dialog;
    7777        updateData->done = FALSE;
    78         tr_torrentSetLocation( tor, location, do_move, &updateData->done );
     78        tr_torrentSetLocation( tor, location, do_move, NULL, &updateData->done );
    7979        gtr_timeout_add_seconds( 1, onTimer, updateData );
    8080
  • trunk/libtransmission/rpcimpl.c

    r8414 r8453  
    795795        {
    796796            tr_torrent * tor = torrents[i];
    797             tr_torrentSetLocation( tor, location, move, NULL );
     797            tr_torrentSetLocation( tor, location, move, NULL, NULL );
    798798            notify( session, TR_RPC_TORRENT_CHANGED, tor );
    799799        }
  • trunk/libtransmission/torrent.c

    r8433 r8453  
    22812281{
    22822282    tr_bool move_from_old_location;
    2283     tr_bool * setme_done;
     2283    int * setme_state;
     2284    double * setme_progress;
    22842285    char * location;
    22852286    tr_torrent * tor;
     
    22892290setLocation( void * vdata )
    22902291{
     2292    int err = 0;
    22912293    struct LocationData * data = vdata;
    22922294    tr_torrent * tor = data->tor;
    22932295    const tr_bool do_move = data->move_from_old_location;
    22942296    const char * location = data->location;
     2297    double bytesHandled = 0;
    22952298
    22962299    assert( tr_isTorrent( tor ) );
     
    23142317         * FIXME: there are still all kinds of nasty cases, like what
    23152318         * if the target directory runs out of space halfway through... */
    2316         for( i=0; i<tor->info.fileCount; ++i )
     2319        for( i=0; !err && i<tor->info.fileCount; ++i )
    23172320        {
    23182321            struct stat sb;
    2319             char * oldpath = tr_buildPath( tor->downloadDir, tor->info.files[i].name, NULL );
    2320             char * newpath = tr_buildPath( location, tor->info.files[i].name, NULL );
    2321 
     2322            const tr_file * f = &tor->info.files[i];
     2323            char * oldpath = tr_buildPath( tor->downloadDir, f->name, NULL );
     2324            char * newpath = tr_buildPath( location, f->name, NULL );
    23222325           
    2323             if( do_move && !stat( oldpath, &sb ) )
     2326            if( do_move )
    23242327            {
    2325                 tr_moveFile( oldpath, newpath );
     2328                errno = 0;
    23262329                tr_torinf( tor, "moving \"%s\" to \"%s\"", oldpath, newpath );
     2330                if( tr_moveFile( oldpath, newpath ) ) {
     2331                    err = 1;
     2332                    tr_torerr( tor, "error moving \"%s\" to \"%s\": %s",
     2333                                    oldpath, newpath, tr_strerror( errno ) );
     2334                }
    23272335            }
    23282336            else if( !stat( newpath, &sb ) )
     
    23312339            }
    23322340
     2341            if( data->setme_progress )
     2342            {
     2343                bytesHandled += f->length;
     2344                *data->setme_progress = bytesHandled / tor->info.totalSize;
     2345            }
     2346
    23332347            tr_free( newpath );
    23342348            tr_free( oldpath );
    23352349        }
    23362350
    2337         /* blow away the leftover subdirectories in the old location */
    2338         tr_torrentDeleteLocalData( tor, unlink );
    2339 
    2340         /* set the new location and reverify */
    2341         tr_torrentSetDownloadDir( tor, location );
    2342         tr_torrentVerify( tor );
    2343     }
    2344 
    2345     if( data->setme_done )
    2346         *data->setme_done = TRUE;
     2351        if( !err )
     2352        {
     2353            /* blow away the leftover subdirectories in the old location */
     2354            tr_torrentDeleteLocalData( tor, unlink );
     2355
     2356            /* set the new location and reverify */
     2357            tr_torrentSetDownloadDir( tor, location );
     2358            tr_torrentVerify( tor );
     2359        }
     2360    }
     2361
     2362    if( data->setme_state )
     2363        *data->setme_state = err ? TR_LOC_ERROR : TR_LOC_DONE;
    23472364
    23482365    /* cleanup */
     
    23522369
    23532370void
    2354 tr_torrentSetLocation( tr_torrent * tor,
    2355                        const char * location,
    2356                        tr_bool      move_from_old_location,
    2357                        tr_bool    * setme_done )
     2371tr_torrentSetLocation( tr_torrent  * tor,
     2372                       const char  * location,
     2373                       tr_bool       move_from_old_location,
     2374                       double      * setme_progress,
     2375                       int         * setme_state )
    23582376{
    23592377    struct LocationData * data;
     
    23612379    assert( tr_isTorrent( tor ) );
    23622380
    2363     if( setme_done )
    2364         *setme_done = FALSE;
     2381    if( setme_state )
     2382        *setme_state = TR_LOC_MOVING;
     2383    if( setme_progress )
     2384        *setme_progress = 0;
    23652385
    23662386    /* run this in the libtransmission thread */
     
    23692389    data->location = tr_strdup( location );
    23702390    data->move_from_old_location = move_from_old_location;
    2371     data->setme_done = setme_done;
     2391    data->setme_state = setme_state;
     2392    data->setme_progress = setme_progress;
    23722393    tr_runInEventThread( tor->session, setLocation, data );
    23732394}
  • trunk/libtransmission/transmission.h

    r8433 r8453  
    938938typedef int tr_fileFunc( const char * filename );
    939939
     940enum
     941{
     942    TR_LOC_MOVING,
     943    TR_LOC_DONE,
     944    TR_LOC_ERROR
     945};
     946
    940947/** @brief Tell transmsision where to find this torrent's local data */
    941948void tr_torrentSetLocation( tr_torrent  * torrent,
    942949                            const char  * location,
    943950                            tr_bool       move_from_previous_location,
    944                             tr_bool     * setme_done );
     951                            double      * setme_progress,
     952                            int         * setme_state );
    945953
    946954/**
Note: See TracChangeset for help on using the changeset viewer.