Changeset 2456


Ignore:
Timestamp:
Jul 22, 2007, 2:24:13 AM (15 years ago)
Author:
charles
Message:

xmission: load torrents on startup and populate the torrent list.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/fdlimit.c

    r2452 r2456  
    472472    errno = 0;
    473473    file->file = open( path, write ? ( O_RDWR | O_CREAT ) : O_RDONLY, 0666 );
    474     if( file->file < 0 )
     474    if( write && ( file->file < 0 ) )
    475475    {
    476476        ret = tr_ioErrorFromErrno();
  • trunk/wx/xmission.cc

    r2439 r2456  
    1414#include <vector>
    1515#include <iostream>
     16#include <stdint.h>
    1617#include <wx/artprov.h>
    1718#include <wx/defs.h>
     
    2627extern "C" {
    2728  #include <libtransmission/transmission.h>
     29  #include <libtransmission/utils.h>
    2830}
    2931
     
    5153private:
    5254    void rebuildTorrentList();
     55    void repopulateTorrentList ();
    5356    wxListCtrl * myTorrentList;
     57    typedef std::vector<tr_torrent_t*> torrents_t;
     58    torrents_t myTorrents;
     59    void insertTorrent( tr_torrent_t*, const std::vector<int>& );
    5460};
    5561
     
    132138        COL_REMAINING,
    133139        COL_SEEDS,
    134         COL_SEND,
     140        COL_SENT,
    135141        COL_SIZE,
    136142        COL_STATE,
     
    159165            columns[_T("remaining")] = COL_REMAINING;
    160166            columns[_T("seeds")]     = COL_SEEDS;
    161             columns[_T("sent")]      = COL_SEND;
     167            columns[_T("sent")]      = COL_SENT;
    162168            columns[_T("size")]      = COL_SIZE;
    163169            columns[_T("state")]     = COL_STATE;
     
    175181    }
    176182
    177     std::vector<int> getTorrentColumns( wxConfig * config )
     183    typedef std::vector<int> int_v;
     184
     185    int_v getTorrentColumns( wxConfig * config )
    178186    {
    179187        const wxString key = _T("TorrentListColumns");
     
    182190            columnStr = _T("name|#|size|done|status|seeds|peers|eta|uspeed|dspeed");
    183191
    184         std::vector<int> cols;
     192        int_v cols;
    185193        while( !columnStr.IsEmpty() )
    186194        {
     
    191199        return cols;
    192200    }
     201
     202    int bestDecimal( double num ) {
     203        if ( num < 10 ) return 2;
     204        if ( num < 100 ) return 1;
     205        return 0;
     206    }
     207
     208    std::string getReadableSize( uint64_t size )
     209    {
     210        int i;
     211        static const char *sizestrs[] = { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB" };
     212            //N_("B"), N_("KiB"), N_("MiB"), N_("GiB"), N_("TiB"), N_("PiB"), N_("EiB") };
     213        for ( i=0; size>>10; ++i )
     214            size = size>>10;
     215        char buf[512];
     216        snprintf( buf, sizeof(buf), "%.*f %s", bestDecimal(size), (double)size, sizestrs[i] );
     217        return buf;
     218    }
     219    std::string getReadableSize( float f )
     220    {
     221        return getReadableSize( (uint64_t)f );
     222    }
     223
     224    std::string getReadableTime( int i /*seconds*/ )  /*FIXME*/
     225    {
     226        const int s = i % 60; i /= 60;
     227        const int m = i % 60; i /= 60;
     228        const int h = i;
     229        char buf[64];
     230        snprintf( buf, sizeof(buf), "%d:%02d:%02d", h, m, s);
     231        return buf;
     232    }
     233
     234    wxString toWxStr( const std::string& s )
     235    {
     236        return wxString( s.c_str(), wxConvUTF8 );
     237    }
     238
     239    wxString toWxStr( const char * s )
     240    {
     241        return wxString( s, wxConvUTF8 );
     242    }
     243}
     244
     245
     246/***
     247****
     248***/
     249
     250void
     251MyFrame :: insertTorrent( tr_torrent_t * tor,
     252                          const int_v        & cols )
     253{
     254    int row = -1;
     255    int col = 0;
     256    char buf[512];
     257    std::string str;
     258    const tr_stat_t * s = tr_torrentStat( tor );
     259    const tr_info_t* info = tr_torrentInfo( tor );
     260
     261
     262    for( int_v::const_iterator it(cols.begin()), end(cols.end()); it!=end; ++it )
     263    {
     264        wxString xstr;
     265
     266        switch( *it )
     267        {
     268            case COL_NUMBER:
     269                snprintf( buf, sizeof(buf), "%d", 666 );
     270                xstr = toWxStr( buf );
     271                break;
     272
     273            case COL_DONE:
     274                snprintf( buf, sizeof(buf), "%%%.1f", s->percentDone );
     275                xstr = toWxStr( buf );
     276                break;
     277
     278            case COL_DOWNLOAD_SPEED: break;
     279                xstr = toWxStr( getReadableSize( s->rateDownload ) + "/s"  );
     280                break;
     281
     282            case COL_ETA:
     283                xstr = toWxStr( getReadableTime( s->eta ) );
     284                break;
     285               
     286            case COL_HASH:
     287                xstr = toWxStr( info->hashString );
     288                break;
     289
     290            case COL_NAME:
     291                xstr = toWxStr( info->name );
     292                break;
     293
     294            case COL_PEERS:
     295                /* FIXME: this is all peers, not just leechers */
     296                snprintf( buf, sizeof(buf), "%d (%d)", s->peersTotal, s->peersConnected );
     297                xstr = toWxStr( buf );
     298                break;
     299
     300            case COL_RATIO:
     301                snprintf( buf, sizeof(buf), "%%%d", (int)(s->uploaded / (double)s->downloadedValid) );
     302                xstr = toWxStr( buf );
     303                break;
     304
     305            case COL_RECEIVED:
     306                xstr = toWxStr( getReadableSize( s->downloaded ) );
     307                break;
     308
     309            case COL_REMAINING:
     310                xstr = toWxStr( getReadableSize( s->left ) );
     311                break;
     312
     313            case COL_SEEDS:
     314                snprintf( buf, sizeof(buf), "%d", s->seeders ); /* FIXME: %d (%d) */
     315                xstr = toWxStr( buf );
     316                break;
     317
     318            case COL_SENT:
     319                xstr = toWxStr( getReadableSize( s->uploaded ) );
     320                break;
     321
     322            case COL_SIZE:
     323                xstr = toWxStr( getReadableSize( info->totalSize ) );
     324                break;
     325
     326            case COL_STATE:
     327                xstr = _T("Fixme");
     328                break;
     329
     330            case COL_STATUS:
     331                xstr = _T("Fixme");
     332                break;
     333
     334            case COL_TOTAL:
     335                xstr = _T("Fixme");
     336                break;
     337
     338            case COL_UPLOAD_SPEED:
     339                xstr = toWxStr( getReadableSize( s->rateUpload ) + "/s" );
     340                break;
     341
     342            default:
     343                xstr = _T("Fixme");
     344        }
     345
     346        if( row < 0 )
     347            row = myTorrentList->InsertItem( myTorrentList->GetItemCount(), xstr );
     348        else
     349            myTorrentList->SetItem( row, ++col, xstr );
     350    }
     351}
     352
     353
     354void
     355MyFrame :: repopulateTorrentList ()
     356{
     357    myTorrentList->DeleteAllItems();
     358
     359    const int_v cols = getTorrentColumns( myConfig );
     360    for( torrents_t::const_iterator it(myTorrents.begin()),
     361                                   end(myTorrents.end()); it!=end; ++it )
     362        insertTorrent( *it, cols );
    193363}
    194364
     
    199369
    200370    int i = 0;
    201     const std::vector<int> cols = getTorrentColumns( myConfig );
    202     for( std::vector<int>::const_iterator it(cols.begin()), end(cols.end()); it!=end; ++it )
     371    const int_v cols = getTorrentColumns( myConfig );
     372    for( int_v ::const_iterator it(cols.begin()), end(cols.end()); it!=end; ++it )
    203373    {
    204374        wxString h;
     
    217387            case COL_REMAINING:       h = _T("Remaining"); break;
    218388            case COL_SEEDS:           h = _T("Seeds"); break;
    219             case COL_SEND:            h = _T("Send"); break;
     389            case COL_SENT:            h = _T("Sent"); break;
    220390            case COL_SIZE:            h = _T("Size"); break;
    221391            case COL_STATE:           h = _T("State"); break;
     
    228398        myTorrentList->InsertColumn( i++, h );
    229399    }
     400
     401    repopulateTorrentList ();
    230402}
    231403
     
    248420    ico.CopyFromBitmap( wxBitmap( transmission_logo ) );
    249421    SetIcon( ico );
     422
     423    /**
     424    ***  Torrents
     425    **/
     426
     427    const int flags = TR_FLAG_PAUSED;
     428    const char * destination = "/tmp/asdf";
     429    int count = 0;
     430    tr_torrent_t ** torrents = tr_loadTorrents ( handle, destination, flags, &count );
     431    myTorrents.insert( myTorrents.end(), torrents, torrents+count );
     432    tr_free( torrents );
     433
    250434
    251435    /**
     
    337521    row_sizer->Add( myTorrentList, wxSizerFlags().Expand() );
    338522    row_sizer->AddGrowableCol( 1, 1 );
    339 
    340     i = myTorrentList->InsertItem( 0, _T("Fedora.iso") );
    341     myTorrentList->SetItem( i, 1, _T("*"));
    342     myTorrentList->SetItem( i, 2, _T("4.4 GiB"));
    343     myTorrentList->SetItem( i, 3, _T("50%"));
    344     myTorrentList->SetItem( i, 4, _T("0 (77)"));
    345     myTorrentList->SetItem( i, 5, _T("1 (128)"));
     523    repopulateTorrentList ();
    346524
    347525
Note: See TracChangeset for help on using the changeset viewer.