Changeset 2
- Timestamp:
- Jan 12, 2006, 6:20:48 PM (16 years ago)
- Location:
- trunk
- Files:
-
- 12 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Jamfile
r1 r2 16 16 macosx/English.lproj/MainMenu.nib/info.nib 17 17 macosx/English.lproj/MainMenu.nib/keyedobjects.nib 18 macosx/Images/Info. tiff19 macosx/Images/Open. tiff20 macosx/Images/P rogress.tiff21 macosx/Images/ Remove.tiff22 macosx/Images/ Resume.tiff23 macosx/Images/Re vealOff.tiff24 macosx/Images/RevealO n.tiff25 macosx/Images/ Stop.tiff18 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 26 26 macosx/Images/Transmission.icns 27 27 macosx/Images/TransmissionDocument.icns -
trunk/Jamrules
r1 r2 8 8 VERSION_MAJOR = 0 ; 9 9 VERSION_MINOR = 3 ; 10 VERSION_STRING = $(VERSION_MAJOR).$(VERSION_MINOR) ; 10 # VERSION_STRING = $(VERSION_MAJOR).$(VERSION_MINOR) ; 11 VERSION_STRING = 0.4-cvs ; 11 12 12 13 DEFINES += VERSION_MAJOR=$(VERSION_MAJOR) 13 14 VERSION_MINOR=$(VERSION_MINOR) 14 15 VERSION_STRING=\\\"$(VERSION_STRING)\\\" ; 15 CCFLAGS = -g -Wall -W ;16 16 OPTIM = -O3 ; 17 17 RM = rm -Rf ; … … 28 28 # universal binaries) 29 29 RANLIB = ; 30 NOARSCAN = 1 ; 30 31 NOARUPDATE = 1 ; 31 32 actions Archive … … 37 38 { 38 39 Depends $(1) : $(2) ; 40 Depends $(1) : Jamrules ; 39 41 Clean clean : $(1) ; 40 42 } 41 43 actions OSXInfoPlist 42 44 { 45 $(RM) $(1) 43 46 sed "s/%%VERSION%%/$(VERSION_STRING)/" < $(2) > $(1) 44 47 } -
trunk/configure
r1 r2 1 1 #! /bin/sh 2 2 3 # 4 # Functions 5 # 6 usage() 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 18 EOF 19 } 20 21 openssl_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 } 30 EOF 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 # 48 CC="${CC-cc}" 49 CFLAGS="${CFLAGS--g -Wall -W}" 3 50 # For > 2 GB files 4 51 DEFINES="_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE" 5 6 52 # For asprintf 7 53 DEFINES="$DEFINES _GNU_SOURCE" 54 openssl_disable=0 8 55 56 # 57 # Parse options 58 # 59 while [ $# -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 75 done 76 77 # 9 78 # System-specific flags 79 # 10 80 SYSTEM=`uname -s` 11 81 case $SYSTEM in … … 56 126 echo "System: $SYSTEM" 57 127 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 # 131 if [ ${openssl_disable} = 1 ]; then 132 echo "OpenSSL: no, using built-in SHA1 implementation" 133 else 134 openssl_test 135 fi 136 137 # 138 # Generate config.jam 139 # 140 rm -f config.jam 141 cat > config.jam << EOF 142 CC = $CC ; 143 LINK = $CC ; 144 CCFLAGS = $CFLAGS ; 145 DEFINES = $DEFINES ; 146 LINKLIBS = $LINKLIBS ; 66 147 EOF 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" 148 if [ -n "$OPENSSL_PREFIX" ]; then 149 cat >> config.jam << EOF 150 HDRS += $OPENSSL_PREFIX/include ; 151 LINKFLAGS += -L$OPENSSL_PREFIX/lib ; 152 EOF 74 153 fi 75 rm -f testconf.c testconf76 77 # Generate config.jam78 rm -f config.jam79 cat << EOF > config.jam80 DEFINES = $DEFINES ;81 LINKLIBS = $LINKLIBS ;82 EOF83 154 84 155 echo -
trunk/libtransmission/fastresume.h
r1 r2 31 31 * been completed or started in each slot 32 32 * 33 * The resume file is located in ~/.transmission/. Its name is 34 * "resume.<hash>". 33 * The name of the resume file is "resume.<hash>". 35 34 * 36 35 * All values are stored in the native endianness. Moving a … … 40 39 **********************************************************************/ 41 40 42 static char * fastResumeFolderName()43 {44 char * ret;45 asprintf( &ret, "%s/.transmission", getenv( "HOME" ) );46 return ret;47 }48 49 41 static char * fastResumeFileName( tr_io_t * io ) 50 42 { 43 tr_torrent_t * tor = io->tor; 51 44 char * ret, * p; 52 45 int i; 53 46 54 p = fastResumeFolderName(); 55 asprintf( &ret, "%s/resume.%40d", p, 0 ); 56 free( p ); 47 asprintf( &ret, "%s/resume.%40d", tor->prefsDirectory, 0 ); 57 48 58 49 p = &ret[ strlen( ret ) - 2 * SHA_DIGEST_LENGTH ]; … … 122 113 } 123 114 124 /* Create folder if missing */125 path = fastResumeFolderName();126 mkdir( path, 0755 );127 free( path );128 129 115 /* Create/overwrite the resume file */ 130 116 path = fastResumeFileName( io ); … … 136 122 return; 137 123 } 138 free( path );139 124 140 125 /* Write format version */ … … 161 146 162 147 fclose( file ); 148 149 tr_dbg( "Resume file '%s' written", path ); 150 free( path ); 163 151 } 164 152 … … 185 173 return 1; 186 174 } 175 tr_dbg( "Resume file '%s' loaded", path ); 187 176 free( path ); 188 177 -
trunk/libtransmission/internal.h
r1 r2 156 156 tr_tracker_t * tracker; 157 157 tr_io_t * io; 158 uint64_t stopDate; 158 159 159 160 int bindSocket; … … 165 166 uint64_t downloaded[10]; 166 167 uint64_t uploaded[10]; 168 169 char * prefsDirectory; 167 170 }; 168 171 … … 180 183 181 184 char id[21]; 185 char prefsDirectory[256]; 182 186 }; 183 187 -
trunk/libtransmission/peer.c
r1 r2 101 101 #include "peermessages.h" 102 102 #include "peerutils.h" 103 #include "peerparse.h" 103 104 104 105 /*********************************************************************** … … 233 234 } 234 235 236 if( tor->status & TR_STATUS_STOPPING ) 237 { 238 return; 239 } 240 235 241 /* Check for incoming connections */ 236 242 if( tor->bindSocket > -1 && … … 332 338 peer->date = tr_date(); 333 339 peer->pos += ret; 334 if( parse Message( tor, peer, ret ) )340 if( parseBuf( tor, peer, ret ) ) 335 341 { 336 342 goto dropPeer; -
trunk/libtransmission/peermessages.h
r1 r2 21 21 *****************************************************************************/ 22 22 23 /*********************************************************************** 24 * This file handles all outgoing messages 25 **********************************************************************/ 26 23 27 static uint8_t * messagesPending( tr_peer_t * peer, int * size ) 24 28 { -
trunk/libtransmission/peerutils.h
r1 r2 123 123 } 124 124 125 /* TODO: check for bad downloaders */ 126 125 127 #if 0 126 128 /* Choke unchoked peers we are not sending anything to */ … … 161 163 } 162 164 } 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 wrong192 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 else441 {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 sucky472 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 );609 165 610 166 return 0; … … 663 219 * missing less blocks. 664 220 **********************************************************************/ 665 static in t chooseBlock( tr_torrent_t * tor, tr_peer_t * peer )221 static inline int chooseBlock( tr_torrent_t * tor, tr_peer_t * peer ) 666 222 { 667 223 tr_info_t * inf = &tor->info; … … 799 355 { 800 356 /* 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 ) 802 359 { 803 360 block = i; -
trunk/libtransmission/transmission.c
r1 r2 60 60 61 61 h->bindPort = 9090; 62 63 snprintf( h->prefsDirectory, sizeof( h->prefsDirectory ), 64 "%s/.transmission", getenv( "HOME" ) ); 65 mkdir( h->prefsDirectory, 0755 ); 62 66 63 67 return h; 68 } 69 70 /*********************************************************************** 71 * tr_getPrefsDirectory 72 *********************************************************************** 73 * 74 **********************************************************************/ 75 char * tr_getPrefsDirectory( tr_handle_t * h ) 76 { 77 return (char *) h->prefsDirectory; 64 78 } 65 79 … … 185 199 tor->upload = h->upload; 186 200 tor->fdlimit = h->fdlimit; 201 tor->prefsDirectory = (char *) h->prefsDirectory; 187 202 188 203 /* We have a new torrent */ … … 253 268 tr_trackerStopped( tor->tracker ); 254 269 tor->status = TR_STATUS_STOPPING; 270 tor->stopDate = tr_date(); 255 271 tr_lockUnlock( tor->lock ); 256 272 } … … 317 333 tr_lockLock( tor->lock ); 318 334 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 ) ) 320 338 { 321 339 torrentReallyStop( h, i ); … … 479 497 480 498 /* Receive/send messages */ 481 if( !( tor->status & TR_STATUS_STOPPING ) ) 482 { 483 tr_peerPulse( tor ); 484 } 499 tr_peerPulse( tor ); 485 500 486 501 /* Try to get new peers or to send a message to the tracker */ -
trunk/libtransmission/transmission.h
r1 r2 41 41 42 42 /*********************************************************************** 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 **********************************************************************/ 49 char * tr_getPrefsDirectory( tr_handle_t * ); 50 51 /*********************************************************************** 43 52 * tr_setBindPort 44 53 *********************************************************************** -
trunk/macosx/Controller.h
r1 r2 20 20 * DEALINGS IN THE SOFTWARE. 21 21 *****************************************************************************/ 22 23 #ifndef CONTROLLER_H 24 #define CONTROLLER_H 22 25 23 26 #include <Cocoa/Cocoa.h> … … 64 67 contextInfo: (void *) info; 65 68 - (void) stopTorrent: (id) sender; 69 - (void) stopTorrentWithIndex: (int) index; 66 70 - (void) resumeTorrent: (id) sender; 71 - (void) resumeTorrentWithIndex: (int) index; 67 72 - (void) removeTorrent: (id) sender; 68 73 - (void) showInfo: (id) sender; … … 77 82 78 83 @end 84 85 #endif -
trunk/macosx/Controller.m
r1 r2 23 23 #include <IOKit/IOMessage.h> 24 24 25 #include "Controller.h"26 25 #include "NameCell.h" 27 26 #include "ProgressCell.h" … … 29 28 30 29 #define TOOLBAR_OPEN @"Toolbar Open" 31 #define TOOLBAR_RESUME @"Toolbar Resume"32 #define TOOLBAR_STOP @"Toolbar Stop"33 30 #define TOOLBAR_REMOVE @"Toolbar Remove" 31 #define TOOLBAR_PREFS @"Toolbar Preferences" 34 32 #define TOOLBAR_INFO @"Toolbar Info" 35 33 … … 43 41 @implementation Controller 44 42 45 - (void) enableToolbarItem: (NSString *) ident flag: (BOOL) e46 { 47 NSArray * array = [fToolbar items];43 - (void) updateToolbar 44 { 45 NSArray * items; 48 46 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 } 99 63 } 100 64 } … … 119 83 [fWindow setDelegate: self]; 120 84 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 127 85 [fTableView setDataSource: self]; 128 86 [fTableView setDelegate: self]; … … 135 93 progressCell = [[ProgressCell alloc] init]; 136 94 tableColumn = [fTableView tableColumnWithIdentifier: @"Name"]; 95 [nameCell setController: self]; 137 96 [tableColumn setDataCell: nameCell]; 138 97 [tableColumn setMinWidth: 10.0]; … … 144 103 [tableColumn setMaxWidth: 134.0]; 145 104 146 [fTableView sizeToFit]; 105 [fTableView setAutosaveTableColumns: YES]; 106 [fTableView sizeToFit]; 147 107 148 108 [fTableView registerForDraggedTypes: [NSArray arrayWithObjects: … … 209 169 selector: @selector( updateUI: ) userInfo: NULL repeats: YES]; 210 170 [[NSRunLoop currentRunLoop] addTimer: fTimer 211 forMode: NSModalPanelRunLoopMode]; 171 forMode: NSEventTrackingRunLoopMode]; 172 } 173 174 - (void) windowDidResize: (NSNotification *) n 175 { 176 [fTableView sizeToFit]; 212 177 } 213 178 … … 412 377 - (void) resumeTorrent: (id) sender 413 378 { 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]; 416 386 } 417 387 418 388 - (void) stopTorrent: (id) sender 419 389 { 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]; 422 397 } 423 398 … … 490 465 if( [[tableColumn identifier] isEqualToString: @"Name"] ) 491 466 { 492 [(NameCell *) cell setStat: &fStat[rowIndex] ];467 [(NameCell *) cell setStat: &fStat[rowIndex] index: rowIndex]; 493 468 } 494 469 else if( [[tableColumn identifier] isEqualToString: @"Progress"] ) … … 566 541 item = [[NSToolbarItem alloc] initWithItemIdentifier: ident]; 567 542 568 [item setTarget: self];569 570 543 if( [ident isEqualToString: TOOLBAR_OPEN] ) 571 544 { 572 545 [item setLabel: @"Open"]; 573 546 [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: )]; 587 550 } 588 551 else if( [ident isEqualToString: TOOLBAR_REMOVE] ) … … 590 553 [item setLabel: @"Remove"]; 591 554 [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: )]; 593 566 } 594 567 else if( [ident isEqualToString: TOOLBAR_INFO] ) … … 596 569 [item setLabel: @"Info"]; 597 570 [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: )]; 599 574 } 600 575 else … … 609 584 - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) t 610 585 { 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]; 614 589 } 615 590 -
trunk/macosx/NameCell.h
r1 r2 21 21 *****************************************************************************/ 22 22 23 #ifndef NAMECELL_H 24 #define NAMECELL_H 25 23 26 #include <Cocoa/Cocoa.h> 24 27 #include <transmission.h> 28 #include "Controller.h" 25 29 26 30 @interface NameCell : NSCell 27 31 { 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; 31 38 } 32 - (void) setStat: (tr_stat_t *) stat; 39 - (void) setController: (Controller *) controller; 40 - (void) setStat: (tr_stat_t *) stat index: (int) index; 33 41 @end 42 43 #endif -
trunk/macosx/NameCell.m
r1 r2 26 26 @implementation NameCell 27 27 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; 31 37 } 32 38 … … 48 54 nameString = [NSString stringWithFormat: @"%@%@", 49 55 stringFittingInWidth( fStat->info.name, cellFrame.size.width - 50 10- widthForString( sizeString, 12 ), 12 ),56 35 - widthForString( sizeString, 12 ), 12 ), 51 57 sizeString]; 52 58 … … 101 107 peersString = [NSString stringWithFormat: @"%@%@", 102 108 @"Error: ", stringFittingInWidth( fStat->error, 103 cellFrame.size.width - 15-109 cellFrame.size.width - 40 - 104 110 widthForString( @"Error: ", 10 ), 10 )]; 105 111 } … … 119 125 pen.x += 0; pen.y += 15; 120 126 [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 } 121 162 122 163 /* "Reveal in Finder" button */ … … 127 168 if( NSPointInRect( fClickPoint, fRevealRect ) ) 128 169 { 129 revealImage = [NSImage imageNamed: @"RevealOn. tiff"];170 revealImage = [NSImage imageNamed: @"RevealOn.png"]; 130 171 } 131 172 else 132 173 { 133 revealImage = [NSImage imageNamed: @"RevealOff. tiff"];174 revealImage = [NSImage imageNamed: @"RevealOff.png"]; 134 175 } 135 176 pen.x = fRevealRect.origin.x; … … 156 197 inView: (NSView *) v mouseIsUp: (BOOL) flag 157 198 { 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 } 163 229 } 164 230 fClickPoint = NSMakePoint(0,0); -
trunk/macosx/ProgressCell.h
r1 r2 21 21 *****************************************************************************/ 22 22 23 #ifndef PROGRESSCELL_H 24 #define PROGRESSCELL_H 25 23 26 #include <Cocoa/Cocoa.h> 24 27 #include <transmission.h> … … 42 45 - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) view; 43 46 @end 47 48 #endif -
trunk/macosx/ProgressCell.m
r1 r2 82 82 83 83 /* Have a NSBitmapImageRep ready to draw the progression bar */ 84 bgImg = [NSImage imageNamed: @"Progress. tiff"];84 bgImg = [NSImage imageNamed: @"Progress.png"]; 85 85 fBgBmp = [[bgImg representations] objectAtIndex: 0]; 86 86 size = [bgImg size]; -
trunk/macosx/Transmission.xcodeproj/project.pbxproj
r1 r2 14 14 4D2784370905709500687951 /* Transmission.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D2784360905709500687951 /* Transmission.icns */; }; 15 15 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 */; }; 19 24 4DF0C5AB0899190500DD8943 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0C5A90899190500DD8943 /* Controller.m */; }; 20 25 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 */; }; 26 29 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 27 30 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; … … 75 78 4D2784360905709500687951 /* Transmission.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Transmission.icns; path = Images/Transmission.icns; sourceTree = "<group>"; }; 76 79 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>"; }; 80 88 4DF0C5A90899190500DD8943 /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = "<group>"; }; 81 89 4DF0C5AA0899190500DD8943 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = "<group>"; }; 82 90 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>"; }; 88 94 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 89 95 8D1107320486CEB800E47090 /* Transmission.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Transmission.app; sourceTree = BUILT_PRODUCTS_DIR; }; … … 173 179 4D2784360905709500687951 /* Transmission.icns */, 174 180 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 */, 183 192 8D1107310486CEB800E47090 /* Info.plist */, 184 193 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, … … 257 266 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 258 267 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 */, 265 272 4D2784370905709500687951 /* Transmission.icns in Resources */, 266 273 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 */, 269 281 ); 270 282 runOnlyForDeploymentPostprocessing = 0;
Note: See TracChangeset
for help on using the changeset viewer.