You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/konqueror/konq_main.cc

223 lines
8.3 KiB

/* This file is part of the KDE project
Copyright (C) 1998, 1999 Simon Hausmann <hausmann@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 "konq_main.h"
#include "konq_misc.h"
#include "konq_factory.h"
#include "konq_mainwindow.h"
#include "konq_view.h"
#include "konq_settingsxt.h"
#include "KonquerorIface.h"
#include <ktempfile.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kdebug.h>
#include <kcmdlineargs.h>
#include <dcopclient.h>
#include <kimageio.h>
#include <qfile.h>
#include <qwidgetlist.h>
static const KCmdLineOptions options[] =
{
{ "silent", I18N_NOOP("Start without a default window"), 0 },
{ "preload", I18N_NOOP("Preload for later use"), 0 },
{ "profile <profile>", I18N_NOOP("Profile to open"), 0 },
{ "profiles", I18N_NOOP("List available profiles"), 0 },
{ "mimetype <mimetype>", I18N_NOOP("Mimetype to use for this URL (e.g. text/html or inode/directory)"), 0 },
{ "select", I18N_NOOP("For URLs that point to files, opens the directory and selects the file, instead of opening the actual file"), 0 },
{ "+[URL]", I18N_NOOP("Location to open"), 0 },
KCmdLineLastOption
};
extern "C" KDE_EXPORT int kdemain( int argc, char **argv )
{
KCmdLineArgs::init( argc, argv, KonqFactory::aboutData() );
KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
KCmdLineArgs::addTempFileOption();
KonquerorApplication app;
app.dcopClient()->registerAs( "konqueror" );
KonquerorIface *kiface = new KonquerorIface;
app.dcopClient()->setDefaultObject( kiface->objId() );
KGlobal::locale()->insertCatalogue("libkonq"); // needed for apps using libkonq
KImageIO::registerFormats();
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
KTempFile crashlog_file(locateLocal("tmp", "konqueror-crash-"), ".log");
KonqMainWindow::s_crashlog_file = crashlog_file.file();
if ( kapp->isRestored() )
{
int n = 1;
while ( KonqMainWindow::canBeRestored( n ) )
{
QString className = KMainWindow::classNameOfToplevel( n );
if( className == QString::fromLatin1( "KonqMainWindow" ))
(new KonqMainWindow( KURL(), false ) )->restore( n );
else
kdWarning() << "Unknown class " << className << " in session saved data!" << endl;
n++;
}
}
else
{
if (args->isSet("profiles"))
{
QStringList profiles = KGlobal::dirs()->findAllResources("data", "konqueror/profiles/*", false, true);
profiles.sort();
for(QStringList::ConstIterator it = profiles.begin();
it != profiles.end(); ++it)
{
QString file = *it;
file = file.mid(file.findRev('/')+1);
printf("%s\n", QFile::encodeName(file).data());
}
return 0;
}
if (args->isSet("profile"))
{
QString profile = QString::fromLocal8Bit(args->getOption("profile"));
QString profilePath = profile;
if (profile[0] != '/')
profilePath = locate( "data", QString::fromLatin1("konqueror/profiles/")+profile );
QString url;
QStringList filesToSelect;
if (args->count() == 1)
url = QString::fromLocal8Bit(args->arg(0));
KURL kurl(url);
KParts::URLArgs urlargs;
if (args->isSet("mimetype"))
urlargs.serviceType = QString::fromLocal8Bit(args->getOption("mimetype"));
if (args->isSet("select")) {
QString fn = kurl.fileName(false);
if( !fn.isEmpty() ){
filesToSelect += fn;
kurl.setFileName("");
}
}
kdDebug(1202) << "main() -> createBrowserWindowFromProfile servicetype=" << urlargs.serviceType << endl;
KonqMisc::createBrowserWindowFromProfile( profilePath, profile, kurl, urlargs, false, filesToSelect );
}
else
{
if (args->count() == 0)
{
if (args->isSet("preload"))
{
if( KonqSettings::maxPreloadCount() > 0 )
{
DCOPRef ref( "kded", "konqy_preloader" );
if( !ref.callExt( "registerPreloadedKonqy", DCOPRef::NoEventLoop, 5000,
app.dcopClient()->appId(), qt_xscreen()))
return 0; // too many preloaded or failed
KonqMainWindow* win = new KonqMainWindow( KURL(), false ); // prepare an empty window too
// KonqMainWindow ctor sets always the preloaded flag to false, so create the window before this
KonqMainWindow::setPreloadedFlag( true );
KonqMainWindow::setPreloadedWindow( win );
kdDebug(1202) << "Konqy preloaded :" << app.dcopClient()->appId() << endl;
}
else
{
return 0; // no preloading
}
}
else if (!args->isSet("silent"))
{
// By default try to open in webbrowser mode. People can use "konqueror ." to get a filemanager.
QString profile = "webbrowsing";
QString profilePath = locate( "data", QString::fromLatin1("konqueror/profiles/")+profile );
if ( !profilePath.isEmpty() ) {
KonqMisc::createBrowserWindowFromProfile( profilePath, profile );
} else {
KonqMainWindow *mainWindow = new KonqMainWindow;
mainWindow->show();
}
}
kdDebug(1202) << "main() -> no args" << endl;
}
else
{
KURL::List urlList;
KonqMainWindow * mainwin = 0L;
for ( int i = 0; i < args->count(); i++ )
{
// KonqMisc::konqFilteredURL doesn't cope with local files... A bit of hackery below
KURL url = args->url(i);
KURL urlToOpen;
QStringList filesToSelect;
if (url.isLocalFile() && QFile::exists(url.path())) // "konqueror index.html"
urlToOpen = url;
else
urlToOpen = KURL( KonqMisc::konqFilteredURL(0L, QString::fromLocal8Bit(args->arg(i))) ); // "konqueror slashdot.org"
if ( !mainwin ) {
KParts::URLArgs urlargs;
if (args->isSet("mimetype"))
{
urlargs.serviceType = QString::fromLocal8Bit(args->getOption("mimetype"));
kdDebug(1202) << "main() : setting serviceType to " << urlargs.serviceType << endl;
}
if (args->isSet("select"))
{
QString fn = urlToOpen.fileName(false);
if( !fn.isEmpty() ){
filesToSelect += fn;
urlToOpen.setFileName("");
}
}
const bool tempFile = KCmdLineArgs::isTempFileSet();
mainwin = KonqMisc::createNewWindow( urlToOpen, urlargs, false, filesToSelect, tempFile );
} else
urlList += urlToOpen;
}
if ( mainwin )
mainwin->openMultiURL( urlList );
}
}
}
args->clear();
app.exec();
// Delete all KonqMainWindows, so that we don't have
// any parts loaded when KLibLoader::cleanUp is called.
// Their deletion was postponed in their event()
// (and Qt doesn't delete WDestructiveClose widgets on exit anyway :( )
while( KonqMainWindow::mainWindowList() != NULL )
{ // the list will be deleted by last KonqMainWindow
delete KonqMainWindow::mainWindowList()->first();
}
delete kiface;
crashlog_file.unlink();
return 0;
}