Exemple #1
0
void *
tr_cpCreatePieceBitfield (const tr_completion * cp, size_t * byte_count)
{
  void * ret;
  tr_piece_index_t n;
  tr_bitfield pieces;

  assert (tr_torrentHasMetadata (cp->tor));

  n = cp->tor->info.pieceCount;
  tr_bitfieldConstruct (&pieces, n);

  if (tr_cpHasAll (cp))
    {
      tr_bitfieldSetHasAll (&pieces);
    }
  else if (!tr_cpHasNone (cp))
    {
      tr_piece_index_t i;
      bool * flags = tr_new (bool, n);
      for (i=0; i<n; ++i)
        flags[i] = tr_cpPieceIsComplete (cp, i);
      tr_bitfieldSetFromFlags (&pieces, flags, n);
      tr_free (flags);
    }
void
tr_torrentSetMetadataSizeHint( tr_torrent * tor, int size )
{
    if( !tr_torrentHasMetadata( tor ) )
    {
        if( tor->incompleteMetadata == NULL )
        {
            int i;
            struct tr_incomplete_metadata * m;
            const int n = ( size + ( METADATA_PIECE_SIZE - 1 ) ) / METADATA_PIECE_SIZE;
            dbgmsg( tor, "metadata is %d bytes in %d pieces", size, n );

            m = tr_new( struct tr_incomplete_metadata, 1 );
            m->pieceCount = n;
            m->metadata = tr_new( uint8_t, size );
            m->metadata_size = size;
            m->piecesNeededCount = n;
            m->piecesNeeded = tr_new( struct metadata_node, n );

            for( i=0; i<n; ++i ) {
                m->piecesNeeded[i].piece = i;
                m->piecesNeeded[i].requestedAt = 0;
            }

            tor->incompleteMetadata = m;
        }
    }
tr_completeness
tr_cpGetStatus( const tr_completion * cp )
{
    if( tr_cpHasAll( cp ) ) return TR_SEED;
    if( !tr_torrentHasMetadata( cp->tor ) ) return TR_LEECH;
    if( cp->sizeNow == tr_cpSizeWhenDone( cp ) ) return TR_PARTIAL_SEED;
    return TR_LEECH;
}
Exemple #4
0
void tr_torrentSaveResume(tr_torrent* tor)
{
    int err;
    tr_variant top;
    char* filename;

    if (!tr_isTorrent(tor))
    {
        return;
    }

    tr_variantInitDict(&top, 50); /* arbitrary "big enough" number */
    tr_variantDictAddInt(&top, TR_KEY_seeding_time_seconds, tor->secondsSeeding);
    tr_variantDictAddInt(&top, TR_KEY_downloading_time_seconds, tor->secondsDownloading);
    tr_variantDictAddInt(&top, TR_KEY_activity_date, tor->activityDate);
    tr_variantDictAddInt(&top, TR_KEY_added_date, tor->addedDate);
    tr_variantDictAddInt(&top, TR_KEY_corrupt, tor->corruptPrev + tor->corruptCur);
    tr_variantDictAddInt(&top, TR_KEY_done_date, tor->doneDate);
    tr_variantDictAddStr(&top, TR_KEY_destination, tor->downloadDir);

    if (tor->incompleteDir != NULL)
    {
        tr_variantDictAddStr(&top, TR_KEY_incomplete_dir, tor->incompleteDir);
    }

    tr_variantDictAddInt(&top, TR_KEY_downloaded, tor->downloadedPrev + tor->downloadedCur);
    tr_variantDictAddInt(&top, TR_KEY_uploaded, tor->uploadedPrev + tor->uploadedCur);
    tr_variantDictAddInt(&top, TR_KEY_max_peers, tor->maxConnectedPeers);
    tr_variantDictAddInt(&top, TR_KEY_bandwidth_priority, tr_torrentGetPriority(tor));
    tr_variantDictAddBool(&top, TR_KEY_paused, !tor->isRunning && !tor->isQueued);
    savePeers(&top, tor);

    if (tr_torrentHasMetadata(tor))
    {
        saveFilePriorities(&top, tor);
        saveDND(&top, tor);
        saveProgress(&top, tor);
    }

    saveSpeedLimits(&top, tor);
    saveRatioLimits(&top, tor);
    saveIdleLimits(&top, tor);
    saveFilenames(&top, tor);
    saveName(&top, tor);

    filename = getResumeFilename(tor);

    if ((err = tr_variantToFile(&top, TR_VARIANT_FMT_BENC, filename)) != 0)
    {
        tr_torrentSetLocalError(tor, "Unable to save resume file: %s", tr_strerror(err));
    }

    tr_free(filename);

    tr_variantFree(&top);
}
static char*
getShortTransferString( const tr_torrent  * tor,
                        const tr_stat     * torStat,
                        double              uploadSpeed,
                        double              downloadSpeed,
                        char              * buf,
                        size_t              buflen )
{
    char downStr[32], upStr[32];
    const int haveMeta = tr_torrentHasMetadata( tor );
    const int haveDown = haveMeta && torStat->peersSendingToUs > 0;
    const int haveUp = haveMeta && torStat->peersGettingFromUs > 0;

    if( haveDown )
        tr_strlspeed( downStr, downloadSpeed, sizeof( downStr ) );
    if( haveUp )
        tr_strlspeed( upStr, uploadSpeed, sizeof( upStr ) );

    if( haveDown && haveUp )
        /* 1==down speed, 2==down arrow, 3==up speed, 4==down arrow */
        g_snprintf( buf, buflen, _( "%1$s %2$s, %3$s %4$s" ),
                    gtr_get_unicode_string( GTR_UNICODE_DOWN ), downStr,
                    gtr_get_unicode_string( GTR_UNICODE_UP ), upStr );
    else if( haveDown )
        /* bandwidth speed + unicode arrow */
        g_snprintf( buf, buflen, _( "%1$s %2$s" ),
                    gtr_get_unicode_string( GTR_UNICODE_DOWN ), downStr );
    else if( haveUp )
        /* bandwidth speed + unicode arrow */
        g_snprintf( buf, buflen, _( "%1$s %2$s" ),
                    gtr_get_unicode_string( GTR_UNICODE_UP ), upStr );
    else if( tr_torrentHasMetadata( tor ) )
        /* the torrent isn't uploading or downloading */
        g_strlcpy( buf, _( "Idle" ), buflen );
    else
        *buf = '\0';

    return buf;
}
static char*
getShortTransferString (const tr_torrent  * tor,
                        const tr_stat     * st,
                        double              uploadSpeed_KBps,
                        double              downloadSpeed_KBps,
                        char              * buf,
                        size_t              buflen)
{
  const int haveMeta = tr_torrentHasMetadata (tor);
  const int haveUp = haveMeta && st->peersGettingFromUs > 0;
  const int haveDown = haveMeta && ((st->peersSendingToUs > 0) || (st->webseedsSendingToUs > 0));


  if (haveDown)
    {
      char dnStr[32], upStr[32];
      tr_formatter_speed_KBps (dnStr, downloadSpeed_KBps, sizeof (dnStr));
      tr_formatter_speed_KBps (upStr, uploadSpeed_KBps, sizeof (upStr));

      /* down speed, down symbol, up speed, up symbol */
      g_snprintf (buf, buflen, _("%1$s %2$s  %3$s %4$s"),
                  dnStr,
                  gtr_get_unicode_string (GTR_UNICODE_DOWN),
                  upStr,
                  gtr_get_unicode_string (GTR_UNICODE_UP));
    }
  else if (haveUp)
    {
      char upStr[32];
      tr_formatter_speed_KBps (upStr, uploadSpeed_KBps, sizeof (upStr));

      /* up speed, up symbol */
      g_snprintf (buf, buflen, _("%1$s  %2$s"),
                  upStr,
                  gtr_get_unicode_string (GTR_UNICODE_UP));
    }
  else if (st->isStalled)
    {
      g_strlcpy (buf, _("Stalled"), buflen);
    }
  else
    {
      *buf = '\0';
    }

  return buf;
}
Exemple #7
0
void
tr_torrentSaveResume( tr_torrent * tor )
{
    int err;
    tr_benc top;
    char * filename;

    if( !tr_isTorrent( tor ) )
        return;

    tr_bencInitDict( &top, 50 ); /* arbitrary "big enough" number */
    tr_bencDictAddInt( &top, KEY_TIME_SEEDING, tor->secondsSeeding );
    tr_bencDictAddInt( &top, KEY_TIME_DOWNLOADING, tor->secondsDownloading );
    tr_bencDictAddInt( &top, KEY_ACTIVITY_DATE, tor->activityDate );
    tr_bencDictAddInt( &top, KEY_ADDED_DATE, tor->addedDate );
    tr_bencDictAddInt( &top, KEY_CORRUPT, tor->corruptPrev + tor->corruptCur );
    tr_bencDictAddInt( &top, KEY_DONE_DATE, tor->doneDate );
    tr_bencDictAddStr( &top, KEY_DOWNLOAD_DIR, tor->downloadDir );
    if( tor->incompleteDir != NULL )
        tr_bencDictAddStr( &top, KEY_INCOMPLETE_DIR, tor->incompleteDir );
    tr_bencDictAddInt( &top, KEY_DOWNLOADED, tor->downloadedPrev + tor->downloadedCur );
    tr_bencDictAddInt( &top, KEY_UPLOADED, tor->uploadedPrev + tor->uploadedCur );
    tr_bencDictAddInt( &top, KEY_MAX_PEERS, tor->maxConnectedPeers );
    tr_bencDictAddInt( &top, KEY_BANDWIDTH_PRIORITY, tr_torrentGetPriority( tor ) );
    tr_bencDictAddBool( &top, KEY_PAUSED, !tor->isRunning );
    savePeers( &top, tor );
    if( tr_torrentHasMetadata( tor ) )
    {
        saveFilePriorities( &top, tor );
        saveDND( &top, tor );
        saveProgress( &top, tor );
    }
    saveSpeedLimits( &top, tor );
    saveRatioLimits( &top, tor );
    saveIdleLimits( &top, tor );

    filename = getResumeFilename( tor );
    if(( err = tr_bencToFile( &top, TR_FMT_BENC, filename )))
        tr_torrentSetLocalError( tor, "Unable to save resume file: %s", tr_strerror( err ) );
    tr_free( filename );

    tr_bencFree( &top );
}
static void
updateTorrent( struct OpenData * o )
{
    const gboolean isLocalFile = tr_ctorGetSourceFile( o->ctor ) != NULL;
    gtk_widget_set_sensitive( o->trash_check, isLocalFile );

    if( !o->tor )
    {
        gtr_file_list_clear( o->file_list );
        gtk_widget_set_sensitive( o->file_list, FALSE );
    }
    else
    {
        tr_torrentSetDownloadDir( o->tor, o->downloadDir );
        gtk_widget_set_sensitive( o->file_list, tr_torrentHasMetadata( o->tor ) );
        gtr_file_list_set_torrent( o->file_list, tr_torrentId( o->tor ) );
        tr_torrentVerify( o->tor );
    }
}
static char*
getShortTransferString( const tr_torrent  * tor,
                        const tr_stat     * st,
                        double              uploadSpeed_KBps,
                        double              downloadSpeed_KBps,
                        char              * buf,
                        size_t              buflen )
{
    char downStr[32], upStr[32];
    const int haveMeta = tr_torrentHasMetadata( tor );
    const int haveUp = haveMeta && st->peersGettingFromUs > 0;
    const int haveDown = haveMeta && ( ( st->peersSendingToUs > 0 ) || ( st->webseedsSendingToUs > 0 ) );

    if( haveDown )
        tr_formatter_speed_KBps( downStr, downloadSpeed_KBps, sizeof( downStr ) );
    if( haveUp )
        tr_formatter_speed_KBps( upStr, uploadSpeed_KBps, sizeof( upStr ) );

    if( haveDown && haveUp )
        /* 1==down arrow, 2==down speed, 3==up arrow, 4==down speed */
        g_snprintf( buf, buflen, _( "%1$s %2$s, %3$s %4$s" ),
                    gtr_get_unicode_string( GTR_UNICODE_DOWN ), downStr,
                    gtr_get_unicode_string( GTR_UNICODE_UP ), upStr );
    else if( haveDown )
        /* bandwidth speed + unicode arrow */
        g_snprintf( buf, buflen, _( "%1$s %2$s" ),
                    gtr_get_unicode_string( GTR_UNICODE_DOWN ), downStr );
    else if( haveUp )
        /* bandwidth speed + unicode arrow */
        g_snprintf( buf, buflen, _( "%1$s %2$s" ),
                    gtr_get_unicode_string( GTR_UNICODE_UP ), upStr );
    else if( st->isStalled )
        g_strlcpy( buf, _( "Stalled" ), buflen );
    else if( haveMeta )
        g_strlcpy( buf, _( "Idle" ), buflen );
    else
        *buf = '\0';

    return buf;
}
Exemple #10
0
static uint64_t
calculateHaveValid( const tr_completion * ccp )
{
    uint64_t                  b = 0;
    tr_piece_index_t          i;
    const tr_torrent        * tor            = ccp->tor;
    const uint64_t            pieceSize      = tor->info.pieceSize;
    const uint64_t            lastPieceSize  = tor->lastPieceSize;
    const tr_piece_index_t    lastPiece      = tor->info.pieceCount - 1;

    if( !tr_torrentHasMetadata( tor ) )
        return 0;

    for( i=0; i!=lastPiece; ++i )
        if( tr_cpPieceIsComplete( ccp, i ) )
            b += pieceSize;

    if( tr_cpPieceIsComplete( ccp, lastPiece ) )
        b += lastPieceSize;

    return b;
}
static void
getStatusString( GString           * gstr,
                 const tr_torrent  * tor,
                 const tr_stat     * st,
                 const double        uploadSpeed_KBps,
                 const double        downloadSpeed_KBps )
{
    if( st->error )
    {
        const char * fmt[] = { NULL, N_( "Tracker gave a warning: \"%s\"" ),
                                     N_( "Tracker gave an error: \"%s\"" ),
                                     N_( "Error: %s" ) };
        g_string_append_printf( gstr, _( fmt[st->error] ), st->errorString );
    }
    else switch( st->activity )
    {
        case TR_STATUS_STOPPED:
        case TR_STATUS_CHECK_WAIT:
        case TR_STATUS_CHECK:
        case TR_STATUS_DOWNLOAD_WAIT:
        case TR_STATUS_SEED_WAIT:
        {
            getShortStatusString( gstr, tor, st, uploadSpeed_KBps, downloadSpeed_KBps );
            break;
        }

        case TR_STATUS_DOWNLOAD:
        {
            if( tr_torrentHasMetadata( tor ) )
            {
                g_string_append_printf( gstr,
                    ngettext( "Downloading from %1$'d of %2$'d connected peer",
                              "Downloading from %1$'d of %2$'d connected peers",
                              st->webseedsSendingToUs + st->peersSendingToUs ),
                    st->webseedsSendingToUs + st->peersSendingToUs,
                    st->webseedsSendingToUs + st->peersConnected );
            }
            else
            {
                g_string_append_printf( gstr,
                    ngettext( "Downloading metadata from %1$'d peer (%2$d%% done)",
                              "Downloading metadata from %1$'d peers (%2$d%% done)",
                              st->peersConnected + st->peersConnected ),
                    st->peersConnected + st->webseedsSendingToUs,
                    (int)(100.0*st->metadataPercentComplete) );
            }
            break;
        }

        case TR_STATUS_SEED:
            g_string_append_printf( gstr,
                ngettext( "Seeding to %1$'d of %2$'d connected peer",
                          "Seeding to %1$'d of %2$'d connected peers",
                          st->peersConnected ),
                st->peersGettingFromUs,
                st->peersConnected );
                break;
    }

    if( ( st->activity != TR_STATUS_CHECK_WAIT ) &&
        ( st->activity != TR_STATUS_CHECK ) &&
        ( st->activity != TR_STATUS_DOWNLOAD_WAIT ) &&
        ( st->activity != TR_STATUS_SEED_WAIT ) &&
        ( st->activity != TR_STATUS_STOPPED ) )
    {
        char buf[256];
        getShortTransferString( tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof( buf ) );
        if( *buf )
            g_string_append_printf( gstr, " - %s", buf );
    }
}
static void getStatusString(GString* gstr, tr_torrent const* tor, tr_stat const* st, double const uploadSpeed_KBps,
    double const downloadSpeed_KBps)
{
    if (st->error != 0)
    {
        char const* fmt[] =
        {
            NULL,
            N_("Tracker gave a warning: \"%s\""),
            N_("Tracker gave an error: \"%s\""),
            N_("Error: %s")
        };

        g_string_append_printf(gstr, _(fmt[st->error]), st->errorString);
    }
    else
    {
        switch (st->activity)
        {
        case TR_STATUS_STOPPED:
        case TR_STATUS_CHECK_WAIT:
        case TR_STATUS_CHECK:
        case TR_STATUS_DOWNLOAD_WAIT:
        case TR_STATUS_SEED_WAIT:
            {
                getShortStatusString(gstr, tor, st, uploadSpeed_KBps, downloadSpeed_KBps);
                break;
            }

        case TR_STATUS_DOWNLOAD:
            {
                if (!tr_torrentHasMetadata(tor))
                {
                    /* Downloading metadata from 2 peer (s)(50% done) */
                    g_string_append_printf(gstr, _("Downloading metadata from %1$'d %2$s (%3$d%% done)"), st->peersConnected,
                        ngettext("peer", "peers", st->peersConnected), (int)(100.0 * st->metadataPercentComplete));
                }
                else if (st->peersSendingToUs != 0 && st->webseedsSendingToUs != 0)
                {
                    /* Downloading from 2 of 3 peer (s) and 2 webseed (s) */
                    g_string_append_printf(gstr, _("Downloading from %1$'d of %2$'d %3$s and %4$'d %5$s"), st->peersSendingToUs,
                        st->peersConnected, ngettext("peer", "peers", st->peersConnected), st->webseedsSendingToUs,
                        ngettext("web seed", "web seeds", st->webseedsSendingToUs));
                }
                else if (st->webseedsSendingToUs != 0)
                {
                    /* Downloading from 3 web seed (s) */
                    g_string_append_printf(gstr, _("Downloading from %1$'d %2$s"), st->webseedsSendingToUs,
                        ngettext("web seed", "web seeds", st->webseedsSendingToUs));
                }
                else
                {
                    /* Downloading from 2 of 3 peer (s) */
                    g_string_append_printf(gstr, _("Downloading from %1$'d of %2$'d %3$s"), st->peersSendingToUs,
                        st->peersConnected, ngettext("peer", "peers", st->peersConnected));
                }

                break;
            }

        case TR_STATUS_SEED:
            g_string_append_printf(gstr, ngettext("Seeding to %1$'d of %2$'d connected peer",
                "Seeding to %1$'d of %2$'d connected peers", st->peersConnected), st->peersGettingFromUs, st->peersConnected);
            break;
        }
    }

    if (st->activity != TR_STATUS_CHECK_WAIT && st->activity != TR_STATUS_CHECK && st->activity != TR_STATUS_DOWNLOAD_WAIT &&
        st->activity != TR_STATUS_SEED_WAIT && st->activity != TR_STATUS_STOPPED)
    {
        char buf[256];
        getShortTransferString(tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof(buf));

        if (*buf != '\0')
        {
            g_string_append_printf(gstr, " - %s", buf);
        }
    }
}
static char*
getStatusString( const tr_torrent  * tor,
                 const tr_stat     * st,
                 const double        uploadSpeed_KBps,
                 const double        downloadSpeed_KBps )
{
    const int isActive = st->activity != TR_STATUS_STOPPED;
    const int isChecking = st->activity == TR_STATUS_CHECK
                        || st->activity == TR_STATUS_CHECK_WAIT;

    GString * gstr = g_string_new( NULL );

    if( st->error )
    {
        const char * fmt[] = { NULL, N_( "Tracker gave a warning: \"%s\"" ),
                                     N_( "Tracker gave an error: \"%s\"" ),
                                     N_( "Error: %s" ) };
        g_string_append_printf( gstr, _( fmt[st->error] ), st->errorString );
    }
    else switch( st->activity )
    {
        case TR_STATUS_STOPPED:
        case TR_STATUS_CHECK_WAIT:
        case TR_STATUS_CHECK:
        {
            char * pch = getShortStatusString( tor, st, uploadSpeed_KBps, downloadSpeed_KBps );
            g_string_assign( gstr, pch );
            g_free( pch );
            break;
        }

        case TR_STATUS_DOWNLOAD:
        {
            if( tr_torrentHasMetadata( tor ) )
            {
                g_string_append_printf( gstr,
                    gtr_ngettext( "Downloading from %1$'d of %2$'d connected peer",
                                  "Downloading from %1$'d of %2$'d connected peers",
                                  st->webseedsSendingToUs + st->peersSendingToUs ),
                    st->webseedsSendingToUs + st->peersSendingToUs,
                    st->webseedsSendingToUs + st->peersConnected );
            }
            else
            {
                g_string_append_printf( gstr,
                    gtr_ngettext( "Downloading metadata from %1$'d peer (%2$d%% done)",
                                  "Downloading metadata from %1$'d peers (%2$d%% done)",
                                  st->peersConnected + st->peersConnected ),
                    st->peersConnected + st->webseedsSendingToUs,
                    (int)(100.0*st->metadataPercentComplete) );
            }
            break;
        }

        case TR_STATUS_SEED:
            g_string_append_printf( gstr,
                gtr_ngettext( "Seeding to %1$'d of %2$'d connected peer",
                              "Seeding to %1$'d of %2$'d connected peers",
                              st->peersConnected ),
                st->peersGettingFromUs,
                st->peersConnected );
                break;
    }

    if( isActive && !isChecking )
    {
        char buf[256];
        getShortTransferString( tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof( buf ) );
        if( *buf )
            g_string_append_printf( gstr, " - %s", buf );
    }

    return g_string_free( gstr, FALSE );
}
bool TorrentObject::IsMagnet() const
{
	return !tr_torrentHasMetadata( fTorrentHandle );
}