mirror of
https://github.com/transmission/transmission
synced 2025-03-16 08:49:47 +00:00
add color-coded lines to the gtk debug window -- info is black, debug is grey, errors are red...
This commit is contained in:
parent
5401979ffa
commit
ab85deaf51
7 changed files with 258 additions and 185 deletions
|
@ -192,6 +192,7 @@ refreshTorrentActions( GtkTreeSelection * s )
|
|||
action_sensitize( "stop-torrent", (status & TR_STATUS_ACTIVE) != 0);
|
||||
action_sensitize( "start-torrent", (status & TR_STATUS_INACTIVE) != 0);
|
||||
action_sensitize( "remove-torrent", status != 0);
|
||||
action_sensitize( "recheck-torrent", status != 0);
|
||||
action_sensitize( "show-torrent-inspector", status != 0);
|
||||
}
|
||||
|
||||
|
@ -1045,7 +1046,7 @@ doAction ( const char * action_name, gpointer user_data )
|
|||
{
|
||||
if( !data->msgwinopen )
|
||||
{
|
||||
GtkWidget * win = msgwin_create();
|
||||
GtkWidget * win = msgwin_create( data->core );
|
||||
g_signal_connect( win, "destroy", G_CALLBACK( boolwindclosed ),
|
||||
&data->msgwinopen );
|
||||
data->msgwinopen = TRUE;
|
||||
|
|
422
gtk/msgwin.c
422
gtk/msgwin.c
|
@ -39,213 +39,275 @@
|
|||
#define COL_LVL 0
|
||||
#define COL_MSG 1
|
||||
|
||||
static void
|
||||
changelevel( GtkWidget * widget, gpointer data );
|
||||
static void
|
||||
asksave( GtkWidget * widget, gpointer data );
|
||||
static void
|
||||
dosave( GtkWidget * widget, gint resp, gpointer gdata );
|
||||
static void
|
||||
doclear( GtkWidget * widget, gpointer data );
|
||||
|
||||
static GtkTextBuffer * textbuf = NULL;
|
||||
|
||||
static struct { char * label; char * pref; char * text; int id; } levels[] = {
|
||||
{ N_("Error"), "error", "ERR", TR_MSG_ERR },
|
||||
{ N_("Info"), "info", "INF", TR_MSG_INF },
|
||||
{ N_("Debug"), "debug", "DBG", TR_MSG_DBG },
|
||||
};
|
||||
static GtkTextTag*
|
||||
get_or_create_tag (GtkTextTagTable * table, const char * key)
|
||||
{
|
||||
g_assert (table);
|
||||
g_assert (key && *key);
|
||||
|
||||
GtkWidget *
|
||||
msgwin_create( void ) {
|
||||
GtkWidget * win, * vbox, * scroll, * text;
|
||||
GtkWidget * frame, * bbox, * save, * clear, * menu;
|
||||
PangoFontDescription * desc;
|
||||
int ii, curlevel;
|
||||
|
||||
if( NULL == textbuf )
|
||||
textbuf = gtk_text_buffer_new( NULL );
|
||||
|
||||
win = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
||||
vbox = gtk_vbox_new( FALSE, 0 );
|
||||
scroll = gtk_scrolled_window_new( NULL, NULL );
|
||||
text = gtk_text_view_new_with_buffer( textbuf );
|
||||
frame = gtk_frame_new( NULL );
|
||||
bbox = gtk_hbutton_box_new();
|
||||
save = gtk_button_new_from_stock( GTK_STOCK_SAVE );
|
||||
clear = gtk_button_new_from_stock( GTK_STOCK_CLEAR );
|
||||
menu = gtk_combo_box_new_text();
|
||||
|
||||
gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
|
||||
desc = pango_font_description_new();
|
||||
pango_font_description_set_family( desc, "Monospace" );
|
||||
gtk_widget_modify_font( text, desc );
|
||||
pango_font_description_free( desc );
|
||||
|
||||
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scroll ),
|
||||
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
|
||||
|
||||
gtk_container_add( GTK_CONTAINER( scroll ), text );
|
||||
gtk_container_add( GTK_CONTAINER( frame ), scroll );
|
||||
|
||||
gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
|
||||
gtk_box_pack_start( GTK_BOX( vbox ), frame, TRUE, TRUE, 0 );
|
||||
|
||||
gtk_button_box_set_layout( GTK_BUTTON_BOX( bbox), GTK_BUTTONBOX_SPREAD );
|
||||
|
||||
curlevel = tr_getMessageLevel();
|
||||
for( ii = 0; ALEN( levels ) > ii; ii++ ) {
|
||||
gtk_combo_box_append_text( GTK_COMBO_BOX( menu ),
|
||||
gettext( levels[ii].label ) );
|
||||
if( levels[ii].id == curlevel )
|
||||
gtk_combo_box_set_active( GTK_COMBO_BOX( menu ), ii );
|
||||
GtkTextTag * tag = gtk_text_tag_table_lookup (table, key);
|
||||
if (!tag) {
|
||||
tag = gtk_text_tag_new (key);
|
||||
gtk_text_tag_table_add (table, tag);
|
||||
g_object_unref (tag); // table refs it
|
||||
}
|
||||
|
||||
gtk_container_add( GTK_CONTAINER( bbox ), clear );
|
||||
gtk_container_add( GTK_CONTAINER( bbox ), save );
|
||||
gtk_container_add( GTK_CONTAINER( bbox ), menu );
|
||||
gtk_box_pack_start( GTK_BOX( vbox ), bbox, FALSE, FALSE, 0 );
|
||||
|
||||
gtk_container_add( GTK_CONTAINER( win ), vbox );
|
||||
|
||||
g_signal_connect( save, "clicked", G_CALLBACK( asksave ), win );
|
||||
g_signal_connect( clear, "clicked", G_CALLBACK( doclear ), NULL );
|
||||
g_signal_connect( menu, "changed", G_CALLBACK( changelevel ), NULL );
|
||||
|
||||
gtk_window_set_role( GTK_WINDOW( win ), "tr-messages" );
|
||||
|
||||
gtk_widget_show_all( win );
|
||||
|
||||
return win;
|
||||
return tag;
|
||||
}
|
||||
|
||||
static void
|
||||
changelevel( GtkWidget * widget, gpointer data SHUTUP ) {
|
||||
int index;
|
||||
char * ignored;
|
||||
static GtkTextBuffer*
|
||||
debug_window_text_buffer_new ( void )
|
||||
{
|
||||
GtkTextBuffer * buffer = gtk_text_buffer_new ( NULL );
|
||||
|
||||
index = gtk_combo_box_get_active( GTK_COMBO_BOX( widget ) );
|
||||
if( 0 <= index && (int) ALEN( levels ) > index &&
|
||||
tr_getMessageLevel() != levels[index].id ) {
|
||||
tr_setMessageLevel( levels[index].id );
|
||||
cf_setpref( tr_prefs_name( PREF_ID_MSGLEVEL ), levels[index].pref );
|
||||
cf_saveprefs( &ignored );
|
||||
g_free( ignored );
|
||||
msgwin_update();
|
||||
}
|
||||
}
|
||||
GtkTextTagTable * table = gtk_text_buffer_get_tag_table (buffer);
|
||||
|
||||
static void
|
||||
asksave( GtkWidget * widget SHUTUP, gpointer data ) {
|
||||
GtkWidget * wind;
|
||||
g_object_set (get_or_create_tag(table,"bold"),
|
||||
"weight", PANGO_WEIGHT_BOLD,
|
||||
NULL);
|
||||
|
||||
g_object_set (get_or_create_tag (table, "info"),
|
||||
"foreground", "black",
|
||||
NULL);
|
||||
|
||||
g_object_set (get_or_create_tag (table, "error"),
|
||||
"foreground", "red",
|
||||
NULL);
|
||||
|
||||
wind = gtk_file_chooser_dialog_new( _("Save Log"), GTK_WINDOW( data ),
|
||||
GTK_FILE_CHOOSER_ACTION_SAVE,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
|
||||
NULL );
|
||||
g_signal_connect( G_OBJECT( wind ), "response", G_CALLBACK( dosave ), NULL );
|
||||
gtk_widget_show( wind );
|
||||
}
|
||||
g_object_set (get_or_create_tag (table, "debug"),
|
||||
"foreground", "gray",
|
||||
NULL);
|
||||
|
||||
static void
|
||||
dosave( GtkWidget * widget, gint resp, gpointer gdata SHUTUP ) {
|
||||
char * path, * buf;
|
||||
FILE * fptr;
|
||||
GtkTextIter front, back;
|
||||
size_t len;
|
||||
|
||||
if( GTK_RESPONSE_ACCEPT == resp ) {
|
||||
path = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( widget ) );
|
||||
if( NULL != path ) {
|
||||
fptr = fopen( path, "w" );
|
||||
if( NULL == fptr ) {
|
||||
errmsg( GTK_WINDOW( widget ),
|
||||
_("Failed to open the file %s for writing:\n%s"),
|
||||
path, strerror( errno ) );
|
||||
}
|
||||
else {
|
||||
gtk_text_buffer_get_start_iter( textbuf, &front );
|
||||
gtk_text_buffer_get_end_iter( textbuf, &back );
|
||||
buf = gtk_text_buffer_get_text( textbuf, &front, &back, FALSE );
|
||||
if( NULL != buf ) {
|
||||
len = strlen( buf );
|
||||
if( len > fwrite( buf, 1, len, fptr ) ) {
|
||||
errmsg( GTK_WINDOW( widget ),
|
||||
_("Error while writing to the file %s:\n%s"),
|
||||
path, strerror( errno ) );
|
||||
}
|
||||
g_free( buf );
|
||||
}
|
||||
fclose( fptr );
|
||||
}
|
||||
}
|
||||
g_free( path );
|
||||
}
|
||||
|
||||
gtk_widget_destroy( widget );
|
||||
}
|
||||
|
||||
static void
|
||||
doclear( GtkWidget * widget SHUTUP, gpointer data SHUTUP ) {
|
||||
GtkTextIter front, back;
|
||||
|
||||
gtk_text_buffer_get_start_iter( textbuf, &front );
|
||||
gtk_text_buffer_get_end_iter( textbuf, &back );
|
||||
gtk_text_buffer_delete( textbuf, &front, &back );
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void
|
||||
msgwin_loadpref( void ) {
|
||||
const char * pref;
|
||||
int ii;
|
||||
|
||||
tr_setMessageQueuing( 1 );
|
||||
pref = tr_prefs_get( PREF_ID_MSGLEVEL );
|
||||
if( NULL == pref )
|
||||
return;
|
||||
|
||||
for( ii = 0; ALEN( levels ) > ii; ii++ ) {
|
||||
if( 0 == strcmp( pref, levels[ii].pref ) ) {
|
||||
tr_setMessageLevel( levels[ii].id );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
msgwin_update( void ) {
|
||||
msgwin_update( void )
|
||||
{
|
||||
tr_msg_list_t * msgs, * ii;
|
||||
GtkTextIter iter, front;
|
||||
char * label, * line;
|
||||
int count, jj;
|
||||
struct tm * tm;
|
||||
|
||||
if( NULL == textbuf )
|
||||
return;
|
||||
g_assert( textbuf != NULL );
|
||||
|
||||
msgs = tr_getQueuedMessages();
|
||||
for( ii = msgs; NULL != ii; ii = ii->next ) {
|
||||
label = _("???");
|
||||
for( jj = 0; ALEN( levels ) > jj; jj++ ) {
|
||||
if( levels[jj].id == ii->level ) {
|
||||
label = levels[jj].text;
|
||||
break;
|
||||
}
|
||||
for( ii = msgs; NULL != ii; ii = ii->next )
|
||||
{
|
||||
int len;
|
||||
char * line;
|
||||
const char * tag = NULL;
|
||||
struct tm * tm = localtime( &ii->when );
|
||||
GtkTextIter mark_start, mark_end;
|
||||
|
||||
switch( ii->level ) {
|
||||
case TR_MSG_ERR: tag = "error"; break;
|
||||
case TR_MSG_INF: tag = "info"; break;
|
||||
case TR_MSG_DBG: tag = "debug"; break;
|
||||
}
|
||||
tm = localtime( &ii->when );
|
||||
line = g_strdup_printf( "%02i:%02i:%02i %s %s\n", tm->tm_hour, tm->tm_min,
|
||||
tm->tm_sec, label, ii->message );
|
||||
gtk_text_buffer_get_end_iter( textbuf, &iter );
|
||||
gtk_text_buffer_insert( textbuf, &iter, line, -1 );
|
||||
|
||||
line = g_strdup_printf( "%02i:%02i:%02i %s\n", tm->tm_hour, tm->tm_min, tm->tm_sec, ii->message );
|
||||
len = strlen( line );
|
||||
|
||||
gtk_text_buffer_get_end_iter( textbuf, &mark_end );
|
||||
gtk_text_buffer_insert( textbuf, &mark_end, line, len );
|
||||
mark_start = mark_end;
|
||||
gtk_text_iter_backward_chars( &mark_start, len );
|
||||
gtk_text_buffer_apply_tag_by_name (textbuf, tag, &mark_start, &mark_end);
|
||||
|
||||
g_free( line );
|
||||
}
|
||||
tr_freeMessageList( msgs );
|
||||
|
||||
#if 0
|
||||
count = gtk_text_buffer_get_line_count( textbuf );
|
||||
if( MAX_MSGCOUNT < count ) {
|
||||
gtk_text_buffer_get_iter_at_line( textbuf, &front, 0 );
|
||||
gtk_text_buffer_get_iter_at_line( textbuf, &iter, count - MAX_MSGCOUNT );
|
||||
gtk_text_buffer_delete( textbuf, &front, &iter );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
level_combo_changed_cb( GtkWidget * w, TrCore * core )
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
if( gtk_combo_box_get_active_iter( GTK_COMBO_BOX(w), &iter ) ) {
|
||||
int id = 0;
|
||||
GtkTreeModel * m = gtk_combo_box_get_model( GTK_COMBO_BOX(w) );
|
||||
gtk_tree_model_get( m, &iter, 1, &id, -1 );
|
||||
tr_setMessageLevel( id );
|
||||
tr_core_set_pref_int( core, PREF_ID_MSGLEVEL, id );
|
||||
msgwin_update( );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
save_dialog_response_cb( GtkWidget * d, int response, GtkTextBuffer * textbuf )
|
||||
{
|
||||
if( response == GTK_RESPONSE_ACCEPT )
|
||||
{
|
||||
char * filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( d ) );
|
||||
FILE * fp = fopen( filename, "w+" );
|
||||
if( !fp )
|
||||
{
|
||||
errmsg( GTK_WINDOW(d),
|
||||
_("Unable to open \"%s\" for writing: %s"),
|
||||
filename, g_strerror( errno ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
char * buf;
|
||||
GtkTextIter front, back;
|
||||
gtk_text_buffer_get_start_iter( textbuf, &front );
|
||||
gtk_text_buffer_get_end_iter( textbuf, &back );
|
||||
buf = gtk_text_buffer_get_text( textbuf, &front, &back, FALSE );
|
||||
if( buf ) {
|
||||
const size_t len = strlen( buf );
|
||||
if( len > fwrite( buf, 1, len, fp ) ) {
|
||||
errmsg( GTK_WINDOW( d ),
|
||||
_("Error writing to \"%s\": %s"),
|
||||
filename, strerror( errno ) );
|
||||
}
|
||||
g_free( buf );
|
||||
}
|
||||
fclose( fp );
|
||||
}
|
||||
g_free( filename );
|
||||
}
|
||||
|
||||
gtk_widget_destroy( d );
|
||||
}
|
||||
|
||||
static void
|
||||
save_cb( GtkWidget * w, GtkTextBuffer * textbuf )
|
||||
{
|
||||
GtkWindow * window = GTK_WINDOW( gtk_widget_get_toplevel( w ) );
|
||||
GtkWidget * d = gtk_file_chooser_dialog_new( _("Save Debug Log"), window,
|
||||
GTK_FILE_CHOOSER_ACTION_SAVE,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
|
||||
NULL );
|
||||
g_signal_connect( d, "response",
|
||||
G_CALLBACK( save_dialog_response_cb ), textbuf );
|
||||
gtk_widget_show( d );
|
||||
}
|
||||
|
||||
static void
|
||||
clear_cb( GtkWidget * w UNUSED, GtkTextBuffer * textbuf )
|
||||
{
|
||||
GtkTextIter front, back;
|
||||
gtk_text_buffer_get_start_iter( textbuf, &front );
|
||||
gtk_text_buffer_get_end_iter( textbuf, &back );
|
||||
gtk_text_buffer_delete( textbuf, &front, &back );
|
||||
}
|
||||
|
||||
static struct {
|
||||
const char * label;
|
||||
const char * pref;
|
||||
const char * text;
|
||||
int id;
|
||||
} trLevels[] = {
|
||||
{ N_("Error"), "error", "ERR", TR_MSG_ERR },
|
||||
{ N_("Info"), "info", "INF", TR_MSG_INF },
|
||||
{ N_("Debug"), "debug", "DBG", TR_MSG_DBG },
|
||||
};
|
||||
|
||||
GtkWidget *
|
||||
msgwin_create( TrCore * core )
|
||||
{
|
||||
unsigned int i;
|
||||
GtkListStore * store;
|
||||
GtkWidget * win, * vbox, * scroll, * text;
|
||||
GtkWidget * levels;
|
||||
GtkWidget * toolbar;
|
||||
GtkCellRenderer * renderer;
|
||||
int ii, curlevel;
|
||||
|
||||
win = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
||||
gtk_window_set_role( GTK_WINDOW( win ), "debug-window" );
|
||||
vbox = gtk_vbox_new( FALSE, 0 );
|
||||
|
||||
/**
|
||||
*** toolbar
|
||||
**/
|
||||
|
||||
toolbar = gtk_toolbar_new ();
|
||||
gtk_toolbar_set_style( GTK_TOOLBAR( toolbar), GTK_TOOLBAR_BOTH_HORIZ );
|
||||
|
||||
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), GTK_STOCK_SAVE,
|
||||
_("Save"), NULL,
|
||||
G_CALLBACK(save_cb), textbuf, -1);
|
||||
|
||||
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), GTK_STOCK_CLEAR,
|
||||
_("Clear"), NULL,
|
||||
G_CALLBACK(clear_cb), textbuf, -1);
|
||||
|
||||
gtk_toolbar_insert_space(GTK_TOOLBAR(toolbar), -1);
|
||||
|
||||
|
||||
gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
|
||||
GTK_TOOLBAR_CHILD_WIDGET, gtk_label_new(_("Level ")),
|
||||
NULL, _("Select the debug filter level."),
|
||||
NULL, NULL, NULL, NULL);
|
||||
|
||||
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
|
||||
|
||||
curlevel = TR_MSG_INF;
|
||||
tr_prefs_get_int( PREF_ID_MSGLEVEL, &curlevel );
|
||||
for( i=ii=0; i<G_N_ELEMENTS(trLevels); ++i ) {
|
||||
GtkTreeIter iter;
|
||||
gtk_list_store_append (store, &iter);
|
||||
gtk_list_store_set (store, &iter, 0, _(trLevels[i].label),
|
||||
1, trLevels[i].id,
|
||||
-1);
|
||||
if( trLevels[i].id == curlevel )
|
||||
ii = i;
|
||||
}
|
||||
levels = gtk_combo_box_new_with_model (GTK_TREE_MODEL(store));
|
||||
g_object_unref (G_OBJECT(store));
|
||||
renderer = gtk_cell_renderer_text_new ();
|
||||
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(levels), renderer, TRUE);
|
||||
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(levels), renderer, "text", 0, NULL);
|
||||
gtk_combo_box_set_active( GTK_COMBO_BOX( levels ), ii );
|
||||
g_signal_connect( levels, "changed", G_CALLBACK(level_combo_changed_cb), core );
|
||||
|
||||
gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
|
||||
GTK_TOOLBAR_CHILD_WIDGET, levels,
|
||||
NULL, _("Select the debug filter level."),
|
||||
NULL, NULL, NULL, NULL);
|
||||
|
||||
gtk_box_pack_start( GTK_BOX( vbox ), toolbar, FALSE, FALSE, 0 );
|
||||
|
||||
/**
|
||||
*** text area
|
||||
**/
|
||||
|
||||
text = gtk_text_view_new_with_buffer( textbuf );
|
||||
gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
|
||||
|
||||
scroll = gtk_scrolled_window_new( NULL, NULL );
|
||||
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scroll ),
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC );
|
||||
gtk_container_add( GTK_CONTAINER( scroll ), text );
|
||||
|
||||
gtk_box_pack_start( GTK_BOX( vbox ), scroll, TRUE, TRUE, 0 );
|
||||
|
||||
|
||||
msgwin_update( );
|
||||
gtk_container_add( GTK_CONTAINER( win ), vbox );
|
||||
gtk_widget_show_all( win );
|
||||
return win;
|
||||
}
|
||||
|
||||
void
|
||||
msgwin_loadpref( void )
|
||||
{
|
||||
int level = TR_MSG_INF;
|
||||
textbuf = debug_window_text_buffer_new ( );
|
||||
gboolean b = tr_prefs_get_int( PREF_ID_MSGLEVEL, &level );
|
||||
g_message ("level from prefs: %d (b==%d)", level, (int)b );
|
||||
tr_setMessageLevel( level );
|
||||
tr_setMessageQueuing( TRUE );
|
||||
}
|
||||
|
|
|
@ -25,11 +25,13 @@
|
|||
#ifndef TG_MSGWIN_H
|
||||
#define TG_MSGWIN_H
|
||||
|
||||
#include "tr_core.h"
|
||||
|
||||
void
|
||||
msgwin_init( void );
|
||||
|
||||
GtkWidget *
|
||||
msgwin_create( void );
|
||||
msgwin_create( TrCore* core );
|
||||
|
||||
void
|
||||
msgwin_update( void );
|
||||
|
|
|
@ -213,7 +213,7 @@ fastResumeLoadProgress( const tr_torrent_t * tor,
|
|||
for( i=0; i<n; ++i ) {
|
||||
if ( !curMTimes[i] || ( curMTimes[i]!=oldMTimes[i] ) ) {
|
||||
const tr_file_t * file = &tor->info.files[i];
|
||||
tr_inf( "File '%s' mtimes differ-- flaggin pieces [%d..%d]",
|
||||
tr_dbg( "File '%s' mtimes differ-- flagging pieces [%d..%d] for recheck",
|
||||
file->name, file->firstPiece, file->lastPiece);
|
||||
tr_bitfieldAddRange( uncheckedPieces,
|
||||
file->firstPiece, file->lastPiece );
|
||||
|
|
|
@ -225,9 +225,12 @@ checkFiles( tr_io_t * io )
|
|||
|
||||
tr_bitfieldClear( io->uncheckedPieces );
|
||||
|
||||
if ( fastResumeLoad( io->tor, io->uncheckedPieces ) )
|
||||
if( fastResumeLoad( io->tor, io->uncheckedPieces ) )
|
||||
tr_bitfieldAddRange( io->uncheckedPieces, 0, tor->info.pieceCount-1 );
|
||||
|
||||
if( !tr_bitfieldIsEmpty( io->uncheckedPieces ) )
|
||||
tr_inf( "Rechecking portions of \"%s\"", tor->info.name );
|
||||
|
||||
for( i=0; i<tor->info.pieceCount; ++i )
|
||||
{
|
||||
if( tor->status & TR_STATUS_STOPPING )
|
||||
|
@ -236,7 +239,7 @@ checkFiles( tr_io_t * io )
|
|||
if( !tr_bitfieldHas( io->uncheckedPieces, i ) )
|
||||
continue;
|
||||
|
||||
tr_inf ( "Checking piece %d because it's not in fast-resume", i );
|
||||
tr_dbg ( "Checking piece %d because it's not in fast-resume", i );
|
||||
|
||||
if( !checkPiece( tor, i ) )
|
||||
tr_cpPieceAdd( tor->completion, i );
|
||||
|
|
|
@ -269,6 +269,8 @@ void tr_torrentStart( tr_torrent_t * tor )
|
|||
{
|
||||
/* Join the thread first */
|
||||
torrentReallyStop( tor );
|
||||
|
||||
tr_inf("Starting torrent \"%s\"", tor->info.name);
|
||||
|
||||
/* Don't start if a torrent with the same name and destination is already active */
|
||||
if( tr_torrentDuplicateDownload( tor ) )
|
||||
|
@ -301,6 +303,7 @@ void tr_torrentStart( tr_torrent_t * tor )
|
|||
|
||||
static void torrentStop( tr_torrent_t * tor )
|
||||
{
|
||||
tr_inf("Stopping torrent \"%s\"", tor->info.name);
|
||||
tr_trackerStopped( tor->tracker );
|
||||
tr_rcReset( tor->download );
|
||||
tr_rcReset( tor->upload );
|
||||
|
|
|
@ -85,6 +85,8 @@ tr_handle_t * tr_init( const char * tag )
|
|||
tr_fdInit();
|
||||
h->shared = tr_sharedInit( h );
|
||||
|
||||
tr_inf( TR_NAME " " VERSION_STRING " started" );
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue