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/kdesktop/kwebdesktop/kwebdesktop.cpp

194 lines
6.3 KiB

/* This file is part of the KDE project
Copyright (C) 2000 David Faure <faure@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
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.
*/
// Idea by Gael Duval
// Implementation by David Faure
#include <config.h>
#include <kapplication.h>
#include <kconfig.h>
#include <kdebug.h>
#include <klocale.h>
#include <kcmdlineargs.h>
#include <kaboutdata.h>
#include <kurifilter.h>
#include <kio/job.h>
#include <tqscrollview.h>
#include "kwebdesktop.h"
#include <kmimetype.h>
#include <kparts/componentfactory.h>
#include "kwebdesktopsettings.h"
#include "kwebdesktop.moc"
static KCmdLineOptions options[] =
{
{ "+width", I18N_NOOP("Width of the image to create"), 0 },
{ "+height", I18N_NOOP("Height of the image to create"), 0 },
{ "+file", I18N_NOOP("File sname where to dump the output in png format"), 0 },
{ "+[URL]", I18N_NOOP("URL to open (if not specified, it is read from kwebdesktoprc)"), 0 },
KCmdLineLastOption
};
KWebDesktopRun::KWebDesktopRun( KWebDesktop* webDesktop, const KURL & url )
: m_webDesktop(webDesktop), m_url(url)
{
kdDebug() << "KWebDesktopRun::KWebDesktopRun starting get" << endl;
KIO::Job * job = KIO::get(m_url, false, false);
connect( job, TQT_SIGNAL( result( KIO::Job *)),
this, TQT_SLOT( slotFinished(KIO::Job *)));
connect( job, TQT_SIGNAL( mimetype( KIO::Job *, const TQString &)),
this, TQT_SLOT( slotMimetype(KIO::Job *, const TQString &)));
}
void KWebDesktopRun::slotMimetype( KIO::Job *job, const TQString &_type )
{
KIO::SimpleJob *sjob = static_cast<KIO::SimpleJob *>(job);
// Update our URL in case of a redirection
m_url = sjob->url();
TQString type = _type; // necessary copy if we plan to use it
sjob->putOnHold();
kdDebug() << "slotMimetype : " << type << endl;
KParts::ReadOnlyPart* part = m_webDesktop->createPart( type );
// Now open the URL in the part
if ( part )
part->openURL( m_url );
}
void KWebDesktopRun::slotFinished( KIO::Job * job )
{
// The whole point of all this is to abort silently on error
if (job->error())
{
kdDebug() << job->errorString() << endl;
kapp->exit(1);
}
}
int main( int argc, char **argv )
{
KAboutData data( "kwebdesktop", I18N_NOOP("KDE Web Desktop"),
VERSION,
I18N_NOOP("Displays an HTML page as the background of the desktop"),
KAboutData::License_GPL,
"(c) 2000, David Faure <faure@kde.org>" );
data.addAuthor( "David Faure", I18N_NOOP("developer and maintainer"), "faure@kde.org" );
KCmdLineArgs::init( argc, argv, &data );
KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
KApplication app;
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if ( args->count() != 3 && args->count() != 4 )
{
args->usage();
return 1;
}
const int width = TQCString(args->arg(0)).toInt();
const int height = TQCString(args->arg(1)).toInt();
TQCString imageFile = args->arg(2);
TQString url;
if (args->count() == 4)
url = TQString::fromLocal8Bit(args->arg(3));
KWebDesktop *webDesktop = new KWebDesktop( 0, imageFile, width, height );
if (url.isEmpty())
url = KWebDesktopSettings::uRL();
// Apply uri filter
KURIFilterData uridata = url;
KURIFilter::self()->filterURI( uridata );
KURL u = uridata.uri();
// Now start getting, to ensure mimetype and possible connection
KWebDesktopRun * run = new KWebDesktopRun( webDesktop, u );
int ret = app.exec();
KIO::SimpleJob::removeOnHold(); // Kill any slave that was put on hold.
delete webDesktop;
delete run;
//khtml::Cache::clear();
return ret;
}
void KWebDesktop::slotCompleted()
{
kdDebug() << "KWebDesktop::slotCompleted" << endl;
// Dump image to m_imageFile
TQPixmap snapshot = TQPixmap::grabWidget( m_part->widget() );
snapshot.save( m_imageFile, "PNG" );
// And terminate the app.
kapp->quit();
}
KParts::ReadOnlyPart* KWebDesktop::createPart( const TQString& mimeType )
{
delete m_part;
m_part = 0;
KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
if ( !mime || mime == KMimeType::defaultMimeTypePtr() )
return 0;
if ( mime->is( "text/html" ) || mime->is( "text/xml" ) || mime->is( "application/xhtml+xml" ) )
{
KHTMLPart* htmlPart = new KHTMLPart;
htmlPart->widget()->resize(m_width,m_height);
htmlPart->setMetaRefreshEnabled(false);
htmlPart->setJScriptEnabled(false);
htmlPart->setJavaEnabled(false);
htmlPart->setPluginsEnabled(false);
((TQScrollView *)htmlPart->widget())->setFrameStyle( TQFrame::NoFrame );
((TQScrollView *)htmlPart->widget())->setHScrollBarMode( TQScrollView::AlwaysOff );
((TQScrollView *)htmlPart->widget())->setVScrollBarMode( TQScrollView::AlwaysOff );
connect( htmlPart, TQT_SIGNAL( completed() ), this, TQT_SLOT( slotCompleted() ) );
m_part = htmlPart;
} else {
// Try to find an appropriate viewer component
m_part = KParts::ComponentFactory::createPartInstanceFromQuery<KParts::ReadOnlyPart>
( mimeType, TQString::null, 0, 0, this, 0 );
if ( !m_part )
kdWarning() << "No handler found for " << mimeType << endl;
else {
kdDebug() << "Loaded " << m_part->className() << endl;
connect( m_part, TQT_SIGNAL( completed() ),
this, TQT_SLOT( slotCompleted() ) );
}
}
if ( m_part ) {
connect( m_part, TQT_SIGNAL( canceled(const TQString &) ),
this, TQT_SLOT( slotCompleted() ) );
}
return m_part;
}
KWebDesktop::~KWebDesktop()
{
delete m_part;
}