summaryrefslogtreecommitdiffstats
path: root/konqueror/konq_run.cc
diff options
context:
space:
mode:
Diffstat (limited to 'konqueror/konq_run.cc')
-rw-r--r--konqueror/konq_run.cc195
1 files changed, 195 insertions, 0 deletions
diff --git a/konqueror/konq_run.cc b/konqueror/konq_run.cc
new file mode 100644
index 000000000..96256f8c3
--- /dev/null
+++ b/konqueror/konq_run.cc
@@ -0,0 +1,195 @@
+/* This file is part of the KDE project
+ Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
+
+ 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 <kdebug.h>
+
+#include "konq_run.h"
+#include "konq_view.h"
+#include <kuserprofile.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <konq_historymgr.h>
+
+#include <assert.h>
+
+#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 QString & _type )
+{
+ //kdDebug(1202) << "KonqRun::foundMimeType " << _type << " m_req=" << m_req.debug() << endl;
+
+ QString 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<KIO::StatJob*>( m_job );
+ if ( job && !job->error() && m_pView ) {
+ connect( job, SIGNAL( infoMessage( KIO::Job*, const QString& ) ),
+ m_pView, SLOT( slotInfoMessage(KIO::Job*, const QString& ) ) );
+ }
+}
+
+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<KIO::TransferJob*>( m_job );
+ if ( job && !job->error() ) {
+ connect( job, SIGNAL( redirection( KIO::Job *, const KURL& )),
+ SLOT( slotRedirection( KIO::Job *, const KURL& ) ));
+ if ( m_pView && m_pView->service()->desktopEntryName() != "konq_sidebartng") {
+ connect( job, SIGNAL( infoMessage( KIO::Job*, const QString& ) ),
+ m_pView, SLOT( slotInfoMessage(KIO::Job*, const QString& ) ) );
+ }
+ }
+}
+
+void KonqRun::slotRedirection( KIO::Job *job, const KURL& redirectedToURL )
+{
+ KURL redirectFromURL = static_cast<KIO::TransferJob *>(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"