From 066bae76e94c21604fe4132c4ca26e5b2f0c6375 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Wed, 24 Jul 2013 11:29:03 -0500 Subject: Initial import of knmap 2.1 sources --- src/htmlwidget.cpp | 366 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 src/htmlwidget.cpp (limited to 'src/htmlwidget.cpp') diff --git a/src/htmlwidget.cpp b/src/htmlwidget.cpp new file mode 100644 index 0000000..aea1ff7 --- /dev/null +++ b/src/htmlwidget.cpp @@ -0,0 +1,366 @@ +/*************************************************************************** + * * + * Copyright (C) 2005, 2006 by Kevin Gilbert * + * kev.gilbert@cdu.edu.au * + * * + * 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; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ***************************************************************************/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "htmlwidget.h" +#include "knmap.h" +#include "stylesheetdialog.h" + +const float HTMLWidget::m_zoomIncrement = 25; + +// constructor +// =========== + +HTMLWidget::HTMLWidget( QStringList* stylesheetURLs, QWidget* parent, const char* name ) +: QWidget( parent, name ), + m_dlg( NULL ), + m_process( NULL ), + m_stylesheetURLs( stylesheetURLs ), + m_zoomFactor( 100 ) +{ m_htmlPart = new KHTMLPart( this, "html part" ); + m_htmlPart->setOnlyLocalReferences( true ); +} + +// destructor +// ========== + +HTMLWidget::~HTMLWidget( ) +{ if( m_dlg != NULL ) + delete m_dlg; + + if( m_process != NULL ) + delete m_process; +} + +// gotoAnchor +// ========== + +void HTMLWidget::gotoAnchor( const QString& anchor ) +{ if( !m_htmlPart->gotoAnchor( anchor )) + KMessageBox::sorry( this, i18n( "There does not appear to be ANY help available for the item you requested.\nSorry! Now piss off and stop bothering me.\nYou stink.\nYou've got bad breath.\nYour ugly.\nNobody loves you.\nNow for your bad points..." ), i18n( "No help available in Knmap page" )); +} + +// loadKnmapManPage +// ================ + +void HTMLWidget::loadKnmapManPage( ) +{ if( !tryKnmapFile( )) + { m_htmlPart->begin( ); + m_htmlPart->write( i18n( "

Missing File

" )); + m_htmlPart->write( i18n( "

The file knmap/nmap_manpage.html, which is part of the Knmap package, could not be found." )); + m_htmlPart->write(i18n( "

As a result, the prepackaged man page for Knmap is not available." )); + m_htmlPart->write( i18n( "

You may be able to view your local man page for nmap by selecting Settings / Use local man page" )); + m_htmlPart->end( ); + } + + m_htmlPart->setUserStyleSheet( m_stylesheetURL ); + m_htmlPart->setZoomFactor( int( m_zoomFactor )); +} + +// loadLocalManPage +// ================ + +void HTMLWidget::loadLocalManPage( ) +{ m_process = new KProcess( ); + *m_process << "man"; + *m_process << "-w"; + *m_process << "nmap"; + + connect( m_process, SIGNAL( processExited( KProcess* )), SLOT( slotManProcessExited( ))); + connect( m_process, SIGNAL( receivedStdout( KProcess*, char*, int )), SLOT( slotManReceivedStdout( KProcess*, char*, int ))); + + m_manPagePath = QString::null; + m_process->start( KProcess::NotifyOnExit, KProcess::Stdout ); +} + +// loadManPage +// =========== + +void HTMLWidget::loadManPage( const bool localManPage ) +{ if( localManPage ) + loadLocalManPage( ); + else + loadKnmapManPage( ); +} + +// readSettings +// ============ + +void HTMLWidget::readSettings( ) +{ KConfig* config = kapp->config( ); + config->setGroup( "General" ); + m_zoomFactor = config->readDoubleNumEntry( "zoomFactor", 100.0 ); + m_stylesheetURL.setPath( config->readPathEntry( "stylesheetURL" )); +} + +// resizeEvent +// =========== + +void HTMLWidget::resizeEvent( QResizeEvent* event ) +{ QWidget::resizeEvent( event ); + m_htmlPart->view( )->resize( width( ), height( )); +} + +// saveSettings +// ============ + +void HTMLWidget::saveSettings( ) +{ KConfig* config = kapp->config( ); + config->setGroup( "General" ); + config->writeEntry( "stylesheetURL", m_stylesheetURL.path( )); + config->writeEntry( "zoomFactor", m_zoomFactor ); +} + +// setInitialValues +// ================ + +void HTMLWidget::setInitialValues( ) +{ m_htmlPart->setUserStyleSheet( m_stylesheetURL ); + m_htmlPart->setZoomFactor( int( m_zoomFactor )); +} + +// setStylesheet +// ============= + +void HTMLWidget::setStylesheet( ) +{ m_dlg = new StylesheetDialog( m_stylesheetURL.path( ), *m_stylesheetURLs, this, "man stylesheet dlg" ); + connect( m_dlg, SIGNAL( stylesheetRemoved( )), SLOT( slotStylesheetRemoved( ))); + + if( m_dlg->exec( ) != QDialog::Accepted ) + { delete m_dlg; + m_dlg = NULL; + return; + } + + *m_stylesheetURLs = m_dlg->stylesheetURLs( ); + m_stylesheetURL.setPath( m_stylesheetURLs->front( )); + m_htmlPart->setUserStyleSheet( m_stylesheetURL ); + + emit( optionsDirty( )); + delete m_dlg; + m_dlg = NULL; +} + +// slotGunzipProcessExited +// ======================= + +void HTMLWidget::slotGunzipProcessExited( ) +{ if( !m_process->normalExit( )) + { delete m_process; + m_process = NULL; + emit( errorLoadingLocalManPage( i18n( "Could not load the local 'man' page - the 'gunzip' process failed." ))); + return; + } + + delete m_process; + + m_process = new KProcess( ); + *m_process << "man2html"; + *m_process << "-"; + + connect( m_process, SIGNAL( processExited( KProcess* )), SLOT( slotMan2HTMLProcessExited( ))); + connect( m_process, SIGNAL( receivedStdout( KProcess*, char*, int )), SLOT( slotMan2HTMLReceivedStdout( KProcess*, char*, int ))); + + m_htmlData = QString::null; + m_process->start( KProcess::NotifyOnExit, KProcess::Communication( KProcess::Stdin | KProcess::Stdout )); + m_process->writeStdin( m_manPageData, m_manPageData.length( )); + m_process->closeStdin( ); +} + +// slotGunzipReceivedStdout +// ======================== + +void HTMLWidget::slotGunzipReceivedStdout( KProcess* /* process */, char* buffer, int buflen ) +{ m_manPageData += QString::fromLatin1( buffer, buflen ); +} + +// slotMan2HTMLReceivedStdout +// ========================== + +void HTMLWidget::slotMan2HTMLReceivedStdout( KProcess* /* process */, char* buffer, int buflen ) +{ m_htmlData += QString::fromLatin1( buffer, buflen ); +} + +// slotMan2HTMLProcessExited +// ========================= + +void HTMLWidget::slotMan2HTMLProcessExited( ) +{ if( !m_process->normalExit( )) + emit( errorLoadingLocalManPage( i18n( "Could not load the local 'man' page - the 'man2html' process failed." ))); + + delete m_process; + m_process = NULL; + + m_htmlPart->begin( ); + QTextStream textStream( &m_htmlData, IO_ReadOnly ); + + while( !textStream.atEnd( )) + { QString htmlLine = textStream.readLine( ); + + if( htmlLine.startsWith( "

TARGET SPECIFICATION

" )) + m_htmlPart->write( "" ); + else + if( htmlLine.startsWith( "
-" )) + { QStringList nmapOptions = QStringList::split( " ", htmlLine.right( htmlLine.length( ) - 7 )); + QString anchors; + + for( QStringList::Iterator it = nmapOptions.begin( ); it != nmapOptions.end( ); ++it ) + { if( (*it)[ 0 ] != '-' ) + break; + + QStringList nmapOption = QStringList::split( "<", *it ); + anchors += QString( "" ).arg( nmapOption.front( )); + } + + m_htmlPart->write( anchors ); + } + + m_htmlPart->write( htmlLine + "\n" ); + } + + m_htmlPart->end( ); + + m_htmlPart->setUserStyleSheet( m_stylesheetURL ); + m_htmlPart->setZoomFactor( int( m_zoomFactor )); +} + +// slotManProcessExited +// ==================== + +void HTMLWidget::slotManProcessExited( ) +{ + if( !m_process->normalExit( )) + { delete m_process; + m_process = NULL; + emit( errorLoadingLocalManPage( i18n( "Could not load the local 'man' page - the 'man -w' process failed." ))); + return; + } + + delete m_process; + ushort length = m_manPagePath.length( ); + + if( m_manPagePath[ length - 1 ] == '\n' ) + m_manPagePath = m_manPagePath.left( length - 1 ); + + if( !m_manPagePath.endsWith( ".gz" )) + { m_process = NULL; + emit( errorLoadingLocalManPage( i18n( "Could not load the local 'man' page - it either was not found or it not a 'gz' file." ))); + return; + } + + m_process = new KProcess( ); + *m_process << "gunzip"; + *m_process << "-c"; + *m_process << m_manPagePath; + + connect( m_process, SIGNAL( processExited( KProcess* )), SLOT( slotGunzipProcessExited( ))); + connect( m_process, SIGNAL( receivedStdout( KProcess*, char*, int )), SLOT( slotGunzipReceivedStdout( KProcess*, char*, int ))); + + m_manPageData = QString::null; + m_process->start( KProcess::NotifyOnExit, KProcess::Stdout ); +} + +// slotManReceivedStdout +// ===================== + +void HTMLWidget::slotManReceivedStdout( KProcess* /* process */, char* buffer, int buflen ) +{ m_manPagePath += QString::fromLatin1( buffer, buflen ); +} + +// slotStylesheetRemoved +// ===================== + +void HTMLWidget::slotStylesheetRemoved( ) +{ *m_stylesheetURLs = m_dlg->stylesheetURLs( ); + emit( optionsDirty( )); +} + +// tryKnmapFile +// ============ + +bool HTMLWidget::tryKnmapFile( ) +{ +#ifdef _DEBUG + QString path = "/home/c/knmap/src/nmap_manpage.html"; +#else + QString path = locate( "data", "knmap/nmap_manpage.html" ); +#endif + + if( !QFile::exists( path )) + return false; + + QFile manPageFile( path ); + + if( !manPageFile.open( IO_ReadOnly )) + return false; + + QTextStream manPageStream( &manPageFile ); + m_htmlPart->begin( ); + + while ( !manPageStream.atEnd( )) + { QString line = manPageStream.read( ); + m_htmlPart->write( line ); + } + + m_htmlPart->end( ); + manPageFile.close(); + + return true; +} + +// zoomFactor +// ========== + +void HTMLWidget::zoomFactor( const float factor ) +{ m_zoomFactor = factor; + m_htmlPart->setZoomFactor( int( m_zoomFactor )); + emit( optionsDirty( )); +} +// zoomIn +// ====== + +void HTMLWidget::zoomIn( ) +{ m_zoomFactor = _min_( ZOOM_MAX_FACTOR, m_zoomFactor + m_zoomIncrement ); + m_htmlPart->setZoomFactor( int( m_zoomFactor )); + emit( optionsDirty( )); +} + +// zoomOut +// ======= + +void HTMLWidget::zoomOut( ) +{ m_zoomFactor = _max_( ZOOM_MIN_FACTOR, m_zoomFactor - m_zoomIncrement ); + m_htmlPart->setZoomFactor( int( m_zoomFactor )); + emit( optionsDirty( )); +} -- cgit v1.2.3