///////////////////////////////////////////////////////////////////////////// /// CLASS PodcastFetcher /// @note Allows us to download podcasts from any enclosure, even the weird ones, with decent filenames.. //////////////////////////////////////////////////////////////////////////// PodcastFetcher::PodcastFetcher( QString url, const KURL &directory ): m_directory ( directory ), m_url( QUrl( url )) { m_http = new QHttp( m_url.host() ); m_redirected = false; QObject::connect(m_http, SIGNAL( responseHeaderReceived ( const QHttpResponseHeader & ) ), this, SLOT( slotResponseReceived( const QHttpResponseHeader & ) ) ); QObject::connect(m_http, SIGNAL(done( bool )), this, SLOT(slotDone( bool ))); fetch( ); } void PodcastFetcher::fetch() { DEBUG_BLOCK KURL filepath = m_directory; debug() << "filename = " << m_url.fileName() << endl; filepath.addPath( m_url.fileName() ); m_file = new QFile( filepath.path() ); if( m_file != 0 ) debug() << "QFile = " << m_file->name() << endl; else debug() << "BUG: m_file == NULL" << endl; if ( m_file->exists() ) { emit result( 0 ); debug() << m_file->name() << " exists, aborting download" << endl; return; } debug() << "get( http://"<< m_url.host() << m_url.encodedPathAndQuery() << " )" << endl; m_http->get( m_url.encodedPathAndQuery(), m_file ); if ( m_http->error() ) debug() << m_http->errorString() << endl; } void PodcastFetcher::kill() { m_http->abort(); m_http->clearPendingRequests(); m_http->closeConnection(); if( m_file && m_file->exists() ) m_file->remove(); } void PodcastFetcher::slotResponseReceived( const QHttpResponseHeader & resp ) { DEBUG_BLOCK debug() << "RESPONCE, statuscode = " << resp.statusCode() << endl; if( resp.statusCode() == 302 ) { if (resp.hasKey( "location" ) ) { QString oldHost = m_url.host(); m_url = QUrl( resp.value( "location" ) ); if( m_url.host() != oldHost ) m_http->setHost( m_url.host() ); debug() << "m_redirected to " << m_url.toString( ) <remove() ) delete m_file; else debug() << "BUG in PodcastFetcher::responceReceived(): could not remove m_file " << m_file->name() << endl; } m_redirected = true; } } else if (resp.statusCode() == 200 ) { debug() << "filename = " << m_url.fileName() << endl; } } void PodcastFetcher::slotDone( bool error ) { DEBUG_BLOCK if ( m_redirected ) { m_redirected = false; fetch(); } else if ( !error ) { debug() << "downloaded to " << m_file->name() << endl; } else debug() << "ERROR: " << " errorstring = " << m_http->errorString() << endl; emit result( m_http->error() ); }