void tr_upnpPulse( tr_upnp_t * upnp ) { tr_upnp_device_t ** ii; tr_lockLock( &upnp->lock ); if( upnp->active ) { /* pulse on all known devices */ upnp->discovering = 1; for( ii = &upnp->devices; NULL != *ii; ii = &(*ii)->next ) { if( devicePulse( *ii, upnp->fdlimit, upnp->port ) ) { upnp->discovering = 0; } } /* send an SSDP discover message */ if( upnp->discovering && upnp->lastdelay + upnp->lastdiscover < tr_date() ) { upnp->outfd = sendSSDP( upnp->fdlimit, upnp->outfd ); upnp->lastdiscover = tr_date(); upnp->lastdelay = MIN( upnp->lastdelay * 2, SSDP_MAX_DELAY ); } /* try to receive SSDP messages */ watchSSDP( &upnp->devices, upnp->infd ); if( watchSSDP( &upnp->devices, upnp->outfd ) ) { killSock( upnp->fdlimit, &upnp->outfd ); } } else { /* delete all mappings then delete devices */ ii = &upnp->devices; while( NULL != *ii ) { if( deviceStop( *ii ) ) { deviceRemove( ii, upnp->fdlimit ); } else { devicePulse( *ii, upnp->fdlimit, 0 ); ii = &(*ii)->next; } } } tr_lockUnlock( &upnp->lock ); }
void Engine::onDeviceStop() { emit deviceStop(); }