Add a new interface to make the public port available to the frontend.

This commit is contained in:
Josh Elsasser 2007-02-06 04:26:40 +00:00
parent b2fb0bbf3c
commit f67ad8cf47
10 changed files with 52 additions and 27 deletions

View File

@ -65,9 +65,10 @@ static void sigHandler ( int signal );
int main( int argc, char ** argv )
{
int i, error, nat;
int i, error;
tr_handle_t * h;
tr_stat_t * s;
tr_handle_status_t * hstat;
printf( "Transmission %s (%d) - http://transmission.m0k.org/\n\n",
VERSION_STRING, VERSION_REVISION );
@ -240,8 +241,8 @@ int main( int argc, char ** argv )
tr_natTraversalEnable( h, 0 );
for( i = 0; i < 10; i++ )
{
nat = tr_natTraversalStatus( h );
if( TR_NAT_TRAVERSAL_DISABLED == nat )
hstat = tr_handleStatus( h );
if( TR_NAT_TRAVERSAL_DISABLED == hstat->natTraversalStatus )
{
/* Port mappings were deleted */
break;

View File

@ -297,7 +297,7 @@ makeprefwindow(GtkWindow *parent, TrBackend *back) {
ii++;
/* NAT traversal checkbox */
intval = tr_natTraversalStatus(tr_backend_handle(back));
intval = tr_handleStatus(tr_backend_handle(back))->natTraversalStatus;
boolval = !TR_NAT_TRAVERSAL_IS_DISABLED( intval );
setupprefwidget(natcheck, PREF_NAT, boolval);
gtk_table_attach_defaults(GTK_TABLE(table), natcheck, 0, 2, RN(ii));

View File

@ -540,13 +540,15 @@ winclose(GtkWidget *widget SHUTUP, GdkEvent *event SHUTUP, gpointer gdata) {
gboolean
exitcheck(gpointer gdata) {
struct exitdata *data = gdata;
int natstat = tr_natTraversalStatus(tr_backend_handle(data->cbdata->back));
tr_handle_status_t * hstat;
hstat = tr_handleStatus( tr_backend_handle( data->cbdata->back ) );
/* keep going if we haven't hit the exit timeout and
we either have torrents left or nat traversal is stopping */
if( time( NULL ) - data->started < TRACKER_EXIT_TIMEOUT &&
( !tr_backend_torrents_stopped( data->cbdata->back ) ||
TR_NAT_TRAVERSAL_DISABLED != natstat ) ) {
TR_NAT_TRAVERSAL_DISABLED != hstat->natTraversalStatus ) ) {
updatemodel(data->cbdata);
return TRUE;
}

View File

@ -218,6 +218,9 @@ struct tr_handle_s
char id[21];
char key[21];
tr_handle_status_t stats[2];
int statCur;
};
#endif

View File

@ -190,7 +190,7 @@ int tr_sharedGetPublicPort( tr_shared_t * s )
}
/***********************************************************************
* tr_sharedTraversalEnable, tr_natTraversalStatus
* tr_sharedTraversalEnable, tr_sharedTraversalStatus
***********************************************************************
*
**********************************************************************/

View File

@ -54,7 +54,7 @@ void tr_sharedSetPort ( tr_shared_t *, int port );
int tr_sharedGetPublicPort ( tr_shared_t * s );
/***********************************************************************
* tr_sharedTraversalEnable, tr_natTraversalStatus
* tr_sharedTraversalEnable, tr_sharedTraversalStatus
***********************************************************************
*
**********************************************************************/

View File

@ -86,9 +86,21 @@ void tr_natTraversalEnable( tr_handle_t * h, int enable )
tr_sharedTraversalEnable( h->shared, enable );
}
int tr_natTraversalStatus( tr_handle_t * h )
tr_handle_status_t * tr_handleStatus( tr_handle_t * h )
{
return tr_sharedTraversalStatus( h->shared );
tr_handle_status_t * s;
h->statCur = ( h->statCur + 1 ) % 2;
s = &h->stats[h->statCur];
tr_sharedLock( h->shared );
s->natTraversalStatus = tr_sharedTraversalStatus( h->shared );
s->publicPort = tr_sharedGetPublicPort( h->shared );
tr_sharedUnlock( h->shared );
return s;
}
void tr_setGlobalUploadLimit( tr_handle_t * h, int limit )

View File

@ -131,19 +131,12 @@ void tr_setBindPort( tr_handle_t *, int );
void tr_natTraversalEnable( tr_handle_t *, int enable );
/***********************************************************************
* tr_natTraversalStatus
* tr_handleStatus
***********************************************************************
* Return the status of NAT traversal
* Returns some status info for the given handle.
**********************************************************************/
#define TR_NAT_TRAVERSAL_MAPPING 1
#define TR_NAT_TRAVERSAL_MAPPED 2
#define TR_NAT_TRAVERSAL_NOTFOUND 3
#define TR_NAT_TRAVERSAL_ERROR 4
#define TR_NAT_TRAVERSAL_UNMAPPING 5
#define TR_NAT_TRAVERSAL_DISABLED 6
#define TR_NAT_TRAVERSAL_IS_DISABLED( st ) \
( TR_NAT_TRAVERSAL_DISABLED == (st) || TR_NAT_TRAVERSAL_UNMAPPING == (st) )
int tr_natTraversalStatus( tr_handle_t * );
typedef struct tr_handle_status_s tr_handle_status_t;
tr_handle_status_t * tr_handleStatus( tr_handle_t * );
/***********************************************************************
* tr_setGlobalUploadLimit
@ -445,6 +438,20 @@ struct tr_tracker_info_s
char * announce;
};
struct tr_handle_status_s
{
#define TR_NAT_TRAVERSAL_MAPPING 1
#define TR_NAT_TRAVERSAL_MAPPED 2
#define TR_NAT_TRAVERSAL_NOTFOUND 3
#define TR_NAT_TRAVERSAL_ERROR 4
#define TR_NAT_TRAVERSAL_UNMAPPING 5
#define TR_NAT_TRAVERSAL_DISABLED 6
#define TR_NAT_TRAVERSAL_IS_DISABLED( st ) \
( TR_NAT_TRAVERSAL_DISABLED == (st) || TR_NAT_TRAVERSAL_UNMAPPING == (st) )
int natTraversalStatus;
int publicPort;
};
#ifdef __TRANSMISSION__
# include "internal.h"
#endif

View File

@ -485,7 +485,7 @@ static void sleepCallBack(void * controller, io_service_t y, natural_t messageTy
enumerator = [fTorrents objectEnumerator];
Torrent * torrent;
while (!timeUp && ((torrent = [enumerator nextObject]) || tr_natTraversalStatus(fLib) != TR_NAT_TRAVERSAL_DISABLED))
while (!timeUp && ((torrent = [enumerator nextObject]) || tr_handleStatus(fLib)->natTraversalStatus != TR_NAT_TRAVERSAL_DISABLED))
while (![torrent isPaused] && !(timeUp = [start timeIntervalSinceNow] < -5.0))
{
usleep(100000);

View File

@ -299,18 +299,18 @@
- (void) updateNatStatus
{
int status = tr_natTraversalStatus(fHandle);
if (fNatStatus == status)
tr_handle_status_t * hstat = tr_handleStatus(fHandle);
if (fNatStatus == hstat->natTraversalStatus)
return;
fNatStatus = status;
fNatStatus = hstat->natTraversalStatus;
if (status == 2)
if (hstat->natTraversalStatus == TR_NAT_TRAVERSAL_MAPPED)
{
[fNatStatusField setStringValue: NSLocalizedString(@"Port successfully mapped",
"Preferences -> Network -> port map status")];
[fNatStatusImage setImage: [NSImage imageNamed: @"GreenDot.tiff"]];
}
else if (status == 3 || status == 4)
else if (hstat->natTraversalStatus == TR_NAT_TRAVERSAL_NOTFOUND || hstat->natTraversalStatus == TR_NAT_TRAVERSAL_ERROR)
{
[fNatStatusField setStringValue: NSLocalizedString(@"Error mapping port",
"Preferences -> Network -> port map status")];