]> granicus.if.org Git - transmission/commitdiff
(trunk) #1400, #2308: differentiate warnings and errors; differentiate between local...
authorCharles Kerr <charles@transmissionbt.com>
Wed, 5 Aug 2009 01:25:36 +0000 (01:25 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Wed, 5 Aug 2009 01:25:36 +0000 (01:25 +0000)
cli/cli.c
daemon/remote.c
gtk/torrent-cell-renderer.c
libtransmission/peer-mgr.c
libtransmission/torrent.c
libtransmission/torrent.h
libtransmission/transmission.h
qt/torrent.cc
qt/torrent.h
web/javascript/torrent.js
web/javascript/transmission.js

index 37190707487a1e1017792c53a3897bfc74c63d7d..53ef2939379289830aa1412f11397b44f263d485 100644 (file)
--- a/cli/cli.c
+++ b/cli/cli.c
@@ -439,6 +439,9 @@ main( int     argc,
     {
         char            line[LINEWIDTH];
         const tr_stat * st;
+        const char * messageName[] = { NULL, "Tracker returned a warning:",
+                                             "Tracker returned an error:",
+                                             "Error:" };
 
         tr_wait( 200 );
 
@@ -470,8 +473,9 @@ main( int     argc,
 
         getStatusStr( st, line, sizeof( line ) );
         printf( "\r%-*s", LINEWIDTH, line );
-        if( st->error )
-            fprintf( stderr, "\n%s\n", st->errorString );
+
+        if( messageName[st->error] )
+            fprintf( stderr, "\n%s: %s\n", messageName[st->error], st->errorString );
     }
 
 cleanup:
index dbe94fb6478b2fb6ba040539136e49ed6aaf816a..cff386a41a6c84a8871a58fb8e6f179b59295397 100644 (file)
@@ -253,6 +253,7 @@ static const char * details_keys[] = {
     "doneDate",
     "downloadDir",
     "downloadedEver",
+    "error",
     "errorString",
     "eta",
     "hashString",
@@ -1005,9 +1006,16 @@ printDetails( tr_benc * top )
                 strlsize( buf, i, sizeof( buf ) );
                 printf( "  Corrupt DL: %s\n", buf );
             }
-            if( tr_bencDictFindStr( t, "errorString", &str ) && str && *str )
-                printf( "  Error: %s\n", str );
-
+            if( tr_bencDictFindStr( t, "errorString", &str ) && str && *str &&
+                tr_bencDictFindInt( t, "error", &i ) && i )
+            {
+                switch( i ) {
+                    case TR_STAT_TRACKER_WARNING: printf( "  Tracker returned a warning: %s\n", str ); break;
+                    case TR_STAT_TRACKER_ERROR:   printf( "  Tracker returned an error: %s\n", str ); break;
+                    case TR_STAT_LOCAL_ERROR:     printf( "  Error: %s\n", str ); break;
+                    default: break; /* no error */
+                }
+            }
             if( tr_bencDictFindInt( t, "peersConnected", &i )
               && tr_bencDictFindInt( t, "peersGettingFromUs", &j )
               && tr_bencDictFindInt( t, "peersSendingToUs", &k ) )
index c17004d0e218d5332f4c2a1bc944e04e8604b8b5..19b4516459a74e4e0aadbd12c48eaf2fe698ea76 100644 (file)
@@ -213,7 +213,10 @@ getStatusString( const tr_stat * torStat )
 
     if( torStat->error )
     {
-        g_string_assign( gstr, torStat->errorString );
+        const char * fmt[] = { NULL, N_( "Tracker returned a warning: \"%s\"" ),
+                                     N_( "Tracker returned an error: \"%s\"" ),
+                                     N_( "Error: \"%s\"" ) };
+        g_string_append_printf( gstr, _( fmt[torStat->error] ), torStat->errorString );
     }
     else switch( torStat->activity )
         {
index e1db14babd61ae40658f4d30d65b1dedb05636d9..f3d7f16b857efe1e57ec4fde30f57ac0d96e1a11 100644 (file)
@@ -1172,9 +1172,9 @@ peerCallbackFunc( void * vpeer, void * vevent, void * vt )
             }
             else /* a local error, such as an IO error */
             {
-                t->tor->error = e->err;
+                t->tor->error = TR_STAT_LOCAL_ERROR;
                 tr_strlcpy( t->tor->errorString,
-                            tr_strerror( t->tor->error ),
+                            tr_strerror( e->err ),
                             sizeof( t->tor->errorString ) );
                 tr_torrentStop( t->tor );
             }
index d0e4c90a87f8fee0f68e35f64dd1c5df9598f65c..e7b875c777ccf837511ca3cd5c39fd9d7ce42b48 100644 (file)
@@ -285,20 +285,18 @@ onTrackerResponse( void * tracker UNUSED,
 
         case TR_TRACKER_WARNING:
             tr_torerr( tor, _( "Tracker warning: \"%s\"" ), event->text );
-            tor->error = -1;
-            tr_strlcpy( tor->errorString, event->text,
-                       sizeof( tor->errorString ) );
+            tor->error = TR_STAT_TRACKER_WARNING;
+            tr_strlcpy( tor->errorString, event->text, sizeof( tor->errorString ) );
             break;
 
         case TR_TRACKER_ERROR:
             tr_torerr( tor, _( "Tracker error: \"%s\"" ), event->text );
-            tor->error = -2;
-            tr_strlcpy( tor->errorString, event->text,
-                       sizeof( tor->errorString ) );
+            tor->error = TR_STAT_TRACKER_ERROR;
+            tr_strlcpy( tor->errorString, event->text, sizeof( tor->errorString ) );
             break;
 
         case TR_TRACKER_ERROR_CLEAR:
-            tor->error = 0;
+            tor->error = TR_STAT_OK;
             tor->errorString[0] = '\0';
             break;
     }
@@ -604,7 +602,7 @@ torrentRealInit( tr_torrent * tor, const tr_ctor * ctor )
 
     tr_ctorInitTorrentWanted( ctor, tor );
 
-    tor->error   = 0;
+    tor->error = TR_STAT_OK;
 
     tr_bitfieldConstruct( &tor->checkedPieces, tor->info.pieceCount );
     tr_torrentUncheck( tor );
@@ -859,9 +857,8 @@ tr_torrentStat( tr_torrent * tor )
     s = &tor->stats;
     s->id = tor->uniqueId;
     s->activity = tr_torrentGetActivity( tor );
-    s->error  = tor->error;
-    memcpy( s->errorString, tor->errorString,
-           sizeof( s->errorString ) );
+    s->error = tor->error;
+    memcpy( s->errorString, tor->errorString, sizeof( s->errorString ) );
 
     tc = tor->tracker;
     ti = tr_trackerGetAddress( tor->tracker, tor );
@@ -1247,7 +1244,8 @@ checkAndStartImpl( void * vtor )
     now = time( NULL );
     tor->isRunning = TRUE;
     tor->needsSeedRatioCheck = TRUE;
-    *tor->errorString = '\0';
+    tor->error = TR_STAT_OK;
+    tor->errorString[0] = '\0';
     tr_torrentResetTransferStats( tor );
     tor->completeness = tr_cpGetStatus( &tor->completion );
     tr_torrentSaveResume( tor );
index 1b3973f83657d691b77d8f6affa470a86a51616f..8d75a385dfd39dfef666e01ef1932161fccbcabe 100644 (file)
@@ -140,7 +140,7 @@ struct tr_torrent
 
     int                      magicNumber;
 
-    int                      error;
+    tr_stat_errtype          error;
     char                     errorString[128];
 
     uint8_t                  obfuscatedHash[SHA_DIGEST_LENGTH];
index 89c61bf5103f0c958d847b7d585b7990078afbe9..8cb66cfd66dc2633dd113dcf914b909d01ee1cda 100644 (file)
@@ -1364,8 +1364,14 @@ enum
     TR_PEER_FROM__MAX
 };
 
-/** Can be used as a mnemonic for "no error" errno */
-#define TR_OK 0
+typedef enum
+{
+    TR_STAT_OK               = 0,
+    TR_STAT_TRACKER_WARNING  = 1,
+    TR_STAT_TRACKER_ERROR    = 2,
+    TR_STAT_LOCAL_ERROR      = 3
+}
+tr_stat_errtype;
 
 /**
  * The current status of a torrent.
@@ -1392,11 +1398,13 @@ typedef struct tr_stat
         becomes unreachable. */
     char *  scrapeURL;
 
-    /** The errno status for this torrent.  0 means everything's fine. */
-    int     error;
+    /** Defines what kind of text is in errorString.
+        @see errorString */
+    tr_stat_errtype error;
 
-    /** Typically an error string returned from the tracker. */
-    char    errorString[128];
+    /** A warning or error message regarding the torrent.
+        @see error */
+    char errorString[128];
 
     /** When tr_stat.status is TR_STATUS_CHECK or TR_STATUS_CHECK_WAIT,
         this is the percentage of how much of the files has been
index cfa52fee18407230e6adf4f2283d21a7ee0d3d45..c51aa97bb451f67e26d73799a9cb366b76307bea 100644 (file)
@@ -59,7 +59,8 @@ Torrent :: myProperties[] =
     { DOWNLOAD_DIR, "downloadDir", QVariant::String, STAT },
     { ACTIVITY, "status", QVariant::Int, STAT },
     { NAME, "name", QVariant::String, INFO },
-    { ERROR, "errorString", QVariant::String, STAT },
+    { ERROR, "error", QVariant::Int, STAT },
+    { ERROR_STRING, "errorString", QVariant::String, STAT },
     { SIZE_WHEN_DONE, "sizeWhenDone", QVariant::ULongLong, STAT },
     { LEFT_UNTIL_DONE, "leftUntilDone", QVariant::ULongLong, STAT },
     { HAVE_UNCHECKED, "haveUnchecked", QVariant::ULongLong, STAT },
@@ -620,3 +621,19 @@ Torrent :: activityString( ) const
 
     return str;
 }
+
+QString
+Torrent :: getError( ) const
+{
+    QString s = getString( ERROR_STRING );
+
+    switch( getInt( ERROR ) )
+    {
+        case TR_STAT_TRACKER_WARNING: s = tr( "Tracker returned a warning: %1" ).arg( s ); break;
+        case TR_STAT_TRACKER_ERROR: s = tr( "Tracker returned an error: %1" ).arg( s ); break;
+        case TR_STAT_LOCAL_ERROR: s = tr( "Error: %1" ).arg( s ); break;
+        default: s.clear(); break;
+    }
+
+    return s;
+}
index ba1653ecbbb5f714fbbc07e5d5b3dc4be68580f6..7021ab4ac92a156c3b4bfa29e711e18cd56153ca 100644 (file)
@@ -90,6 +90,7 @@ class Torrent: public QObject
             ACTIVITY,
             NAME,
             ERROR,
+            ERROR_STRING,
             SIZE_WHEN_DONE,
             LEFT_UNTIL_DONE,
             HAVE_UNCHECKED,
@@ -207,7 +208,7 @@ class Torrent: public QObject
         QString creator( ) const { return getString( CREATOR ); }
         QString comment( ) const { return getString( COMMENT ); }
         QString getPath( ) const { return getString( DOWNLOAD_DIR ); }
-        QString getError( ) const { return getString( ERROR ); }
+        QString getError( ) const;
         QString hashString( ) const { return getString( HASH_STRING ); }
         QString scrapeResponse( ) const { return getString( SCRAPE_RESPONSE ); }
         QString announceResponse( ) const { return getString( ANNOUNCE_RESPONSE ); }
index 55201e97a4dd23ca2f375092806217fb731b2529..40fd4c49e55c46ee1f0bae083f3aabf3ae15d6c4 100644 (file)
@@ -22,6 +22,11 @@ Torrent._RatioUseGlobal        = 0;
 Torrent._RatioUseLocal         = 1;
 Torrent._RatioUnlimited        = 2;
 
+Torrent._ErrNone               = 0;
+Torrent._ErrTrackerWarning     = 1;
+Torrent._ErrTrackerError       = 2;
+Torrent._ErrLocalError         = 3;
+
 Torrent.prototype =
 {
        /*
@@ -162,7 +167,6 @@ Torrent.prototype =
        dateAdded: function() { return this._date; },
        downloadSpeed: function() { return this._download_speed; },
        downloadTotal: function() { return this._download_total; },
-       errorMessage: function() { return this._error_message; },
        hash: function() { return this._hashString; },
        id: function() { return this._id; },
        isActive: function() { return this.state() != Torrent._StatusPaused; },
@@ -316,7 +320,7 @@ Torrent.prototype =
                this._sizeWhenDone          = data.sizeWhenDone;
                this._recheckProgress       = data.recheckProgress;
                this._error                 = data.error;
-               this._error_message         = data.errorString;
+               this._error_string          = data.errorString;
                this._eta                   = data.eta;
                this._swarm_speed           = data.swarmSpeed;
                this._total_leechers        = Math.max( 0, data.leechers );
@@ -340,14 +344,24 @@ Torrent.prototype =
                }
        },
 
-       getPeerDetails: function()
+       getErrorMessage: function()
        {
-               if( this._error_message &&
-                   this._error_message !== '' &&
-                   this._error_message !== 'other' )
-                       return this._error_message;
+               if( this._error  == Torrent._ErrTrackerWarning )
+                       return 'Tracker returned a warning: ' + this._error_string;
+               if( this._error  == Torrent._ErrTrackerError )
+                       return 'Tracker returned an error: ' + this._error_string;
+               if( this._error  == Torrent._ErrLocalError )
+                       return 'Error: ' + this._error_string;
+               return null;
+       },
 
+       getPeerDetails: function()
+       {
                var c;
+
+               if(( c = this.getErrorMessage( )))
+                       return c;
+
                var st = this.state( );
                switch( st )
                {
index 317dee9ecff2aba6158c7ca987fcd54ae5e4c727..594c7b24ea59382512debb3018d532233e9aa3bf 100644 (file)
@@ -991,8 +991,9 @@ Transmission.prototype =
                if( torrents.length == 1 )
                {
                        var t = torrents[0];
-                       if( t._error_message )
-                               error = t._error_message ;
+                       var err = t.getErrorMessage( );
+                       if( err )
+                               error = err;
                        if( t._comment)
                                comment = t._comment ;
                        if( t._creator )