/* ============================================================ * * This file is a part of the rekonq project * * Copyright (C) 2009 by Andrea Diamantini * * 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) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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. If not, see . * * ============================================================ */ // Self Includes #include "protocolhandler.h" // Local Includes #include "newtabpage.h" #include "application.h" #include "mainwindow.h" #include "mainview.h" #include "urlbar.h" #include "historymanager.h" // KDE Includes #include #include #include #include #include #include #include #include #include #include #include #include // Qt Includes #include #include #include #include #include #include ProtocolHandler::ProtocolHandler(QObject *parent) : QObject(parent) , _lister(new KDirLister) , _frame(0) { connect( _lister, SIGNAL(newItems(const KFileItemList &)), this, SLOT(showResults(const KFileItemList &))); } ProtocolHandler::~ProtocolHandler() { } bool ProtocolHandler::handle(const QNetworkRequest &request, QWebFrame *frame) { _url = request.url(); _frame = frame; // "mailto" handling if ( _url.protocol() == QLatin1String("mailto") ) { KToolInvocation::invokeMailer(_url); return true; } // "about" handling if ( _url.protocol() == QLatin1String("about") ) { if( _url == KUrl("about:closedTabs") || _url == KUrl("about:history") || _url == KUrl("about:bookmarks") || _url == KUrl("about:favorites") || _url == KUrl("about:home") ) { NewTabPage p(frame); p.generate(_url); return true; } } // "ftp" handling. A little bit "hard" handling this. Hope I found // the best solution. // My idea is: webkit cannot handle in any way ftp. So we have surely to return true here. // We start trying to guess what the url represent: it's a dir? show its contents (and download them). // it's a file? download it. It's another thing? beat me, but I don't know what to do... if( _url.protocol() == QLatin1String("ftp") ) { KIO::StatJob *job = KIO::stat(_url); connect(job, SIGNAL(result(KJob*)), this, SLOT( slotMostLocalUrlResult(KJob*) )); return true; } // "file" handling. This is quite trivial :) if(_url.protocol() == QLatin1String("file") ) { QFileInfo fileInfo( _url.path() ); if(fileInfo.isDir()) { _lister->openUrl(_url); return true; } } return false; } QString ProtocolHandler::dirHandling(const KFileItemList &list) { KFileItem mainItem = _lister->rootItem(); KUrl rootUrl = mainItem.url(); if (mainItem.isNull()) { QString errStr = i18n("Error opening: %1: No such file or directory", rootUrl.prettyUrl() ); return errStr; } if (!mainItem.isReadable()) { QString errStr = i18n("Unable to read %1", rootUrl.prettyUrl() ); return errStr; } // display "rekonq info" page QString infoFilePath = KStandardDirs::locate("data", "rekonq/htmls/rekonqinfo.html"); QFile file(infoFilePath); bool isOpened = file.open(QIODevice::ReadOnly); if (!isOpened) { return QString("rekonq error, sorry :("); } QString title = _url.prettyUrl(); QString msg = "

" + i18n("Index of ") + _url.prettyUrl() + "

"; if(rootUrl.cd("..")) { QString path = rootUrl.prettyUrl(); QString uparrow = KIconLoader::global()->iconPath( "arrow-up", KIconLoader::Small ); msg += "\"up-arrow\""; msg += "" + i18n("Up to higher level directory") + "

"; } msg += ""; msg += ""; foreach(const KFileItem &item, list) { msg += ""; QString fullPath = item.url().prettyUrl(); QString iconName = item.iconName(); QString icon = QString("file://") + KIconLoader::global()->iconPath( iconName, KIconLoader::Small ); msg += ""; msg += ""; msg += ""; msg += ""; } msg += "
" + i18n("Name") + "" + i18n("Size") + "" + i18n("Last Modified") + "
"; msg += "\"" "; msg += "" + item.name() + ""; msg += ""; if(item.isFile()) { msg += QString::number( item.size()/1024 ) + " KB"; } msg += ""; msg += item.timeString(); msg += "
"; QString html = QString(QLatin1String(file.readAll())) .arg(title) .arg(msg) ; return html; } void ProtocolHandler::showResults(const KFileItemList &list) { if(_lister->rootItem().isFile()) { WebPage *page = qobject_cast( _frame->page() ); page->downloadUrl( _lister->rootItem().url() ); return; } if ( list.isEmpty() ) return; QString html = dirHandling(list); _frame->setHtml(html); Application::instance()->mainWindow()->mainView()->urlBar()->setUrl(_url); Application::historyManager()->addHistoryEntry( _url.prettyUrl() ); } void ProtocolHandler::slotMostLocalUrlResult(KJob *job) { if(job->error()) { // TODO kDebug() << "error"; } else { KIO::StatJob *statJob = static_cast(job); KIO::UDSEntry entry = statJob->statResult(); if( entry.isDir() ) _lister->openUrl(_url); else emit downloadUrl(_url); } }