/* This file is part of the KDE project Copyright (C) 1998, 1999 Torben Weis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "konq_run.h" #include "konq_view.h" #include #include #include #include #include #define HINT_UTF8 106 KonqRun::KonqRun( KonqMainWindow* mainWindow, KonqView *_childView, const KURL & _url, const KonqOpenURLRequest & req, bool trustedSource ) : KParts::BrowserRun( _url, req.args, _childView ? _childView->part() : 0L, mainWindow, //remove referrer if request was typed in manually. // ### TODO: turn this off optionally. !req.typedURL.isEmpty(), trustedSource, // Don't use inline errors on reloading due to auto-refresh sites, but use them in all other cases // (no reload or user-requested reload) !req.args.reload || req.userRequestedReload ), m_pMainWindow( mainWindow ), m_pView( _childView ), m_bFoundMimeType( false ), m_req( req ) { //kdDebug(1202) << "KonqRun::KonqRun() " << this << endl; assert( !m_pMainWindow.isNull() ); if (m_pView) m_pView->setLoading(true); } KonqRun::~KonqRun() { //kdDebug(1202) << "KonqRun::~KonqRun() " << this << endl; if (m_pView && m_pView->run() == this) m_pView->setRun(0L); } void KonqRun::foundMimeType( const TQString & _type ) { //kdDebug(1202) << "KonqRun::foundMimeType " << _type << " m_req=" << m_req.debug() << endl; TQString mimeType = _type; // this ref comes from the job, we lose it when using KIO again m_bFoundMimeType = true; if (m_pView) m_pView->setLoading(false); // first phase finished, don't confuse KonqView // Check if the main window wasn't deleted meanwhile if( !m_pMainWindow ) { m_bFinished = true; m_bFault = true; m_timer.start( 0, true ); return; } // Grab the args back from BrowserRun m_req.args = m_args; bool tryEmbed = true; // One case where we shouldn't try to embed, is when the server asks us to save if ( serverSuggestsSave() ) tryEmbed = false; if ( KonqMainWindow::isMimeTypeAssociatedWithSelf( mimeType ) ) m_req.forceAutoEmbed = true; if ( tryEmbed ) m_bFinished = m_pMainWindow->openView( mimeType, m_strURL, m_pView, m_req ); if ( m_bFinished ) { m_pMainWindow = 0L; m_timer.start( 0, true ); return; } // If we were following another view, do nothing if opening didn't work. if ( m_req.followMode ) m_bFinished = true; if ( !m_bFinished ) { // If we couldn't embed the mimetype, call BrowserRun::handleNonEmbeddable() KParts::BrowserRun::NonEmbeddableResult res = handleNonEmbeddable( mimeType ); if ( res == KParts::BrowserRun::Delayed ) return; m_bFinished = ( res == KParts::BrowserRun::Handled ); if (!m_bFinished && !tryEmbed) // Open selected for a serverSuggestsSave() file m_bFinished = m_pMainWindow->openView( mimeType, m_strURL, m_pView, m_req ); } // make Konqueror think there was an error, in order to stop the spinning wheel // (we saved, canceled, or we're starting another app... in any case the current view should stop loading). m_bFault = true; if ( !m_bFinished && // only if we're going to open KonqMainWindow::isMimeTypeAssociatedWithSelf( mimeType ) ) { KMessageBox::error( m_pMainWindow, i18n( "There appears to be a configuration error. You have associated Konqueror with %1, but it cannot handle this file type." ).arg( mimeType ) ); m_bFinished = true; } if ( m_bFinished ) { m_pMainWindow = 0L; m_timer.start( 0, true ); return; } kdDebug(1202) << "Nothing special to do in KonqRun, falling back to KRun" << endl; KRun::foundMimeType( mimeType ); } void KonqRun::handleError( KIO::Job *job ) { kdDebug(1202) << "KonqRun::handleError error:" << job->errorString() << endl; if (!m_mailto.isEmpty()) { m_job = 0; m_bFinished = true; m_timer.start( 0, true ); return; } KParts::BrowserRun::handleError( job ); } void KonqRun::init() { KParts::BrowserRun::init(); // Maybe init went to the "let's try stat'ing" part. Then connect to info messages. // (in case it goes to scanFile, this will be done below) KIO::StatJob *job = dynamic_cast( m_job ); if ( job && !job->error() && m_pView ) { connect( job, TQT_SIGNAL( infoMessage( KIO::Job*, const TQString& ) ), m_pView, TQT_SLOT( slotInfoMessage(KIO::Job*, const TQString& ) ) ); } } void KonqRun::scanFile() { KParts::BrowserRun::scanFile(); // could be a static cast as of now, but who would notify when // BrowserRun changes KIO::TransferJob *job = dynamic_cast( m_job ); if ( job && !job->error() ) { connect( job, TQT_SIGNAL( redirection( KIO::Job *, const KURL& )), TQT_SLOT( slotRedirection( KIO::Job *, const KURL& ) )); if ( m_pView && m_pView->service()->desktopEntryName() != "konq_sidebartng") { connect( job, TQT_SIGNAL( infoMessage( KIO::Job*, const TQString& ) ), m_pView, TQT_SLOT( slotInfoMessage(KIO::Job*, const TQString& ) ) ); } } } void KonqRun::slotRedirection( KIO::Job *job, const KURL& redirectedToURL ) { KURL redirectFromURL = static_cast(job)->url(); kdDebug(1202) << "KonqRun::slotRedirection from " << redirectFromURL.prettyURL() << " to " << redirectedToURL.prettyURL() << endl; KonqHistoryManager::kself()->confirmPending( redirectFromURL ); if (redirectedToURL.protocol() == "mailto") { m_mailto = redirectedToURL; return; // Error will follow } KonqHistoryManager::kself()->addPending( redirectedToURL ); // Do not post data on reload if we were redirected to a new URL when // doing a POST request. if (redirectFromURL != redirectedToURL) m_args.setDoPost (false); m_args.setRedirectedRequest(true); } #include "konq_run.moc"