summaryrefslogtreecommitdiffstats
path: root/certmanager/kwatchgnupg/kwatchgnupgmainwin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'certmanager/kwatchgnupg/kwatchgnupgmainwin.cpp')
-rw-r--r--certmanager/kwatchgnupg/kwatchgnupgmainwin.cpp292
1 files changed, 292 insertions, 0 deletions
diff --git a/certmanager/kwatchgnupg/kwatchgnupgmainwin.cpp b/certmanager/kwatchgnupg/kwatchgnupgmainwin.cpp
new file mode 100644
index 00000000..19bda278
--- /dev/null
+++ b/certmanager/kwatchgnupg/kwatchgnupgmainwin.cpp
@@ -0,0 +1,292 @@
+/*
+ kwatchgnupgmainwin.cpp
+
+ This file is part of Kleopatra, the KDE keymanager
+ Copyright (c) 2001,2002,2004 Klar�vdalens Datakonsult AB
+
+ Kleopatra 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.
+
+ Kleopatra 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "kwatchgnupgmainwin.h"
+#include "kwatchgnupgconfig.h"
+#include "tray.h"
+
+#include <kleo/cryptobackendfactory.h>
+#include <kleo/cryptoconfig.h>
+
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kprocio.h>
+#include <kconfig.h>
+#include <kfiledialog.h>
+#include <kedittoolbar.h>
+#include <kkeydialog.h>
+
+#include <qtextedit.h>
+#include <qdir.h>
+#include <qeventloop.h>
+#include <qtimer.h>
+#include <qtextcodec.h>
+
+#define WATCHGNUPGBINARY "watchgnupg"
+#define WATCHGNUPGSOCKET ( QDir::home().canonicalPath() + "/.gnupg/log-socket")
+
+KWatchGnuPGMainWindow::KWatchGnuPGMainWindow( QWidget* parent, const char* name )
+ : KMainWindow( parent, name, WType_TopLevel ), mConfig(0)
+{
+ createActions();
+ createGUI();
+
+ mCentralWidget = new QTextEdit( this, "central log view" );
+ mCentralWidget->setTextFormat( QTextEdit::LogText );
+ setCentralWidget( mCentralWidget );
+
+ mWatcher = new KProcIO( QTextCodec::codecForMib( 106 /*utf-8*/ ) );
+ connect( mWatcher, SIGNAL( processExited(KProcess*) ),
+ this, SLOT( slotWatcherExited() ) );
+ connect( mWatcher, SIGNAL( readReady(KProcIO*) ),
+ this, SLOT( slotReadStdout() ) );
+
+ slotReadConfig();
+ mSysTray = new KWatchGnuPGTray( this );
+ mSysTray->show();
+ connect( mSysTray, SIGNAL( quitSelected() ),
+ this, SLOT( slotQuit() ) );
+ setAutoSaveSettings();
+}
+
+KWatchGnuPGMainWindow::~KWatchGnuPGMainWindow()
+{
+ delete mWatcher;
+}
+
+void KWatchGnuPGMainWindow::slotClear()
+{
+ mCentralWidget->clear();
+ mCentralWidget->append( tr("[%1] Log cleared").arg( QDateTime::currentDateTime().toString(Qt::ISODate) ) );
+}
+
+void KWatchGnuPGMainWindow::createActions()
+{
+ (void)new KAction( i18n("C&lear History"), "history_clear", CTRL+Key_L,
+ this, SLOT( slotClear() ),
+ actionCollection(), "clear_log" );
+ (void)KStdAction::saveAs( this, SLOT(slotSaveAs()), actionCollection() );
+ (void)KStdAction::close( this, SLOT(close()), actionCollection() );
+ (void)KStdAction::quit( this, SLOT(slotQuit()), actionCollection() );
+ (void)KStdAction::preferences( this, SLOT(slotConfigure()), actionCollection() );
+ ( void )KStdAction::keyBindings(this, SLOT(configureShortcuts()), actionCollection());
+ ( void )KStdAction::configureToolbars(this, SLOT(slotConfigureToolbars()), actionCollection());
+
+#if 0
+ (void)new KAction( i18n("Configure KWatchGnuPG..."), QString::fromLatin1("configure"),
+ 0, this, SLOT( slotConfigure() ),
+ actionCollection(), "configure" );
+#endif
+
+}
+
+void KWatchGnuPGMainWindow::configureShortcuts()
+{
+ KKeyDialog::configure( actionCollection(), this );
+}
+
+void KWatchGnuPGMainWindow::slotConfigureToolbars()
+{
+ KEditToolbar dlg( factory() );
+
+ dlg.exec();
+}
+
+void KWatchGnuPGMainWindow::startWatcher()
+{
+ disconnect( mWatcher, SIGNAL( processExited(KProcess*) ),
+ this, SLOT( slotWatcherExited() ) );
+ if( mWatcher->isRunning() ) {
+ mWatcher->kill();
+ while( mWatcher->isRunning() ) {
+ kapp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
+ }
+ mCentralWidget->append(tr("[%1] Log stopped")
+ .arg( QDateTime::currentDateTime().toString(Qt::ISODate)));
+ }
+ mWatcher->clearArguments();
+ KConfig* config = kapp->config();
+ config->setGroup("WatchGnuPG");
+ *mWatcher << config->readEntry("Executable", WATCHGNUPGBINARY);
+ *mWatcher << "--force";
+ *mWatcher << config->readEntry("Socket", WATCHGNUPGSOCKET);
+ config->setGroup(QString::null);
+ if( !mWatcher->start() ) {
+ KMessageBox::sorry( this, i18n("The watchgnupg logging process could not be started.\nPlease install watchgnupg somewhere in your $PATH.\nThis log window is now completely useless." ) );
+ } else {
+ mCentralWidget->append( tr("[%1] Log started")
+ .arg( QDateTime::currentDateTime().toString(Qt::ISODate) ) );
+ }
+ connect( mWatcher, SIGNAL( processExited(KProcess*) ),
+ this, SLOT( slotWatcherExited() ) );
+}
+
+void KWatchGnuPGMainWindow::setGnuPGConfig()
+{
+ QStringList logclients;
+ // Get config object
+ Kleo::CryptoConfig* cconfig = Kleo::CryptoBackendFactory::instance()->config();
+ if ( !cconfig )
+ return;
+ //Q_ASSERT( cconfig );
+ KConfig* config = kapp->config();
+ config->setGroup("WatchGnuPG");
+ QStringList comps = cconfig->componentList();
+ for( QStringList::const_iterator it = comps.begin(); it != comps.end(); ++it ) {
+ Kleo::CryptoConfigComponent* comp = cconfig->component( *it );
+ Q_ASSERT(comp);
+ // Look for log-file entry in Debug group
+ Kleo::CryptoConfigGroup* group = comp->group("Debug");
+ if( group ) {
+ Kleo::CryptoConfigEntry* entry = group->entry("log-file");
+ if( entry ) {
+ entry->setStringValue( QString("socket://")+
+ config->readEntry("Socket",
+ WATCHGNUPGSOCKET ));
+ logclients << QString("%1 (%2)").arg(*it).arg(comp->description());
+ }
+ entry = group->entry("debug-level");
+ if( entry ) {
+ entry->setStringValue( config->readEntry("LogLevel", "basic") );
+ }
+ }
+ }
+ cconfig->sync(true);
+ if( logclients.isEmpty() ) {
+ KMessageBox::sorry( 0, i18n("There are no components available that support logging." ) );
+ }
+}
+
+void KWatchGnuPGMainWindow::slotWatcherExited()
+{
+ if( KMessageBox::questionYesNo( this, i18n("The watchgnupg logging process died.\nDo you want to try to restart it?"), QString::null, i18n("Try Restart"), i18n("Do Not Try") ) == KMessageBox::Yes ) {
+ mCentralWidget->append( i18n("====== Restarting logging process =====") );
+ startWatcher();
+ } else {
+ KMessageBox::sorry( this, i18n("The watchgnupg logging process is not running.\nThis log window is now completely useless." ) );
+ }
+}
+
+void KWatchGnuPGMainWindow::slotReadStdout()
+{
+ if ( !mWatcher )
+ return;
+ QString str;
+ while( mWatcher->readln(str,false) > 0 ) {
+ mCentralWidget->append( str );
+ if( !isVisible() ) {
+ // Change tray icon to show something happened
+ // PENDING(steffen)
+ mSysTray->setAttention(true);
+ }
+ }
+ QTimer::singleShot( 0, this, SLOT(slotAckRead()) );
+}
+
+void KWatchGnuPGMainWindow::slotAckRead() {
+ if ( mWatcher )
+ mWatcher->ackRead();
+}
+
+void KWatchGnuPGMainWindow::show()
+{
+ mSysTray->setAttention(false);
+ KMainWindow::show();
+}
+
+void KWatchGnuPGMainWindow::slotSaveAs()
+{
+ QString filename = KFileDialog::getSaveFileName( QString::null, QString::null,
+ this, i18n("Save Log to File") );
+ if( filename.isEmpty() ) return;
+ QFile file(filename);
+ if( file.exists() ) {
+ if( KMessageBox::Yes !=
+ KMessageBox::warningYesNo( this, i18n("The file named \"%1\" already "
+ "exists. Are you sure you want "
+ "to overwrite it?").arg(filename),
+ i18n("Overwrite File"), i18n("Overwrite"), KStdGuiItem::cancel() ) ) {
+ return;
+ }
+ }
+ if( file.open( IO_WriteOnly ) ) {
+ QTextStream st(&file);
+ st << mCentralWidget->text();
+ file.close();
+ }
+}
+
+void KWatchGnuPGMainWindow::slotQuit()
+{
+ disconnect( mWatcher, SIGNAL( processExited(KProcess*) ),
+ this, SLOT( slotWatcherExited() ) );
+ mWatcher->kill();
+ kapp->quit();
+}
+
+void KWatchGnuPGMainWindow::slotConfigure()
+{
+ if( !mConfig ) {
+ mConfig = new KWatchGnuPGConfig( this, "config dialog" );
+ connect( mConfig, SIGNAL( reconfigure() ),
+ this, SLOT( slotReadConfig() ) );
+ }
+ mConfig->loadConfig();
+ mConfig->exec();
+}
+
+void KWatchGnuPGMainWindow::slotReadConfig()
+{
+ KConfig* config = kapp->config();
+ config->setGroup("LogWindow");
+ mCentralWidget->setWordWrap( config->readBoolEntry("WordWrap", false)
+ ?QTextEdit::WidgetWidth
+ :QTextEdit::NoWrap );
+ mCentralWidget->setMaxLogLines( config->readNumEntry( "MaxLogLen", 10000 ) );
+ setGnuPGConfig();
+ startWatcher();
+}
+
+bool KWatchGnuPGMainWindow::queryClose()
+{
+ if ( !kapp->sessionSaving() ) {
+ hide();
+ return false;
+ }
+ return KMainWindow::queryClose();
+}
+
+#include "kwatchgnupgmainwin.moc"