diff --git a/libtransmission/transmission.c b/libtransmission/transmission.c index cbbb3d724..d52ff5e0c 100644 --- a/libtransmission/transmission.c +++ b/libtransmission/transmission.c @@ -434,15 +434,9 @@ tr_stat_t * tr_torrentStat( tr_torrent_t * tor ) s->peersDownloading = 0; tr_peer_t * peer; - s->peers = (tr_peer_stat_t *) calloc( tor->peerCount, sizeof( tr_peer_stat_t ) ); - for( i = 0; i < tor->peerCount; i++ ) { peer = tor->peers[i]; - - s->peers[i].client = tr_clientForId(tr_peerId(peer)); - s->peers[i].isDownloading = tr_peerIsDownloading(peer); - s->peers[i].isUploading = tr_peerIsUploading(peer); if( tr_peerIsConnected( peer ) ) { @@ -490,6 +484,33 @@ tr_stat_t * tr_torrentStat( tr_torrent_t * tor ) return s; } +tr_peer_stat_t * tr_torrentPeers( tr_torrent_t * tor, int * peerCount ) +{ + *peerCount = tor->peerCount; + + tr_peer_stat_t * peers = (tr_peer_stat_t *) calloc( tor->peerCount, sizeof( tr_peer_stat_t ) ); + if (peers != NULL) + { + tr_peer_t * peer; + int i = 0; + for( i = 0; i < tor->peerCount; i++ ) + { + peer = tor->peers[i]; + + peers[i].client = tr_clientForId(tr_peerId(peer)); + peers[i].isDownloading = tr_peerIsDownloading(peer); + peers[i].isUploading = tr_peerIsUploading(peer); + } + } + + return peers; +} + +void tr_torrentPeersFree( tr_peer_stat_t * peers ) +{ + free( peers ); +} + void tr_torrentAvailability( tr_torrent_t * tor, int8_t * tab, int size ) { int i, j, piece; diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 04538f384..56378e45c 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -210,6 +210,13 @@ int tr_getFinished( tr_torrent_t * ); typedef struct tr_stat_s tr_stat_t; tr_stat_t * tr_torrentStat( tr_torrent_t * ); +/*********************************************************************** + * tr_torrentPeers + ***********************************************************************/ +typedef struct tr_peer_stat_s tr_peer_stat_t; +tr_peer_stat_t * tr_torrentPeers( tr_torrent_t *, int * peerCount ); +void tr_torrentPeersFree( tr_peer_stat_t * ); + /*********************************************************************** * tr_torrentAvailability *********************************************************************** @@ -279,14 +286,6 @@ struct tr_info_s /*********************************************************************** * tr_stat_s **********************************************************************/ -typedef struct tr_peer_stat_s -{ - char * client; - - int isDownloading; - int isUploading; -} -tr_peer_stat_t; struct tr_stat_s { #define TR_STATUS_CHECK 0x001 /* Checking files */ @@ -311,7 +310,6 @@ struct tr_stat_s float rateUpload; int eta; int peersTotal; - tr_peer_stat_t * peers; int peersUploading; int peersDownloading; int seeders; @@ -321,6 +319,14 @@ struct tr_stat_s uint64_t uploaded; }; +struct tr_peer_stat_s +{ + char * client; + + int isDownloading; + int isUploading; +}; + #ifdef __TRANSMISSION__ # include "internal.h" #endif diff --git a/macosx/Torrent.m b/macosx/Torrent.m index dda170df4..51f100821 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -517,22 +517,24 @@ - (NSArray *) peers { - int totalPeers = [self totalPeers], i; + int totalPeers, i; + + tr_peer_stat_t * peers = tr_torrentPeers(fHandle, & totalPeers); tr_peer_stat_t peer; - NSMutableArray * peers = [NSMutableArray arrayWithCapacity: totalPeers]; + NSMutableArray * peerDics = [NSMutableArray arrayWithCapacity: totalPeers]; for (i = 0; i < totalPeers; i++) { - peer = fStat->peers[i]; + peer = peers[i]; - [peers addObject: [NSDictionary dictionaryWithObjectsAndKeys: + [peerDics addObject: [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithCString: (char *) peer.client encoding: NSUTF8StringEncoding], @"Client", [NSNumber numberWithBool: peer.isDownloading], @"UL To", [NSNumber numberWithBool: peer.isUploading], @"DL From", nil]]; } //NSLog(@"%d", tr_peerId(peer)); - return peers; + return peerDics; } - (NSString *) progressString