Changeset 2


Ignore:
Timestamp:
Jan 12, 2006, 6:20:48 PM (15 years ago)
Author:
root
Message:

Update 2005-11-01

Location:
trunk
Files:
12 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Jamfile

    r1 r2  
    1616        macosx/English.lproj/MainMenu.nib/info.nib
    1717        macosx/English.lproj/MainMenu.nib/keyedobjects.nib
    18         macosx/Images/Info.tiff
    19         macosx/Images/Open.tiff
    20         macosx/Images/Progress.tiff
    21         macosx/Images/Remove.tiff
    22         macosx/Images/Resume.tiff
    23         macosx/Images/RevealOff.tiff
    24         macosx/Images/RevealOn.tiff
    25         macosx/Images/Stop.tiff
     18        macosx/Images/Info.png
     19        macosx/Images/Open.png
     20        macosx/Images/PauseOff.png
     21        macosx/Images/PauseOn.png
     22        macosx/Images/Progress.png
     23        macosx/Images/Remove.png
     24        macosx/Images/RevealOff.png
     25        macosx/Images/RevealOn.png
    2626        macosx/Images/Transmission.icns
    2727        macosx/Images/TransmissionDocument.icns
  • trunk/Jamrules

    r1 r2  
    88VERSION_MAJOR  = 0 ;
    99VERSION_MINOR  = 3 ;
    10 VERSION_STRING = $(VERSION_MAJOR).$(VERSION_MINOR) ;
     10# VERSION_STRING = $(VERSION_MAJOR).$(VERSION_MINOR) ;
     11VERSION_STRING = 0.4-cvs ;
    1112
    1213DEFINES += VERSION_MAJOR=$(VERSION_MAJOR)
    1314           VERSION_MINOR=$(VERSION_MINOR)
    1415           VERSION_STRING=\\\"$(VERSION_STRING)\\\" ;
    15 CCFLAGS  = -g -Wall -W ;
    1616OPTIM    = -O3 ;
    1717RM       = rm -Rf ;
     
    2828    # universal binaries)
    2929    RANLIB     =   ;
     30    NOARSCAN   = 1 ;
    3031    NOARUPDATE = 1 ;
    3132    actions Archive
     
    3738    {
    3839        Depends        $(1)  : $(2) ;
     40        Depends        $(1)  : Jamrules ;
    3941        Clean          clean : $(1) ;
    4042    }
    4143    actions OSXInfoPlist
    4244    {
     45        $(RM) $(1)
    4346        sed "s/%%VERSION%%/$(VERSION_STRING)/" < $(2) > $(1)
    4447    }
  • trunk/configure

    r1 r2  
    11#! /bin/sh
    22
     3#
     4# Functions
     5#
     6usage()
     7{
     8  cat << EOF
     9
     10  OpenSSL options:
     11    --disable-openssl      Disable OpenSSL, use built-in SHA1 implementation
     12    --openssl-prefix=PATH  Location of OpenSSL headers and library
     13
     14  Some influential environment variables:
     15    CC          C compiler command (default "cc")
     16    CFLAGS      C compiler flags (default "-g -Wall -W")
     17
     18EOF
     19}
     20
     21openssl_test()
     22{
     23  cat > testconf.c << EOF
     24  #include <stdio.h>
     25  #include <openssl/sha.h>
     26  int main()
     27  {
     28      SHA1( 0, 0, 0 );
     29  }
     30EOF
     31  if [ -n "$PREFIX" ]; then
     32    TMPFLAGS="-I$PREFIX/include -L$PREFIX/lib"
     33  fi
     34  if $CC $TMPFLAGS -o testconf testconf.c -lcrypto > /dev/null 2>&1
     35  then
     36    echo "OpenSSL: yes"
     37    DEFINES="$DEFINES HAVE_OPENSSL"
     38    LINKLIBS="$LINKLIBS -lcrypto"
     39  else
     40    echo "OpenSSL: no, using built-in SHA1 implementation"
     41  fi
     42  rm -f testconf.c testconf
     43}
     44
     45#
     46# Defaults settings
     47#
     48CC="${CC-cc}"
     49CFLAGS="${CFLAGS--g -Wall -W}"
    350# For > 2 GB files
    451DEFINES="_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE"
    5 
    652# For asprintf
    753DEFINES="$DEFINES _GNU_SOURCE"
     54openssl_disable=0
    855
     56#
     57# Parse options
     58#
     59while [ $# -ne 0 ]; do
     60  param=`expr "opt$1" : 'opt[^=]*=\(.*\)'`
     61
     62  case "x$1" in
     63    x--disable-openssl)
     64      openssl_disable="1";
     65      ;;
     66    x--openssl-prefix=*)
     67      OPENSSL_PREFIX="$param";
     68      ;;
     69    x--help)
     70      usage
     71      exit 0
     72      ;;
     73  esac
     74  shift
     75done
     76
     77#
    978# System-specific flags
     79#
    1080SYSTEM=`uname -s`
    1181case $SYSTEM in
     
    56126echo "System:  $SYSTEM"
    57127
    58 # Check for OpenSSL
    59 cat > testconf.c << EOF
    60 #include <stdio.h>
    61 #include <openssl/sha.h>
    62 int main()
    63 {
    64     SHA1( 0, 0, 0 );
    65 }
     128#
     129# OpenSSL settings
     130#
     131if [ ${openssl_disable} = 1 ]; then
     132  echo "OpenSSL: no, using built-in SHA1 implementation"
     133else
     134    openssl_test
     135fi
     136
     137#
     138# Generate config.jam
     139#
     140rm -f config.jam
     141cat > config.jam << EOF
     142CC         = $CC ;
     143LINK       = $CC ;
     144CCFLAGS    = $CFLAGS ;
     145DEFINES    = $DEFINES ;
     146LINKLIBS   = $LINKLIBS ;
    66147EOF
    67 if cc -o testconf testconf.c -lcrypto > /dev/null 2>&1
    68 then
    69   echo "OpenSSL: yes"
    70   DEFINES="$DEFINES HAVE_OPENSSL"
    71   LINKLIBS="$LINKLIBS -lcrypto"
    72 else
    73   echo "OpenSSL: no, using built-in SHA1 implementation"
     148if [ -n "$OPENSSL_PREFIX" ]; then
     149cat >> config.jam << EOF
     150HDRS      += $OPENSSL_PREFIX/include ;
     151LINKFLAGS += -L$OPENSSL_PREFIX/lib ;
     152EOF
    74153fi
    75 rm -f testconf.c testconf
    76 
    77 # Generate config.jam
    78 rm -f config.jam
    79 cat << EOF > config.jam
    80 DEFINES  = $DEFINES ;
    81 LINKLIBS = $LINKLIBS ;
    82 EOF
    83154
    84155echo
  • trunk/libtransmission/fastresume.h

    r1 r2  
    3131 *    been completed or started in each slot
    3232 *
    33  * The resume file is located in ~/.transmission/. Its name is
    34  * "resume.<hash>".
     33 * The name of the resume file is "resume.<hash>".
    3534 *
    3635 * All values are stored in the native endianness. Moving a
     
    4039 **********************************************************************/
    4140
    42 static char * fastResumeFolderName()
    43 {
    44     char * ret;
    45     asprintf( &ret, "%s/.transmission", getenv( "HOME" ) );
    46     return ret;
    47 }
    48 
    4941static char * fastResumeFileName( tr_io_t * io )
    5042{
     43    tr_torrent_t * tor = io->tor;
    5144    char * ret, * p;
    5245    int i;
    5346
    54     p = fastResumeFolderName();
    55     asprintf( &ret, "%s/resume.%40d", p, 0 );
    56     free( p );
     47    asprintf( &ret, "%s/resume.%40d", tor->prefsDirectory, 0 );
    5748
    5849    p = &ret[ strlen( ret ) - 2 * SHA_DIGEST_LENGTH ];
     
    122113    }
    123114
    124     /* Create folder if missing */
    125     path = fastResumeFolderName();
    126     mkdir( path, 0755 );
    127     free( path );
    128 
    129115    /* Create/overwrite the resume file */
    130116    path = fastResumeFileName( io );
     
    136122        return;
    137123    }
    138     free( path );
    139124   
    140125    /* Write format version */
     
    161146
    162147    fclose( file );
     148
     149    tr_dbg( "Resume file '%s' written", path );
     150    free( path );
    163151}
    164152
     
    185173        return 1;
    186174    }
     175    tr_dbg( "Resume file '%s' loaded", path );
    187176    free( path );
    188177
  • trunk/libtransmission/internal.h

    r1 r2  
    156156    tr_tracker_t    * tracker;
    157157    tr_io_t         * io;
     158    uint64_t          stopDate;
    158159
    159160    int               bindSocket;
     
    165166    uint64_t          downloaded[10];
    166167    uint64_t          uploaded[10];
     168
     169    char            * prefsDirectory;
    167170};
    168171
     
    180183
    181184    char           id[21];
     185    char           prefsDirectory[256];
    182186};
    183187
  • trunk/libtransmission/peer.c

    r1 r2  
    101101#include "peermessages.h"
    102102#include "peerutils.h"
     103#include "peerparse.h"
    103104
    104105/***********************************************************************
     
    233234    }
    234235
     236    if( tor->status & TR_STATUS_STOPPING )
     237    {
     238        return;
     239    }
     240
    235241    /* Check for incoming connections */
    236242    if( tor->bindSocket > -1 &&
     
    332338                peer->date  = tr_date();
    333339                peer->pos  += ret;
    334                 if( parseMessage( tor, peer, ret ) )
     340                if( parseBuf( tor, peer, ret ) )
    335341                {
    336342                    goto dropPeer;
  • trunk/libtransmission/peermessages.h

    r1 r2  
    2121 *****************************************************************************/
    2222
     23/***********************************************************************
     24 * This file handles all outgoing messages
     25 **********************************************************************/
     26
    2327static uint8_t * messagesPending( tr_peer_t * peer, int * size )
    2428{
  • trunk/libtransmission/peerutils.h

    r1 r2  
    123123    }
    124124
     125    /* TODO: check for bad downloaders */
     126
    125127#if 0
    126128    /* Choke unchoked peers we are not sending anything to */
     
    161163        }
    162164    }
    163 
    164     return 0;
    165 }
    166 
    167 static int parseMessage( tr_torrent_t * tor, tr_peer_t * peer,
    168                          int newBytes )
    169 {
    170     tr_info_t * inf = &tor->info;
    171 
    172     int       i, j;
    173     int       len;
    174     char      id;
    175     uint8_t * p   = peer->buf;
    176     uint8_t * end = &p[peer->pos];
    177    
    178     for( ;; )
    179     {
    180         if( peer->pos < 4 )
    181         {
    182             break;
    183         }
    184 
    185         if( peer->status & PEER_STATUS_HANDSHAKE )
    186         {
    187             char * client;
    188 
    189             if( p[0] != 19 || memcmp( &p[1], "Bit", 3 ) )
    190             {
    191                 /* Don't wait until we get 68 bytes, this is wrong
    192                    already */
    193                 peer_dbg( "GET  handshake, invalid" );
    194                 tr_netSend( peer->socket, (uint8_t *) "Nice try...\r\n", 13 );
    195                 return 1;
    196             }
    197 
    198             if( peer->pos < 68 )
    199             {
    200                 break;
    201             }
    202 
    203             if( memcmp( &p[4], "Torrent protocol", 16 ) )
    204             {
    205                 peer_dbg( "GET  handshake, invalid" );
    206                 return 1;
    207             }
    208 
    209             if( memcmp( &p[28], inf->hash, 20 ) )
    210             {
    211                 peer_dbg( "GET  handshake, wrong torrent hash" );
    212                 return 1;
    213             }
    214 
    215             if( !memcmp( &p[48], tor->id, 20 ) )
    216             {
    217                 /* We are connected to ourselves... */
    218                 peer_dbg( "GET  handshake, that is us" );
    219                 return 1;
    220             }
    221 
    222             peer->status  = PEER_STATUS_CONNECTED;
    223             memcpy( peer->id, &p[48], 20 );
    224             p            += 68;
    225             peer->pos    -= 68;
    226 
    227             for( i = 0; i < tor->peerCount; i++ )
    228             {
    229                 if( tor->peers[i] == peer )
    230                 {
    231                     continue;
    232                 }
    233                 if( !peerCmp( peer, tor->peers[i] ) )
    234                 {
    235                     peer_dbg( "GET  handshake, duplicate" );
    236                     return 1;
    237                 }
    238             }
    239 
    240             client = tr_clientForId( (uint8_t *) peer->id );
    241             peer_dbg( "GET  handshake, ok (%s)", client );
    242             free( client );
    243 
    244             sendBitfield( tor, peer );
    245 
    246             continue;
    247         }
    248        
    249         /* Get payload size */
    250         TR_NTOHL( p, len );
    251         p += 4;
    252 
    253         if( len > 9 + tor->blockSize )
    254         {
    255             /* This shouldn't happen. Forget about that peer */
    256             peer_dbg( "message too large" );
    257             return 1;
    258         }
    259 
    260         if( !len )
    261         {
    262             /* keep-alive */
    263             peer_dbg( "GET  keep-alive" );
    264             peer->pos -= 4;
    265             continue;
    266         }
    267 
    268         /* That's a piece coming */
    269         if( p < end && *p == 7 )
    270         {
    271             /* XXX */
    272             tor->downloaded[9] += newBytes;
    273             peer->inTotal      += newBytes;
    274             newBytes            = 0;
    275         }
    276 
    277         if( &p[len] > end )
    278         {
    279             /* We do not have the entire message */
    280             p -= 4;
    281             break;
    282         }
    283 
    284         /* Remaining data after this message */
    285         peer->pos -= 4 + len;
    286 
    287         /* Type of the message */
    288         id = *(p++);
    289 
    290         switch( id )
    291         {
    292             case 0: /* choke */
    293             {
    294                 tr_request_t * r;
    295 
    296                 if( len != 1 )
    297                 {
    298                     peer_dbg( "GET  choke, invalid" );
    299                     return 1;
    300                 }
    301 
    302                 peer_dbg( "GET  choke" );
    303                 peer->peerChoking    = 1;
    304 
    305                 for( i = 0; i < peer->inRequestCount; i++ )
    306                 {
    307                     r = &peer->inRequests[i];
    308                     if( tor->blockHave[tr_block(r->index,r->begin)] > 0 )
    309                     {
    310                         tor->blockHave[tr_block(r->index,r->begin)]--;
    311                     }
    312                 }
    313                 peer->inRequestCount = 0;
    314 
    315                 break;
    316             }
    317             case 1: /* unchoke */
    318                 if( len != 1 )
    319                 {
    320                     peer_dbg( "GET  unchoke, invalid" );
    321                     return 1;
    322                 }
    323                 peer_dbg( "GET  unchoke" );
    324                 peer->peerChoking = 0;
    325                 break;
    326             case 2: /* interested */
    327                 if( len != 1 )
    328                 {
    329                     peer_dbg( "GET  interested, invalid" );
    330                     return 1;
    331                 }
    332                 peer_dbg( "GET  interested" );
    333                 peer->peerInterested = 1;
    334                 break;
    335             case 3: /* uninterested */
    336                 if( len != 1 )
    337                 {
    338                     peer_dbg( "GET  uninterested, invalid" );
    339                     return 1;
    340                 }
    341                 peer_dbg( "GET  uninterested" );
    342                 peer->peerInterested = 0;
    343                 break;
    344             case 4: /* have */
    345             {
    346                 uint32_t piece;
    347                 if( len != 5 )
    348                 {
    349                     peer_dbg( "GET  have, invalid" );
    350                     return 1;
    351                 }
    352                 TR_NTOHL( p, piece );
    353                 if( !peer->bitfield )
    354                 {
    355                     peer->bitfield = calloc( ( inf->pieceCount + 7 ) / 8, 1 );
    356                 }
    357                 tr_bitfieldAdd( peer->bitfield, piece );
    358 
    359                 updateInterest( tor, peer );
    360 
    361                 peer_dbg( "GET  have %d", piece );
    362                 break;
    363             }
    364             case 5: /* bitfield */
    365             {
    366                 int bitfieldSize;
    367 
    368                 bitfieldSize = ( inf->pieceCount + 7 ) / 8;
    369                
    370                 if( len != 1 + bitfieldSize )
    371                 {
    372                     peer_dbg( "GET  bitfield, wrong size" );
    373                     return 1;
    374                 }
    375 
    376                 /* Make sure the spare bits are unset */
    377                 if( ( inf->pieceCount & 0x7 ) )
    378                 {
    379                     uint8_t lastByte;
    380                    
    381                     lastByte   = p[bitfieldSize-1];
    382                     lastByte <<= inf->pieceCount & 0x7;
    383                     lastByte  &= 0xFF;
    384 
    385                     if( lastByte )
    386                     {
    387                         peer_dbg( "GET  bitfield, spare bits set" );
    388                         return 1;
    389                     }
    390                 }
    391 
    392                 if( !peer->bitfield )
    393                 {
    394                     peer->bitfield = malloc( bitfieldSize );
    395                 }
    396                 memcpy( peer->bitfield, p, bitfieldSize );
    397 
    398                 updateInterest( tor, peer );
    399 
    400                 peer_dbg( "GET  bitfield, ok" );
    401                 break;
    402             }
    403             case 6: /* request */
    404             {
    405                 int index, begin, length;
    406 
    407                 if( peer->amChoking )
    408                 {
    409                     /* Didn't he get it? */
    410                     sendChoke( peer, 1 );
    411                     break;
    412                 }
    413                
    414                 TR_NTOHL( p,     index );
    415                 TR_NTOHL( &p[4], begin );
    416                 TR_NTOHL( &p[8], length );
    417 
    418                 peer_dbg( "GET  request %d/%d (%d bytes)",
    419                           index, begin, length );
    420 
    421                 /* TODO sanity checks (do we have the piece, etc) */
    422 
    423                 if( length > 16384 )
    424                 {
    425                     /* Sorry mate */
    426                     return 1;
    427                 }
    428 
    429                 if( peer->outRequestCount < MAX_REQUEST_COUNT )
    430                 {
    431                     tr_request_t * r;
    432                    
    433                     r         = &peer->outRequests[peer->outRequestCount];
    434                     r->index  = index;
    435                     r->begin  = begin;
    436                     r->length = length;
    437 
    438                     (peer->outRequestCount)++;
    439                 }
    440                 else
    441                 {
    442                     tr_err( "Too many requests" );
    443                     return 1;
    444                 }
    445                 break;
    446             }
    447             case 7: /* piece */
    448             {
    449                 int index, begin;
    450                 int block;
    451                 tr_request_t * r;
    452 
    453                 TR_NTOHL( p,     index );
    454                 TR_NTOHL( &p[4], begin );
    455 
    456                 peer_dbg( "GET  piece %d/%d (%d bytes)",
    457                           index, begin, len - 9 );
    458 
    459                 if( peer->inRequestCount < 1 )
    460                 {
    461                     /* Our "cancel" was probably late */
    462                     peer_dbg( "not expecting a block" );
    463                     break;
    464                 }
    465                
    466                 r = &peer->inRequests[0];
    467                 if( index != r->index || begin != r->begin )
    468                 {
    469                     int suckyClient;
    470 
    471                     /* Either our "cancel" was late, or this is a sucky
    472                        client that cannot deal with multiple requests */
    473                     suckyClient = 0;
    474                     for( i = 0; i < peer->inRequestCount; i++ )
    475                     {
    476                         r = &peer->inRequests[i];
    477 
    478                         if( index != r->index || begin != r->begin )
    479                         {
    480                             continue;
    481                         }
    482 
    483                         /* Sucky client, he dropped the previous requests */
    484                         peer_dbg( "block was expected later" );
    485                         for( j = 0; j < i; j++ )
    486                         {
    487                             r = &peer->inRequests[j];
    488                             if( tor->blockHave[tr_block(r->index,r->begin)] > 0 )
    489                             {
    490                                 tor->blockHave[tr_block(r->index,r->begin)]--;
    491                             }
    492                         }
    493                         suckyClient = 1;
    494                         peer->inRequestCount -= i;
    495                         memmove( &peer->inRequests[0], &peer->inRequests[i],
    496                                  peer->inRequestCount * sizeof( tr_request_t ) );
    497                         r = &peer->inRequests[0];
    498                         break;
    499                     }
    500 
    501                     if( !suckyClient )
    502                     {
    503                         r = &peer->inRequests[0];
    504                         peer_dbg( "wrong block (expecting %d/%d)",
    505                                   r->index, r->begin );
    506                         break;
    507                     }
    508                 }
    509 
    510                 if( len - 9 != r->length )
    511                 {
    512                     peer_dbg( "wrong size (expecting %d)", r->length );
    513                     return 1;
    514                 }
    515 
    516                 block = tr_block( r->index, r->begin );
    517                 if( tor->blockHave[block] < 0 )
    518                 {
    519                     peer_dbg( "have this block already" );
    520                     (peer->inRequestCount)--;
    521                     memmove( &peer->inRequests[0], &peer->inRequests[1],
    522                              peer->inRequestCount * sizeof( tr_request_t ) );
    523                     break;
    524                 }
    525 
    526                 tor->blockHave[block]  = -1;
    527                 tor->blockHaveCount   +=  1;
    528                 tr_ioWrite( tor->io, index, begin, len - 9, &p[8] );
    529 
    530                 sendCancel( tor, block );
    531 
    532                 if( tr_bitfieldHas( tor->bitfield, index ) )
    533                 {
    534                     tr_peer_t * otherPeer;
    535 
    536                     for( i = 0; i < tor->peerCount; i++ )
    537                     {
    538                         otherPeer = tor->peers[i];
    539 
    540                         if( otherPeer->status < PEER_STATUS_CONNECTED )
    541                         {
    542                             continue;
    543                         }
    544 
    545                         sendHave( otherPeer, index );
    546                         updateInterest( tor, otherPeer );
    547                     }
    548                 }
    549 
    550                 (peer->inRequestCount)--;
    551                 memmove( &peer->inRequests[0], &peer->inRequests[1],
    552                          peer->inRequestCount * sizeof( tr_request_t ) );
    553                 break;
    554             }
    555             case 8: /* cancel */
    556             {
    557                 int index, begin, length;
    558                 int i;
    559                 tr_request_t * r;
    560 
    561                 TR_NTOHL( p,     index );
    562                 TR_NTOHL( &p[4], begin );
    563                 TR_NTOHL( &p[8], length );
    564 
    565                 peer_dbg( "GET  cancel %d/%d (%d bytes)",
    566                           index, begin, length );
    567 
    568                 for( i = 0; i < peer->outRequestCount; i++ )
    569                 {
    570                     r = &peer->outRequests[i];
    571                     if( r->index == index && r->begin == begin &&
    572                         r->length == length )
    573                     {
    574                         (peer->outRequestCount)--;
    575                         memmove( &r[0], &r[1], sizeof( tr_request_t ) *
    576                                 ( peer->outRequestCount - i ) );
    577                         break;
    578                     }
    579                 }
    580 
    581                 break;
    582             }
    583             case 9:
    584             {
    585                 in_port_t port;
    586 
    587                 if( len != 3 )
    588                 {
    589                     peer_dbg( "GET  port, invalid" );
    590                     return 1;
    591                 }
    592 
    593                 port = *( (in_port_t *) p );
    594                 peer_dbg( "GET  port %d", ntohs( port ) );
    595 
    596                 break;
    597             }
    598             default:
    599             {
    600                 peer_dbg( "Unknown message '%d'", id );
    601                 return 1;
    602             }
    603         }
    604 
    605         p += len - 1;
    606     }
    607 
    608     memmove( peer->buf, p, peer->pos );
    609165
    610166    return 0;
     
    663219 * missing less blocks.
    664220 **********************************************************************/
    665 static int chooseBlock( tr_torrent_t * tor, tr_peer_t * peer )
     221static inline int chooseBlock( tr_torrent_t * tor, tr_peer_t * peer )
    666222{
    667223    tr_info_t * inf = &tor->info;
     
    799355    {
    800356        /* TODO: optimize */
    801         if( tor->blockHave[i] > 0 && tor->blockHave[i] < minDownloading )
     357        if( tr_bitfieldHas( peer->bitfield, tr_blockPiece( i ) ) &&
     358            tor->blockHave[i] >= 0 && tor->blockHave[i] < minDownloading )
    802359        {
    803360            block          = i;
  • trunk/libtransmission/transmission.c

    r1 r2  
    6060
    6161    h->bindPort = 9090;
     62
     63    snprintf( h->prefsDirectory, sizeof( h->prefsDirectory ),
     64              "%s/.transmission", getenv( "HOME" ) );
     65    mkdir( h->prefsDirectory, 0755 );
    6266   
    6367    return h;
     68}
     69
     70/***********************************************************************
     71 * tr_getPrefsDirectory
     72 ***********************************************************************
     73 *
     74 **********************************************************************/
     75char * tr_getPrefsDirectory( tr_handle_t * h )
     76{
     77    return (char *) h->prefsDirectory;
    6478}
    6579
     
    185199    tor->upload  = h->upload;
    186200    tor->fdlimit = h->fdlimit;
     201    tor->prefsDirectory = (char *) h->prefsDirectory;
    187202 
    188203    /* We have a new torrent */
     
    253268    tr_trackerStopped( tor->tracker );
    254269    tor->status = TR_STATUS_STOPPING;
     270    tor->stopDate = tr_date();
    255271    tr_lockUnlock( tor->lock );
    256272}
     
    317333        tr_lockLock( tor->lock );
    318334
    319         if( tor->status & TR_STATUS_STOPPED )
     335        if( ( tor->status & TR_STATUS_STOPPED ) ||
     336            ( ( tor->status & TR_STATUS_STOPPING ) &&
     337              tr_date() > tor->stopDate + 60000 ) )
    320338        {
    321339            torrentReallyStop( h, i );
     
    479497
    480498        /* Receive/send messages */
    481         if( !( tor->status & TR_STATUS_STOPPING ) )
    482         {
    483             tr_peerPulse( tor );
    484         }
     499        tr_peerPulse( tor );
    485500
    486501        /* Try to get new peers or to send a message to the tracker */
  • trunk/libtransmission/transmission.h

    r1 r2  
    4141
    4242/***********************************************************************
     43 * tr_getPrefsDirectory
     44 ***********************************************************************
     45 * Returns the full path to the directory used by libtransmission to
     46 * store the resume files. The string belongs to libtransmission, do
     47 * not free it.
     48 **********************************************************************/
     49char * tr_getPrefsDirectory( tr_handle_t * );
     50
     51/***********************************************************************
    4352 * tr_setBindPort
    4453 ***********************************************************************
  • trunk/macosx/Controller.h

    r1 r2  
    2020 * DEALINGS IN THE SOFTWARE.
    2121 *****************************************************************************/
     22
     23#ifndef CONTROLLER_H
     24#define CONTROLLER_H
    2225
    2326#include <Cocoa/Cocoa.h>
     
    6467                            contextInfo: (void *) info;
    6568- (void) stopTorrent:     (id) sender;
     69- (void) stopTorrentWithIndex: (int) index;
    6670- (void) resumeTorrent:   (id) sender;
     71- (void) resumeTorrentWithIndex: (int) index;
    6772- (void) removeTorrent:   (id) sender;
    6873- (void) showInfo:        (id) sender;
     
    7782
    7883@end
     84
     85#endif
  • trunk/macosx/Controller.m

    r1 r2  
    2323#include <IOKit/IOMessage.h>
    2424
    25 #include "Controller.h"
    2625#include "NameCell.h"
    2726#include "ProgressCell.h"
     
    2928
    3029#define TOOLBAR_OPEN   @"Toolbar Open"
    31 #define TOOLBAR_RESUME @"Toolbar Resume"
    32 #define TOOLBAR_STOP   @"Toolbar Stop"
    3330#define TOOLBAR_REMOVE @"Toolbar Remove"
     31#define TOOLBAR_PREFS  @"Toolbar Preferences"
    3432#define TOOLBAR_INFO   @"Toolbar Info"
    3533
     
    4341@implementation Controller
    4442
    45 - (void) enableToolbarItem: (NSString *) ident flag: (BOOL) e
    46 {
    47     NSArray * array = [fToolbar items];
     43- (void) updateToolbar
     44{
     45    NSArray * items;
    4846    NSToolbarItem * item;
    49 
    50     if( [ident isEqualToString: TOOLBAR_OPEN] )
    51     {
    52         item = [array objectAtIndex: 0];
    53         [item setAction: e ? @selector( openShowSheet: ) : NULL];
    54     }
    55     else if( [ident isEqualToString: TOOLBAR_RESUME] )
    56     {
    57         item = [array objectAtIndex: 1];
    58         [item setAction: e ? @selector( resumeTorrent: ) : NULL];
    59     }
    60     else if( [ident isEqualToString: TOOLBAR_STOP] )
    61     {
    62         item = [array objectAtIndex: 2];
    63         [item setAction: e ? @selector( stopTorrent: ) : NULL];
    64     }
    65     else if( [ident isEqualToString: TOOLBAR_REMOVE] )
    66     {
    67         item = [array objectAtIndex: 3];
    68         [item setAction: e ? @selector( removeTorrent: ) : NULL];
    69     }
    70     else if( [ident isEqualToString: TOOLBAR_INFO] )
    71     {
    72         item = [array objectAtIndex: 5];
    73         [item setAction: e ? @selector( showInfo: ) : NULL];
    74     }
    75 }
    76 
    77 - (void) updateToolbar
    78 {
    79     int row = [fTableView selectedRow];
    80 
    81     [self enableToolbarItem: TOOLBAR_RESUME flag: NO];
    82     [self enableToolbarItem: TOOLBAR_STOP   flag: NO];
    83     [self enableToolbarItem: TOOLBAR_REMOVE flag: NO];
    84 
    85     if( row < 0 )
    86     {
    87         return;
    88     }
    89 
    90     if( fStat[row].status &
    91         ( TR_STATUS_CHECK | TR_STATUS_DOWNLOAD | TR_STATUS_SEED ) )
    92     {
    93         [self enableToolbarItem: TOOLBAR_STOP   flag: YES];
    94     }
    95     else
    96     {
    97         [self enableToolbarItem: TOOLBAR_RESUME flag: YES];
    98         [self enableToolbarItem: TOOLBAR_REMOVE flag: YES];
     47    BOOL enable;
     48    int row;
     49    unsigned i;
     50
     51    row    = [fTableView selectedRow];
     52    enable = ( row >= 0 ) && ( fStat[row].status &
     53                ( TR_STATUS_STOPPING | TR_STATUS_PAUSE ) );
     54
     55    items = [fToolbar items];
     56    for( i = 0; i < [items count]; i++ )
     57    {
     58        item = [items objectAtIndex: i];
     59        if( [[item itemIdentifier] isEqualToString: TOOLBAR_REMOVE] )
     60        {
     61            [item setAction: enable ? @selector( removeTorrent: ) : NULL];
     62        }
    9963    }
    10064}
     
    11983    [fWindow  setDelegate: self];
    12084
    121     [self enableToolbarItem: TOOLBAR_OPEN   flag: YES];
    122     [self enableToolbarItem: TOOLBAR_RESUME flag: NO];
    123     [self enableToolbarItem: TOOLBAR_STOP   flag: NO];
    124     [self enableToolbarItem: TOOLBAR_REMOVE flag: NO];
    125     [self enableToolbarItem: TOOLBAR_INFO   flag: YES];
    126 
    12785    [fTableView setDataSource: self];
    12886    [fTableView setDelegate:   self];
     
    13593    progressCell = [[ProgressCell alloc] init];
    13694    tableColumn  = [fTableView tableColumnWithIdentifier: @"Name"];
     95    [nameCell    setController: self];
    13796    [tableColumn setDataCell: nameCell];
    13897    [tableColumn setMinWidth: 10.0];
     
    144103    [tableColumn setMaxWidth: 134.0];
    145104
    146     [fTableView  sizeToFit];
     105    [fTableView setAutosaveTableColumns: YES];
     106    [fTableView sizeToFit];
    147107
    148108    [fTableView registerForDraggedTypes: [NSArray arrayWithObjects:
     
    209169        selector: @selector( updateUI: ) userInfo: NULL repeats: YES];
    210170    [[NSRunLoop currentRunLoop] addTimer: fTimer
    211         forMode: NSModalPanelRunLoopMode];
     171        forMode: NSEventTrackingRunLoopMode];
     172}
     173
     174- (void) windowDidResize: (NSNotification *) n
     175{
     176    [fTableView sizeToFit];
    212177}
    213178
     
    412377- (void) resumeTorrent: (id) sender
    413378{
    414     tr_torrentStart( fHandle, [fTableView selectedRow] );
    415     [self updateToolbar];
     379    [self resumeTorrentWithIndex: [fTableView selectedRow]];
     380}
     381
     382- (void) resumeTorrentWithIndex: (int) idx
     383{
     384    tr_torrentStart( fHandle, idx );
     385    [self updateUI: NULL];
    416386}
    417387
    418388- (void) stopTorrent: (id) sender
    419389{
    420     tr_torrentStop( fHandle, [fTableView selectedRow] );
    421     [self updateToolbar];
     390    [self stopTorrentWithIndex: [fTableView selectedRow]];
     391}
     392
     393- (void) stopTorrentWithIndex: (int) idx
     394{
     395    tr_torrentStop( fHandle, idx );
     396    [self updateUI: NULL];
    422397}
    423398
     
    490465    if( [[tableColumn identifier] isEqualToString: @"Name"] )
    491466    {
    492         [(NameCell *) cell setStat: &fStat[rowIndex]];
     467        [(NameCell *) cell setStat: &fStat[rowIndex] index: rowIndex];
    493468    }
    494469    else if( [[tableColumn identifier] isEqualToString: @"Progress"] )
     
    566541    item = [[NSToolbarItem alloc] initWithItemIdentifier: ident];
    567542
    568     [item setTarget: self];
    569 
    570543    if( [ident isEqualToString: TOOLBAR_OPEN] )
    571544    {
    572545        [item setLabel: @"Open"];
    573546        [item setToolTip: @"Open a torrent"];
    574         [item setImage: [NSImage imageNamed: @"Open.tiff"]];
    575     }
    576     else if( [ident isEqualToString: TOOLBAR_RESUME] )
    577     {
    578         [item setLabel: @"Resume"];
    579         [item setToolTip: @"Resume download"];
    580         [item setImage: [NSImage imageNamed: @"Resume.tiff"]];
    581     }
    582     else if( [ident isEqualToString: TOOLBAR_STOP] )
    583     {
    584         [item setLabel: @"Stop"];
    585         [item setToolTip: @"Stop download"];
    586         [item setImage: [NSImage imageNamed: @"Stop.tiff"]];
     547        [item setImage: [NSImage imageNamed: @"Open.png"]];
     548        [item setTarget: self];
     549        [item setAction: @selector( openShowSheet: )];
    587550    }
    588551    else if( [ident isEqualToString: TOOLBAR_REMOVE] )
     
    590553        [item setLabel: @"Remove"];
    591554        [item setToolTip: @"Remove torrent from list"];
    592         [item setImage: [NSImage imageNamed: @"Remove.tiff"]];
     555        [item setImage: [NSImage imageNamed: @"Remove.png"]];
     556        [item setTarget: self];
     557        /* We set the selector in updateToolbar: */
     558    }
     559    else if( [ident isEqualToString: TOOLBAR_PREFS] )
     560    {
     561        [item setLabel: @"Preferences"];
     562        [item setToolTip: @"Show the Preferences panel"];
     563        [item setImage: [NSImage imageNamed: @"Preferences.png"]];
     564        [item setTarget: fPrefsController];
     565        [item setAction: @selector( show: )];
    593566    }
    594567    else if( [ident isEqualToString: TOOLBAR_INFO] )
     
    596569        [item setLabel: @"Info"];
    597570        [item setToolTip: @"Information"];
    598         [item setImage: [NSImage imageNamed: @"Info.tiff"]];
     571        [item setImage: [NSImage imageNamed: @"Info.png"]];
     572        [item setTarget: self];
     573        [item setAction: @selector( showInfo: )];
    599574    }
    600575    else
     
    609584- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) t
    610585{
    611     return [NSArray arrayWithObjects:
    612             TOOLBAR_OPEN, TOOLBAR_RESUME, TOOLBAR_STOP, TOOLBAR_REMOVE,
    613             NSToolbarFlexibleSpaceItemIdentifier, TOOLBAR_INFO, NULL];
     586    return [NSArray arrayWithObjects: TOOLBAR_OPEN, TOOLBAR_REMOVE,
     587            NSToolbarFlexibleSpaceItemIdentifier, TOOLBAR_PREFS,
     588            TOOLBAR_INFO, NULL];
    614589}
    615590
  • trunk/macosx/NameCell.h

    r1 r2  
    2121 *****************************************************************************/
    2222
     23#ifndef NAMECELL_H
     24#define NAMECELL_H
     25
    2326#include <Cocoa/Cocoa.h>
    2427#include <transmission.h>
     28#include "Controller.h"
    2529
    2630@interface NameCell : NSCell
    2731{
    28     tr_stat_t * fStat;
    29     NSRect      fRevealRect;
    30     NSPoint     fClickPoint;
     32    Controller * fController;
     33    tr_stat_t  * fStat;
     34    int          fIndex;
     35    NSRect       fPauseRect;
     36    NSRect       fRevealRect;
     37    NSPoint      fClickPoint;
    3138}
    32 - (void) setStat: (tr_stat_t *) stat;
     39- (void) setController: (Controller *) controller;
     40- (void) setStat: (tr_stat_t *) stat index: (int) index;
    3341@end
     42
     43#endif
  • trunk/macosx/NameCell.m

    r1 r2  
    2626@implementation NameCell
    2727
    28 - (void) setStat: (tr_stat_t *) stat;
    29 {
    30     fStat = stat;
     28- (void) setController: (Controller *) controller
     29{
     30    fController = controller;
     31}
     32
     33- (void) setStat: (tr_stat_t *) stat index: (int) idx
     34{
     35    fStat  = stat;
     36    fIndex = idx;
    3137}
    3238
     
    4854    nameString = [NSString stringWithFormat: @"%@%@",
    4955        stringFittingInWidth( fStat->info.name, cellFrame.size.width -
    50                 10 - widthForString( sizeString, 12 ), 12 ),
     56                35 - widthForString( sizeString, 12 ), 12 ),
    5157        sizeString];
    5258
     
    101107        peersString = [NSString stringWithFormat: @"%@%@",
    102108        @"Error: ", stringFittingInWidth( fStat->error,
    103             cellFrame.size.width - 15 -
     109            cellFrame.size.width - 40 -
    104110            widthForString( @"Error: ", 10 ), 10 )];
    105111    }
     
    119125    pen.x += 0; pen.y += 15;
    120126    [peersString drawAtPoint: pen withAttributes: attributes];
     127
     128    /* "Pause" button */
     129    fPauseRect = NSMakeRect( cellFrame.origin.x + cellFrame.size.width - 19,
     130                             cellFrame.origin.y + cellFrame.size.height - 38,
     131                             14, 14 );
     132    NSImage * pauseImage = NULL;
     133    if( fStat->status & TR_STATUS_PAUSE )
     134    {
     135        if( NSPointInRect( fClickPoint, fPauseRect ) )
     136        {
     137            pauseImage = [NSImage imageNamed: @"ResumeOn.png"];
     138        }
     139        else
     140        {
     141            pauseImage = [NSImage imageNamed: @"ResumeOff.png"];
     142        }
     143    }
     144    else if( fStat->status &
     145             ( TR_STATUS_CHECK | TR_STATUS_DOWNLOAD | TR_STATUS_SEED ) )
     146    {
     147        if( NSPointInRect( fClickPoint, fPauseRect ) )
     148        {
     149            pauseImage = [NSImage imageNamed: @"PauseOn.png"];
     150        }
     151        else
     152        {
     153            pauseImage = [NSImage imageNamed: @"PauseOff.png"];
     154        }
     155    }
     156    if( pauseImage )
     157    {
     158        pen.x = fPauseRect.origin.x;
     159        pen.y = fPauseRect.origin.y + 14;
     160        [pauseImage compositeToPoint: pen operation: NSCompositeSourceOver];
     161    }
    121162
    122163    /* "Reveal in Finder" button */
     
    127168    if( NSPointInRect( fClickPoint, fRevealRect ) )
    128169    {
    129         revealImage = [NSImage imageNamed: @"RevealOn.tiff"];
     170        revealImage = [NSImage imageNamed: @"RevealOn.png"];
    130171    }
    131172    else
    132173    {
    133         revealImage = [NSImage imageNamed: @"RevealOff.tiff"];
     174        revealImage = [NSImage imageNamed: @"RevealOff.png"];
    134175    }
    135176    pen.x = fRevealRect.origin.x;
     
    156197    inView: (NSView *) v mouseIsUp: (BOOL) flag
    157198{
    158     if( flag && NSPointInRect( stop, fRevealRect ) )
    159     {
    160         /* Reveal in Finder */
    161         [[NSWorkspace sharedWorkspace] openFile:
    162             [NSString stringWithUTF8String: fStat->folder]];
     199    if( flag )
     200    {
     201        if( NSPointInRect( stop, fRevealRect ) )
     202        {
     203            /* Reveal in Finder */
     204            NSString * string = [NSString stringWithFormat:
     205                @"tell application \"Finder\"\nactivate\nreveal (POSIX file \"%s/%s\")\nend tell",
     206                fStat->folder, fStat->info.name];
     207            NSAppleScript * appleScript;
     208            appleScript = [[NSAppleScript alloc] initWithSource: string];
     209            NSDictionary * error;
     210            if( ![appleScript executeAndReturnError: &error] )
     211            {
     212                printf( "Reveal in Finder: AppleScript failed\n" );
     213            }
     214            [appleScript release];
     215        }
     216        else if( NSPointInRect( stop, fPauseRect ) )
     217        {
     218            /* Pause, resume */
     219            if( fStat->status & TR_STATUS_PAUSE )
     220            {
     221                [fController resumeTorrentWithIndex: fIndex];
     222            }
     223            else if( fStat->status & ( TR_STATUS_CHECK |
     224                      TR_STATUS_DOWNLOAD | TR_STATUS_SEED ) )
     225            {
     226                [fController stopTorrentWithIndex: fIndex];
     227            }
     228        }
    163229    }
    164230    fClickPoint = NSMakePoint(0,0);
  • trunk/macosx/ProgressCell.h

    r1 r2  
    2121 *****************************************************************************/
    2222
     23#ifndef PROGRESSCELL_H
     24#define PROGRESSCELL_H
     25
    2326#include <Cocoa/Cocoa.h>
    2427#include <transmission.h>
     
    4245- (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) view;
    4346@end
     47
     48#endif
  • trunk/macosx/ProgressCell.m

    r1 r2  
    8282
    8383    /* Have a NSBitmapImageRep ready to draw the progression bar */
    84     bgImg  = [NSImage imageNamed: @"Progress.tiff"];
     84    bgImg  = [NSImage imageNamed: @"Progress.png"];
    8585    fBgBmp = [[bgImg representations] objectAtIndex: 0];
    8686    size   = [bgImg size];
  • trunk/macosx/Transmission.xcodeproj/project.pbxproj

    r1 r2  
    1414                4D2784370905709500687951 /* Transmission.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D2784360905709500687951 /* Transmission.icns */; };
    1515                4D3EA0AA08AE13C600EA10C2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D3EA0A908AE13C600EA10C2 /* IOKit.framework */; };
    16                 4D6DAAC6090CE00500F43C22 /* RevealOff.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4D6DAAC4090CE00500F43C22 /* RevealOff.tiff */; };
    17                 4D6DAAC7090CE00500F43C22 /* RevealOn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4D6DAAC5090CE00500F43C22 /* RevealOn.tiff */; };
    18                 4D813EB508AA43AC00191DB4 /* Progress.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4D813EB408AA43AC00191DB4 /* Progress.tiff */; };
     16                4D6DAAC6090CE00500F43C22 /* RevealOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D6DAAC4090CE00500F43C22 /* RevealOff.png */; };
     17                4D6DAAC7090CE00500F43C22 /* RevealOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D6DAAC5090CE00500F43C22 /* RevealOn.png */; };
     18                4D752E930913C949008EAAD4 /* Preferences.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D752E920913C949008EAAD4 /* Preferences.png */; };
     19                4D813EB508AA43AC00191DB4 /* Progress.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D813EB408AA43AC00191DB4 /* Progress.png */; };
     20                4DA6FDBA0911233800450CB1 /* PauseOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDB80911233800450CB1 /* PauseOn.png */; };
     21                4DA6FDBB0911233800450CB1 /* PauseOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDB90911233800450CB1 /* PauseOff.png */; };
     22                4DA6FDC5091141AD00450CB1 /* ResumeOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDC3091141AD00450CB1 /* ResumeOff.png */; };
     23                4DA6FDC6091141AD00450CB1 /* ResumeOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDC4091141AD00450CB1 /* ResumeOn.png */; };
    1924                4DF0C5AB0899190500DD8943 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0C5A90899190500DD8943 /* Controller.m */; };
    2025                4DF0C5AE08991C1600DD8943 /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DF0C5AD08991C1600DD8943 /* libtransmission.a */; };
    21                 4DF7500C08A103AD007B0D70 /* Open.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500708A103AD007B0D70 /* Open.tiff */; };
    22                 4DF7500D08A103AD007B0D70 /* Info.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500808A103AD007B0D70 /* Info.tiff */; };
    23                 4DF7500E08A103AD007B0D70 /* Remove.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500908A103AD007B0D70 /* Remove.tiff */; };
    24                 4DF7500F08A103AD007B0D70 /* Resume.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500A08A103AD007B0D70 /* Resume.tiff */; };
    25                 4DF7501008A103AD007B0D70 /* Stop.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500B08A103AD007B0D70 /* Stop.tiff */; };
     26                4DF7500C08A103AD007B0D70 /* Open.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500708A103AD007B0D70 /* Open.png */; };
     27                4DF7500D08A103AD007B0D70 /* Info.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500808A103AD007B0D70 /* Info.png */; };
     28                4DF7500E08A103AD007B0D70 /* Remove.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500908A103AD007B0D70 /* Remove.png */; };
    2629                8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
    2730                8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
     
    7578                4D2784360905709500687951 /* Transmission.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Transmission.icns; path = Images/Transmission.icns; sourceTree = "<group>"; };
    7679                4D3EA0A908AE13C600EA10C2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
    77                 4D6DAAC4090CE00500F43C22 /* RevealOff.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = RevealOff.tiff; path = Images/RevealOff.tiff; sourceTree = "<group>"; };
    78                 4D6DAAC5090CE00500F43C22 /* RevealOn.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = RevealOn.tiff; path = Images/RevealOn.tiff; sourceTree = "<group>"; };
    79                 4D813EB408AA43AC00191DB4 /* Progress.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Progress.tiff; path = Images/Progress.tiff; sourceTree = "<group>"; };
     80                4D6DAAC4090CE00500F43C22 /* RevealOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RevealOff.png; path = Images/RevealOff.png; sourceTree = "<group>"; };
     81                4D6DAAC5090CE00500F43C22 /* RevealOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RevealOn.png; path = Images/RevealOn.png; sourceTree = "<group>"; };
     82                4D752E920913C949008EAAD4 /* Preferences.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Preferences.png; path = Images/Preferences.png; sourceTree = "<group>"; };
     83                4D813EB408AA43AC00191DB4 /* Progress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Progress.png; path = Images/Progress.png; sourceTree = "<group>"; };
     84                4DA6FDB80911233800450CB1 /* PauseOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseOn.png; path = Images/PauseOn.png; sourceTree = "<group>"; };
     85                4DA6FDB90911233800450CB1 /* PauseOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseOff.png; path = Images/PauseOff.png; sourceTree = "<group>"; };
     86                4DA6FDC3091141AD00450CB1 /* ResumeOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeOff.png; path = Images/ResumeOff.png; sourceTree = "<group>"; };
     87                4DA6FDC4091141AD00450CB1 /* ResumeOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeOn.png; path = Images/ResumeOn.png; sourceTree = "<group>"; };
    8088                4DF0C5A90899190500DD8943 /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = "<group>"; };
    8189                4DF0C5AA0899190500DD8943 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = "<group>"; };
    8290                4DF0C5AD08991C1600DD8943 /* libtransmission.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtransmission.a; path = ../libtransmission/libtransmission.a; sourceTree = SOURCE_ROOT; };
    83                 4DF7500708A103AD007B0D70 /* Open.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Open.tiff; path = Images/Open.tiff; sourceTree = "<group>"; };
    84                 4DF7500808A103AD007B0D70 /* Info.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Info.tiff; path = Images/Info.tiff; sourceTree = "<group>"; };
    85                 4DF7500908A103AD007B0D70 /* Remove.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Remove.tiff; path = Images/Remove.tiff; sourceTree = "<group>"; };
    86                 4DF7500A08A103AD007B0D70 /* Resume.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Resume.tiff; path = Images/Resume.tiff; sourceTree = "<group>"; };
    87                 4DF7500B08A103AD007B0D70 /* Stop.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Stop.tiff; path = Images/Stop.tiff; sourceTree = "<group>"; };
     91                4DF7500708A103AD007B0D70 /* Open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Open.png; path = Images/Open.png; sourceTree = "<group>"; };
     92                4DF7500808A103AD007B0D70 /* Info.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Info.png; path = Images/Info.png; sourceTree = "<group>"; };
     93                4DF7500908A103AD007B0D70 /* Remove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Remove.png; path = Images/Remove.png; sourceTree = "<group>"; };
    8894                8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
    8995                8D1107320486CEB800E47090 /* Transmission.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Transmission.app; sourceTree = BUILT_PRODUCTS_DIR; };
     
    173179                                4D2784360905709500687951 /* Transmission.icns */,
    174180                                4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */,
    175                                 4DF7500808A103AD007B0D70 /* Info.tiff */,
    176                                 4D813EB408AA43AC00191DB4 /* Progress.tiff */,
    177                                 4DF7500708A103AD007B0D70 /* Open.tiff */,
    178                                 4DF7500908A103AD007B0D70 /* Remove.tiff */,
    179                                 4DF7500A08A103AD007B0D70 /* Resume.tiff */,
    180                                 4DF7500B08A103AD007B0D70 /* Stop.tiff */,
    181                                 4D6DAAC4090CE00500F43C22 /* RevealOff.tiff */,
    182                                 4D6DAAC5090CE00500F43C22 /* RevealOn.tiff */,
     181                                4DF7500808A103AD007B0D70 /* Info.png */,
     182                                4D813EB408AA43AC00191DB4 /* Progress.png */,
     183                                4DF7500708A103AD007B0D70 /* Open.png */,
     184                                4DF7500908A103AD007B0D70 /* Remove.png */,
     185                                4D6DAAC4090CE00500F43C22 /* RevealOff.png */,
     186                                4D6DAAC5090CE00500F43C22 /* RevealOn.png */,
     187                                4DA6FDB80911233800450CB1 /* PauseOn.png */,
     188                                4DA6FDB90911233800450CB1 /* PauseOff.png */,
     189                                4DA6FDC3091141AD00450CB1 /* ResumeOff.png */,
     190                                4DA6FDC4091141AD00450CB1 /* ResumeOn.png */,
     191                                4D752E920913C949008EAAD4 /* Preferences.png */,
    183192                                8D1107310486CEB800E47090 /* Info.plist */,
    184193                                089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
     
    257266                                8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */,
    258267                                8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
    259                                 4DF7500C08A103AD007B0D70 /* Open.tiff in Resources */,
    260                                 4DF7500D08A103AD007B0D70 /* Info.tiff in Resources */,
    261                                 4DF7500E08A103AD007B0D70 /* Remove.tiff in Resources */,
    262                                 4DF7500F08A103AD007B0D70 /* Resume.tiff in Resources */,
    263                                 4DF7501008A103AD007B0D70 /* Stop.tiff in Resources */,
    264                                 4D813EB508AA43AC00191DB4 /* Progress.tiff in Resources */,
     268                                4DF7500C08A103AD007B0D70 /* Open.png in Resources */,
     269                                4DF7500D08A103AD007B0D70 /* Info.png in Resources */,
     270                                4DF7500E08A103AD007B0D70 /* Remove.png in Resources */,
     271                                4D813EB508AA43AC00191DB4 /* Progress.png in Resources */,
    265272                                4D2784370905709500687951 /* Transmission.icns in Resources */,
    266273                                4D043A7F090AE979009FEDA8 /* TransmissionDocument.icns in Resources */,
    267                                 4D6DAAC6090CE00500F43C22 /* RevealOff.tiff in Resources */,
    268                                 4D6DAAC7090CE00500F43C22 /* RevealOn.tiff in Resources */,
     274                                4D6DAAC6090CE00500F43C22 /* RevealOff.png in Resources */,
     275                                4D6DAAC7090CE00500F43C22 /* RevealOn.png in Resources */,
     276                                4DA6FDBA0911233800450CB1 /* PauseOn.png in Resources */,
     277                                4DA6FDBB0911233800450CB1 /* PauseOff.png in Resources */,
     278                                4DA6FDC5091141AD00450CB1 /* ResumeOff.png in Resources */,
     279                                4DA6FDC6091141AD00450CB1 /* ResumeOn.png in Resources */,
     280                                4D752E930913C949008EAAD4 /* Preferences.png in Resources */,
    269281                        );
    270282                        runOnlyForDeploymentPostprocessing = 0;
Note: See TracChangeset for help on using the changeset viewer.