summaryrefslogtreecommitdiffstats
path: root/kmyfirewall/kmfwidgets
diff options
context:
space:
mode:
Diffstat (limited to 'kmyfirewall/kmfwidgets')
-rw-r--r--kmyfirewall/kmfwidgets/Makefile.am38
-rw-r--r--kmyfirewall/kmfwidgets/kmfchecklistitem.cpp58
-rw-r--r--kmyfirewall/kmfwidgets/kmfchecklistitem.h53
-rw-r--r--kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp104
-rw-r--r--kmyfirewall/kmfwidgets/kmfchecklistoutput.h64
-rw-r--r--kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp80
-rw-r--r--kmyfirewall/kmfwidgets/kmfdocumentinfo.h58
-rw-r--r--kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp452
-rw-r--r--kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h90
-rw-r--r--kmyfirewall/kmfwidgets/kmfhostwidget.cpp368
-rw-r--r--kmyfirewall/kmfwidgets/kmfhostwidget.h69
-rw-r--r--kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp173
-rw-r--r--kmyfirewall/kmfwidgets/kmfinterfacewidget.h63
-rw-r--r--kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp88
-rw-r--r--kmyfirewall/kmfwidgets/kmfiptdocoptions.h49
-rw-r--r--kmyfirewall/kmfwidgets/kmfiptdocview.cpp110
-rw-r--r--kmyfirewall/kmfwidgets/kmfiptdocview.h69
-rw-r--r--kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp117
-rw-r--r--kmyfirewall/kmfwidgets/kmfipv4addresswidget.h52
-rw-r--r--kmyfirewall/kmfwidgets/kmflistview.cpp1148
-rw-r--r--kmyfirewall/kmfwidgets/kmflistview.h91
-rw-r--r--kmyfirewall/kmfwidgets/kmflistviewitem.cpp431
-rw-r--r--kmyfirewall/kmfwidgets/kmflistviewitem.h144
-rw-r--r--kmyfirewall/kmfwidgets/kmfmainwindow.cpp30
-rw-r--r--kmyfirewall/kmfwidgets/kmfmainwindow.h46
-rw-r--r--kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp134
-rw-r--r--kmyfirewall/kmfwidgets/kmfmultiportwidget.h56
-rw-r--r--kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp585
-rw-r--r--kmyfirewall/kmfwidgets/kmfmynetworkwidget.h107
-rw-r--r--kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp293
-rw-r--r--kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h63
-rw-r--r--kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp180
-rw-r--r--kmyfirewall/kmfwidgets/kmfnetworkwidget.h65
-rw-r--r--kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp96
-rw-r--r--kmyfirewall/kmfwidgets/kmfnewdocdlg.h52
-rw-r--r--kmyfirewall/kmfwidgets/kmfobjectinfo.cpp110
-rw-r--r--kmyfirewall/kmfwidgets/kmfobjectinfo.h53
-rw-r--r--kmyfirewall/kmfwidgets/kmfportwidget.cpp294
-rw-r--r--kmyfirewall/kmfwidgets/kmfportwidget.h45
-rw-r--r--kmyfirewall/kmfwidgets/kmfprocout.cpp208
-rw-r--r--kmyfirewall/kmfwidgets/kmfprocout.h82
-rw-r--r--kmyfirewall/kmfwidgets/kmfprotocollistview.cpp197
-rw-r--r--kmyfirewall/kmfwidgets/kmfprotocollistview.h66
-rw-r--r--kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp230
-rw-r--r--kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h63
-rw-r--r--kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp73
-rw-r--r--kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h44
-rw-r--r--kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp190
-rw-r--r--kmyfirewall/kmfwidgets/kmfselectactivetarget.h61
-rw-r--r--kmyfirewall/kmfwidgets/kmfselectinterface.cpp117
-rw-r--r--kmyfirewall/kmfwidgets/kmfselectinterface.h53
-rw-r--r--kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp189
-rw-r--r--kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h57
-rw-r--r--kmyfirewall/kmfwidgets/kmftemplatechooser.cpp154
-rw-r--r--kmyfirewall/kmfwidgets/kmftemplatechooser.h72
-rw-r--r--kmyfirewall/kmfwidgets/kmftransactionlog.cpp278
-rw-r--r--kmyfirewall/kmfwidgets/kmftransactionlog.h72
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui184
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui351
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui437
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui152
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui402
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui161
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui229
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui189
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui234
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui330
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui409
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui166
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui177
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui70
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui173
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui181
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui392
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui202
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui474
-rw-r--r--kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui344
77 files changed, 13641 insertions, 0 deletions
diff --git a/kmyfirewall/kmfwidgets/Makefile.am b/kmyfirewall/kmfwidgets/Makefile.am
new file mode 100644
index 0000000..c06a44c
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/Makefile.am
@@ -0,0 +1,38 @@
+INCLUDES = $(all_includes) -I$(srcdir)/../core -I../core -I../ipteditor -I../genericinterface
+METASOURCES = AUTO
+lib_LTLIBRARIES = libkmfwidgets.la
+libkmfwidgets_la_LDFLAGS = -no-undefined $(all_libraries)
+libkmfwidgets_la_LIBADD = \
+ $(LIB_KPARTS) ../core/libkmfcore.la
+
+
+libkmfwidgets_la_SOURCES = kmfchecklistitem.cpp kmfchecklistoutput.cpp \
+ kmfdocumentinfo.cpp kmfgenericinterfaceeditprotocol.cpp kmfgenericinterfaceeditprotocol.h \
+ kmfhostwidget.cpp kmfinterfacewidget.cpp kmfiptdocoptions.cpp kmfiptdocview.cpp \
+ kmfipv4addresswidget.cpp kmflistview.cpp kmflistviewitem.cpp kmfmainwindow.cpp \
+ kmfmultiportwidget.cpp kmfmynetworkwidget.cpp kmfnethostpropertieswidget.cpp \
+ kmfnetworkwidget.cpp kmfnewdocdlg.cpp kmfobjectinfo.cpp kmfportwidget.cpp kmfprocout.cpp \
+ kmfprotocollistview.cpp kmfprotocolpropertieswidget.cpp kmfqtdesignerplugin.cpp \
+ kmfselectactivetarget.cpp kmfselectinterface.cpp kmfsystemsettingslinux.cpp \
+ kmftemplatechooser.cpp kmftransactionlog.cpp kmyfirewalldocumentinfo.ui \
+ kmyfirewallgenericinterfaceeditprotocolwidget.ui kmyfirewallhostwidget.ui kmyfirewallinterfacewidget.ui \
+ kmyfirewalliptdocoptions.ui kmyfirewallipv4adddresswidget.ui kmyfirewallmultiportwidget.ui \
+ kmyfirewallmynetworkwidget.ui kmyfirewallnethostproperties.ui kmyfirewallnetworkwidget.ui \
+ kmyfirewallnewdocument.ui kmyfirewallobjectinfo.ui kmyfirewallportwidget.ui \
+ kmyfirewallprotocollistview.ui kmyfirewallprotocolpropertieswidget.ui kmyfirewallselectactivetarget.ui \
+ kmyfirewallselectinterface.ui kmyfirewallsystemsettingslinux.ui kmyfirewalltemplatechooser.ui \
+ kmyfirewalltransactionlog.ui
+
+
+libkmfwidgetsincludedir = $(includedir)/kmyfirewall/kmfwidgets/
+
+libkmfwidgetsinclude_HEADERS = kmfprocout.h kmflistview.h kmflistviewitem.h \
+ kmfmultiportwidget.h kmfportwidget.h kmfchecklistoutput.h kmfnewdocdlg.h kmfchecklistitem.h \
+ kmfmainwindow.h kmfnetworkwidget.h kmfiptdocoptions.h kmfiptdocoptions.h \
+ kmfobjectinfo.h kmyfirewallselectinterface.h
+
+noinst_HEADERS = kmfdocumentinfo.h kmfhostwidget.h kmfinterfacewidget.h \
+ kmfipv4addresswidget.h kmfmynetworkwidget.h kmfnethostpropertieswidget.h kmfprotocollistview.h \
+ kmfprotocolpropertieswidget.h kmfqtdesignerplugin.h kmfselectactivetarget.h kmfsystemsettingslinux.h \
+ kmftemplatechooser.h kmftransactionlog.h
+
diff --git a/kmyfirewall/kmfwidgets/kmfchecklistitem.cpp b/kmyfirewall/kmfwidgets/kmfchecklistitem.cpp
new file mode 100644
index 0000000..171f1f7
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfchecklistitem.cpp
@@ -0,0 +1,58 @@
+//
+// C++ Implementation: kmfchecklistitem
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#include "kmfchecklistitem.h"
+
+// QT includes
+
+// KDE includes
+#include <kdebug.h>
+
+// Project includes
+#include "../core/netfilterobject.h"
+#include "../core/kmfprotocol.h"
+#include "../core/kmfprotocolusage.h"
+
+namespace KMF {
+
+KMFCheckListItem::KMFCheckListItem( QListView *parent, QListViewItem *after, const QString& text, Type tt, KMFProtocolUsage* obj ) : QCheckListItem( parent, after, text, tt ) {
+ loadKMFProtocolUsage( obj );
+}
+KMFCheckListItem::KMFCheckListItem( QListViewItem *parent, const QString& text , Type tt, KMFProtocolUsage* obj ) : QCheckListItem( parent, text, tt ) {
+ loadKMFProtocolUsage( obj );
+}
+KMFCheckListItem::KMFCheckListItem( QListViewItem *parent, QListViewItem *after, const QString& text, Type tt, KMFProtocolUsage* obj ) : QCheckListItem( parent, after, text, tt ) {
+ loadKMFProtocolUsage( obj );
+}
+
+KMFCheckListItem::~KMFCheckListItem() {}
+
+
+void KMFCheckListItem::loadKMFProtocolUsage( KMFProtocolUsage* obj ) {
+ if ( KMFProtocolUsage *prot = dynamic_cast<KMFProtocolUsage*> ( obj ) ) {
+ m_protocolUsage = prot;
+ } else {
+ kdDebug() << "ERROR: Given NetfilterObject has wrong type" << endl;
+ }
+}
+
+}
+
diff --git a/kmyfirewall/kmfwidgets/kmfchecklistitem.h b/kmyfirewall/kmfwidgets/kmfchecklistitem.h
new file mode 100644
index 0000000..8d8cc01
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfchecklistitem.h
@@ -0,0 +1,53 @@
+//
+// C++ Interface: kmfchecklistitem
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KMFCHECKLISTITEM_H
+#define KMFCHECKLISTITEM_H
+
+#include <qlistview.h>
+#include <kdemacros.h>
+
+namespace KMF {
+class KMFProtocol;
+class KMFProtocolUsage;
+class NetfilterObject;
+
+class KDE_EXPORT KMFCheckListItem : public QCheckListItem
+{
+public:
+ KMFCheckListItem( QListViewItem *parent, const QString&, Type tt = Controller, KMFProtocolUsage* = 0 );
+ KMFCheckListItem( QListView *parent, QListViewItem *after, const QString&, Type tt = Controller, KMFProtocolUsage* = 0 );
+ KMFCheckListItem( QListViewItem *parent, QListViewItem *after, const QString&, Type tt = Controller, KMFProtocolUsage* = 0);
+ ~KMFCheckListItem();
+
+
+public:
+ KMFProtocolUsage* protocolUsage() const {
+ return m_protocolUsage;
+ };
+
+private:
+ void loadKMFProtocolUsage( KMFProtocolUsage* );
+
+ KMFProtocolUsage *m_protocolUsage;
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp b/kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp
new file mode 100644
index 0000000..3ec367d
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfchecklistoutput.cpp
@@ -0,0 +1,104 @@
+/***************************************************************************
+ begin : Tue Jul 30 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#include "kmfchecklistoutput.h"
+
+// QT includs
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qlistview.h>
+#include <qlayout.h>
+#include <qstring.h>
+
+// kde includes
+#include <klocale.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+namespace KMF {
+KMFCheckListOutput::KMFCheckListOutput( QWidget *parent, const char *name , bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) {
+ setCaption( "KMyFirewall" );
+ QGridLayout *l_prog = new QGridLayout( this,4,2,6,11 );
+ text = new QLabel( i18n("<qt><b>Trying to guess the system configuration...</b><br>"
+ "If errors are occurring you'll have to setup the configuration yourself."
+ "</qt>"), this);
+ l_prog -> addMultiCellWidget( text, 0, 0, 0, 2 );
+
+ mpb_ok = new QPushButton( this, "Ok" );
+ mpb_ok->setText( i18n( "&Close Window" ) );
+ l_prog -> addMultiCellWidget( mpb_ok, 4, 4, 0, 2 );
+
+ mlb_outputView = new QListView( this, "msg" );
+ mlb_outputView->addColumn( i18n( "Looking For" ) );
+ mlb_outputView->addColumn( i18n( "Found?" ) );
+ mlb_outputView->setSelectionMode( QListView::NoSelection );
+ mlb_outputView->setSorting( -1 );
+ l_prog -> addMultiCellWidget( mlb_outputView, 1, 3, 0, 2 );
+
+
+ connect( mpb_ok, SIGNAL( clicked() ) , this, SLOT( hide() ) );
+ m_currItem = new QListViewItem( mlb_outputView );
+ m_currItem->setText( 0, i18n( "Starting system scan..." ) );
+ loadIcons();
+ this->resize( 450, 450 );
+}
+
+KMFCheckListOutput::~KMFCheckListOutput() {}
+
+void KMFCheckListOutput::appendLine( const QString &txt ) {
+ QListViewItem * item = new QListViewItem( mlb_outputView, m_currItem );
+ item->setMultiLinesEnabled( true );
+ item->setText( 0, txt );
+ m_currItem = item;
+ kdDebug() << "void KMFCheckListOutput::appendLine(QString txt)" << endl;
+}
+
+void KMFCheckListOutput::setStatus( bool ok, const QString &err_msg ) {
+ kdDebug() << "void KMFCheckListOutput::setStatus(bool ok,QString &err_msg)" << endl;
+ if ( ok ) {
+ m_currItem->setPixmap( 1, icon_ok );
+ } else {
+ m_currItem->setPixmap( 1, icon_err );
+ m_currItem->setOpen( true );
+ if ( !err_msg.isEmpty() ) {
+ QListViewItem * item = new QListViewItem( m_currItem );
+ item->setText( 0, err_msg );
+ }
+ }
+}
+
+void KMFCheckListOutput::clearList() {
+ kdDebug() << "void KMFCheckListOutput::clearList()" << endl;
+ mlb_outputView->clear();
+}
+
+void KMFCheckListOutput::loadIcons() {
+ kdDebug() << "void KMFCheckListOutput::loadIcons()" << endl;
+ KIconLoader *loader = KGlobal::iconLoader();
+ QString icon_name;
+
+ icon_name = "stop";
+ icon_err = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "button_ok";
+ icon_ok = loader->loadIcon( icon_name, KIcon::Small );
+
+}
+
+}
+
+#include "kmfchecklistoutput.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfchecklistoutput.h b/kmyfirewall/kmfwidgets/kmfchecklistoutput.h
new file mode 100644
index 0000000..73d8887
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfchecklistoutput.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ begin : Tue Jul 30 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFCHECKLISTOUTPUT_H
+#define KMFCHECKLISTOUTPUT_H
+
+#include <qdialog.h>
+#include <qpixmap.h>
+#include <kdemacros.h>
+class QLabel;
+class QListView;
+class QListViewItem;
+class QString;
+class QPushButton;
+namespace KMF {
+/**
+ *@author Christian Hubinger
+ */
+
+class KDE_EXPORT KMFCheckListOutput : public QDialog {
+ Q_OBJECT
+public:
+ KMFCheckListOutput( QWidget *parent = 0, const char *name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~KMFCheckListOutput();
+
+ /**
+ Appends one line at the End Of the List
+ */
+ void appendLine( const QString &txt );
+
+ /**
+ Sets the Status of the last created ListItem
+ */
+ void setStatus( bool ok, const QString &err_msg );
+
+ void clearList();
+
+private:
+
+ // Functions
+ void loadIcons();
+
+ // Data
+ QListView *mlb_outputView;
+ QPushButton *mpb_ok;
+ QListViewItem *m_currItem;
+ QPixmap icon_ok;
+ QPixmap icon_err;
+ QLabel *text;
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp b/kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp
new file mode 100644
index 0000000..2d8a1fb
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfdocumentinfo.cpp
@@ -0,0 +1,80 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+// License: GPL
+//
+
+
+#include "kmfdocumentinfo.h"
+
+// QT includes
+#include <qstring.h>
+#include <qtextedit.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+
+
+// KDE includes
+#include <kapplication.h>
+#include <kdebug.h>
+
+// project includes
+#include "../core/kmfdoc.h"
+#include "../core/kmfnetwork.h"
+#include "../core/kmfundoengine.h"
+namespace KMF {
+KMFDocumentInfo::KMFDocumentInfo(QWidget* parent, const char* name, bool modal, WFlags fl)
+ : KMyFirewallDocumentInfo(parent,name, modal,fl) {
+ connect( b_help, SIGNAL( clicked() ),
+ this, SLOT( slotHelp() ) );
+ connect( b_saveAsTemplate, SIGNAL( clicked() ), this, SLOT( slotSaveAsTemplate() ) );
+
+}
+
+KMFDocumentInfo::~KMFDocumentInfo() {}
+
+void KMFDocumentInfo::slotSaveAsTemplate() {
+ kdDebug() << "slotSaveAsTemplate()" << endl;
+ emit sigSaveAsTemplate();
+}
+
+/*$SPECIALIZATION$*/
+void KMFDocumentInfo::accept() {
+ if ( ! txt_name->text().isNull() ) {
+ m_doc->setName( txt_name->text() );
+// m_doc->changed();
+ // m_doc->network()->changed();
+ }
+
+ if ( ! txt_description->text().isNull() ) {
+ m_doc->setDescription( txt_description->text() );
+// m_doc->changed();
+ // m_doc->network()->changed();
+ }
+
+ QDialog::accept();
+}
+
+void KMFDocumentInfo::loadDoc( KMFDoc* doc ) {
+ m_doc = doc;
+ txt_name->setText( doc->name() );
+ txt_description->setText( doc->description() );
+}
+
+void KMFDocumentInfo::slotHelp() {
+ kdDebug() << "void KMFDocumentInfo::slotHelp()" << endl;
+ kapp->invokeHelp();
+}
+
+
+}
+
+#include "kmfdocumentinfo.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfdocumentinfo.h b/kmyfirewall/kmfwidgets/kmfdocumentinfo.h
new file mode 100644
index 0000000..059d488
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfdocumentinfo.h
@@ -0,0 +1,58 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+// License: GPL
+//
+
+#ifndef KMFDOCUMENTINFO_H
+#define KMFDOCUMENTINFO_H
+
+#include "kmyfirewalldocumentinfo.h"
+
+// QT includes
+
+// KDE includes
+#include <kdemacros.h>
+
+// project includes
+namespace KMF {
+class KMFDoc;
+
+class KDE_EXPORT KMFDocumentInfo : public KMyFirewallDocumentInfo {
+ Q_OBJECT
+
+public:
+ KMFDocumentInfo(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~KMFDocumentInfo();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ void loadDoc( KMFDoc* );
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void accept();
+ void slotSaveAsTemplate();
+ void slotHelp();
+
+private: // data
+ KMFDoc *m_doc;
+
+signals:
+ void sigSaveAsTemplate();
+
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp
new file mode 100644
index 0000000..45ad652
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.cpp
@@ -0,0 +1,452 @@
+//
+// C++ Implementation: kmfgenericinterfaceeditprotocol
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#include "kmfgenericinterfaceeditprotocol.h"
+
+// QT includes
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qlistview.h>
+#include <qradiobutton.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qtextedit.h>
+#include <qbuttongroup.h>
+#include <qgroupbox.h>
+#include <qspinbox.h>
+#include <quuid.h>
+#include <qcombobox.h>
+
+// KDE includes
+#include <klocale.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <kio/job.h>
+#include <ktrader.h>
+#include <klibloader.h>
+#include <klistview.h>
+#include <klistbox.h>
+#include <knuminput.h>
+#include <kpushbutton.h>
+#include <kmessagebox.h>
+#include <ktempfile.h>
+#include <kcombobox.h>
+
+// Project includes
+#include "kmflistviewitem.h"
+#include "../version.h"
+#include "../core/kmfgenericdoc.h"
+#include "../core/kmfnetwork.h"
+#include "../core/kmfprotocol.h"
+#include "../core/kmfprotocollibrary.h"
+#include "../core/kmfprotocolcategory.h"
+#include "../core/kmferror.h"
+#include "../core/kmferrorhandler.h"
+
+namespace KMF {
+KMFGenericInterfaceEditProtocol::KMFGenericInterfaceEditProtocol( QWidget *parent, const char *name, WFlags f )
+ : KMyFirewallGenericInterfaceEditProtocolWidget( parent, name, f ) {
+ // m_protocolsLoaded = false;
+// m_protocols.clear();
+
+ connect( m_lv_protocols, SIGNAL( pressed( QListViewItem* ) ) ,
+ this, SLOT( slotNewItemSelected( QListViewItem* ) ) );
+
+ connect( m_lb_tcpPorts, SIGNAL( currentChanged ( QListBoxItem * ) ), this, SLOT( slotCurrentTCPPortChanged( QListBoxItem * ) ) );
+
+ connect( m_lb_udpPorts, SIGNAL( currentChanged ( QListBoxItem * ) ), this, SLOT( slotCurrentUDPPortChanged( QListBoxItem * ) ) );
+
+ // connect( m_sb_port_num, SIGNAL( valueChanged( int ) ), this, SLOT( slotPortVauleChanged( int ) ) );
+
+ connect( m_te_desc, SIGNAL( textChanged() ), this, SLOT( slotNameDescritionChanged() ) );
+ connect( m_le_protocolName , SIGNAL( textChanged( const QString& ) ), this, SLOT( slotNameDescritionChanged() ) );
+ connect( m_rb_tcp, SIGNAL( clicked() ), this, SLOT( slotProtocolTypeChanged() ) );
+ connect( m_rb_udp, SIGNAL( clicked() ), this, SLOT( slotProtocolTypeChanged() ) );
+
+ connect( m_b_add_port, SIGNAL( clicked() ), this, SLOT( slotAddPort() ) );
+ connect( m_b_del_port, SIGNAL( clicked() ), this, SLOT( slotDelPort() ) );
+
+ connect( m_b_new_protocol, SIGNAL( clicked() ), this, SLOT( slotAddProtocol() ) );
+ connect( m_b_del_protocol, SIGNAL( clicked() ), this, SLOT( slotDelProtocol() ) );
+
+ connect( m_cb_showAll,SIGNAL( toggled( bool ) ), this , SLOT( slotUpdateView() ) );
+}
+
+
+KMFGenericInterfaceEditProtocol::~KMFGenericInterfaceEditProtocol() {}
+
+
+
+void KMFGenericInterfaceEditProtocol::slotNewItemSelected( QListViewItem* qit ) {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotNewItemSelected(...)" << endl;
+
+ KMFListViewItem *item = dynamic_cast<KMFListViewItem*> ( qit );
+ if ( ! item ) {
+ kdDebug() << "Item was no KMFListViewItem!" << endl;
+ m_gb_edit->setEnabled( false );
+ m_b_del_protocol->setEnabled( false );
+ return;
+ }
+
+ if ( m_protocol &&
+ item->type() == NetfilterObject::PROTOCOL &&
+ m_protocol->uuid() == item->protocol()->uuid() ) {
+ kdDebug() << "Selected Same Protocal again" << endl;
+ m_gb_edit->setEnabled( m_protocol->customProtocol() );
+ m_b_del_protocol->setEnabled( m_protocol->customProtocol() );
+ return;
+ }
+ if ( item->type() != NetfilterObject::PROTOCOL ) {
+ return;
+ }
+ m_gb_edit->setEnabled( true );
+ m_b_del_protocol->setEnabled( true );
+ m_protocol = item->protocol();
+ updateEdit();
+}
+
+void KMFGenericInterfaceEditProtocol::slotCurrentTCPPortChanged( QListBoxItem * item ) {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotCurrentTCPPortChanged()" << endl;
+ if ( ! item ) {
+ return;
+ }
+
+ m_lb_udpPorts->clearSelection();
+// m_sb_port_num->setValue( item->text().toInt() );
+ m_rb_tcp->setChecked( true );
+
+}
+
+void KMFGenericInterfaceEditProtocol::slotCurrentUDPPortChanged( QListBoxItem * item ) {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotCurrentUDPPortChanged()" << endl;
+ if ( ! item ) {
+ return;
+ }
+ m_lb_tcpPorts->clearSelection();
+/* m_sb_port_num->blockSignals( true );
+ m_sb_port_num->setValue( item->text().toInt() );
+ m_sb_port_num->blockSignals( false );*/
+ m_rb_udp->setChecked( true );
+}
+
+void KMFGenericInterfaceEditProtocol::slotProtocolTypeChanged() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotProtocolTypeChanged()" << endl;
+ if ( ! m_protocol ) {
+ kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl;
+ return;
+ }
+
+ m_lb_udpPorts->clearSelection();
+ m_lb_tcpPorts->clearSelection();
+}
+void KMFGenericInterfaceEditProtocol::slotAddPort() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotAddPort()" << endl;
+ if ( ! m_protocol ) {
+ kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl;
+ return;
+ }
+
+ m_lb_udpPorts->clearSelection();
+ m_lb_tcpPorts->clearSelection();
+ if ( m_rb_tcp->isChecked() ) {
+ m_protocol->addPort( m_sb_port_num->text(), KMFProtocol::TCP );
+ m_lb_tcpPorts->blockSignals( true );
+ m_lb_tcpPorts->clear();
+ // QStringList l = QStringList::split( ",", m_protocol->tcpPortsList() );
+ m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) );
+
+
+ m_lb_tcpPorts->blockSignals( false );
+
+ for( uint i= 0; i< m_lb_tcpPorts->count(); i++ ) {
+ if ( m_lb_tcpPorts->text( i ) == m_sb_port_num->text() ) {
+ m_lb_tcpPorts->setSelected( i, true );
+ }
+ }
+ slotProtocolChanged();
+ } else if ( m_rb_udp->isChecked() ) {
+ m_protocol->addPort( m_sb_port_num->text(), KMFProtocol::UDP );
+ m_lb_udpPorts->blockSignals( true );
+ m_lb_udpPorts->clear();
+// for( uint i= 0; i< m_protocol->udpPorts()->count(); i++ ) {
+// m_lb_udpPorts->insert( *m_protocol->udpPorts().at( i ) );
+// }
+ m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) );
+ m_lb_udpPorts->blockSignals( false );
+
+ for( uint i= 0; i< m_lb_udpPorts->count(); i++ ) {
+ if ( m_lb_udpPorts->text( i ) == m_sb_port_num->text() ) {
+ m_lb_udpPorts->setSelected( i, true );
+ }
+ }
+ slotProtocolChanged();
+ }
+}
+
+void KMFGenericInterfaceEditProtocol::slotDelPort() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotDelPort()" << endl;
+ if ( m_lb_tcpPorts->selectedItem() ) {
+ m_protocol->delPort( m_lb_tcpPorts->selectedItem()->text(), KMFProtocol::TCP );
+ m_lb_tcpPorts->blockSignals( true );
+ m_lb_tcpPorts->clear();
+ m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) );
+ m_lb_tcpPorts->blockSignals( false );
+ if ( m_lb_tcpPorts->count() > 0 ) {
+ m_lb_tcpPorts->setSelected( 0, true );
+ }
+ slotProtocolChanged();
+ } else if ( m_lb_udpPorts->selectedItem() ) {
+ m_protocol->delPort( m_lb_udpPorts->selectedItem()->text(), KMFProtocol::UDP );
+ m_lb_udpPorts->blockSignals( true );
+ m_lb_udpPorts->clear();
+ m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) );
+ m_lb_udpPorts->blockSignals( false );
+ if ( m_lb_udpPorts->count() > 0 ) {
+ m_lb_udpPorts->setSelected( 0, true );
+ }
+ slotProtocolChanged();
+ }
+}
+
+void KMFGenericInterfaceEditProtocol::slotAddProtocol() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotAddProtocol()" << endl;
+// KMFProtocolCategory* catCustom = KMFProtocol::findCategory( KMFProtocolCategory::customCategoryUuid() );
+// if ( ! catCustom ) {
+// catCustom = KMFProtocolCategory::createCategory( i18n("Custom Protocols") );
+// catCustom->setUuid( KMFProtocolCategory::customCategoryUuid().toString() );
+// }
+
+ KMFProtocol *p = KMFProtocolCategory::getCustomCategory()->createProtocol( i18n("New Protocol") );
+ p->setName( i18n("New Protocol") );
+ p->setCustomProtocol( true );
+ m_protocol = p;
+ slotUpdateView();
+
+// KMFListViewItem *item = new KMFListViewItem( m_lv_protocols, p );
+// item->loadNetfilterObject( p );
+// item->setupProtocolView();
+//
+// m_lv_protocols->setSelected( item, true );
+// slotNewItemSelected( item );
+}
+
+void KMFGenericInterfaceEditProtocol::slotDelProtocol() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotDelProtocol()" << endl;
+ if ( ! m_protocol ) {
+ return;
+ kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl;
+ }
+ int doit = KMessageBox::questionYesNo ( this , i18n( "<p>Are you sure that you want to delete "
+ "the protocol: <b>%1</b>?</p>").arg( m_protocol->name() ),
+ i18n( "Delete Protocol" ), KStdGuiItem::yes(), KStdGuiItem::no() /*, "protocol_edit_delete_protocol"*/ );
+
+ // kdDebug() << "Got Answer: " << doit << endl;
+ if ( doit != 3 ) {
+ return;
+ }
+ // FIXME: Casees Mem0ry Leak, but app crashed othwise!
+ m_protocol->category()->delProtocol( m_protocol, false );
+ m_protocol = 0;
+ slotNewItemSelected( 0 );
+ slotUpdateView();
+}
+
+void KMFGenericInterfaceEditProtocol::slotOnProtocolDeleleted( QObject* ) {
+ m_protocol = 0;
+ slotUpdateView();
+ slotNewItemSelected( 0 );
+}
+
+void KMFGenericInterfaceEditProtocol::slotPortVauleChanged( int val ) {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotPortVauleChanged()" << endl;
+ if ( ! m_protocol ) {
+ kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl;
+ return;
+ }
+
+ QString s = "";
+ s.setNum( val );
+ if ( m_rb_udp->isChecked() ) {
+ QListBoxItem *i = m_lb_udpPorts->selectedItem();
+ if ( ! i ) {
+ return;
+ }
+ QString strVal = "";
+ strVal.setNum( val );
+ if ( m_protocol->replaceUDPPort( i->text().toInt(), val ) ) {
+ m_lb_udpPorts->blockSignals( true );
+ m_lb_udpPorts->clear();
+ m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) );
+
+ for( uint i= 0; i< m_lb_udpPorts->count(); i++ ) {
+ if ( m_lb_udpPorts->text( i ) == strVal ) {
+ m_lb_udpPorts->setSelected( i, true );
+ break;
+ }
+ }
+ m_lb_udpPorts->blockSignals( false );
+ slotProtocolChanged();
+ }
+ } else if ( m_rb_tcp->isChecked() ) {
+ QListBoxItem *i = m_lb_tcpPorts->selectedItem();
+ if ( ! i ) {
+ return;
+ }
+
+ QString strVal = "";
+ strVal.setNum( val );
+
+ if( m_protocol->replaceTCPPort( i->text().toInt(), val ) ) {
+ m_lb_tcpPorts->blockSignals( true );
+ m_lb_tcpPorts->clear();
+ m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) );
+ for( uint i= 0; i< m_lb_tcpPorts->count(); i++ ) {
+ if ( m_lb_tcpPorts->text( i ) == strVal ) {
+ m_lb_tcpPorts->setSelected( i, true );
+ break;
+ }
+ }
+ m_lb_tcpPorts->blockSignals( false );
+ slotProtocolChanged();
+ }
+ }
+}
+
+void KMFGenericInterfaceEditProtocol::slotNameDescritionChanged() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotNameDescritionChanged()" << endl;
+ if ( ! m_protocol ) {
+ kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl;
+ return;
+ }
+
+ if ( ! m_le_protocolName->text().isEmpty() ) {
+ m_protocol->setName( m_le_protocolName->text().stripWhiteSpace().simplifyWhiteSpace() );
+ }
+ m_protocol->setDescription( m_te_desc->text().stripWhiteSpace().simplifyWhiteSpace() );
+
+ // m_protocol->setCategory( m_cob_
+ slotProtocolChanged();
+}
+
+void KMFGenericInterfaceEditProtocol::slotProtocolChanged() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotProtocolChanged()" << endl;
+ QListViewItemIterator it( m_lv_protocols );
+ while ( it.current() ) {
+ KMFListViewItem *kit = dynamic_cast<KMFListViewItem*> ( it.current() );
+ if ( kit->type() == NetfilterObject::PROTOCOL &&
+ kit->protocol()->uuid() == m_protocol->uuid() ) {
+ kit->setupProtocolView();
+ kit->setOpen( true );
+ return;
+ }
+ ++it;
+ }
+}
+
+void KMFGenericInterfaceEditProtocol::updateEdit() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::updateEdit()" << endl;
+ if ( ! m_protocol ) {
+ kdDebug() << "\n\nWARNING: No Protocol Object to save Changes in Memory!!\n\n" << endl;
+ m_gb_edit->setEnabled( false );
+ m_b_del_protocol->setEnabled( false );
+ return;
+ }
+ m_gb_edit->setEnabled( m_protocol->customProtocol() );
+ m_b_del_protocol->setEnabled( m_protocol->customProtocol() );
+
+ m_le_protocolName->blockSignals( true );
+ m_te_desc->blockSignals( true );
+
+ m_le_protocolName->setText( m_protocol->name() );
+ m_te_desc->setText( m_protocol->description() );
+
+ m_le_protocolName->blockSignals( false );
+ m_te_desc->blockSignals( false );
+
+ m_lb_tcpPorts->clear();
+ m_lb_udpPorts->clear();
+ m_lb_tcpPorts->insertStringList( QStringList::split( ",", m_protocol->tcpPortsList() ) );
+ m_lb_udpPorts->insertStringList( QStringList::split( ",", m_protocol->udpPortsList() ) );
+}
+
+void KMFGenericInterfaceEditProtocol::slotUpdateView() {
+ kdDebug() << "void KMFGenericInterfaceEditProtocol::slotUpdateView()" << endl;
+ m_lv_protocols->clear();
+ KMFProtocolCategory::getCustomCategory();
+
+ if ( m_cb_showAll->isChecked() ) {
+ QValueList<KMFProtocolCategory*>& protCats = KMFProtocolLibrary::instance()->protocolCategories();
+ QValueList<KMFProtocolCategory*>::iterator it;
+ for( it = protCats.begin(); it != protCats.end(); ++it ) {
+ KMFProtocolCategory* cat = *it;
+ kdDebug() << "\nSetup Category: Item" << cat->name() << endl;
+
+ KMFListViewItem *item = new KMFListViewItem( m_lv_protocols, cat );
+ item->loadNetfilterObject( cat );
+ item->setupProtocolCategoryView();
+ if ( cat == KMFProtocolCategory::getCustomCategory() ) {
+ item->setOpen( true );
+ }
+ }
+ } else {
+ KMFProtocolCategory* customCat = KMFProtocolCategory::getCustomCategory();
+ KMFListViewItem *item = new KMFListViewItem( m_lv_protocols, customCat );
+ item->loadNetfilterObject( customCat );
+ item->setupProtocolCategoryView();
+ item->setOpen( true );
+ }
+
+ QValueList< KMFProtocol* >& prots = KMFProtocolCategory::getCustomCategory()->protocols();
+ QValueList< KMFProtocol* >::iterator it;
+ for( it = prots.begin(); it != prots.end(); ++it ) {
+ KMFProtocol* p= *it;
+ disconnect( p, SIGNAL( destroyed( QObject* ) ),
+ this, SLOT( slotOnProtocolDeleleted( QObject* ) ) );
+ connect( p, SIGNAL( destroyed( QObject* ) ),
+ this, SLOT( slotOnProtocolDeleleted( QObject* ) ) );
+ }
+
+ setEnabled( true );
+}
+
+
+void KMFGenericInterfaceEditProtocol::loadDoc( KMFNetwork* doc ) {
+ kdDebug() << "void KMFGenericInterfaceLogging::loadDoc( KMFGenericDoc* )" << endl;
+ m_network = doc;
+ slotUpdateView();
+}
+
+void KMFGenericInterfaceEditProtocol::saveProtocols() {
+ kdDebug() << "KMFGenericInterfaceEditProtocol::saveProtocols()" << endl;
+ KMFErrorHandler *errH = new KMFErrorHandler( "KMFErrorHandler" );
+ errH->showError( KMFProtocolLibrary::instance()->saveProtocolLibrary() );
+}
+
+}
+
+#include "kmfgenericinterfaceeditprotocol.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h
new file mode 100644
index 0000000..658eb07
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfgenericinterfaceeditprotocol.h
@@ -0,0 +1,90 @@
+//
+// C++ Interface: kmfgenericinterfaceeditprotocol
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KMFGENERICINTERFACEEDITPROTOCOL_H
+#define KMFGENERICINTERFACEEDITPROTOCOL_H
+
+#include "kmyfirewallgenericinterfaceeditprotocolwidget.h"
+
+// QT Includes
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qguardedptr.h>
+#include <qpixmap.h>
+
+/**
+@author Christian Hubinger
+*/
+
+class QListViewItem;
+class QListBoxItem;
+
+namespace KMF {
+class KMFGenericDoc;
+class KMFNetwork;
+class KMFProtocol;
+class KMFListViewItem;
+class KMFProtocolCategory;
+
+class KMFGenericInterfaceEditProtocol : public KMyFirewallGenericInterfaceEditProtocolWidget {
+ Q_OBJECT
+public:
+ KMFGenericInterfaceEditProtocol( QWidget *parent = 0, const char *name = 0, WFlags f = 0 );
+
+ ~KMFGenericInterfaceEditProtocol();
+
+ void saveProtocols();
+ // void loadProtocols();
+
+public slots:
+ void slotUpdateView();
+
+protected slots:
+ void slotNewItemSelected( QListViewItem* );
+ void slotCurrentTCPPortChanged( QListBoxItem * );
+ void slotCurrentUDPPortChanged( QListBoxItem * );
+ void slotPortVauleChanged( int );
+ void slotProtocolChanged();
+ void slotNameDescritionChanged();
+ void slotProtocolTypeChanged();
+ void slotAddPort();
+ void slotDelPort();
+ void slotAddProtocol();
+ void slotDelProtocol();
+ void slotOnProtocolDeleleted( QObject* );
+public:
+ void loadDoc( KMFNetwork* );
+
+private: // Methods
+
+ void updateEdit();
+ const QString& getXMLSniplet();
+// KMFProtocolCategory* getCuustomCategotry();
+
+private: // DATA
+ KMFNetwork *m_network;
+ // QPtrList<KMFProtocol> m_protocols;
+ QGuardedPtr<KMFProtocol> m_protocol;
+ // bool m_protocolsLoaded;
+
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfhostwidget.cpp b/kmyfirewall/kmfwidgets/kmfhostwidget.cpp
new file mode 100644
index 0000000..4f3c0e5
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfhostwidget.cpp
@@ -0,0 +1,368 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfhostwidget.h"
+
+// QT includes
+#include <qtextedit.h>
+#include <qpushbutton.h>
+#include <qcolor.h>
+#include <qlabel.h>
+
+// KDE includes
+#include <kled.h>
+#include <kcombobox.h>
+#include <knuminput.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kio/netaccess.h>
+#include <kapplication.h>
+#include <ktrader.h>
+#include <kparts/part.h>
+#include <kparts/plugin.h>
+#include <kparts/factory.h>
+
+
+// Project includes
+#include "../core/kmferror.h"
+#include "../core/kmferrorhandler.h"
+#include "../core/xmlnames.h"
+#include "../core/kmftarget.h"
+#include "../core/kmftargetconfig.h"
+#include "../core/kmfundoengine.h"
+#include "../core/kmfcompilerinterface.h"
+#include "../core/kmfinstallerinterface.h"
+namespace KMF {
+KMFHostWidget::KMFHostWidget(QWidget* parent, const char* name, WFlags fl )
+ : KMyFirewallHostWidget(parent, name, fl )
+{
+ kdDebug() << "KMFHostWidget::KMFHostWidget(QWidget* parent, const char* name, WFlags fl)" << endl;
+ connect( m_sb_host_0, SIGNAL( valueChanged ( int ) ),
+ this, SLOT( slotAddressChanged( int ) ) );
+ connect( m_sb_host_1, SIGNAL( valueChanged ( int ) ),
+ this, SLOT( slotAddressChanged( int ) ) );
+ connect( m_sb_host_2, SIGNAL( valueChanged ( int ) ),
+ this, SLOT( slotAddressChanged( int ) ) );
+ connect( m_sb_host_3, SIGNAL( valueChanged ( int ) ),
+ this, SLOT( slotAddressChanged( int ) ) );
+
+ connect( m_sb_host_sshPort, SIGNAL( valueChanged ( int ) ),
+ this, SLOT( slotSSHPortChanged( int ) ) );
+
+
+ connect( m_cb_backend, SIGNAL( activated( const QString& ) ),
+ this, SLOT( slotBackaendChanged( const QString& ) ) );
+ connect( m_cb_os, SIGNAL( activated( const QString& ) ),
+ this, SLOT( slotOSChanged( const QString& ) ) );
+
+ connect( m_host_desc, SIGNAL( textChanged() ),
+ this, SLOT( slotDescriptionChanged() ) );
+
+ connect( m_cmd_testSSH, SIGNAL( clicked() ),
+ this, SLOT( slotTestConnection() ) );
+ connect( m_cmd_autoConf, SIGNAL( clicked() ),
+ this, SLOT( slotTryAutoConfiguration() ) );
+}
+
+KMFHostWidget::~KMFHostWidget()
+{
+
+
+}
+
+void KMFHostWidget::InitGUI() {
+ kdDebug() << "KMFHostWidget::InitGUI()" << endl;
+ m_cb_backend->blockSignals( true );
+ m_cb_os->blockSignals( true );
+ m_cb_backend->clear();
+ m_cb_os->clear();
+
+
+ // kdDebug() << "Start query" << endl;
+ KTrader::OfferList offers = KTrader::self()->query( "KMyFirewall/Compiler");
+ // kdDebug() << "Query performed for KMyFirewall/Installer" << endl;
+ KTrader::OfferList::iterator it;
+ if ( offers.empty() ) {
+ kdDebug() << "ERROR: NO MATCHING PLUGIN FOUND" << endl;
+ }
+ for ( it = offers.begin(); it != offers.end(); ++it ) {
+ KService::Ptr ptr = *it;
+ KLibFactory *factory = KLibLoader::self()->factory( ptr->library().local8Bit().data() );
+ kdDebug() << KLibLoader::self()->lastErrorMessage() << endl;
+ if ( !factory ) {
+ KMessageBox::error( 0, i18n("<qt><b>Compiler plugin could not be loaded.</b></qt>") );
+ kdDebug() << "Couldn't load plugin: " << ptr->name() << endl;
+ }
+
+ if ( KMFCompilerInterface *compiler = dynamic_cast<KMFCompilerInterface*> ( factory->create( this , "KMFCompilerInterface") ) ) {
+ m_cb_os->insertItem( compiler->osGUIName() );
+ }
+ }
+ slotOSChanged( m_cb_os->currentText() );
+ m_cb_backend->blockSignals( false );
+ m_cb_os->blockSignals( false );
+}
+
+/*$SPECIALIZATION$*/
+void KMFHostWidget::loadHost( KMFTarget *target ) {
+ kdDebug() << "KMFHostWidget::loadHost( KMFTarget * " + target->guiName() + " )" << endl;
+ m_target = target;
+
+
+ updateView();
+}
+
+
+void KMFHostWidget::updateView() {
+ kdDebug() << "KMFHostWidget::updateView()" << endl;
+ m_sb_host_0->blockSignals( true );
+ m_sb_host_1->blockSignals( true );
+ m_sb_host_2->blockSignals( true );
+ m_sb_host_3->blockSignals( true );
+ m_sb_host_sshPort->blockSignals( true );
+ m_cb_backend->blockSignals( true );
+ m_cb_os->blockSignals( true );
+ m_host_desc->blockSignals( true );
+ m_cmd_testSSH->blockSignals( true );
+ m_led_configStatus->off();
+ if ( m_target ) {
+ m_led_configStatus->on();
+ if ( m_target->config()->isValid() ) {
+ m_led_configStatus->setColor( Qt::green );
+ m_lbl_configStatus->setText( i18n( "Config Ok" ) );
+ } else {
+ m_led_configStatus->setColor( Qt::red );
+ m_lbl_configStatus->setText( i18n( "Invalid Config!" ) );
+ }
+
+
+ m_cb_backend->setEnabled( true );
+ m_cb_os->setEnabled( true );
+ m_host_desc->setEnabled( true );
+ m_cmd_testSSH->setEnabled( true );
+ m_sb_host_sshPort->setEnabled( true );
+ m_cb_backend->setEnabled( true );
+ m_cb_os->setEnabled( true );
+ m_sb_host_0->setEnabled( true );
+ m_sb_host_1->setEnabled( true );
+ m_sb_host_2->setEnabled( true );
+ m_sb_host_3->setEnabled( true );
+ m_cmd_autoConf->setEnabled( true );
+ m_host_desc->setEnabled( true );
+ m_host_desc->setReadOnly( false );
+ if ( m_target->installer() ) {
+ for( int i = 0; i < m_cb_os->count(); i++ ) {
+ if ( m_cb_os->text( i ).lower() == m_target->installer()->osGUIName().lower() ) {
+ m_cb_os->setCurrentItem( i );
+ break;
+ }
+ }
+
+ m_cb_backend->clear();
+ QValueList<KMFCompilerInterface*> *comps = m_target->installer()->compilers();
+ QValueList<KMFCompilerInterface*>::iterator it;
+
+ for ( it = comps->begin(); it != comps->end(); ++it ) {
+ kdDebug() << "Found Compiler: " << (*it)->backendGUIName() << endl;
+ m_cb_backend->insertItem( (*it)->backendGUIName() );
+ }
+
+ for( int i = 0; i < m_cb_backend->count(); i++ ) {
+ if ( m_cb_backend->text( i ).lower() == m_target->compiler()->backendGUIName().lower() ) {
+ m_cb_backend->setCurrentItem( i );
+ break;
+ }
+ }
+ }
+
+ if ( m_target->isLocalhost() ) {
+// m_cmd_testSSH->setEnabled( false );
+// m_sb_host_sshPort->setEnabled( false );
+ m_sb_host_0->setEnabled( false );
+ m_sb_host_1->setEnabled( false );
+ m_sb_host_2->setEnabled( false );
+ m_sb_host_3->setEnabled( false );
+ m_host_desc->setReadOnly( true );
+ }
+
+
+ IPAddress * addr = m_target->address();
+ m_sb_host_0->setValue( addr->getDigit( 0 ) );
+ m_sb_host_1->setValue( addr->getDigit( 1 ) );
+ m_sb_host_2->setValue( addr->getDigit( 2 ) );
+ m_sb_host_3->setValue( addr->getDigit( 3 ) );
+
+ m_sb_host_sshPort->setValue( m_target->sshPort() );
+
+/* m_cb_backend->setCurrentItem( m_target->config()->backend(), false );
+ m_cb_os->setCurrentItem( m_target->config()->oS(), false );*/
+
+ if ( m_host_desc->text().simplifyWhiteSpace() != m_target->description() ) {
+ m_host_desc->setText( m_target->description() );
+ }
+
+ } else {
+ m_sb_host_0->setEnabled( false );
+ m_sb_host_1->setEnabled( false );
+ m_sb_host_2->setEnabled( false );
+ m_sb_host_3->setEnabled( false );
+ m_cb_backend->setEnabled( false );
+ m_cb_os->setEnabled( false );
+ m_sb_host_sshPort->setEnabled( false );
+ m_cmd_testSSH->setEnabled( false );
+ m_host_desc->setEnabled( false );
+ m_cmd_autoConf->setEnabled( false );
+ m_host_desc->setReadOnly( true );
+ }
+
+ m_sb_host_0->blockSignals( false );
+ m_sb_host_1->blockSignals( false );
+ m_sb_host_2->blockSignals( false );
+ m_sb_host_3->blockSignals( false );
+ m_cb_backend->blockSignals( false );
+ m_cb_os->blockSignals( false );
+ m_host_desc->blockSignals( false );
+ m_sb_host_sshPort->blockSignals( false );
+ m_cmd_testSSH->blockSignals( false );
+}
+
+void KMFHostWidget::slotTestConnection() {
+ if ( ! m_target ) {
+ return;
+ }
+ if ( KIO::NetAccess::fish_execute( m_target->getFishUrl(), "ls /",
+ KApplication::kApplication()->mainWidget() ) != 0) {
+ KMessageBox::information( this, i18n("Conneted successfully to: %1").arg( m_target->toFriendlyString() ) );
+ } else {
+ KMessageBox::error( this, i18n("Connetion to: %1 failed!").arg( m_target->toFriendlyString() ) );
+ }
+}
+void KMFHostWidget::slotTryAutoConfiguration(){
+ kdDebug() << "KMFHostWidget::slotTryAutoConfiguration())" << endl;
+ if ( ! m_target ) {
+ return;
+ }
+ KMFError* err = m_target->tryAutoConfiguration();
+ KMFErrorHandler* errH = new KMFErrorHandler( i18n("Auto Confguration of: %1").arg( m_target->toFriendlyString() ) );
+ if ( ! errH->showError( err ) ) {
+ return;
+ }
+ if ( ! m_target->config()->isValid() ) {
+ KMessageBox::error( this, i18n("<qt><p>Auto Confguration of: %1 could not determinate all needed setting. You'll need to configure the mmissing settings.</p></qt>").arg( m_target->toFriendlyString() ) );
+ } else {
+ KMessageBox::information( this, i18n("<qt><p>Auto Confguration of: %1 finished successfully.</p></qt>").arg( m_target->toFriendlyString() ) );
+ }
+ emit sigTargetChanged();
+}
+
+void KMFHostWidget::slotTryAutoConfiguration_Callback( KMFTarget* ) {
+ disconnect( m_target, SIGNAL( sigTargetChanged( KMFTarget* ) ),
+ this,SLOT( slotTryAutoConfiguration_Callback( KMFTarget* ) ) );
+ if ( ! m_target->config()->isValid() ) {
+ KMessageBox::error( 0, i18n("<qt><p>Auto Confguration of: %1 could not determinate all needed setting. You'll need to configure the mmissing settings.</p></qt>").arg( m_target->toFriendlyString() ) );
+ } else {
+ KMessageBox::information( this, i18n("<qt><p>Auto Confguration of: %1 finished successfully.</p></qt>").arg( m_target->toFriendlyString() ) );
+ }
+ emit sigTargetChanged();
+}
+
+void KMFHostWidget::slotAddressChanged( int val ) {
+ kdDebug() << "KMFHostWidget::slotAddressChanged( int " << val << " )" << endl;
+ KMFUndoEngine::instance()->startTransaction(
+ m_target,
+ i18n( "Edit address of target: %1.").arg( m_target->guiName() )
+ );
+ m_target->address()->setAddress(
+ m_sb_host_0->value(),
+ m_sb_host_1->value(),
+ m_sb_host_2->value(),
+ m_sb_host_3->value() );
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigTargetChanged();
+
+}
+
+void KMFHostWidget::slotSSHPortChanged( int val ) {
+ kdDebug() << "KMFHostWidget:::slotSSHPortChanged( int " << val << " )" << endl;
+ KMFUndoEngine::instance()->startTransaction(
+ m_target,
+ i18n( "Edit SSH port of target: %1.").arg( m_target->guiName() )
+ );
+ m_target->setSSHPort( val );
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigTargetChanged();
+}
+
+
+
+void KMFHostWidget::slotOSChanged( const QString& val ) {
+ kdDebug() << "KMFHostWidget:::slotOSChanged( const QString& " << val << " )" << endl;
+ if ( ! m_target ) {
+ return;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ m_target->config(),
+ i18n( "Edit operation system setting of target: %1.").arg( m_target->guiName() )
+ );
+ m_target->config()->setOS( val.lower() );
+
+ m_cb_backend->blockSignals( true );
+ m_cb_backend->clear();
+ QValueList<KMFCompilerInterface*> *comps = m_target->installer()->compilers();
+ QValueList<KMFCompilerInterface*>::iterator it;
+
+ for ( it = comps->begin(); it != comps->end(); ++it ) {
+ kdDebug() << "Found Compiler: " << (*it)->backendGUIName() << endl;
+ m_cb_backend->insertItem( (*it)->backendGUIName() );
+ }
+ m_cb_backend->blockSignals( false );
+ slotBackaendChanged( m_cb_backend->currentText() );
+
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigTargetChanged();
+}
+
+void KMFHostWidget::slotBackaendChanged( const QString& val ) {
+ kdDebug() << "KMFHostWidget::slotBackaendChanged( const QString& " << val << " )" << endl;
+ KMFUndoEngine::instance()->startTransaction(
+ m_target->config(),
+ i18n( "Edit backend setting of target: %1.").arg( m_target->guiName() )
+ );
+ m_target->config()->setBackend( val.lower() );
+
+
+
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigTargetChanged();
+}
+
+void KMFHostWidget::slotDescriptionChanged() {
+ kdDebug() << "KMFHostWidget::slotDescriptionChanged()" << endl;
+ if ( m_host_desc->text() == m_target->description() ) {
+ kdDebug() << "Description Unchanged" << endl;
+ return;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ m_target,
+ i18n( "Edit documentation of target: %1.").arg( m_target->guiName() )
+ );
+ m_target->setDescription( m_host_desc->text().simplifyWhiteSpace() );
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigTargetChanged();
+}
+
+}
+
+#include "kmfhostwidget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfhostwidget.h b/kmyfirewall/kmfwidgets/kmfhostwidget.h
new file mode 100644
index 0000000..20aaf55
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfhostwidget.h
@@ -0,0 +1,69 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFHOSTWIDGET_H
+#define KMFHOSTWIDGET_H
+
+#include "kmyfirewallhostwidget.h"
+
+#include <qwidget.h>
+#include <kdialogbase.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kprocess.h>
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qguardedptr.h>
+
+namespace KMF {
+class KMFTarget;
+
+class KMFHostWidget : public KMyFirewallHostWidget
+{
+ Q_OBJECT
+
+public:
+ KMFHostWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFHostWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+ void loadHost( KMFTarget *target );
+ void InitGUI();
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+ void updateView();
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotAddressChanged( int );
+ void slotSSHPortChanged( int );
+ void slotOSChanged( const QString& );
+ void slotBackaendChanged( const QString& );
+ void slotDescriptionChanged();
+ void slotTestConnection();
+ void slotTryAutoConfiguration();
+ void slotTryAutoConfiguration_Callback( KMFTarget* );
+ signals:
+ void sigTargetChanged();
+
+
+private:
+ QGuardedPtr<KMFTarget> m_target;
+
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp b/kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp
new file mode 100644
index 0000000..e2979b7
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfinterfacewidget.cpp
@@ -0,0 +1,173 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfinterfacewidget.h"
+
+// QT includes
+#include <qstringlist.h>
+
+// KDE includes
+#include <klocale.h>
+#include <kcombobox.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <kguiitem.h>
+#include <kpushbutton.h>
+#include <knuminput.h>
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kiconloader.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+
+// Prokject includes
+#include "../core/kmftarget.h"
+#include "../core/kmftargetconfig.h"
+#include "../core/kmfundoengine.h"
+namespace KMF {
+KMFInterfaceWidget::KMFInterfaceWidget( QWidget* parent, const char* name, WFlags fl )
+ : KMyFirewallInterfaceWidget( parent, name, fl ) {
+ connect( m_b_add_int, SIGNAL( clicked() ), this, SLOT( slotAddInterface() ) );
+ connect( m_b_del_int, SIGNAL( clicked() ), this, SLOT( slotDelInterface() ) );
+
+ m_cb_int_name->clear();
+ m_cb_int_name->insertItem( "eth" );
+ m_cb_int_name->insertItem( "ppp" );
+ m_cb_int_name->insertItem( "ippp" );
+ m_cb_int_name->insertItem( "ppoe" );
+ m_cb_int_name->insertItem( "wlan" );
+ m_cb_int_name->insertItem( "tun" );
+ m_cb_int_name->insertItem( "tap" );
+ m_cb_int_name->insertItem( "gre" );
+ m_cb_int_name->insertItem( "lo" );
+}
+
+KMFInterfaceWidget::~KMFInterfaceWidget() {}
+
+void KMFInterfaceWidget::loadTarget( KMFTarget* target ) {
+ kdDebug() << "KMFInterfaceWidget::loadTarget( KMFTarget* target )" << endl;
+ m_target = target;
+ updateView();
+}
+
+void KMFInterfaceWidget::updateView(){
+ kdDebug() << "KMFInterfaceWidget::updateView()" << endl;
+ if ( ! m_target ) {
+ return;
+ }
+ KMFTargetConfig *conf = m_target->config();
+ kdDebug() << "Load Config:" << endl;
+ kdDebug() << conf->toString() << endl;
+ m_lb_int->clear();
+ QStringList ints = conf->interfaces();
+ for ( QStringList::Iterator it = ints.begin(); it != ints.end(); ++it ) {
+ QString s = *it;
+ kdDebug() << "Load Interface: " << s << endl;
+ m_lb_int->insertItem( s );
+ }
+}
+
+void KMFInterfaceWidget::slotAddInterface() {
+ QString int_name = m_cb_int_name->currentText();
+ int int_num = m_sb_int_num->value();
+ QString str_num;
+ str_num.setNum( int_num );
+ QString interface = int_name;
+ if ( int_name != "lo" )
+ interface += str_num;
+ for ( uint i = 0;i < m_lb_int->count();i++ ) {
+ QString interf = m_lb_int->text( i );
+ if ( interface == interf ) {
+ KMessageBox::sorry( this, i18n( "You cannot have more then one interface with the same name." ),
+ i18n( "Configuration" ) );
+ return ;
+ }
+ }
+ m_lb_int->insertItem( interface );
+
+
+ KMFUndoEngine::instance()->startTransaction(
+ m_target->config(),
+ i18n( "Edit interfaces for target: %1.").arg( m_target->guiName() )
+ );
+ m_target->config()->setInterfaces( interfaces() );
+ KMFUndoEngine::instance()->endTransaction();
+
+}
+
+void KMFInterfaceWidget::addInterface( const QString& interface ) {
+ for ( uint i = 0;i < m_lb_int->count();i++ ) {
+ QString interf = m_lb_int->text( i );
+ if ( interface == interf ) {
+ KMessageBox::sorry( this, i18n( "You cannot have more then one interface with the same name." ),
+ i18n( "Configuration" ) );
+ return ;
+ }
+ }
+ m_lb_int->insertItem( interface );
+}
+
+void KMFInterfaceWidget::addInterfaces( QStringList interfcaes ) {
+ m_lb_int-> insertStringList( interfcaes );
+}
+
+void KMFInterfaceWidget::slotDelInterface() {
+ int index = m_lb_int->currentItem();
+ if ( index > -1 ) {
+ switch ( QMessageBox::warning( this, i18n( "Configuration" ),
+ i18n( "Are you sure that you want to delete\n"
+ "this interface?\n" ),
+ i18n( "&OK" ), i18n( "&Cancel" ),
+ 0, 2 ) ) {
+
+ case 0: // OK clicked
+ m_lb_int->removeItem( index );
+ KMFUndoEngine::instance()->startTransaction(
+ m_target->config(),
+ i18n( "Edit interfaces for target: %1.").arg( m_target->guiName() )
+ );
+ m_target->config()->setInterfaces( interfaces() );
+ KMFUndoEngine::instance()->endTransaction();
+ break;
+ }
+
+ } else {
+ KMessageBox::sorry( this, i18n( "You have to select an interface first before you can delete it." ),
+ i18n( "Configuration" ) );
+ return ;
+
+ }
+}
+
+void KMFInterfaceWidget::clear() {
+ m_lb_int->clear();
+}
+
+QStringList KMFInterfaceWidget::interfaces() {
+ QStringList ifs;
+ for ( uint i = 0;i < m_lb_int->count();i++ ) {
+ QString interf = m_lb_int->text( i );
+ if ( !interf.isEmpty() ) {
+ kdDebug() << "Found Interface " << interf << endl;
+ ifs << interf;
+ }
+ }
+ return ifs;
+}
+
+}
+#include "kmfinterfacewidget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfinterfacewidget.h b/kmyfirewall/kmfwidgets/kmfinterfacewidget.h
new file mode 100644
index 0000000..cd898bd
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfinterfacewidget.h
@@ -0,0 +1,63 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFINTERFACEWIDGET_H
+#define KMFINTERFACEWIDGET_H
+
+#include "kmyfirewallinterfacewidget.h"
+
+#include <qstring.h>
+
+#include <qguardedptr.h>
+
+class QStringList;
+
+namespace KMF {
+class KMFTarget;
+
+class KMFInterfaceWidget : public KMyFirewallInterfaceWidget {
+ Q_OBJECT
+
+public:
+ KMFInterfaceWidget( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFInterfaceWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+ void addInterface( const QString& interface );
+ void addInterfaces( QStringList interfaces );
+ void clear();
+
+ void loadTarget( KMFTarget* target );
+
+ QStringList interfaces();
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ void slotDelInterface();
+ void slotAddInterface();
+
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+ void updateView();
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+
+signals:
+ void sigTargetChanged();
+
+private:
+ QGuardedPtr<KMFTarget> m_target;
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp b/kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp
new file mode 100644
index 0000000..32599b8
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfiptdocoptions.cpp
@@ -0,0 +1,88 @@
+/***************************************************************************
+ begin : Wed Aug 21 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.org.orphi.iki
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "kmfiptdocoptions.h"
+
+
+// qt includes
+#include <qcheckbox.h>
+
+// kde includes
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+// project includes
+#include "../core/kmfdoc.h"
+#include "../core/kmfiptdoc.h"
+#include "../core/kmfundoengine.h"
+#include "../core/kmfnetwork.h"
+#include "../core/kmftarget.h"
+namespace KMF {
+KMFIPTDocOptions::KMFIPTDocOptions( QWidget *parent, const char *name ) : KMyFirewallIPTDocOptions( parent, name ) {}
+
+KMFIPTDocOptions::~KMFIPTDocOptions() {}
+
+void KMFIPTDocOptions::loadDoc( KMFIPTDoc* doc ) {
+ kdDebug() << "void KMFIPTDocOptions::loadDoc(KMFIPTDoc* doc)" << endl;
+ kmfdoc = doc;
+ c_use_filter->setChecked( kmfdoc->useFilter() );
+ c_use_nat->setChecked( kmfdoc->useNat() );
+ c_use_mangle->setChecked( kmfdoc->useMangle() );
+ c_use_ipfwd->setChecked( kmfdoc->useIPFwd() );
+ c_use_rp_filter->setChecked( kmfdoc->useRPFilter() );
+ c_use_martians->setChecked( kmfdoc->useMartians() );
+ c_use_syn_cookies->setChecked( kmfdoc->useSynCookies() );
+ c_use_modules->setChecked( kmfdoc->useModules() );
+}
+void KMFIPTDocOptions::accept() {
+ if ( ! c_use_filter->isChecked() && ! c_use_nat->isChecked() && ! c_use_mangle->isChecked() ) {
+ KMessageBox::sorry(this, i18n("<p>Sorry, you need to use at least one of the three tables -- <b> filter, nat</b> or <b>mangle</b>:<br>it does not make any sense to work on a ruleset where you cannot add any rules.</p>") );
+ return;
+ }
+
+
+ KMFUndoEngine::instance()->startTransaction(
+ kmfdoc,
+ i18n( "Edit document settings for target: %1.").arg( kmfdoc->target()->guiName() )
+ );
+ kmfdoc->setUseFilter( c_use_filter->isChecked() );
+ kmfdoc->setUseNat( c_use_nat->isChecked() );
+ kmfdoc->setUseMangle( c_use_mangle->isChecked() );
+ kmfdoc->setUseIPFwd( c_use_ipfwd->isChecked() );
+ if ( c_use_rp_filter->isChecked() ) {
+ kmfdoc->setUseRPFilter( true );
+ kmfdoc->setUseMartians( c_use_martians->isChecked() );
+ } else {
+ kmfdoc->setUseRPFilter( false );
+ kmfdoc->setUseMartians( false );
+ }
+ kmfdoc->setUseSynCookies( c_use_syn_cookies->isChecked() );
+ kmfdoc->setUseModules( c_use_modules->isChecked() );
+ // kmfdoc->network()->changed();
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigConfigChanged();
+ QDialog::accept();
+}
+
+void KMFIPTDocOptions::slotHelp() {
+ kdDebug() << "void KMFIPTDocOptions::slotHelp() {" << endl;
+ kapp->invokeHelp();
+}
+
+}
+#include "kmfiptdocoptions.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfiptdocoptions.h b/kmyfirewall/kmfwidgets/kmfiptdocoptions.h
new file mode 100644
index 0000000..a4dd317
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfiptdocoptions.h
@@ -0,0 +1,49 @@
+/***************************************************************************
+ begin : Wed Aug 21 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.org.orphi.iki
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFIPTDOCOPTIONS_H
+#define KMFIPTDOCOPTIONS_H
+
+#include <qwidget.h>
+#include <kdemacros.h>
+#include "kmyfirewalliptdocoptions.h"
+
+/**
+ *@author Christian Hubinger
+ */
+
+class QString;
+
+namespace KMF {
+class KMFIPTDoc;
+
+class KDE_EXPORT KMFIPTDocOptions : public KMyFirewallIPTDocOptions {
+ Q_OBJECT
+public:
+ KMFIPTDocOptions( QWidget *parent = 0, const char *name = 0 );
+ ~KMFIPTDocOptions();
+ void loadDoc( KMFIPTDoc* doc );
+
+public slots:
+ void slotHelp();
+ void accept();
+private:
+ KMFIPTDoc* kmfdoc;
+signals:
+ void sigConfigChanged();
+
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfiptdocview.cpp b/kmyfirewall/kmfwidgets/kmfiptdocview.cpp
new file mode 100644
index 0000000..ee5e91b
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfiptdocview.cpp
@@ -0,0 +1,110 @@
+//
+// C++ Implementation: kmfiptdocview
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2005
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "kmfiptdocview.h"
+
+// QT includes
+
+
+// KDE includes
+#include <kdebug.h>
+
+// Project includes
+#include "../core/kmfiptdoc.h"
+#include "../core/kmfdoc.h"
+#include "../core/iptable.h"
+#include "../core/xmlnames.h"
+namespace KMF {
+KMFIPTDocView::KMFIPTDocView(QWidget *parent, const char *name) : QTabWidget(parent, name)
+{
+ loaded = false;
+ m_iptViewFilter = new KMFListView( 0, "view" );
+ m_iptViewNat = new KMFListView( 0, "view" );
+ m_iptViewMangle = new KMFListView( 0, "view" );
+ addTab( m_iptViewFilter, "Filter" );
+ addTab( m_iptViewNat, "Nat" );
+ addTab( m_iptViewMangle, "Mangle" );
+
+ m_iptViewFilter ->setEnabled( true );
+ m_iptViewFilter->clear();
+ m_iptViewFilter->slotUpdateView();
+
+ m_iptViewNat ->setEnabled( true );
+ m_iptViewNat->clear();
+ m_iptViewNat->slotUpdateView();
+
+ m_iptViewMangle ->setEnabled( true );
+ m_iptViewMangle->clear();
+ m_iptViewMangle->slotUpdateView();
+
+ setMinimumSize( 600, 400 );
+}
+
+
+KMFIPTDocView::~KMFIPTDocView()
+{
+}
+
+void KMFIPTDocView::slotLoadDoc( KMFIPTDoc *iptdoc ) {
+ kdDebug() << "void KMFIPTDocView::slotLoadDoc( KMFIPTDoc *iptdoc )" << endl;
+ if ( ! loaded ) {
+ m_iptViewMangle->clear();
+ m_iptViewFilter->slotLoadNode( iptdoc->table( Constants::FilterTable_Name ) );
+ m_iptViewFilter->slotUpdateView();
+ m_iptViewMangle->clear();
+ m_iptViewNat->slotLoadNode( iptdoc->table( Constants::NatTable_Name ) );
+ m_iptViewFilter->slotUpdateView();
+ m_iptViewMangle->clear();
+ m_iptViewMangle->slotLoadNode( iptdoc->table( Constants::MangleTable_Name ) );
+ m_iptViewFilter->slotUpdateView();
+ loaded = true;
+ } else {
+
+ m_iptViewFilter->slotUpdateView( iptdoc->table( Constants::FilterTable_Name ) );
+ m_iptViewFilter->slotUpdateView();
+
+ m_iptViewNat->slotUpdateView( iptdoc->table( Constants::NatTable_Name ) );
+ m_iptViewNat->slotUpdateView();
+
+ m_iptViewMangle->slotUpdateView( iptdoc->table( Constants::MangleTable_Name ) );
+ m_iptViewMangle->slotUpdateView();
+ }
+}
+
+void KMFIPTDocView::slotLoadTable( IPTable* ) {
+
+}
+
+void KMFIPTDocView::close() {
+ kdDebug() << "void KMFIPTDocView::close()" << endl;
+ emit closing();
+ QTabWidget::close();
+}
+
+void KMFIPTDocView::show() {
+ kdDebug() << "void KMFIPTDocView::show()" << endl;
+ emit showing();
+ QTabWidget::show();
+ m_iptViewFilter->slotUpdateView();
+ m_iptViewNat->slotUpdateView();
+ m_iptViewMangle->slotUpdateView();
+}
+
+void KMFIPTDocView::hide() {
+ kdDebug() << "void KMFIPTDocView::hide()" << endl;
+ emit closing();
+ QTabWidget::hide();
+}
+
+
+}
+
+#include "kmfiptdocview.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfiptdocview.h b/kmyfirewall/kmfwidgets/kmfiptdocview.h
new file mode 100644
index 0000000..88093d4
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfiptdocview.h
@@ -0,0 +1,69 @@
+//
+// C++ Interface: kmfiptdocview
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2005
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef KMFIPTDOCVIEW_H
+#define KMFIPTDOCVIEW_H
+
+#include <qtabwidget.h>
+
+
+#include "kmflistview.h"
+
+// Project includes
+
+namespace KMF {
+class KMFIPTDoc;
+class IPTable;
+
+/**
+@author Christian Hubinger
+*/
+class KMFIPTDocView : public QTabWidget
+{
+Q_OBJECT
+public:
+ KMFIPTDocView(QWidget *parent = 0, const char *name = 0);
+
+ ~KMFIPTDocView();
+
+KMFListView* filterView() const {
+ return m_iptViewFilter;
+};
+
+KMFListView* natView() const {
+ return m_iptViewNat;
+};
+
+KMFListView* mangleView() const {
+ return m_iptViewMangle;
+};
+
+
+public slots:
+ void slotLoadDoc( KMFIPTDoc* );
+ void slotLoadTable( IPTable* );
+ void close();
+ void show();
+ void hide();
+
+private:
+ KMFListView *m_iptViewFilter;
+ KMFListView *m_iptViewNat;
+ KMFListView *m_iptViewMangle;
+ bool loaded;
+
+signals:
+ void closing();
+ void showing();
+
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp
new file mode 100644
index 0000000..8a19942
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.cpp
@@ -0,0 +1,117 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfipv4addresswidget.h"
+
+// QT includes
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qwidgetstack.h>
+#include <qtextedit.h>
+#include <qtimer.h>
+
+
+// KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <kcombobox.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <knuminput.h>
+
+// Project includes
+#include "../core/ipaddress.h"
+namespace KMF {
+KMFIPv4AddressWidget::KMFIPv4AddressWidget ( QWidget* parent, const char* name, WFlags fl )
+ : KMyFirewallIPv4AdddressWidget ( parent,name,fl ) {
+
+// m_address = new IPAddress( 0,0,0,0 );
+ connect( m_sb_from_1, SIGNAL( valueChanged( const QString& ) ),
+ this, SLOT( slotAddressChanged( const QString& ) ) );
+ connect( m_sb_from_2, SIGNAL( valueChanged( const QString& ) ),
+ this, SLOT( slotAddressChanged( const QString& ) ) );
+ connect( m_sb_from_3, SIGNAL( valueChanged( const QString& ) ),
+ this, SLOT( slotAddressChanged( const QString& ) ) );
+ connect( m_sb_from_4, SIGNAL( valueChanged( const QString& ) ),
+ this, SLOT( slotAddressChanged( const QString& ) ) );
+}
+
+KMFIPv4AddressWidget::~KMFIPv4AddressWidget() {}
+
+/*$SPECIALIZATION$*/
+
+void KMFIPv4AddressWidget::loadIPAddress( int d0, int d1, int d2, int d3 ) {
+ kdDebug() << "KMFIPv4AddressWidget::loadIPAddress( "
+ << d0 << "."
+ << d1 << "."
+ << d2 << "."
+ << d3 << " )" << endl;
+
+
+
+ m_sb_from_1->blockSignals( true );
+ m_sb_from_2->blockSignals( true );
+ m_sb_from_3->blockSignals( true );
+ m_sb_from_4->blockSignals( true );
+
+ m_sb_from_1->setValue( d0 );
+ m_sb_from_2->setValue( d1 );
+ m_sb_from_3->setValue( d2 );
+ m_sb_from_4->setValue( d3 );
+
+ m_sb_from_1->blockSignals( false );
+ m_sb_from_2->blockSignals( false );
+ m_sb_from_3->blockSignals( false );
+ m_sb_from_4->blockSignals( false );
+
+ m_sb_from_1->setEnabled( true );
+ m_sb_from_2->setEnabled( true );
+ m_sb_from_3->setEnabled( true );
+ m_sb_from_4->setEnabled( true );
+
+ // m_address->setAddress( d0, d1, d2, d3 );
+}
+
+void KMFIPv4AddressWidget::slotAddressChanged( const QString& ) {
+ kdDebug() << "KMFIPv4AddressWidget::slotAddressChanged( const QString& )" << endl;
+ /*
+ if ( ! m_address ) {
+ return;
+ }
+
+ const QString& newAddr = m_sb_from_1->text() +"."+
+ m_sb_from_2->text() +"."+
+ m_sb_from_3->text() +"."+
+ m_sb_from_4->text();
+ if ( m_address->toString() == newAddr ) {
+ return;
+ }*/
+
+ emit sigAddressChanged(
+ m_sb_from_1->value(),
+ m_sb_from_2->value(),
+ m_sb_from_3->value(),
+ m_sb_from_4->value() );
+}
+
+}
+
+#include "kmfipv4addresswidget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfipv4addresswidget.h b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.h
new file mode 100644
index 0000000..3ae2a6b
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfipv4addresswidget.h
@@ -0,0 +1,52 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFIPV4ADDRESSWIDGET_H
+#define KMFIPV4ADDRESSWIDGET_H
+
+#include "kmyfirewallipv4adddresswidget.h"
+
+// QT include
+#include <qguardedptr.h>
+
+namespace KMF {
+class IPAddress;
+
+class KMFIPv4AddressWidget : public KMyFirewallIPv4AdddressWidget {
+ Q_OBJECT
+
+ public:
+ KMFIPv4AddressWidget ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFIPv4AddressWidget();
+ void loadIPAddress( int, int, int, int );
+
+ /*$PUBLIC_FUNCTIONS$*/
+
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+
+ protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+ protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotAddressChanged( const QString& );
+
+ private:
+// IPAddress *m_address;
+
+ signals:
+ void sigAddressChanged( int, int, int, int );
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmflistview.cpp b/kmyfirewall/kmfwidgets/kmflistview.cpp
new file mode 100644
index 0000000..072e348
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmflistview.cpp
@@ -0,0 +1,1148 @@
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+/*
+Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004
+*/
+
+
+
+#include "kmflistview.h"
+
+// QT includes
+#include <qstring.h>
+#include <qptrlist.h>
+#include <kiconloader.h>
+
+// KDE includes
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kconfig.h>
+
+// Project includes
+#include "../core/netfilterobject.h"
+#include "../core/kmfdoc.h"
+#include "../core/iptable.h"
+#include "../core/iptchain.h"
+#include "../core/iptrule.h"
+#include "../core/iptruleoption.h"
+#include "../core/kmfconfig.h"
+#include "../core/kmfappstate.h"
+#include "../core/xmlnames.h"
+#include "../kmyfirewall.h"
+#include "kmflistviewitem.h"
+namespace KMF {
+KMFListView::KMFListView( QWidget *parent, const char *name ) : KListView( parent, name ) {
+ loadIcons();
+ connect( this, SIGNAL( sigLoadNode( NetfilterObject* ) ),
+ this, SLOT( slotLoadNode( NetfilterObject* ) ) );
+ cast_error = i18n( "ERROR: Wrong ListViewItem Class used!\nThis is no KMFListViewItem" );
+ setSorting(0,true);
+ m_show_desc = true;
+ m_show_cmds = false;
+ m_show_objectID = false;
+ m_NetfilterObject = 0;
+
+
+ addColumn( i18n( "Rule No." ) );
+ addColumn( QString::null );
+ addColumn( i18n( "Value" ) );
+ setSizePolicy( QSizePolicy( ( QSizePolicy::SizeType ) 2, ( QSizePolicy::SizeType ) 2, 0, 0,
+ sizePolicy().hasHeightForWidth() ) );
+ setFrameShape( KListView::StyledPanel );
+ setFrameShadow( KListView::Sunken );
+ setSorting( 0, true );
+ setFullWidth( true );
+ setItemsMovable( true );
+ setDropHighlighter( true );
+ setDropVisualizer( true );
+ setSelectionMode( QListView::Single );
+
+}
+
+
+KMFListView::~KMFListView() {}
+
+void KMFListView::slotLoadNode( NetfilterObject* node ) {
+ kdDebug() << "void KMFListView::loadNode( NetfilterObject* node )" << endl;
+ if ( ! node ) {
+ kdDebug() << "node == 0" << endl;
+ return;
+ }
+ m_NetfilterObject = node;
+
+ if ( m_NetfilterObject->type() == NetfilterObject::TABLE ) {
+ if ( IPTable * table = dynamic_cast<IPTable*> ( node ) ) {
+ bool changed = false;
+ if ( KMFConfig::showDocumentation() ) {
+ if ( ! m_show_desc )
+ changed = true;
+ m_show_desc = true;
+ } else {
+ if ( m_show_desc )
+ changed = true;
+ m_show_desc = false;
+ }
+ if ( KMFConfig::showCommandLine() ) {
+ if ( ! m_show_cmds )
+ changed = true;
+ m_show_cmds = true;
+ } else {
+ if ( m_show_cmds )
+ changed = true;
+ m_show_cmds = false;
+ }
+ if ( KMFConfig::showObjectID() ) {
+ if ( ! m_show_objectID )
+ changed = true;
+ m_show_objectID = true;
+ } else {
+ if ( m_show_objectID )
+ changed = true;
+ m_show_objectID = false;
+ }
+ setUpdatesEnabled( false );
+ setupTableView( table );
+ setUpdatesEnabled( true );
+ sort();
+ triggerUpdate();
+ } else {
+ KMessageBox::error( this, i18n( "Found invalid ListViewItem." ), i18n( "Found invalid ListViewItem." ) );
+ }
+ }
+}
+
+void KMFListView::slotUpdateView() {
+ kdDebug() << "KMFListView::slotUpdateView()." << endl;
+ if ( ! m_NetfilterObject ) {
+ kdDebug() << "m_NetfilterObject = 0" << endl;
+ return ;
+ }
+ if ( ! KMFAppState::upAndRunning() ) {
+ kdDebug() << "Doing Nothing during startup." << endl;
+ this->clearAllItems();
+ return;
+ }
+/* if ( ! KMFAppState::hasOpenDoc() ) {
+ kdDebug() << "No Open doc. disabling view!" << endl;
+ this->clearAllItems();
+ setEnabled( false );
+ return;
+ }*/
+ setEnabled( true );
+ emit sigLoadNode( m_NetfilterObject );
+}
+
+void KMFListView::slotUpdateView( NetfilterObject* obj ) {
+ if ( ! obj )
+ return;
+ if ( ! KMFAppState::upAndRunning() ) {
+ kdDebug() << "Doing Nothing during startup." << endl;
+ this->clearAllItems();
+ return;
+ }
+ if ( obj->type() == NetfilterObject::TABLE ) {
+ if ( ! m_NetfilterObject )
+ return;
+ emit sigLoadNode( m_NetfilterObject );
+ } else if ( obj->type() == NetfilterObject::CHAIN ) {
+ if ( IPTChain* chain = dynamic_cast<IPTChain*>( obj ) ) {
+ if ( KMFListViewItem* item = findKMFItem( chain->name(), 2, chain->uuid() ) ) {
+ if ( KMFListViewItem* parent = dynamic_cast<KMFListViewItem*>( item->parent() ) ) {
+ emit sigLoadNode( m_NetfilterObject );
+// kdDebug() << "Starting update for Chain Item..." << endl;
+ setUpdatesEnabled( false );
+ setupChainView( chain, parent );
+ setUpdatesEnabled( true );
+ triggerUpdate();
+// kdDebug() << "Finished update for Chain Item." << endl;
+ }
+ }
+ }
+ } else if ( obj->type() == NetfilterObject::RULE ) {
+ if ( IPTRule* rule = dynamic_cast<IPTRule*>( obj ) ) {
+ if ( KMFListViewItem* item = findKMFItem( rule->name(), 2, rule->uuid()) ) {
+ if ( KMFListViewItem* parent = dynamic_cast<KMFListViewItem*>( item->parent() ) ) {
+// kdDebug() << "Starting update for Rule Item..." << endl;
+ setUpdatesEnabled( false );
+ setupRuleView( rule, parent );
+ setUpdatesEnabled( true );
+ triggerUpdate();
+// kdDebug() << "Finished update for Rule Item." << endl;
+ }
+ }
+ }
+ }
+}
+
+KMFListViewItem* KMFListView::getRootItem() {
+ KMFListViewItem * item = dynamic_cast<KMFListViewItem*>( firstChild() );
+ if ( item ) {
+ return item;
+ } else {
+ return 0;
+ }
+}
+
+void KMFListView::slotChangeRoot( QListViewItem* /*item*/ ) {
+ // if ( ! item || item == 0)
+ // return;
+ //
+ // if ( KMFListViewItem * tmp_item = dynamic_cast<KMFListViewItem *>( item ) ) {
+ // if ( tmp_item == 0 || ! tmp_item )
+ // return ;
+ // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::RULEOPTION )
+ // if ( tmp_item->ruleOption() )
+ // emit sigLoadNode( tmp_item->ruleOption() );
+ // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::RULE )
+ // if ( tmp_item->rule() )
+ // emit sigLoadNode( tmp_item->rule() );
+ // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::CHAIN )
+ // if ( tmp_item->chain() )
+ // emit sigLoadNode( tmp_item->chain() );
+ // if ( tmp_item->isTopItem() && tmp_item->type() == KMFListViewItem::TABLE )
+ // if ( tmp_item->table() )
+ // emit sigLoadNode( tmp_item->table() );
+ // }
+}
+
+void KMFListView::setupTableView( IPTable* table ) {
+// kdDebug() << "KMFListView::setupTableView(IPTable* table, KMFListViewItem* item )" << endl;
+ if ( ! table )
+ return ;
+ KMFListViewItem* item = 0;
+ item = findKMFItem( table->name(), 2, table->uuid() );
+ if ( ! item ) {
+ item = new KMFListViewItem( this, 0, table );
+ item->setOpen( true );
+ }
+
+ item->sortChildItems( 0, true );
+ item->setTopItem( true );
+ item->setInUse( true );
+ item->setOpen( true );
+ item->setText( 0, i18n( "Table:" ) );
+ item->setPixmap( 0 , icon_table );
+ item->setText( 2, table->name() );
+
+ QPtrList<IPTChain> chains = table->chains();
+ QPtrList<IPTChain> used_chains;
+ for ( int i = chains.count(); i >= 0; i-- ) {
+ IPTChain* chain = 0;
+ chain = chains.at( i );
+ if ( chain ) {
+ used_chains.append ( chain );
+ QString str_obj_id = "";
+ str_obj_id = chain->uuid().toString();
+
+ if ( m_existed_chains.findIndex ( chain->name() + "|" + str_obj_id ) == -1 )
+ m_existed_chains.append ( chain->name() + "|" + str_obj_id );
+
+ if ( ! m_dict_existed_rules.find( chain->uuid() ) ) {
+ m_dict_existed_rules.insert( chain->uuid().toString(), new QStringList );
+ }
+ setupChainView( chain, item );
+ }
+ }
+ if ( ! m_existed_chains.isEmpty() ) {
+ for ( QStringList::Iterator it = m_existed_chains.begin(); it != m_existed_chains.end(); ++it ) {
+ QString existed_chain_name_id = *it;
+ int delimiter = existed_chain_name_id.find( "|" );
+ QString existed_chain_name = existed_chain_name_id.left( delimiter );
+ QString existed_chain_id_str = existed_chain_name_id.right( existed_chain_name_id.length() - delimiter - 1 );
+/* QUuid existed_obj_id = -1;
+ bool ok;
+ existed_obj_id = existed_chain_id_str.toInt( &ok );*/
+ QUuid existed_obj_id( existed_chain_id_str );
+// kdDebug() << "Found Existed Name: " << existed_chain_name << " ID: " << existed_obj_id << endl;
+ bool have = false;
+ QPtrListIterator<IPTChain> it2( used_chains );
+ IPTChain* used_chain = 0;
+ while ( it2.current() ) {
+ used_chain = it2.current();
+// kdDebug() << "Entering: while ( used_chain )" << endl;
+ ++it2;
+ if ( existed_chain_name == used_chain->name() ) {
+// kdDebug() << "Chain: " << used_chain->name() << " already existed:" << endl;
+ have = true;
+ }
+ }
+ if ( ! have ) {
+// kdDebug() << "Chain: " << existed_chain_name << " could not be found" << endl;
+ KMFListViewItem* del_item = findKMFItem( existed_chain_name, 2, existed_obj_id );
+ if ( del_item ) {
+// kdDebug() << "Chain: " << existed_chain_name << " was DELETED:" << endl;
+ delete del_item;
+ }
+ }
+ }
+ }
+
+ m_existed_chains.clear();
+ QPtrListIterator<IPTChain> it3 ( used_chains );
+ while ( it3.current() ) {
+ IPTChain * chain = it3.current();
+ ++it3;
+ QString str_obj_id = chain->uuid().toString();
+ // str_obj_id = str_obj_id.setNum( chain->uuid() );
+
+ m_existed_chains.append( chain->name() + "|" + str_obj_id );
+ }
+
+ KMFListViewItem * item_desc = 0;
+ item_desc = findKMFItem( i18n( "Documentation:" ), 0, table->uuid() );
+
+ if ( !table->description().isEmpty() && m_show_desc ) {
+ if ( ! item_desc ) {
+ item_desc = new KMFListViewItem( item, 0, table );
+ }
+
+ item_desc->setInUse( true );
+ item_desc->setMultiLinesEnabled( true );
+ item_desc->setText( 0, i18n( "Documentation:" ) );
+ item_desc->setPixmap( 1, icon_rename );
+ item_desc->setText( 2, table->description() );
+
+ } else if ( item_desc ) {
+ delete item_desc;
+ }
+
+
+ KMFListViewItem* item_obj_id = 0;
+ item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, table->uuid(),true,item );
+
+ if ( KMFConfig::showObjectID() ) {
+ if ( ! item_obj_id ) {
+ item_obj_id = new KMFListViewItem( item, 0, table );
+ }
+ item_obj_id->setInUse( true );
+ item_obj_id->setText( 0, i18n( "Object ID:" ) );
+ item_obj_id->setText( 2, table->uuid().toString() );
+ } else if ( item_obj_id ) {
+ delete item_obj_id;
+ }
+// kdDebug() << "Sorting Table Item Children..." << endl;
+ item->sort();
+}
+
+void KMFListView::setupChainView( IPTChain* chain, KMFListViewItem* parent ) {
+// kdDebug() << "KMFListView::setupChainView( IPTChain* chain, KMFListViewItem* item )" << endl;
+ if ( ! chain || ! parent )
+ return ;
+
+ KMFListViewItem * item = 0;
+ item = findKMFItem( chain->name(), 2, chain->uuid(), true, parent );
+ if ( ! item ) {
+// kdDebug() << "No Item for Chain: " << chain->name() << " found.\nNeed to create a new one." << endl;
+ item = new KMFListViewItem( parent, 0, chain );
+ }
+ item->sortChildItems( 0, true );
+ item->setTopItem( true );
+ item->setInUse( true );
+ QPixmap icon_null;
+ item->setText( 0, i18n( "Chain:" ) );
+ if ( chain->isBuildIn() ) {
+ item->setPixmap( 0, icon_builtin );
+ } else {
+ item->setPixmap( 0, icon_user );
+ }
+
+ if ( chain->logging() ) {
+ item->setPixmap( 1, icon_log );
+ } else {
+ item->setPixmap( 1, icon_null );
+ }
+ QString chain_name = chain->name();
+ item->setText( 2, chain_name );
+
+
+ KMFListViewItem * i_chain_cmd = 0;
+ i_chain_cmd = findKMFItem( i18n( "Cmd:" ), 0, chain->uuid(), true, item );
+
+ if ( ! chain->isBuildIn() && m_show_cmds ) {
+ if ( ! i_chain_cmd ) {
+ i_chain_cmd = new KMFListViewItem( item , 0, chain );
+ }
+ QString tmp_cmd = chain->createIPTablesChainDefinition();
+ // kdDebug() << "Setting up item: i_chain_cmd" << endl;
+ i_chain_cmd->setInUse( true );
+ i_chain_cmd->setText( 0, i18n( "Cmd:" ) );
+ i_chain_cmd->setPixmap( 0, icon_cmd );
+ i_chain_cmd->setText( 2, tmp_cmd );
+ } else if ( i_chain_cmd ) {
+ delete i_chain_cmd;
+ }
+
+ // logging+++++++++++++++++++++++++++++++++++++++++++++++++++
+ // kdDebug() << "Setting up item: i_chain_log" << endl;
+ bool logging = chain->logging();
+ KMFListViewItem * i_chain_log = 0;
+ i_chain_log = findKMFItem( i18n( "Chain logging:" ), 0, chain->uuid(), true, item );
+
+ if ( ! logging && i_chain_log ) {
+ delete i_chain_log;
+ }
+
+ if ( logging ) {
+ if ( ! i_chain_log ) {
+ i_chain_log = new KMFListViewItem( item, 0, chain );
+ i_chain_log->setOpen( true );
+ }
+ i_chain_log->setInUse( true );
+ i_chain_log->setText( 0, i18n( "Chain logging:" ) );
+ // kdDebug() << "Logging enabled" << endl;
+ // i_chain_log->setPixmap( 1, icon_log );
+ i_chain_log->setText( 2, i18n( "Dropped Packets" ) );
+ QString limit = chain->logLimit();
+ QString prefix = chain->logPrefix();
+ QString burst = chain->logBurst();
+ KMFListViewItem * i_limit = 0;
+ i_limit = findKMFItem( i18n( "Limit rate:" ), 0, chain->uuid(), true, i_chain_log );
+
+
+ if ( ( limit.isEmpty() || limit == XML::Undefined_Value ) && i_limit ) {
+ delete i_limit;
+ } else
+ if ( ! limit.isEmpty() && limit != XML::Undefined_Value ) {
+ if ( ! i_limit ) {
+ i_limit = new KMFListViewItem( i_chain_log, 0, chain );
+ i_limit->setOpen( true );
+ }
+
+ i_limit->setInUse( true );
+ i_limit->setText( 0, i18n( "Limit rate:" ) );
+ i_limit->setText( 2, limit );
+
+ KMFListViewItem * i_burst = 0;
+ i_burst = findKMFItem( i18n( "Limit burst:" ), 0, chain->uuid(), true, i_chain_log );
+
+ if ( ( burst.isEmpty() || burst == XML::Undefined_Value ) && i_burst ) {
+ delete i_burst;
+ }
+
+ if ( ! burst.isEmpty() && burst != XML::Undefined_Value ) {
+ // kdDebug() << "Setting up item: i_burst" << endl;
+ if ( ! i_burst ) {
+ i_burst = new KMFListViewItem( i_chain_log, i_limit, chain );
+ i_burst->setOpen( true );
+ }
+ i_burst->setInUse( true );
+ i_burst->setText( 0, i18n( "Limit burst:" ) );
+ i_burst->setText( 2, burst );
+ }
+ }
+
+ KMFListViewItem* i_prefix = 0;
+ i_prefix = findKMFItem( i18n( "Log prefix:" ), 0, chain->uuid(), true, i_chain_log );
+
+ if ( ( prefix.isEmpty() || prefix == XML::Undefined_Value ) && i_prefix ) {
+ delete i_prefix;
+ }
+
+ if ( ! prefix.isEmpty() && prefix != XML::Undefined_Value ) {
+ // kdDebug() << "Setting up item: i_prefix" << endl;
+ if ( ! i_prefix ) {
+ i_prefix = new KMFListViewItem( i_chain_log, 0, chain );
+ i_prefix->setOpen( true );
+ }
+ i_prefix->setInUse( true );
+ i_prefix->setText( 0, i18n( "Log prefix:" ) );
+ i_prefix->setText( 2, prefix );
+
+ }
+ }
+
+ // // chain feeds++++++++++++++++++++++++++++++++++++++++++++
+ QString str = chain->name();
+ QPtrList<IPTRule> feeds = chain->chainFeeds();
+ bool buildin = chain->isBuildIn();
+ // kdDebug() << "Setting up item: i_chain_feeds" << endl;
+ KMFListViewItem * i_chain_feeds = 0;
+ i_chain_feeds = findKMFItem( i18n( "Chain Feeds:" ), 0, chain->uuid(), true, item );
+ if ( ! i_chain_feeds ) {
+ if ( logging )
+ i_chain_feeds = new KMFListViewItem( item, i_chain_log, chain );
+ else
+ i_chain_feeds = new KMFListViewItem( item, item, chain );
+ i_chain_feeds->setOpen( true );
+ }
+ i_chain_feeds->setText( 0, i18n( "Chain Feeds:" ) );
+ i_chain_feeds->setInUse( true );
+ if ( buildin ) {
+ i_chain_feeds->setText( 2, i18n( "System Feed" ) );
+ } else {
+ int number = feeds.count();
+ QString num_feed = i18n( "1 Feed", "%n Feeds", number );
+ i_chain_feeds->setText( 2, num_feed );
+ i_chain_feeds->setInUse( true );
+ i_chain_feeds->deleteChildren();
+ IPTRule *curr_rule = 0;
+ QPtrList<KMFListViewItem> used_items;
+ if ( ! feeds.isEmpty() ) {
+ i_chain_feeds->setPixmap( 0, icon_feed );
+ QPtrListIterator<IPTRule> it( feeds );
+ while ( it.current() ) {
+ curr_rule = it.current();
+ ++it;
+ KMFListViewItem * item_feeds = new KMFListViewItem( i_chain_feeds, chain );
+ item_feeds->setInUse( true );
+ item_feeds->setText( 0, i18n( "From chain: %1" ).arg( curr_rule->chain() ->name() ) );
+ item_feeds->setPixmap( 2, icon_rule );
+ item_feeds->setText( 2, curr_rule->name() );
+ }
+ }
+ }
+ // //chain fwds++++++++++++++++++++++++++++++++++++++++++++++++
+ QPtrList<IPTRule> fwds = chain->chainFwds();
+
+ // kdDebug() << "Setting up item: i_chain_fwds" << endl;
+ KMFListViewItem * i_chain_fwds = 0;
+ i_chain_fwds = findKMFItem( i18n( "Chain forwards:" ), 0, chain->uuid(), true, item );
+ if ( ! i_chain_fwds ) {
+ i_chain_fwds = new KMFListViewItem( item, i_chain_feeds, chain );
+ i_chain_fwds->setOpen( true );
+ }
+
+ int number2 = fwds.count();
+ QString num_fwd = i18n( "1 Forward", "%n Forwards", number2 );
+ i_chain_fwds->setInUse( true );
+ i_chain_fwds->setText( 0, i18n( "Chain forwards:" ) );
+ i_chain_fwds->setText( 2, num_fwd );
+
+// QPtrList<KMFListViewItem> used_items;
+ i_chain_fwds->deleteChildren();
+ if ( !fwds.isEmpty() ) {
+ i_chain_fwds->setPixmap( 0, icon_fwds );
+ IPTRule * curr_rule;
+ QPtrListIterator<IPTRule> it( fwds );
+ while ( it.current() ) {
+ curr_rule = it.current();
+ ++it;
+ KMFListViewItem * item_fwds = new KMFListViewItem( i_chain_fwds, chain );
+ item_fwds->setInUse( true );
+ item_fwds->setPixmap( 0, icon_rule );
+ item_fwds->setText( 0, i18n( "Rule: %1" ).arg( curr_rule->name() ) );
+ item_fwds->setPixmap( 1, icon_fwd );
+ item_fwds->setText( 2, curr_rule->target() );
+ }
+ }
+
+
+ //########### Start Rules ####################
+ QPtrList<IPTRule> tmp_ruleset = chain->chainRuleset();
+
+ // kdDebug() << "Setting up item: i_chain_allrules" << endl;
+ KMFListViewItem* i_chain_allrules = 0;
+ i_chain_allrules = findKMFItem( i18n( "Rule(s):" ), 0, chain->uuid(), true, item );
+ if ( ! i_chain_allrules ) {
+ i_chain_allrules = new KMFListViewItem( item, i_chain_fwds, chain );
+ i_chain_allrules->setOpen( TRUE );
+ }
+ i_chain_allrules->sortChildItems( 0, true );
+
+ int number3 = tmp_ruleset.count();
+ QString num_rules = i18n( "1 Rule", "%n Rules", number3 );
+ i_chain_allrules->setInUse( true );
+ i_chain_allrules->setText( 0, i18n( "Rule(s):" ) );
+ i_chain_allrules->setPixmap( 0, icon_rule );
+ i_chain_allrules->setText( 2, num_rules );
+
+ QPtrList<IPTRule> used_rules;
+ QStringList *existed_rules = m_dict_existed_rules.find( chain->uuid() );
+
+ if ( existed_rules ) {
+ if ( !tmp_ruleset.isEmpty() ) {
+ IPTRule * curr_rule;
+ for ( curr_rule = tmp_ruleset.last(); curr_rule; curr_rule = tmp_ruleset.prev() ) {
+// kdDebug() << "Entering: for ( curr_rule = tmp_ruleset.last(); curr_rule; curr_rule = tmp_ruleset.prev() )" << endl;
+ used_rules.append( curr_rule );
+ if ( existed_rules->findIndex ( curr_rule->name() + "|" + curr_rule->uuid().toString() ) == -1 ) {
+ existed_rules->append( curr_rule->name() + "|" + curr_rule->uuid().toString() );
+ }
+ setupRuleView( curr_rule , i_chain_allrules );
+ }
+ }
+ if ( ! existed_rules->isEmpty() )
+ for ( QStringList::Iterator it = existed_rules->begin(); it != existed_rules->end(); ++it ) {
+ QString existed_rule_name_id = *it;
+ int delimiter = existed_rule_name_id.find( "|" );
+ QString existed_rule_name = existed_rule_name_id.left( delimiter );
+ QString existed_rule_id_str = existed_rule_name_id.right( existed_rule_name_id.length() - delimiter - 1 );
+ QUuid existed_obj_id( existed_rule_id_str );
+/* bool ok;
+ existed_obj_id = existed_rule_id_str.toInt( &ok );*/
+// kdDebug() << "Found Existed Name: " << existed_rule_name << " ID: " << existed_obj_id << endl;
+ bool have = false;
+ QPtrListIterator<IPTRule> it2( used_rules );
+ IPTRule* used_rule = 0;
+ while ( it2.current() ) {
+ used_rule = it2.current();
+// kdDebug() << "Entering: while ( used_rule )" << endl;
+ ++it2;
+ if ( /*existed_rule_name == used_rule->name() &&*/ existed_obj_id == used_rule->uuid() ) {
+ kdDebug() << "Rule: " << used_rule->name() << " already existed." << endl;
+ have = true;
+ }
+ }
+ if ( ! have ) {
+// kdDebug() << "Rule: " << existed_rule_name << " could not be found" << endl;
+ KMFListViewItem* del_item = findKMFItem( existed_rule_name, 2, existed_obj_id );
+ if ( del_item ) {
+// kdDebug() << "Rule: " << existed_rule_name << " was DELETED:" << endl;
+ delete del_item;
+ } else {
+ del_item = findKMFItem( i18n("Rule"), 0, existed_obj_id, false );
+ if ( del_item ) {
+// kdDebug() << "Rule: " << existed_rule_name << " was DELETED:" << endl;
+ delete del_item;
+ }
+ }
+ }
+ }
+
+ existed_rules->clear();
+
+ QPtrListIterator<IPTRule> it3 ( used_rules );
+ while ( it3.current() ) {
+ IPTRule * rule = it3.current();
+ ++it3;
+ existed_rules->append( rule->name() + "|" + rule->uuid().toString() );
+ }
+ }
+ //########### End Rules ####################
+
+ // default target ++++++++++++++++++++++++++++++++++++
+
+ KMFListViewItem * i_deftg = 0;
+ i_deftg = findKMFItem( i18n( "Target:" ), 0, chain->uuid(), true, item );
+ if ( ! i_deftg ) {
+ i_deftg = new KMFListViewItem( item, i_chain_allrules, chain );
+ }
+
+ if ( ! chain->hasDefaultTarget() ) {
+ delete i_deftg;
+ } else {
+ QString def_tg = chain->defaultTarget();
+ QString cmd = chain->createIPTablesChainDefaultTarget();
+
+ // kdDebug() << "Setting up item: i_deftg" << endl;
+ i_deftg->setInUse( true );
+ i_deftg->setPixmap( 0, icon_target );
+ i_deftg->setText( 0, i18n( "Target:" ) );
+ i_deftg->setText( 2, def_tg );
+ kdDebug() << "Target: " << cmd << endl;
+ if ( def_tg == "DROP" ) {
+ i_deftg->setPixmap( 1, icon_drop );
+ } else if ( def_tg == "ACCEPT" ) {
+ i_deftg->setPixmap( 1, icon_accept );
+ }
+
+ // kdDebug() << "Setting up item: i_deftg_rule" << endl;
+ KMFListViewItem * i_deftg_rule = 0;
+ i_deftg_rule = findKMFItem( i18n( "Policy Cmd:" ), 0, chain->uuid(), true, i_deftg );
+
+ if ( m_show_cmds ) {
+ if ( ! i_deftg_rule ) {
+ i_deftg_rule = new KMFListViewItem( i_deftg, chain );
+ i_deftg_rule->setOpen( false );
+ }
+ i_deftg_rule->setInUse( true );
+ i_deftg_rule->setText( 0, i18n( "Policy Cmd:" ) );
+ i_deftg_rule->setPixmap( 0, icon_cmd );
+ i_deftg_rule->setText( 2, cmd );
+ } else {
+ if ( i_deftg_rule )
+ delete i_deftg_rule;
+ }
+ }
+
+ KMFListViewItem * item_desc = 0;
+ item_desc = findKMFItem( i18n( "Documentation:" ), 0, chain->uuid(), true, item );
+
+ if ( !chain->description().isEmpty() && ! chain->isBuildIn() ) {
+ if ( ! item_desc ) {
+ item_desc = new KMFListViewItem( item, item, chain );
+ }
+ item_desc->setInUse( true );
+ item_desc->setMultiLinesEnabled( true );
+ item_desc->setText( 0, i18n( "Documentation:" ) );
+ item_desc->setPixmap( 1, icon_rename );
+ item_desc->setText( 2, chain->description() );
+
+ } else if( !chain->description().isEmpty() && chain->isBuildIn() && m_show_desc ) {
+ if ( ! item_desc ) {
+ item_desc = new KMFListViewItem( item, item, chain );
+ }
+ item_desc->setInUse( true );
+ item_desc->setMultiLinesEnabled( true );
+ item_desc->setText( 0, i18n( "Documentation:" ) );
+ item_desc->setPixmap( 1, icon_rename );
+ item_desc->setText( 2, chain->description() );
+ } else if ( item_desc ) {
+ delete item_desc;
+ }
+
+ KMFListViewItem* item_obj_id = 0;
+ item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, chain->uuid(),true,item );
+
+ if ( KMFConfig::showObjectID() ) {
+ if ( ! item_obj_id ) {
+ item_obj_id = new KMFListViewItem( item, 0, chain );
+ }
+ item_obj_id->setInUse( true );
+ item_obj_id->setText( 0, i18n( "Object ID:" ) );
+ QString sid = "";
+ item_obj_id->setText( 2, chain->uuid().toString() );
+ } else if ( item_obj_id ) {
+ delete item_obj_id;
+ }
+// kdDebug() << "Sorting Chain Item Children...\n" << endl;
+ item->sort();
+}
+
+void KMFListView::setupRuleView( IPTRule* rule, KMFListViewItem* parent ) {
+// kdDebug() << "KMFListView::setupRuleView( IPTRule* rule, KMFListViewItem* item )" << endl;
+ if ( ! rule || ! parent )
+ return ;
+
+ KMFListViewItem * item = 0;
+ item = findKMFItem( rule->name(), 2, rule->uuid(), true, parent );
+ if ( ! item ) {
+// kdDebug() << "No Item for Rule: " << rule->name() << " found.\nNeed to create a new one." << endl;
+ item = new KMFListViewItem( parent, parent, rule );
+ }
+ item->sortChildItems( 0, true );
+ item->setTopItem( true );
+ item->setInUse( true );
+ QPixmap icon_null;
+ QString rule_name = rule->name();
+ QString rule_target = rule->target();
+ QString rule_cmd = rule->toString();
+
+ QString rule_nr = "";
+ if ( rule->customRule() && rule->enabled() ) {
+ rule_nr = rule_nr + "Custom ";
+ }
+ if ( !rule->enabled() ) {
+ rule_nr = rule_nr + "Disabled ";
+ }
+ rule_nr = rule_nr + "Rule:";
+ QString rule_number = "";
+ rule_number = rule_number.setNum( rule->ruleNum() +1 );
+ rule_nr = rule_nr + " " + rule_number;
+// item->setPixmap( 0, icon_rule );
+ item->setText( 0, rule_nr );
+ if ( ! rule->enabled() )
+ item->setPixmap( 0, icon_disabled );
+ else if ( rule->logging() )
+ item->setPixmap( 0, icon_log );
+ else
+ item->setPixmap( 0, icon_rule );
+
+ item->setText( 1, QString::null );
+ item->setPixmap( 2, icon_null );
+ item->setText( 2, rule_name );
+ item->setRenameEnabled( 2, true );
+
+ // kdDebug() << "There are options defined for the rule " << endl;
+ KMFListViewItem* item_target = 0;
+ item_target = findKMFItem( i18n( "Target:" ), 0, rule->uuid(), true, item );
+ if ( !item_target ) {
+ item_target = new KMFListViewItem( item, 0, rule );
+ }
+ item_target->setInUse( true );
+ item_target->setText( 0, i18n( "Target:" ) );
+ item_target->setPixmap( 0, icon_target );
+ item_target->setText( 2, rule_target );
+ if ( rule_target == "ACCEPT" ) {
+ item_target->setPixmap( 1, icon_accept );
+ } else if ( rule_target == "DROP" ) {
+ item_target->setPixmap( 1, icon_drop );
+ } else if ( rule_target == "LOG" ) {
+ item_target->setPixmap( 1, icon_log );
+ } else if ( rule_target == "REJECT" ) {
+ item_target->setPixmap( 1, icon_reject );
+ } else if ( rule_target == "RETURN" ) {
+ item_target->setPixmap( 1, icon_return );
+ } else if ( rule_target == "QUEUE" ) {
+ item_target->setPixmap( 1, icon_queue );
+ }
+
+ KMFListViewItem* item_cmd = 0;
+ item_cmd = findKMFItem( i18n( "Cmd:" ), 0, rule->uuid(), true, item );
+
+ if ( m_show_cmds ) {
+ if ( ! item_cmd ) {
+ item_cmd = new KMFListViewItem( item, 0, rule );
+ }
+ item_cmd->setInUse( true );
+ item_cmd->setMultiLinesEnabled( true );
+ item_cmd->setText( 0, i18n( "Cmd:" ) );
+ item_cmd->setPixmap( 0, icon_cmd );
+ item_cmd->setText( 2, rule_cmd );
+ } else if ( item_cmd ) {
+ delete item_cmd;
+ }
+
+ //############## Start Rule Options ############
+ QPtrList<QString>* available_options = IPTRuleOption::getAvailableOptionTypes();
+ for ( uint j = 0;j < available_options->count();j++ ) {
+ QString type = "";
+ type = *available_options->at( j );
+ if ( type.isEmpty() )
+ return ;
+
+ IPTRuleOption* opt = 0;
+ opt = rule->getOptionForName( type );
+ if ( ! opt ) {
+ return ;
+ }
+
+// kdDebug() << "Found Option: " << opt->guiName() << " is emty "<< opt->isEmpty() << endl;
+
+ if ( ! opt->isEmpty() ) {
+ if ( !opt->isTargetOption() ) {
+ setupRuleOptionView( opt, item );
+ } else if ( opt->isTargetOption() ) {
+ setupRuleOptionView( opt, item_target );
+ }
+ } else {
+
+ KMFListViewItem * kmfitem = 0;
+ kmfitem = findKMFItem( opt->guiName(), 0, opt->uuid(), true, item );
+ if ( kmfitem ) {
+ delete kmfitem;
+ } else {
+ kmfitem = findKMFItem( opt->guiName(), 0, opt->uuid(), true, item_target );
+ if ( kmfitem ) {
+ delete kmfitem;
+ }
+ }
+
+
+ }
+ }
+ //############## End Rule Options ############
+
+ KMFListViewItem * item_log = 0;
+ item_log = findKMFItem( i18n( "Logging:" ), 0, rule->uuid(),true,item );
+ if ( rule->logging() && ! rule->enabled() ) {
+ if ( ! item_log ) {
+ item_log = new KMFListViewItem( item, 0, rule );
+ }
+ item_log->setInUse( true );
+ item_log->setText( 0, i18n( "Logging:" ) );
+ item_log->setPixmap( 1, icon_log );
+ item_log->setText( 2, i18n( "Logging matching Packets" ) );
+ } else if ( item_log ) {
+ delete item_log;
+ }
+
+
+ KMFListViewItem * item_desc = 0;
+ item_desc = findKMFItem( i18n( "Documentation:" ), 0, rule->uuid(),true,item );
+
+ if ( !rule->description().isEmpty() ) {
+ if ( ! item_desc ) {
+ item_desc = new KMFListViewItem( item, 0, rule );
+ }
+
+ item_desc->setInUse( true );
+ item_desc->setMultiLinesEnabled( true );
+ item_desc->setText( 0, i18n( "Documentation:" ) );
+ item_desc->setPixmap( 1, icon_rename );
+ item_desc->setText( 2, rule->description() );
+
+ } else if ( item_desc ) {
+ delete item_desc;
+ }
+
+ KMFListViewItem* item_obj_id = 0;
+ item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, rule->uuid(),true,item );
+
+ if ( KMFConfig::showObjectID() ) {
+ if ( ! item_obj_id ) {
+ item_obj_id = new KMFListViewItem( item, 0, rule );
+ }
+ item_obj_id->setInUse( true );
+ item_obj_id->setText( 0, i18n( "Object ID:" ) );
+ QString sid = "";
+ item_obj_id->setText( 2, rule->uuid().toString() );
+ } else if ( item_obj_id ) {
+ delete item_obj_id;
+ }
+ item->sort();
+}
+
+void KMFListView::setupRuleOptionView( IPTRuleOption* option, KMFListViewItem* parent ) {
+// kdDebug() << "void KMFListView::setupRuleOptionView( IPTRuleOption* option, KMFListViewItem* parent )" << endl;
+ if ( ! option || ! parent )
+ return ;
+
+ QString type = option->getOptionType();
+ QStringList values = option->getValues();
+ QDict<QStringList>* gui_string_dict = option->getGUIStringDict();
+ QStringList* gui_strings = gui_string_dict->find( type );
+ QString name = "";
+
+ KMFListViewItem * item = 0;
+ item = findKMFItem( option->guiName(), 0, option->uuid(),true,parent );
+
+ if ( values.count() < 1 || option->isEmpty() ) {
+ if ( item ) {
+ delete item;
+ }
+ return;
+ }
+
+ if ( ! item ) {
+// // kdDebug() << "No Item for Option: " << *gui_strings->at( 0 ) << " found.\nCreateing a new one." << endl;
+ item = new KMFListViewItem( parent, parent, option );
+ item->setOpen( true );
+ }
+
+ item->setTopItem( true );
+ item->setInUse( true );
+ item->setPixmap( 0, icon_filter );
+ item->setText( 0, option->guiName() );
+
+ // KMFListViewItem* item_filter = 0;
+ for ( uint i = 0; i < values.count(); i++ ) {
+ QString val = "";
+ val = *values.at( i );
+ if ( val.isNull() )
+ return ;
+
+
+ if ( gui_strings->count() > i /* + 1 */ ) {
+ // if (val == XML::BoolOn_Value)
+ // val = "";
+
+ QString gui_name = "";
+ gui_name = *gui_strings->at( i /* + 1 */ );
+ KMFListViewItem * item_opt = 0;
+ item_opt = findKMFItem( gui_name, 0, option->uuid(),true,item );
+
+ if ( gui_name.isEmpty() || val == XML::Undefined_Value || val.simplifyWhiteSpace().isEmpty() || val == XML::BoolOff_Value ) {
+ if ( item_opt ) {
+ delete item_opt;
+ }
+ } else {
+ if ( ! item_opt ) {
+// kdDebug() << "Creating Item for option Name: " << gui_name << endl;
+ item_opt = new KMFListViewItem( item, 0, option );
+ item_opt->setOpen( true );
+ }
+ if ( val != XML::BoolOn_Value ) {
+ item_opt->setInUse( true );
+ item_opt->setText( 0, gui_name );
+ item_opt->setText( 2, val );
+ } else {
+ item_opt->setInUse( true );
+ item_opt->setText( 0, gui_name );
+ }
+ }
+ }
+ }
+
+ KMFListViewItem *item_obj_id = 0;
+ item_obj_id = findKMFItem( i18n( "Object ID:" ), 0, option->uuid(),true,item );
+ if ( KMFConfig::showObjectID() ) {
+ if ( ! item_obj_id ) {
+ item_obj_id = new KMFListViewItem( item, 0, option );
+ }
+ item_obj_id->setInUse( true );
+ item_obj_id->setText( 0, i18n( "Object ID:" ) );
+ item_obj_id->setText( 2, option->uuid().toString() );
+ } else if ( item_obj_id ) {
+ delete item_obj_id;
+ }
+}
+
+void KMFListView::clearAllItems() {
+// kdDebug() << "void KMFListView::clearAllItems()" << endl;
+/* m_existed_chains.clear();
+ m_dict_existed_rules.clear();*/
+ clear();
+}
+
+KMFListViewItem* KMFListView::findKMFItem( const QString & text, int column, const QUuid& obj_id, bool exact /*= true*/, KMFListViewItem* from_item /*= 0*/ ) {
+ // kdDebug() << "KMFListViewItem* KMFListView::findKMFItem(const QString& text: " << text << ", int column:" << column << ", int obj_id: " << obj_id << ")" << endl;
+ if ( text.isNull() || column < 0 )
+ return 0;
+ if ( from_item ) {
+// from_item->setText(1,"Serching this item");
+ QListViewItemIterator it( from_item );
+ QListViewItem * qitem = 0;
+
+ qitem = from_item->firstChild();
+ while ( qitem ) {
+ KMFListViewItem * item = 0;
+ item = dynamic_cast<KMFListViewItem*> ( qitem );
+ if ( item ) {
+// item->setPixmap(1,icon_accept);
+ if ( obj_id.isNull() ) {
+ if ( item->text( column ) == text ) {
+ return item;
+ }
+ } else {
+ if ( exact ) {
+ if ( item->text( column ) == text && item->uuid() == obj_id )
+ return item;
+ } else {
+ if ( item->text( column ).contains( text ) && item->uuid() == obj_id )
+ return item;
+ }
+ }
+ } else {
+ kdDebug() << "CAST ERROR: Item not of type KMFListViewItem" << endl;
+ return 0;
+ }
+ qitem = qitem->nextSibling();
+ }
+ } else {
+ QListViewItemIterator it( this );
+ while ( it.current() ) {
+ QListViewItem * qitem = it.current();
+ ++it;
+ KMFListViewItem * item = 0;
+ item = dynamic_cast<KMFListViewItem*> ( qitem );
+ if ( item ) {
+ if ( obj_id.isNull() ) {
+ if ( item->text( column ) == text ) {
+ return item;
+ }
+ } else {
+ if ( exact ) {
+ if ( item->text( column ) == text && item->uuid() == obj_id )
+ return item;
+ } else {
+ if ( item->text( column ).contains( text ) && item->uuid() == obj_id )
+ return item;
+ }
+ }
+ } else {
+ kdDebug() << "CAST ERROR: Item not of type KMFListViewItem" << endl;
+ }
+ }
+ }
+// kdDebug() << "Couldn't find Item " << text << " column: " << column << ", int obj_id: " << obj_id << endl;
+ return 0;
+}
+
+KMFListViewItem* KMFListView::findKMFItem( const QString & text1, int column1,const QString & text2, int column2, const QUuid& obj_id ) {
+ // kdDebug() << "KMFListViewItem* KMFListView::findKMFItem(const QString& text: " << text << ", int column:" << column << ", int obj_id: " << obj_id << ")" << endl;
+ if ( text1.isNull() || column1 < 0 || obj_id.isNull() || text2.isNull() || column2 < 0 )
+ return 0;
+
+ QListViewItemIterator it( this );
+ while ( it.current() ) {
+ QListViewItem * qitem = it.current();
+ ++it;
+ KMFListViewItem * item = 0;
+ item = dynamic_cast<KMFListViewItem*> ( qitem );
+ if ( item ) {
+ if ( item->text( column1 ) == text1 && item->text( column2 ) == text2 && item->uuid() == obj_id )
+ return item;
+ } else {
+ kdDebug() << "CAST ERROR: Item not of type KMFListViewItem" << endl;
+ }
+ }
+// kdDebug() << "Couldn't find Item " << text << " column: " << column << ", int obj_id: " << obj_id << endl;
+ return 0;
+}
+
+
+void KMFListView::loadIcons() {
+ kdDebug() << "void KMFListView::loadIcons()" << endl;
+ KIconLoader *loader = KGlobal::iconLoader();
+ QString icon_name;
+
+ icon_name = "up";
+ icon_up = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "down";
+ icon_down = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "ereaser";
+ icon_del = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filenew";
+ icon_new = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "edit";
+ icon_edit = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "rule";
+ icon_rule = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "user_defined";
+ icon_user = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "builtin";
+ icon_builtin = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "table";
+ icon_table = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filter";
+ icon_filter = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "text";
+ icon_rename = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "view_tree";
+ icon_chain = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "reject";
+ icon_reject = loader->loadIcon( icon_name, KIcon::User );
+
+ icon_name = "target";
+ icon_target = loader->loadIcon( icon_name, KIcon::User );
+
+ icon_name = "stop";
+ icon_drop = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "button_ok";
+ icon_accept = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filesaveas";
+ icon_log = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "undo";
+ icon_return = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "editclear";
+ icon_cmd = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filter";
+ icon_filter = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "pipe";
+ icon_queue = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "button_cancel";
+ icon_disabled = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "1rightarrow";
+ icon_fwd = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "2rightarrow";
+ icon_fwds = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "fill";
+ icon_feed = loader->loadIcon( icon_name, KIcon::Small );
+
+}
+
+
+}
+
+#include "kmflistview.moc"
diff --git a/kmyfirewall/kmfwidgets/kmflistview.h b/kmyfirewall/kmfwidgets/kmflistview.h
new file mode 100644
index 0000000..bcc89e8
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmflistview.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+/*
+Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004
+*/
+
+
+#ifndef KMFLISTVIEW_H
+#define KMFLISTVIEW_H
+
+#include <klistview.h>
+
+
+// QT includes
+#include <qptrlist.h>
+#include <qintdict.h>
+#include <qdict.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qpixmap.h>
+#include <quuid.h>
+#include <qguardedptr.h>
+// Project includes
+
+/**
+@author Christian Hubinger
+*/
+class KListViewItem;
+namespace KMF {
+class NetfilterObject;
+class IPTable;
+class IPTChain;
+class IPTRule;
+class IPTRuleOption;
+class KMFListViewItem;
+
+
+class KDE_EXPORT KMFListView : public KListView {
+ Q_OBJECT
+public:
+ KMFListView( QWidget *parent = 0, const char *name = 0 );
+
+ ~KMFListView();
+
+ KMFListViewItem* getRootItem();
+ void clearAllItems();
+
+public slots:
+ void slotLoadNode( NetfilterObject* );
+ void slotUpdateView();
+ void slotUpdateView( NetfilterObject* );
+ KMFListViewItem* findKMFItem( const QString& text, int column, const QUuid& obj_id, bool exact = true, KMFListViewItem* from = 0 );
+ KMFListViewItem* findKMFItem( const QString& text1, int column1,const QString& text2, int column2, const QUuid& obj_id );
+
+signals:
+ void sigUpdateItem( int );
+
+private:
+ void loadIcons();
+ void setupTableView( IPTable* );
+ void setupChainView( IPTChain*, KMFListViewItem* );
+ void setupRuleView( IPTRule*, KMFListViewItem* );
+ void setupRuleOptionView( IPTRuleOption*, KMFListViewItem* );
+
+private slots:
+ void slotChangeRoot( QListViewItem* );
+
+private: // data
+ QGuardedPtr<NetfilterObject> m_NetfilterObject;
+ IPTable *m_table;
+ QString cast_error;
+
+ QStringList m_existed_chains;
+ QDict< QStringList > m_dict_existed_rules;
+
+ bool m_show_desc, m_show_cmds, m_show_objectID;
+
+ QPixmap icon_up, icon_down, icon_del, icon_edit, icon_rule, icon_filter, icon_rename,
+ icon_chain, icon_log, icon_accept, icon_drop, icon_cmd, icon_reject, icon_return,
+ icon_target, icon_queue, icon_new, icon_disabled, icon_feed, icon_fwd, icon_fwds, icon_user, icon_builtin, icon_table;
+signals:
+ void sigLoadNode( NetfilterObject* );
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmflistviewitem.cpp b/kmyfirewall/kmfwidgets/kmflistviewitem.cpp
new file mode 100644
index 0000000..b58305d
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmflistviewitem.cpp
@@ -0,0 +1,431 @@
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+/*
+Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004
+*/
+
+#include "kmflistviewitem.h"
+
+// QT includes
+
+// KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kglobal.h>
+
+// Project includes
+#include "../core/xmlnames.h"
+#include "../core/ipaddress.h"
+#include "../core/kmfnetzone.h"
+#include "../core/kmfnethost.h"
+#include "../core/kmftarget.h"
+#include "../core/kmftargetconfig.h"
+#include "../core/kmfprotocol.h"
+#include "../core/kmfprotocolcategory.h"
+#include "../core/iptable.h"
+#include "../core/iptchain.h"
+#include "../core/iptrule.h"
+#include "../core/iptruleoption.h"
+#include "../core/netfilterobject.h"
+namespace KMF {
+KMFListViewItem::KMFListViewItem( KListView *parent, NetfilterObject* obj ) : KListViewItem( parent ) {
+ m_top = false;
+ loadNetfilterObject(obj);
+ m_inUse = false;
+}
+KMFListViewItem::KMFListViewItem( KListView *parent, KListViewItem *after, NetfilterObject* obj ) : KListViewItem( parent, after ) {
+ m_top = false;
+ loadNetfilterObject(obj);
+ m_inUse = false;
+}
+KMFListViewItem::KMFListViewItem( KListViewItem *parent, NetfilterObject* obj ) : KListViewItem( parent ) {
+ m_top = false;
+ loadNetfilterObject(obj);
+ m_inUse = false;
+}
+KMFListViewItem::KMFListViewItem( KListViewItem *parent, KListViewItem *after, NetfilterObject* obj ) : KListViewItem( parent, after ) {
+ m_top = false;
+ loadNetfilterObject(obj);
+ m_inUse = false;
+}
+
+KMFListViewItem::~KMFListViewItem() {
+}
+
+void KMFListViewItem::loadNetfilterObject( NetfilterObject* obj ) {
+ m_object = obj;
+ // m_obj_id = -1;
+ m_table = 0;
+ m_chain = 0;
+ m_rule = 0;
+ m_option = 0;
+ m_zone = 0;
+ m_host = 0;
+ m_target = 0;
+ m_protocol = 0;
+ m_protocolCategory = 0;
+ // m_type = -1;
+ if ( ! obj )
+ return;
+
+ m_obj_id = obj->uuid();
+
+ if ( IPTable *table = dynamic_cast<IPTable*> ( obj ) ) {
+ // m_type = KMFListViewItem::TABLE;
+ m_table = table;
+ } else if ( IPTChain *chain = dynamic_cast<IPTChain*> ( obj ) ) {
+ // m_type = KMFListViewItem::CHAIN;
+ m_chain = chain;
+ } else if ( IPTRule *rule = dynamic_cast<IPTRule*> ( obj ) ) {
+ // m_type = KMFListViewItem::RULE;
+ m_rule = rule;
+ } else if ( IPTRuleOption *opt = dynamic_cast<IPTRuleOption*> ( obj ) ) {
+ // m_type = KMFListViewItem::RULEOPTION;
+ m_option = opt;
+ } else if ( KMFNetZone *zone = dynamic_cast<KMFNetZone*> ( obj ) ) {
+ // m_type = KMFListViewItem::NETZONE;
+ m_zone = zone;
+ } else if ( KMFNetHost *host = dynamic_cast<KMFNetHost*> ( obj ) ) {
+ // m_type = KMFListViewItem::NETHOST;
+ m_host = host;
+ } else if ( KMFTarget *host = dynamic_cast<KMFTarget*> ( obj ) ) {
+ // m_type = KMFListViewItem::KMFTARGET;
+ m_target = host;
+ } else if ( KMFProtocol *prot = dynamic_cast<KMFProtocol*> ( obj ) ) {
+ // m_type = KMFListViewItem::KMFTARGET;
+ // kdDebug() << "KMFListViewItem::loadNetfilterObject(..) - loaded Protocol" << endl;
+ m_protocol = prot;
+ } else if ( KMFProtocolCategory *protCat = dynamic_cast<KMFProtocolCategory*> ( obj ) ) {
+ // m_type = KMFListViewItem::KMFTARGET;
+ // kdDebug() << "KMFListViewItem::loadNetfilterObject(..) - loaded Protocol" << endl;
+ m_protocolCategory = protCat;
+ }
+}
+
+int KMFListViewItem::type() {
+ return m_object->type();
+}
+
+void KMFListViewItem::setTopItem( bool onoff ) {
+ m_top = onoff;
+}
+
+void KMFListViewItem::setInUse( bool onoff ) {
+ if ( ! onoff )
+ setChildrenInUse ( true );
+ m_inUse = onoff;
+}
+
+bool KMFListViewItem::inUse() {
+ bool ret = m_inUse;
+ m_inUse = false;
+ return ret;
+}
+
+
+
+NetfilterObject* KMFListViewItem::netfilterObject() const {
+ return m_object;
+}
+
+void KMFListViewItem::setChildrenInUse( bool onoff ) {
+ KMFListViewItem* item = this;
+ item = dynamic_cast<KMFListViewItem*> ( item->firstChild() );
+ while ( item ){
+ item->setInUse( onoff );
+ item = dynamic_cast<KMFListViewItem*> ( item->nextSibling() );
+ }
+}
+void KMFListViewItem::deleteChildren() {
+ while ( firstChild() ) {
+ kdDebug() << "Deleting Item: " << text(0) << " " << text(2) << endl;
+ delete firstChild();
+ }
+}
+
+
+void KMFListViewItem::setupProtocolView() {
+ kdDebug() << " KMFListViewItem::setupProtocolView()" << endl;
+ if ( ! m_protocol ) {
+ kdDebug() << " KMFListViewItem::setupProtocolView(): m_protocol == 0" << endl;
+ return;
+ }
+
+ while( firstChild() ) {
+ delete firstChild();
+ }
+
+ setPixmap(0, KGlobal:: iconLoader()->loadIcon("kmyfirewall", KIcon::Small ) );
+ setText( 0, protocol()->name() );
+ setText( 1, protocol()->description() );
+ // setOpen( true );
+
+ if ( protocol()->tcpPorts().size() > 0 ) {
+ KMFListViewItem *tcpPorts = new KMFListViewItem( this, 0, protocol() );
+ tcpPorts->loadNetfilterObject( protocol() );
+ tcpPorts->setText( 0, i18n("TCP Ports:") );
+ tcpPorts->setText( 1, protocol()->tcpPortsList() );
+ }
+ if ( protocol()->udpPorts().size() > 0 ) {
+ KMFListViewItem *udpPorts = new KMFListViewItem( this, 0, protocol() );
+ udpPorts->loadNetfilterObject( protocol() );
+ udpPorts->setText( 0, i18n("UDP Ports:") );
+ udpPorts->setText( 1, protocol()->udpPortsList() );
+ }
+
+/* while ( it.current() ) {
+ }*/
+}
+
+
+void KMFListViewItem::setupProtocolCategoryView() {
+ while( firstChild() ) {
+ delete firstChild();
+ }
+
+ setPixmap(0, KGlobal::iconLoader()->loadIcon( "folder" , KIcon::Small ) );
+ setText( 0, protocolCategory()->name() );
+ setText( 1, protocolCategory()->description() );
+
+ QValueList< KMFProtocol* >& prots = protocolCategory()->protocols();
+ QValueList< KMFProtocol* >::iterator it;
+ for( it = prots.begin(); it != prots.end(); ++it ) {
+ KMFListViewItem *prot = new KMFListViewItem( this, 0, (*it) );
+ prot->setupProtocolView();
+ }
+}
+
+void KMFListViewItem::setupTargetView() {
+// if ( target()->isCurrentTarget() ) {
+// setFont( QFont::Bold );
+// } else {
+// setFont( QFont::Bold );
+// }
+ if ( target()->isCurrentTarget() ) {
+ setPixmap(0, KGlobal:: iconLoader()->loadIcon("kmyfirewall", KIcon::Small ) );
+ } else {
+ setPixmap(0, KGlobal:: iconLoader()->loadIcon("enhanced_browsing", KIcon::Small ) );
+ }
+ setText( 0, target()->guiName() );
+ setText( 1,"[" + target()->address()->toString() + "]" );
+ setText( 2, target()->config()->oS() );
+ setText( 3, target()->config()->backend() );
+ setText( 4, target()->description() );
+}
+
+void KMFListViewItem::setupNetHostView() {
+ setPixmap(0, KGlobal:: iconLoader()->loadIcon("home_white", KIcon::Small ) );
+ setText( 0, host()->guiName() );
+ setText( 1,"[" + host()->address()->toString() + "]" );
+
+ if ( host()->name().startsWith("incoming_world") ) {
+ setText( 2,"" + i18n("%1 -> Localhost").arg( host()->guiName() ) );
+ }
+ if ( host()->name().startsWith("outgoing_world") ) {
+ setText( 2, i18n("Localhost -> %1").arg( host()->guiName() ) );
+ }
+}
+
+
+
+void KMFListViewItem::setupZoneView() {
+ kdDebug() << "void KMFListViewItem::setupZoneView()" << endl;
+ if ( type() != NetfilterObject::NETZONE ) {
+ return;
+ }
+ KIconLoader *loader = KGlobal:: iconLoader();
+
+ setText( 0,m_zone->guiName() );
+ if ( m_zone->name() == "incoming_world" || m_zone->name() == "outgoing_world" ) {
+ setPixmap(0, loader->loadIcon("network", KIcon::Small ) );
+ } else {
+ setPixmap(0, loader->loadIcon("network_local", KIcon::Small ) );
+ }
+
+ // if ( m_zone->name().startsWith("incoming_world") || m_zone->name().startsWith("outgoing_world") )
+ setText( 1, "[" + m_zone->address()->toString() + i18n("/%1]").arg( m_zone->maskLength() ) );
+
+/* setText( 2,"" + i18n("%1 -> Localhost").arg( m_zone->guiName() ) );*/
+ setText( 4,"" + m_zone->description() );
+
+ if ( m_zone->name().startsWith("incoming_world") ) {
+ setText( 2,"" + i18n("%1 -> Localhost").arg( m_zone->guiName() ) );
+
+ }
+ if ( m_zone->name().startsWith("outgoing_world") ) {
+ setText( 2, i18n("Localhost -> %1").arg( m_zone->guiName() ) );
+
+ }
+
+ QPtrListIterator<KMFNetZone> it ( m_zone->zones() );
+ while ( it.current() ) {
+ KMFListViewItem *item = new KMFListViewItem( this, 0, it.current() );
+ item->loadNetfilterObject( it.current() );
+ item->setupZoneView();
+ // item->setRenameEnabled( 0, true );
+ setOpen(true);
+ ++it;
+ }
+
+ QPtrListIterator<KMFTarget> it2 ( m_zone->hosts() );
+ while ( it2.current() ) {
+ if ( it2.current()->type() == NetfilterObject::NETHOST ) {
+ KMFNetHost *host = dynamic_cast<KMFNetHost*>( it2.current() );
+ KMFListViewItem *item = new KMFListViewItem( this, 0, host );
+ item->loadNetfilterObject( host );
+ item->setupNetHostView();
+ setOpen(true);
+ } else if ( it2.current()->type() == NetfilterObject::KMFTARGET ) {
+ KMFTarget* target = dynamic_cast<KMFTarget*>( it2.current() );
+ kdDebug() << "Added KMFTarget" << endl;
+ KMFListViewItem *item = new KMFListViewItem( this, 0, target );
+ item->loadNetfilterObject( target );
+ item->setupTargetView();
+ // item->setRenameEnabled( 0, true );
+ setOpen(true);
+ }
+
+
+
+ /*
+ if ( KMFTarget* target = dynamic_cast<KMFTarget*>( it2.current() ) ){
+ kdDebug() << "Added KMFTarget" << endl;
+ KMFListViewItem *item = new KMFListViewItem( this, 0, target );
+ item->loadNetfilterObject( target );
+ item->setupTargetView();
+ // item->setRenameEnabled( 0, true );
+ setOpen(true);
+ } else if ( KMFNetHost *host = dynamic_cast<KMFNetHost*>( it2.current() ) ) {
+ kdDebug() << "Added KMFNetHost" << endl;
+ KMFListViewItem *item = new KMFListViewItem( this, 0, host );
+ item->loadNetfilterObject( host );
+ // item->setRenameEnabled( 0, true );
+ item->setupNetHostView();*/
+
+/* item->setPixmap(0, loader->loadIcon("home_white", KIcon::Small ) );
+ item->setText( 0, host->guiName() );
+ item->setText( 1,"[" + host->address()->toString() + "]" );
+
+ if ( host->name().startsWith("incoming_world") ) {
+ item->setText( 2,"" + i18n("%1 -> Localhost").arg( host->guiName() ) );
+ }
+ if ( host->name().startsWith("outgoing_world") ) {
+ item->setText( 2, i18n("Localhost -> %1").arg( host->guiName() ) );
+ }*/
+// setOpen(true);
+// // ++it2;
+// }
+
+
+
+
+
+// KMFListViewItem *item = new KMFListViewItem( this, 0, it2.current() );
+// item->loadNetfilterObject( it2.current() );
+// item->setPixmap(0, loader->loadIcon("home_white", KIcon::Small ) );
+// item->setText( 0, it2.current()->guiName() );
+// item->setText( 1,"[" + it2.current()->address()->toString() + "]" );
+//
+// if ( it2.current()->name().startsWith("incoming_world") ) {
+// item->setText( 2,"" + i18n("%1 -> Localhost").arg( it2.current()->guiName() ) );
+// }
+// if ( it2.current()->name().startsWith("outgoing_world") ) {
+// item->setText( 2, i18n("Localhost -> %1").arg( it2.current()->guiName() ) );
+// }
+// setOpen(true);
+ ++it2;
+
+ }
+}
+
+QString KMFListViewItem::key( int column, bool ascending ) const {
+// kdDebug() << "QString KMFListViewItem::key( int column, bool ascending )" << endl;
+ if ( ! m_object ) {
+ return QListViewItem::key( column, ascending );
+ }
+
+ if ( m_object->type() == NetfilterObject::TABLE ) {
+ if ( text(0) == i18n("Documentation:") ) {
+ return "0000";
+ }
+ } else if ( m_object->type() == NetfilterObject::CHAIN ) {
+ if ( text(0) == i18n("Documentation:") || text(2) == Constants::InputChain_Name ) {
+ return "0000";
+ } else if ( text(0) == i18n("Chain logging:") || text(2) == Constants::OutputChain_Name ) {
+ return "1111";
+ } else if ( text(0) == i18n("Chain Feeds:") || text(2) == Constants::ForwardChain_Name ) {
+ return "2222";
+ } else if ( text(0) == i18n("Chain forwards:") || text(2) == Constants::PreRoutingChain_Name ) {
+ return "3333";
+ } else if ( text(0) == i18n("Rule(s):") || text(2) == Constants::PostRoutingChain_Name ) {
+ return "4444";
+ } else if ( text(0) == i18n("Cmd:") ) {
+ return "9999";
+ } else if (text(0).contains( i18n("Chain (User-Defined):") ) ) {
+ int index = m_chain->table()->chains().find( m_chain );
+ QString ret = "";
+ return ret.setNum( 5555 + index );
+ }
+ } else if ( m_object->type() == NetfilterObject::RULE ) {
+ if ( text(0) == i18n("Documentation:") ) {
+ return "0000";
+ } else if ( text(0) == i18n("Cmd:") ) {
+ return "8888";
+ } else if ( text(0) == i18n("Target:") ) {
+ return "9999";
+ } else {
+ QString ret = "";
+ ret = ret.setNum( m_rule->ruleNum() );
+ while ( ret.length() < 5 ) {
+ ret.prepend("0");
+ }
+ return ret;
+ }
+ } else if ( m_object->type() == NetfilterObject::RULEOPTION ) {
+ QPtrList<QString>* types = IPTRuleOption::getAvailableOptionTypes();
+ QPtrListIterator< QString > it ( *types );
+ int i = 0;
+ int index = -1;
+ bool finished = false;
+ while ( it.current() && ! finished ) {
+ QString type = *it.current();
+ ++it;
+// kdDebug() << "Checking type: " << type << endl;
+ if ( type == m_option->getOptionType() ) {
+ index = i;
+ finished = true;
+ }
+ i++;
+ }
+ QString ret = "";
+// kdDebug() << "QString KMFListViewItem::key(...) returnd: " << ret << " for ruleoption type: " << m_option->getOptionType() << endl;
+ return ret.setNum( 5555 + index );
+ } else if ( m_object->type() == NetfilterObject::NETZONE ) {
+ if ( m_zone ) {
+ //return "0000";
+ return "0000" + m_zone->guiName();
+ }
+ } else if ( m_object->type() == NetfilterObject::NETHOST ) {
+ if ( m_host ) {
+ // return "1111";
+ return "1111" + m_host->guiName();
+ }
+ } else if ( m_object->type() == NetfilterObject::KMFTARGET ) {
+ if ( m_host ) {
+ // return "1111";
+ return "1111" + m_target->guiName();
+ }
+ }
+
+
+ return QListViewItem::key( column, ascending );
+}
+
+}
diff --git a/kmyfirewall/kmfwidgets/kmflistviewitem.h b/kmyfirewall/kmfwidgets/kmflistviewitem.h
new file mode 100644
index 0000000..6181794
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmflistviewitem.h
@@ -0,0 +1,144 @@
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+/*
+Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2004
+*/
+
+#ifndef KMFLISTVIEWITEM_H
+#define KMFLISTVIEWITEM_H
+
+#include "kmflistview.h"
+
+// QT includes
+#include <qstring.h>
+#include <quuid.h>
+#include <qguardedptr.h>
+
+// KDE includes
+
+// Project includes
+
+/**
+@author Christian Hubinger
+*/
+
+namespace KMF {
+class IPTable;
+class IPTChain;
+class IPTRule;
+class IPTRuleOption;
+class NetfilterObject;
+class KMFNetZone;
+class KMFNetHost;
+class KMFTarget;
+class KMFProtocol;
+class KMFProtocolCategory;
+
+class KDE_EXPORT KMFListViewItem : public KListViewItem {
+public:
+ KMFListViewItem( KListView *parent, NetfilterObject* );
+ KMFListViewItem( KListViewItem *parent, NetfilterObject* );
+ KMFListViewItem( KListView *parent, KListViewItem *after, NetfilterObject* );
+ KMFListViewItem( KListViewItem *parent, KListViewItem *after, NetfilterObject* );
+
+ virtual ~KMFListViewItem();
+
+ NetfilterObject* netfilterObject() const;
+
+ IPTable* table() const {
+ return m_table;
+ };
+ IPTChain* chain() const {
+ return m_chain;
+ };
+ IPTRule* rule() const {
+ return m_rule;
+ };
+ IPTRuleOption* ruleOption() const {
+ return m_option;
+ };
+
+ KMFNetZone* zone() const {
+ return m_zone;
+ };
+
+ KMFNetHost* host() const {
+ return m_host;
+ };
+
+ KMFTarget* target() const {
+ return m_target;
+ };
+
+ KMFProtocol* protocol() const {
+ return m_protocol;
+ };
+
+ KMFProtocolCategory* protocolCategory() const {
+ return m_protocolCategory;
+ };
+
+
+ bool isTopItem() const {
+ return m_top;
+ };
+
+ int type();
+
+ const QUuid& uuid() const {
+ return m_obj_id;
+ }
+
+ void setupZoneView();
+ void setupTargetView();
+ void setupNetHostView();
+ void setupProtocolView();
+ void setupProtocolCategoryView();
+
+ void deleteChildren();
+ void setChildrenInUse( bool );
+ void setTopItem( bool );
+ void setInUse( bool );
+ bool inUse();
+ // enum { TABLE = 0, CHAIN = 1, RULE = 2, RULEOPTION = 3 , NETZONE = 4, NETHOST = 5, KMFTARGET = 6 };
+
+ void loadNetfilterObject( NetfilterObject* );
+ virtual QString key( int column, bool ascending ) const;
+
+private:
+/* IPTable *m_table;
+ IPTChain *m_chain;
+ IPTRule *m_rule;
+ IPTRuleOption *m_option;
+ KMFNetZone* m_zone;
+ KMFNetHost* m_host;
+ KMFTarget* m_target;
+ KMFProtocol* m_protocol;
+ KMFProtocolCategory* m_protocolCategory;
+ NetfilterObject* m_object;*/
+
+ QGuardedPtr<IPTable> m_table;
+ QGuardedPtr<IPTChain> m_chain;
+ QGuardedPtr<IPTRule> m_rule;
+ QGuardedPtr<IPTRuleOption> m_option;
+ QGuardedPtr<KMFNetZone> m_zone;
+ QGuardedPtr<KMFNetHost> m_host;
+ QGuardedPtr<KMFTarget> m_target;
+ QGuardedPtr<KMFProtocol> m_protocol;
+ QGuardedPtr<KMFProtocolCategory> m_protocolCategory;
+ QGuardedPtr<NetfilterObject> m_object;
+
+
+ // int m_type;
+ QUuid m_obj_id;
+ bool m_top;
+ bool m_inUse;
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfmainwindow.cpp b/kmyfirewall/kmfwidgets/kmfmainwindow.cpp
new file mode 100644
index 0000000..c8bc0ed
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfmainwindow.cpp
@@ -0,0 +1,30 @@
+//
+// C++ Implementation: kmfmainwindow
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#include "kmfmainwindow.h"
+namespace KMF {
+KMFMainWindow::KMFMainWindow( QWidget* parent, const char *name ) : KMyFirewallInterface(), KParts::MainWindow( parent, name ) {}
+
+KMFMainWindow::~KMFMainWindow() {}
+
+}
+
+#include "kmfmainwindow.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfmainwindow.h b/kmyfirewall/kmfwidgets/kmfmainwindow.h
new file mode 100644
index 0000000..9c0f3f5
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfmainwindow.h
@@ -0,0 +1,46 @@
+//
+// C++ Interface: kmfmainwindow
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KMFMAINWINDOW_H
+#define KMFMAINWINDOW_H
+
+#include <kparts/mainwindow.h>
+#include "../core/kmyfirewallinterface.h"
+#include "../core/netfilterobject.h"
+
+/**
+@author Christian Hubinger
+*/
+
+namespace KMF {
+class KDE_EXPORT KMFMainWindow : public KParts::MainWindow, virtual public KMyFirewallInterface {
+ Q_OBJECT
+public:
+
+ KMFMainWindow( QWidget* parent, const char *name );
+ virtual ~KMFMainWindow();
+signals:
+ void sigUpdateView();
+ void sigUpdateView( NetfilterObject*);
+ void sigEnableActions( bool );
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp b/kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp
new file mode 100644
index 0000000..fa89a85
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfmultiportwidget.cpp
@@ -0,0 +1,134 @@
+/***************************************************************************
+ begin : Fri Nov 1 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#include "kmfmultiportwidget.h"
+
+
+#include <qstring.h>
+#include <qspinbox.h>
+#include <qlistbox.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+
+#include <kpushbutton.h>
+
+#include "../core/kmferror.h"
+namespace KMF {
+KMFMultiPortWidget::KMFMultiPortWidget( QWidget *parent, const char *name ) : KMyFirewallMultiPortWidget( parent, name ) {
+ m_err = new KMFError();
+ m_err->setErrType( KMFError::OK );
+ lb_ports->clear();
+ connect( b_add, SIGNAL( clicked() ), this, SLOT( addPort() ) );
+ connect( b_remove, SIGNAL( clicked() ), this, SLOT( removePort() ) );
+ connect( c_use_multiport, SIGNAL( toggled( bool ) ), this, SIGNAL( sigMultiPortChanged( bool ) ) );
+}
+KMFMultiPortWidget::~KMFMultiPortWidget() {}
+
+void KMFMultiPortWidget::addPort() {
+ QString port = "";
+ port.setNum( sb_port->value() );
+ if ( port.isEmpty() )
+ return ;
+ if ( lb_ports->count() > 14 )
+ return ;
+
+ for ( uint i = 0; i < lb_ports->count(); i++ )
+ if ( lb_ports->text( i ) == port )
+ return ;
+
+ lb_ports->insertItem( port );
+}
+
+void KMFMultiPortWidget::addPort( QString& port ) {
+ lb_ports->insertItem( port );
+}
+
+void KMFMultiPortWidget::removePort() {
+ int index = -1;
+ index = lb_ports->currentItem();
+ if ( index > -1 )
+ lb_ports->removeItem( index );
+}
+
+void KMFMultiPortWidget::removePort( int index ) {
+ lb_ports->removeItem( index );
+}
+
+KMFError* KMFMultiPortWidget::getPortString( QString* value ) {
+ for ( uint i = 0; i < lb_ports->count(); i++ ) {
+ if ( !(*value).isEmpty() )
+ value->append( "," );
+ value->append( lb_ports->text( i ) );
+ }
+ if ( value->isEmpty() )
+ return m_err;
+
+ value->stripWhiteSpace();
+ return m_err;
+}
+
+void KMFMultiPortWidget::setType( const QString& type ) {
+ setEnabled( true );
+ c_use_multiport->setChecked( true );
+ if ( type == "src" )
+ rb_src->setChecked( true );
+ if ( type == "dest" )
+ rb_dest->setChecked( true );
+ if ( type == "equ" )
+ rb_equ->setChecked( true );
+
+}
+
+void KMFMultiPortWidget::loadPortString( QString& str ) {
+ if ( str.isEmpty() )
+ return ;
+ lb_ports->clear();
+ int pos = -1;
+ pos = str.find( "," );
+ while ( pos > -1 ) {
+ QString port = str.left( pos );
+ lb_ports->insertItem( port );
+ str = str.right( str.length() - pos - 1 );
+ pos = str.find( "," );
+ }
+ if ( !str.isEmpty() ) {
+ lb_ports->insertItem( str );
+ }
+}
+
+void KMFMultiPortWidget::reset() {
+ c_use_multiport->setChecked( false );
+ rb_src->setChecked( false );
+ rb_dest->setChecked( false );
+ rb_equ->setChecked( false );
+ lb_ports->clear();
+}
+
+
+QString& KMFMultiPortWidget::type() const {
+ QString ret = "src";
+ if ( rb_src->isChecked() )
+ ret = "src";
+ else if ( rb_dest->isChecked() )
+ ret = "dest";
+ else if ( rb_equ->isChecked() )
+ ret = "equ";
+ QString *val = new QString( ret );
+ return *val;
+}
+
+}
+
+#include "kmfmultiportwidget.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfmultiportwidget.h b/kmyfirewall/kmfwidgets/kmfmultiportwidget.h
new file mode 100644
index 0000000..8b1d042
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfmultiportwidget.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ begin : Fri Nov 1 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFMULTIPORTWIDGET_H
+#define KMFMULTIPORTWIDGET_H
+
+#include <qwidget.h>
+#include <kdemacros.h>
+#include "kmyfirewallmultiportwidget.h"
+
+
+class QString;
+
+namespace KMF {
+class KMFError;
+
+/**
+ *@author Christian Hubinger
+ */
+
+class KDE_EXPORT KMFMultiPortWidget : public KMyFirewallMultiPortWidget {
+ Q_OBJECT
+public:
+ KMFMultiPortWidget( QWidget *parent = 0, const char *name = 0 );
+ ~KMFMultiPortWidget();
+
+ KMFError* getPortString( QString* value );
+ void setType( const QString& type );
+ QString& type() const;
+ void loadPortString( QString& );
+ void reset();
+
+private slots:
+ void addPort();
+ void addPort( QString& port );
+ void removePort();
+ void removePort( int index );
+
+private:
+ KMFError *m_err;
+
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp
new file mode 100644
index 0000000..d9d7a2c
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.cpp
@@ -0,0 +1,585 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfmynetworkwidget.h"
+
+// QT includes
+#include <qstring.h>
+#include <qframe.h>
+#include <qpixmap.h>
+#include <qwidgetstack.h>
+#include <qtextedit.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+// KDe Includes
+#include <ktabwidget.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kpopupmenu.h>
+#include <kinputdialog.h>
+
+// Project includes
+#include "kmfhostwidget.h"
+#include "kmfinterfacewidget.h"
+#include "kmfsystemsettingslinux.h"
+#include "kmfnetworkwidget.h"
+
+#include "../core/kmfnetzone.h"
+#include "../core/kmfdoc.h"
+#include "../core/kmfnetwork.h"
+#include "../core/kmftarget.h"
+#include "../core/kmftargetconfig.h"
+#include "../core/kmferror.h"
+#include "../kmfwidgets/kmflistviewitem.h"
+
+namespace KMF {
+KMFMyNetworkWidget::KMFMyNetworkWidget(QWidget* parent, const char* name, WFlags fl)
+: KMyFirewallMyNetworkWidget(parent,name,fl)
+{
+ kdDebug() << "Contructor: KMFMyNetworkWidget::KMFMyNetworkWidget(QWidget* parent, const char* name, WFlags fl)" << endl;
+ m_network = 0;
+ m_contextMenu = new KPopupMenu( this, "m_contextMenu" );
+
+ connect( m_lv_zones, SIGNAL( contextMenuRequested ( QListViewItem*, const QPoint&, int ) ),
+ this, SLOT( slotZoneRBM( QListViewItem*, const QPoint&, int ) ) );
+
+ connect( m_lv_zones, SIGNAL( pressed( QListViewItem* ) ) ,
+ this, SLOT( slotNewItemSelected( QListViewItem* ) ) );
+
+ connect( m_lv_zones, SIGNAL( itemRenamed ( QListViewItem *, int, const QString & ) ) ,
+ this, SLOT( slotRenameItem( QListViewItem *, int, const QString & ) ) );
+
+
+
+ loadIcons();
+ setupPropertiesView();
+}
+
+void KMFMyNetworkWidget::saveConfig() {
+ kdDebug() << "KMFMyNetworkWidget::saveConfig()" << endl;
+ m_network->exportXMLRuleset( false, false );
+ // m_network->saveConfig();
+}
+
+void KMFMyNetworkWidget::setNetwork( KMFNetwork* net ) {
+// if ( ! m_network ) {
+// m_network = net;
+//
+// } else {
+ m_network = net;
+ m_lv_zones->clear();
+ KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() );
+ it->setupZoneView();
+// }
+// m_lv_zones->clear();
+// KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() );
+// it->setupZoneView();
+}
+
+void KMFMyNetworkWidget::setupPropertiesView() {
+ kdDebug() << "void KMFMyNetworkWidget::setupPropertiesView()" << endl;
+ m_hostProperties = new KMFHostWidget( this, "host widget" );
+ kt_hostProperties->addTab( m_hostProperties, i18n( "General" ) );
+ connect( m_hostProperties, SIGNAL( sigTargetChanged() ),
+ this, SLOT( slotTargetChanged() ) );
+
+ m_hostProperties->InitGUI();
+
+ m_hostInterfaces = new KMFInterfaceWidget( this, "interface widget" );
+ kt_hostProperties->addTab( m_hostInterfaces, i18n( "Interfaces" ) );
+
+ m_hostSettingsLinux = new KMFSystemSettingsLinux( this, "system settings widget" );
+ kt_hostProperties->addTab( m_hostSettingsLinux, i18n( "System Settings" ) );
+
+
+// QWidget *zonePropsWidget = new QWidget( this, "ads" );
+
+
+// QLabel *desc = new QLabel( i18n("<qt>Define your network zone here by defining the Networks IP and netmask.</qt>") , zonePropsWidget, "ad" );
+//
+// QLabel *desc2 = new QLabel( i18n("Zone Documentation:") , zonePropsWidget, "ad" );
+//
+// m_zone_desc = new QTextEdit( zonePropsWidget, "adf" );
+// m_zone_desc->setReadOnly( false );
+// QGridLayout *grid = new QGridLayout( zonePropsWidget, 3,2);
+
+ m_network_widget = new KMFNetworkWidget( this, "m_network_widget" );
+
+ connect( m_network_widget,SIGNAL( sigZoneChanged( KMFNetZone* ) ),
+ this,SLOT( slotZoneChanged( KMFNetZone* ) ) );
+
+// grid->addWidget( m_network_widget, 0,0 );
+// grid->addWidget( m_network_widget, 1,0 );
+// grid->addWidget( desc2,0,1 );
+// grid->addMultiCellWidget( m_zone_desc, 1,2,1,1);
+
+ kt_zoneProperties->addTab( m_network_widget, i18n( "General" ) );
+
+
+}
+
+KMFMyNetworkWidget::~KMFMyNetworkWidget() {
+}
+
+
+void KMFMyNetworkWidget::slotNewItemSelected( QListViewItem* item ) {
+ kdDebug() << "void KMFMyNetworkWidget::slotNewItemSelected( QListViewItem* item )" << endl;
+ if ( ! item )
+ return ;
+ m_zone = 0;
+ m_target = 0;
+
+ m_lv_zones->blockSignals( true );
+ m_lv_zones->clearSelection();
+ m_lv_zones->setSelected( item, true );
+ m_lv_zones->blockSignals( false );
+
+ KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item );
+
+ if ( ! kmfitem ) {
+ kdDebug() << "No Item Selected!" << endl;
+ return;
+ }
+
+ m_hostProperties->setEnabled( false );
+ if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::NETZONE ) {
+ kdDebug() << "Selected NETZONE" << endl;
+ m_wsEdit->raiseWidget( ws_pageZoneProperties );
+ // kt_hostProperties->showPage( m_hostProperties );
+ m_zone = kmfitem->zone();
+ if ( m_zone ) {
+// kdDebug() << "kmfitem->zone() pointer is valid" << endl;
+ kmfitem->setText( 0,m_zone->guiName() );
+ kmfitem->setText( 1, "[" + m_zone->address()->toString() + i18n("/%1]").arg( m_zone->maskLength() ) );
+
+ m_network_widget->loadZone( m_zone );
+ if ( m_zone->readOnly() ) {
+ m_network_widget->allowEdit( false );
+ } else {
+ m_network_widget->allowEdit( true );
+ }
+
+ }
+ } else if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::KMFTARGET ) {
+ kdDebug() << "Selected KMFTARGET" << endl;
+ m_wsEdit->raiseWidget( ws_pageHostProperties );
+ // kt_hostProperties->showPage( m_hostProperties );
+ m_target = kmfitem->target();
+ if ( m_target ) {
+// kdDebug() << "kmfitem->target() pointer is valid" << endl;
+ m_zone = m_target->zone();
+ m_hostProperties->loadHost( m_target );
+ m_hostProperties->setEnabled( true );
+
+ m_hostInterfaces->loadTarget( m_target );
+
+ if ( m_target->config()->oS() == "linux" ) {
+ kt_hostProperties->setTabEnabled( m_hostSettingsLinux, true );
+ m_hostSettingsLinux->loadTarget( m_target );
+ } else {
+ kt_hostProperties->setTabEnabled( m_hostSettingsLinux, false );
+ }
+
+ kmfitem->setupTargetView();
+ }
+ } else if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::NETHOST ) {
+ kdDebug() << "Selected NETHOST" << endl;
+ }
+ kdDebug() << "Laving slotNewItemSelected()" << endl;
+}
+
+void KMFMyNetworkWidget::slotZoneChanged( KMFNetZone* z ) {
+ kdDebug() << "void KMFMyNetworkWidget::slotZoneChanged( KMFNetZone* z )" << endl;
+ if ( KMFListViewItem *item = findItem( z->uuid() ) ) {
+ kdDebug() << "Updating item" << endl;
+ item->setText( 1, "[" + z->address()->toString() + i18n("/%1]").arg( z->maskLength() ) );
+ item->setText( 4, z->description() );
+ }
+
+
+ m_lv_zones->clear();
+ KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() );
+ it->setupZoneView();
+
+ if ( KMFListViewItem *item = findItem( m_zone->uuid() ) ) {
+ slotNewItemSelected( item );
+ }
+}
+
+
+
+void KMFMyNetworkWidget::slotZoneRBM( QListViewItem* item, const QPoint& point, int ) {
+ if ( ! item )
+ return ;
+ KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item );
+ if ( kmfitem != 0 && kmfitem->type() == NetfilterObject::NETZONE ) {
+ kdDebug() << "Setting up Zone RBM:" << endl;
+ m_target = 0;
+ m_zone = 0;
+ m_zone = kmfitem->zone();
+ if ( m_zone ) {
+ m_contextMenu->clear();
+ QString name = m_zone->name();
+ QString lab_str = i18n("Zone: %1").arg( m_zone->guiName() );
+ m_contextMenu->insertTitle( icon_chain, lab_str );
+ m_contextMenu->insertItem( icon_new, i18n( "Add Host..." ), this, SLOT( slotAddHost() ) );
+
+
+ m_contextMenu->insertSeparator();
+ m_contextMenu->insertItem( icon_new, i18n( "Add Zone..." ), this, SLOT( slotAddZone() ) );
+ if ( m_zone->name() != "incoming_world" && m_zone->name() != "outgoing_world" && ! m_zone->readOnly() ) {
+ m_contextMenu->insertItem( icon_rename, i18n( "Rename Zone..." ), this, SLOT( slotRenameZone() ) );
+ m_contextMenu->insertSeparator();
+ m_contextMenu->insertItem( icon_del, i18n( "Delete Zone" ), this, SLOT( slotDelZone() ) );
+ }
+
+ m_contextMenu->popup( point );
+ }
+ } else if ( kmfitem != 0 && kmfitem->type() == NetfilterObject::KMFTARGET ) {
+ kdDebug() << "Setting up Host RBM:" << endl;
+ m_target = 0;
+ m_target = kmfitem->target();
+ if ( m_target ) {
+ m_contextMenu->clear();
+ QString name = m_target->name();
+ QString lab_str = i18n("Host: %1").arg( m_target->guiName() );
+ m_contextMenu->insertTitle( icon_chain, lab_str );
+ if ( ! m_target->readOnly() ) {
+ m_contextMenu->insertItem( icon_rename, i18n( "Rename Host..." ), this, SLOT( slotRenameHost() ) );
+ m_contextMenu->insertSeparator();
+ m_contextMenu->insertItem( icon_del, i18n( "Delete Host..." ), this, SLOT( slotDelHost() ) );
+ }
+ if ( ! m_target->isCurrentTarget() ) {
+ m_contextMenu->insertSeparator();
+ m_contextMenu->insertItem( KGlobal::iconLoader()->loadIcon( "kmyfirewall", KIcon::Small ), i18n( "Make Active Target..." ), this, SLOT( slotSetActiveTarget() ) );
+ }
+
+ m_contextMenu->popup( point );
+ }
+ }
+}
+
+void KMFMyNetworkWidget::slotSetActiveTarget() {
+ if( ! m_target ) {
+ return;
+ }
+ m_network->setCurrentTarget( m_target );
+ slotUpdateView();
+ emit sigActiveTargetChanged();
+}
+
+void KMFMyNetworkWidget::slotAddHost() {
+ kdDebug() << "void KMFMyNetworkWidget::slotAddHost()" << endl;
+ bool ok;
+ QString name = KInputDialog::getText( i18n("New Host"), i18n("Host Name"),i18n("New Host"), &ok, this );
+ if ( !ok )
+ return;
+
+ if ( m_zone ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_network->netzone(),
+ i18n("Add Target: %1 to Zone: %2").arg( name ).arg( m_zone->guiName() )
+ );
+ QString s = "";
+ s = s.setNum( m_zone->hosts().count() );
+ KMFTarget * host = m_zone->addTarget( "" + m_zone->name() + "_h_" + s, * (new QDomDocument() ) );
+ if ( host ) {
+ host->setGuiName( name );
+ m_target = host;
+ m_network->netzone()->refreshNetworkTree();
+ // m_network->netzone()->changed();
+ KMFUndoEngine::instance()->endTransaction();
+ } else {
+ KMFUndoEngine::instance()->abortTransaction();
+ }
+
+ }
+ slotUpdateView();
+}
+
+void KMFMyNetworkWidget::slotDelHost() {
+ kdDebug() << "void KMFMyNetworkWidget::slotDelHost()" << endl;
+ if ( ! m_zone || ! m_target )
+ return;
+ KMFUndoEngine::instance()->startTransaction(
+ m_zone,
+ i18n("Delete Target: %1 from Zone: %2").arg( m_target->guiName() ).arg( m_zone->guiName() )
+ );
+ m_zone->delHost( m_target );
+ KMFUndoEngine::instance()->endTransaction();
+ m_target = 0;
+ slotUpdateView();
+}
+
+
+void KMFMyNetworkWidget::slotAddZone() {
+ kdDebug() << "void KMFMyNetworkWidget::slotAddZone()" << endl;
+ bool ok;
+ QString name = KInputDialog::getText(i18n("New Zone"), i18n("Zone Name"),i18n("NewZone"), &ok, this );
+ if ( !ok )
+ return;
+
+ QString s = "";
+ s = s.setNum( m_network->netzone()->zones().count() );
+
+ KMFUndoEngine::instance()->startTransaction(
+ m_network->netzone(),
+ i18n("Add Zone: %1 to Zone: %2").arg( name ).arg( m_network->netzone()->guiName() )
+ );
+
+ KMFNetZone * zone = m_network->netzone()->addZone( "", new KMFError() );
+ if ( zone ) {
+ zone->setGuiName( name );
+
+ m_zone = zone;
+ m_target = 0;
+ m_network->netzone()->refreshNetworkTree();
+ slotUpdateView();
+ KMFUndoEngine::instance()->endTransaction();
+ } else {
+ KMFUndoEngine::instance()->abortTransaction();
+ }
+}
+
+void KMFMyNetworkWidget::slotDelZone() {
+ kdDebug() << "void KMFMyNetworkWidget::slotDelZone()" << endl;
+ if ( ! m_zone )
+ return;
+ if ( m_zone->name() != i18n("world") ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_zone->zone(),
+ i18n("Delete Zone: %1 from Zone: %2").arg( m_zone->guiName() ).arg( m_zone->zone()->guiName() )
+ );
+ m_zone->zone()->delZone( m_zone );
+ m_zone = 0;
+ slotUpdateView();
+ KMFUndoEngine::instance()->endTransaction();
+ }
+}
+
+void KMFMyNetworkWidget::slotRenameItem( QListViewItem* item, int, const QString& name ) {
+ kdDebug() << "void KMFMyNetworkWidget::slotRenameItem( QListViewItem* item, int, const QString& name )" << endl;
+ if ( ! item )
+ return;
+
+ if ( name.isEmpty() ) {
+ slotUpdateView();
+ return;
+ }
+
+ if ( KMFListViewItem *kmfitem = dynamic_cast<KMFListViewItem*> (item) ) {
+ if ( kmfitem->type() == NetfilterObject::NETZONE ) {
+ KMFUndoEngine::instance()->startTransaction(
+ kmfitem->zone(),
+ i18n("Rename Zone: %1 to %3").arg( m_zone->guiName() ).arg( name )
+ );
+
+ kmfitem->zone()->setGuiName( name );
+ kdDebug() << "Renaming Zone: " << kmfitem->zone()->name() << endl;
+ slotUpdateView();
+ KMFUndoEngine::instance()->endTransaction();
+ return;
+ }
+ if ( kmfitem->type() == NetfilterObject::KMFTARGET ) {
+ KMFUndoEngine::instance()->startTransaction(
+ kmfitem->target(),
+ i18n("Rename Host: %1 to %3").arg( m_zone->guiName() ).arg( name )
+ );
+ kmfitem->target()->setGuiName( name );
+ kdDebug() << "Renaming Host: " << kmfitem->target()->name() << endl;
+ slotUpdateView();
+ KMFUndoEngine::instance()->endTransaction();
+ return;
+ }
+ }
+}
+
+void KMFMyNetworkWidget::slotRenameZone() {
+ kdDebug() << "void KMFMyNetworkWidget::slotRenameZone()" << endl;
+ if ( ! m_zone )
+ return;
+ if ( KMFListViewItem* item = findItem( m_zone->uuid() ) ) {
+ item->setRenameEnabled( 0 ,true );
+ item->startRename(0);
+ }
+}
+
+void KMFMyNetworkWidget::slotRenameHost() {
+ kdDebug() << "void KMFMyNetworkWidget::slotRenameHost()" << endl;
+ if ( ! m_target )
+ return;
+ if ( KMFListViewItem* item = findItem( m_target->uuid() ) ) {
+ item->setRenameEnabled( 0 ,true );
+ item->startRename(0);
+ }
+}
+
+void KMFMyNetworkWidget::slotUpdateView( NetfilterObject* ) {
+ kdDebug() << "void KMFMyNetworkWidget::slotUpdateView()" << endl;
+ if ( ! m_network ) {
+ kdDebug() << "WARNING: m_network == 0" << endl;
+ return;
+ }
+ slotUpdateView();
+}
+
+void KMFMyNetworkWidget::slotUpdateView() {
+ kdDebug() << "void KMFMyNetworkWidget::slotUpdateView()" << endl;
+ if ( ! m_network ) {
+ kdDebug() << "WARNING: m_network == 0" << endl;
+ return;
+ }
+
+
+ m_lv_zones->clear();
+ KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() );
+ it->setupZoneView();
+
+ m_lv_zones->setEnabled( true );
+ if ( m_target ) {
+ if ( KMFListViewItem *item = findItem( m_target->uuid() ) ) {
+ m_lv_zones->setSelected( item, true );
+ slotNewItemSelected( item );
+ }
+
+
+ } else if ( m_zone ) {
+ if ( KMFListViewItem *item = findItem( m_zone->uuid() ) ) {
+
+ m_lv_zones->setSelected( item, true );
+ slotNewItemSelected( item );
+ }
+ }
+ m_lv_zones->setSorting( 0 , false );
+}
+
+void KMFMyNetworkWidget::slotTargetChanged() {
+ kdDebug() << "KMFMyNetworkWidget::slotTargetChanged()" << endl;
+ if ( ! m_target ) {
+ kdDebug() << "m_target == 0" << endl;
+ return;
+ }
+ // m_network->netzone()->placeHostInZone( m_target );
+
+ m_network->netzone()->refreshNetworkTree();
+
+ m_lv_zones->clear();
+ KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() );
+ it->setupZoneView();
+
+ if ( KMFListViewItem *item = findItem( m_target->uuid() ) ) {
+ slotNewItemSelected( item );
+ }
+ emit sigActiveTargetChanged();
+}
+
+KMFListViewItem* KMFMyNetworkWidget::findItem( const QUuid& obj_id ) {
+ // kdDebug() << "KMFListViewItem* KMFMyNetworkWidget::findItem( int obj_id )" << endl;
+ QListViewItem* root = m_lv_zones->firstChild();
+ if ( ! root )
+ return 0;
+ QListViewItem* item = root->firstChild();
+ while ( item ) {
+ if ( KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item ) ) {
+ // kdDebug() << "\nkmfitem->uuid(): " << kmfitem->uuid() <<
+ // " obj_id: " << obj_id << endl;
+
+ if ( kmfitem->uuid() == obj_id ) {
+ // kdDebug() << "MATCHED" << endl;
+ return kmfitem;
+ }
+ }
+ item = item->itemBelow();
+ }
+ return 0;
+}
+
+
+
+/*$SPECIALIZATION$*/
+void KMFMyNetworkWidget::loadIcons() {
+ kdDebug() << "void KMFGenericInterfa::loadIcons()" << endl;
+ KIconLoader *loader = KGlobal:: iconLoader();
+ QString icon_name;
+
+ icon_name = "up";
+ icon_up = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "down";
+ icon_down = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "editdelete";
+ icon_del = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filenew";
+ icon_new = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "edit";
+ icon_edit = loader->loadIcon( icon_name, KIcon::Small );
+
+
+ icon_name = "filter";
+ icon_filter = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "text";
+ icon_rename = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "rule-22";
+ icon_rule = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "view_tree";
+ icon_chain = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "reject";
+ icon_reject = loader->loadIcon( icon_name, KIcon::User );
+
+ icon_name = "target";
+ icon_target = loader->loadIcon( icon_name, KIcon::User );
+
+ icon_name = "stop";
+ icon_drop = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "button_ok";
+ icon_accept = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filesaveas";
+ icon_log = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "undo";
+ icon_return = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "editclear";
+ icon_cmd = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "filter";
+ icon_filter = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "pipe";
+ icon_queue = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "editcopy";
+ icon_copy = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "forward";
+ icon_move = loader->loadIcon( icon_name, KIcon::Small );
+
+}
+
+}
+
+#include "kmfmynetworkwidget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfmynetworkwidget.h b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.h
new file mode 100644
index 0000000..97d25f4
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfmynetworkwidget.h
@@ -0,0 +1,107 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFMYNETWORKWIDGET_H
+#define KMFMYNETWORKWIDGET_H
+
+#include "kmyfirewallmynetworkwidget.h"
+
+#include <qwidget.h>
+#include <kdialogbase.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kprocess.h>
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qguardedptr.h>
+#include <quuid.h>
+class KPopupMenu;
+class QTextEdit;
+
+
+namespace KMF {
+class KMFHostWidget;
+class KMFInterfaceWidget;
+class KMFSystemSettingsLinux;
+class KMFNetworkWidget;
+class KMFNetZone;
+class KMFNetwork;
+class KMFTarget;
+class KMFListViewItem;
+class NetfilterObject;
+
+class KMFMyNetworkWidget : public KMyFirewallMyNetworkWidget
+{
+ Q_OBJECT
+
+public:
+ KMFMyNetworkWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFMyNetworkWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+ void saveConfig();
+ void setNetwork( KMFNetwork* );
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ void slotUpdateView();
+ void slotUpdateView( NetfilterObject* );
+signals:
+ void sigActiveTargetChanged();
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotZoneRBM( QListViewItem*, const QPoint&, int );
+ void slotNewItemSelected( QListViewItem* );
+ void slotAddHost();
+ void slotDelHost();
+ void slotAddZone();
+ void slotDelZone();
+ void slotRenameItem( QListViewItem* item, int, const QString& name );
+ void slotRenameZone();
+ void slotRenameHost();
+ void slotZoneChanged( KMFNetZone* );
+ void slotTargetChanged();
+ void slotSetActiveTarget();
+
+ private:
+ void setupPropertiesView();
+ void loadIcons();
+ KMFListViewItem* findItem( const QUuid& obj_id );
+
+ private:
+ KMFHostWidget *m_hostProperties;
+ KMFInterfaceWidget *m_hostInterfaces;
+ KMFSystemSettingsLinux *m_hostSettingsLinux;
+
+ QPixmap icon_up, icon_down, icon_del, icon_edit, icon_rule, icon_filter, icon_rename,
+ icon_chain, icon_log, icon_accept, icon_drop, icon_cmd, icon_reject, icon_return,
+ icon_target, icon_queue, icon_new, icon_copy, icon_move;
+
+
+ // KMFNetZone *m_globalzone;
+ // KMFTarget *m_localhost;
+
+ QGuardedPtr<KMFNetwork> m_network;
+ QGuardedPtr<KMFNetZone> m_zone;
+ QGuardedPtr<KMFTarget> m_target;
+
+ // QTextEdit* m_zone_desc;
+ KMFNetworkWidget* m_network_widget;
+ // QWidget *ws_pageZoneProperties;
+ KPopupMenu* m_contextMenu;
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp
new file mode 100644
index 0000000..c6efc1a
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.cpp
@@ -0,0 +1,293 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfnethostpropertieswidget.h"
+
+// QT includes
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qwidgetstack.h>
+#include <qtextedit.h>
+#include <qframe.h>
+
+// KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <kcombobox.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <knuminput.h>
+
+// Project Includes
+#include "../core/kmftarget.h"
+#include "../core/ipaddress.h"
+#include "../core/kmfnethost.h"
+#include "../core/kmfnetzone.h"
+#include "../core/kmfundoengine.h"
+
+#include "kmfipv4addresswidget.h"
+namespace KMF {
+KMFNetHostPropertiesWidget::KMFNetHostPropertiesWidget ( QWidget* parent, const char* name, WFlags fl )
+ : KMyFirewallNetHostProperties ( parent,name,fl ) {
+
+ m_address_widget = new KMFIPv4AddressWidget( m_frameAddress, "m_address_widget" );
+
+ connect( m_address_widget, SIGNAL( sigAddressChanged( int, int, int, int ) ),
+ this,SLOT( slotAddressChanged( int, int, int, int ) ) );
+
+ connect( m_cb_host_limit, SIGNAL( toggled( bool ) ),
+ this, SLOT( slotHostLimitToggled( bool ) ) );
+
+ connect( m_sb_host_rate, SIGNAL( valueChanged( int ) ),
+ this, SLOT( slotHostLimitValueChanged( int ) ) );
+
+ connect( m_cb_limit_host_interval, SIGNAL( activated( int ) ),
+ this, SLOT( slotHostLimitScaleChanged( int ) ) );
+
+ connect( m_cb_host_log, SIGNAL( toggled( bool ) ),
+ this, SLOT( slotHostLogToggled( bool ) ) );
+
+ connect( m_host_desc, SIGNAL( textChanged() ),
+ this, SLOT( slotDescriptionChanged() ) );
+
+ QGridLayout *grid = new QGridLayout( m_frameAddress, 1, 1 );
+ grid->addWidget( m_address_widget, 0, 0 );
+ m_frameAddress->adjustSize();
+ adjustSize();
+}
+
+KMFNetHostPropertiesWidget::~KMFNetHostPropertiesWidget() {}
+
+void KMFNetHostPropertiesWidget::blockAllSignals( bool onoff ) {
+ m_cb_limit_host_interval->blockSignals( onoff );
+ m_cb_host_limit->blockSignals( onoff );
+ m_sb_host_rate->blockSignals( onoff );
+ m_host_desc->blockSignals( onoff );
+}
+
+void KMFNetHostPropertiesWidget::slotHostDeleted() {
+ setEnabled( false );
+ m_host = 0;
+}
+
+void KMFNetHostPropertiesWidget::loadHost( KMFNetHost* host ) {
+ kdDebug() << "KMFNetHostPropertiesWidget::loadTarget( KMFNetHost* host " << endl;
+ if ( ! host ) {
+ return;
+ }
+
+ if ( m_host ) {
+ disconnect( m_host, SIGNAL( destroyed() ),
+ this,SLOT( slotHostDeleted() ) );
+ }
+
+ m_host = host;
+ connect( m_host, SIGNAL( destroyed() ),
+ this,SLOT( slotHostDeleted() ) );
+ blockAllSignals( true );
+ setEnabled( true );
+ m_address_widget->loadIPAddress(
+ m_host->address()->getDigit( 0 ),
+ m_host->address()->getDigit( 1 ),
+ m_host->address()->getDigit( 2 ),
+ m_host->address()->getDigit( 3 )
+ );
+ if ( m_host->limit() ) {
+ m_cb_host_limit->setChecked( true );
+ m_sb_host_rate->setEnabled( true );
+ m_cb_limit_host_interval->setEnabled( true );
+ m_sb_host_rate->setValue( m_host->limitRate() );
+ kdDebug() << "Found host log scale: " << m_host->limitScale() << endl;
+
+ m_cb_limit_host_interval->blockSignals( true );
+ if ( m_host->limitScale() == "second" ) {
+ m_cb_limit_host_interval->setCurrentItem( 0 );
+ } else if ( m_host->limitScale() == "minute" ) {
+ m_cb_limit_host_interval->setCurrentItem( 1 );
+ } else if ( m_host->limitScale() == "hour" ) {
+ m_cb_limit_host_interval->setCurrentItem( 2 );
+ } else {
+ kdDebug() << "Found illefal value: " << m_host->limitScale() << endl;
+ }
+ m_cb_limit_host_interval->blockSignals( false );
+
+ } else {
+ m_cb_host_limit->setChecked( false );
+ m_sb_host_rate->setEnabled( false );
+ m_cb_limit_host_interval->setEnabled( false );
+ }
+
+ KMFNetZone* parentZone = m_host->zone()->rootZone();
+ if ( parentZone->name() == "incoming_world" ) {
+ m_cb_host_log->setChecked( m_host->logIncoming() );
+ } else if ( parentZone->name() == "outgoing_world" ) {
+ m_cb_host_log->setChecked( m_host->logOutgoing() );
+ }
+
+ if ( m_host_desc->text().simplifyWhiteSpace() != m_host->description() ) {
+ m_host_desc->blockSignals( true );
+ m_host_desc->setText( m_host->description() );
+ m_host_desc->blockSignals( false );
+ }
+ m_host_desc->setReadOnly( false );
+ blockAllSignals( false );
+}
+
+void KMFNetHostPropertiesWidget::slotAddressChanged( int d0, int d1, int d2, int d3 ) {
+ kdDebug() << "KMFNetHostPropertiesWidget::slotAddressChanged( "
+ << d0 << "."
+ << d1 << "."
+ << d2 << "."
+ << d3 << ")" << endl;
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n("Change address of Host: %1.").arg( m_host->guiName() )
+ );
+ m_host->address()->setAddress( d0, d1, d2, d3 );
+ m_host->zone()->rootZone()->placeHostInZone( m_host );
+ m_host->zone()->rootZone()->refreshNetworkTree();
+ KMFUndoEngine::instance()->endTransaction();
+
+ emit sigHostAddressChanged( m_host->address()->toString() );
+ // emit sigHostChanged( m_host );
+}
+
+
+void KMFNetHostPropertiesWidget::slotHostLogToggled( bool ) {
+ kdDebug() << "void KMFNetHostPropertiesWidget::slotHostLogToggled( bool )" << endl;
+ if ( ! m_host )
+ return;
+ kdDebug() << "Changing host: " << m_host->guiName() << endl;
+
+ KMFNetZone* parentZone = m_host->zone()->rootZone();
+ if ( parentZone->name() == "incoming_world" ) {
+ if ( m_host->logIncoming() == m_cb_host_log->isChecked() ) {
+ return;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "%1 logging of incoming packets for host %2." ).arg( m_cb_host_log->isChecked() ? i18n( "Enable" ) : i18n( "Disable" ) ).arg( m_host->guiName() )
+ );
+ m_host->setLogIncoming( m_cb_host_log->isChecked() );
+ KMFUndoEngine::instance()->endTransaction();
+ } else if ( parentZone->name() == "outgoing_world" ) {
+ if ( m_host->logOutgoing() == m_cb_host_log->isChecked() ) {
+ return;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "%1 logging of outgoing packets for host %2." ).arg( m_cb_host_log->isChecked() ? i18n( "Enable" ) : i18n( "Disable" ) ).arg( m_host->guiName() )
+ );
+ m_host->setLogOutgoing( m_cb_host_log->isChecked() );
+ KMFUndoEngine::instance()->endTransaction();
+ }
+ emit sigHostChanged( m_host );
+}
+
+void KMFNetHostPropertiesWidget::slotHostLimitToggled( bool on ){
+ kdDebug() << "void KMFNetHostPropertiesWidget::slotHostLimitToggled( bool " << on << " )" << endl;
+ if ( ! m_host )
+ return;
+ kdDebug() << "Changing host: " << m_host->guiName() << endl;
+ if ( on ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Enable package limit for host %1." ).arg( m_host->guiName() )
+ );
+ m_host->setLimit( m_sb_host_rate->value(), m_cb_limit_host_interval->currentText() );
+ KMFUndoEngine::instance()->endTransaction();
+ } else {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Disable package limit for host %1." ).arg( m_host->guiName() )
+ );
+ m_host->setLimit( -1, m_cb_limit_host_interval->currentText() );
+ KMFUndoEngine::instance()->endTransaction();
+ }
+ emit sigHostChanged( m_host );
+}
+
+void KMFNetHostPropertiesWidget::slotHostLimitValueChanged( int ) {
+ kdDebug() << "void KMFNetHostPropertiesWidget::slotHostLimitValueChanged( int )" << endl;
+ if ( ! m_host )
+ return;
+ kdDebug() << "Changing host: " << m_host->guiName() << endl;
+ if ( m_cb_host_limit->isChecked() ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Change package limit for host %1 to %2/%3." ).arg( m_host->guiName() ).arg( m_sb_host_rate->value() ).arg( m_cb_limit_host_interval->currentText() )
+ );
+ m_host->setLimit( m_sb_host_rate->value(), m_cb_limit_host_interval->currentText() );
+ KMFUndoEngine::instance()->endTransaction();
+ } else {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Disable package limit for host %1." ).arg( m_host->guiName() )
+ );
+ m_host->setLimit( -1, m_cb_limit_host_interval->currentText() );
+ KMFUndoEngine::instance()->endTransaction();
+ }
+ emit sigHostChanged( m_host );
+}
+
+void KMFNetHostPropertiesWidget::slotHostLimitScaleChanged( int ) {
+ kdDebug() << "void KMFGenericInterfaceProtocol::slotHostLimitValueChanged( int )" << endl;
+ if ( ! m_host )
+ return;
+ kdDebug() << "Changing host: " << m_host->guiName() << endl;
+ if ( m_cb_host_limit->isChecked() ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Change package limit for host %1 to %2/%3." ).arg( m_host->guiName() ).arg( m_sb_host_rate->value() ).arg( m_cb_limit_host_interval->currentText() )
+ );
+ m_host->setLimit( m_sb_host_rate->value(), m_cb_limit_host_interval->currentText() );
+ KMFUndoEngine::instance()->endTransaction();
+ } else {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Disable package limit for host %1." ).arg( m_host->guiName() )
+ );
+ m_host->setLimit( -1, "" );
+ KMFUndoEngine::instance()->endTransaction();
+ }
+ emit sigHostChanged( m_host );
+}
+
+void KMFNetHostPropertiesWidget::slotDescriptionChanged() {
+ kdDebug() << "void KMFNetHostPropertiesWidget::slotDescriptionChanged( const QString& )" << endl;
+ if ( ! m_host ) {
+ return;
+ }
+ QString newTxt = m_host_desc->text().simplifyWhiteSpace();
+ if ( newTxt != m_host->description() ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_host,
+ i18n( "Change documentation of host: %1" ).arg( m_host->guiName() )
+ );
+ m_host->setDescription( newTxt );
+ KMFUndoEngine::instance()->endTransaction();
+ }
+ emit sigHostChanged( m_host );
+}
+
+}
+
+#include "kmfnethostpropertieswidget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h
new file mode 100644
index 0000000..6eb76d2
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfnethostpropertieswidget.h
@@ -0,0 +1,63 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFNETHOSTPROPERTIESWIDGET_H
+#define KMFNETHOSTPROPERTIESWIDGET_H
+
+#include "kmyfirewallnethostproperties.h"
+
+// QT include
+#include <qguardedptr.h>
+
+namespace KMF {
+class KMFNetHost;
+class KMFIPv4AddressWidget;
+
+class KMFNetHostPropertiesWidget : public KMyFirewallNetHostProperties {
+ Q_OBJECT
+
+ public:
+ KMFNetHostPropertiesWidget ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFNetHostPropertiesWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ void loadHost( KMFNetHost* );
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+
+ protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+ protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotAddressChanged( int, int, int, int );
+ void slotHostLimitToggled( bool );
+ void slotHostLogToggled( bool );
+ void slotHostLimitValueChanged( int );
+ void slotHostLimitScaleChanged( int );
+ void slotDescriptionChanged();
+ void slotHostDeleted();
+
+ private:
+ void blockAllSignals( bool );
+
+ private:
+ QGuardedPtr<KMFNetHost> m_host;
+ KMFIPv4AddressWidget *m_address_widget;
+
+ signals:
+ void sigHostAddressChanged( const QString& );
+ void sigHostChanged( KMFNetHost* );
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp b/kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp
new file mode 100644
index 0000000..627d48f
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfnetworkwidget.cpp
@@ -0,0 +1,180 @@
+//
+// C++ Implementation: kmfnetworkwidget
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "kmfnetworkwidget.h"
+
+// QT includes
+#include <qlabel.h>
+#include <qtextedit.h>
+#include <qevent.h>
+
+// KDE includes
+#include <kdebug.h>
+#include <knuminput.h>
+#include <klocale.h>
+
+// project includes
+#include "../core/kmfundoengine.h"
+
+
+namespace KMF {
+KMFNetworkWidget::KMFNetworkWidget(QWidget *parent, const char *name)
+ : KMyFirewallNetworkWidget(parent, name) {
+ m_allowEdit = true;
+ connect( m_sb_from_1,SIGNAL( valueChanged( const QString& ) ),
+ this,SLOT( slotAddressChanged( const QString& ) ) );
+ connect( m_sb_from_2,SIGNAL( valueChanged( const QString& ) ),
+ this,SLOT( slotAddressChanged( const QString& ) ) );
+ connect( m_sb_from_3,SIGNAL( valueChanged( const QString& ) ),
+ this,SLOT( slotAddressChanged( const QString& ) ) );
+ connect( m_sb_from_4,SIGNAL( valueChanged( const QString& ) ),
+ this,SLOT( slotAddressChanged( const QString& ) ) );
+
+ connect( m_sb_mask,SIGNAL( valueChanged( int ) ),
+ this,SLOT( slotShortMaskChanged( int ) ) );
+
+ connect( m_txt_desc,SIGNAL( textChanged() ),
+ this,SLOT( slotDescriptionChanged() ) );
+
+}
+
+
+KMFNetworkWidget::~KMFNetworkWidget() {}
+
+void KMFNetworkWidget::slotZoneDeleted() {
+ setEnabled( false );
+}
+
+void KMFNetworkWidget::loadZone( KMFNetZone* zone ) {
+ setEnabled( true );
+ blockAllSignals( true );
+ m_zone = zone;
+ connect( m_zone, SIGNAL( destroyed() ), this, SLOT ( slotZoneDeleted() ) );
+
+ m_sb_from_1->setEnabled( true );
+ m_sb_from_2->setEnabled( true );
+ m_sb_from_3->setEnabled( true );
+ m_sb_from_4->setEnabled( true );
+ m_sb_mask->setEnabled( true );
+
+ m_sb_from_1->setValue( zone->address()->getDigit( 0 ) );
+ m_sb_from_2->setValue( zone->address()->getDigit( 1 ) );
+ m_sb_from_3->setValue( zone->address()->getDigit( 2 ) );
+ m_sb_from_4->setValue( zone->address()->getDigit( 3 ) );
+
+ lbl_mask->setText( zone->mask()->toString() );
+ if ( zone->description() != m_txt_desc->text().simplifyWhiteSpace() ) {
+ m_txt_desc->setText( zone->description() );
+ }
+ m_sb_mask->setValue( IPAddress::calcLenthToMask( *zone->mask() ) );
+ blockAllSignals( false );
+}
+
+void KMFNetworkWidget::slotAddressChanged( const QString& ) {
+ kdDebug() << "void KMFNetworkWidget::slotAddressChanged( const QString& )" << endl;
+ if ( ! m_zone ) {
+ return;
+ }
+
+ blockAllSignals( true );
+ if ( m_allowEdit ) {
+
+ const QString& newAddr = m_sb_from_1->text() +"."+
+ m_sb_from_2->text() +"."+
+ m_sb_from_3->text() +"."+
+ m_sb_from_4->text();
+
+ if ( newAddr == m_zone->address()->toString() ) {
+ return;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ m_zone->rootZone(),
+ i18n( "Change address of Zone: %1" ).arg( m_zone->guiName() )
+ );
+
+ m_zone->address()->setAddress( m_sb_from_1->value(), m_sb_from_2->value(), m_sb_from_3->value(), m_sb_from_4->value() );
+ m_zone->rootZone()->refreshNetworkTree();
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigZoneChanged( m_zone );
+ }
+ blockAllSignals( false );
+
+}
+
+void KMFNetworkWidget::slotShortMaskChanged( int len ) {
+ kdDebug() << "void KMFNetworkWidget::slotShortMaskChanged( const QString& )" << endl;
+ IPAddress addr = IPAddress::calcNetworkMaskFromLength( len );
+ blockAllSignals( true );
+ lbl_mask->setText( addr.toString() );
+ if ( m_allowEdit && m_zone->maskLength() != len ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_zone->rootZone(),
+ i18n( "Change mask length of Zone: %1" ).arg( m_zone->guiName() )
+ );
+ m_zone->setMaskLength( len );
+ m_zone->rootZone()->refreshNetworkTree();
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigZoneChanged( m_zone );
+ }
+ blockAllSignals( false );
+}
+
+void KMFNetworkWidget::slotDescriptionChanged() {
+ kdDebug() << "void KMFNetworkWidget::slotDescriptionChanged( const QString& )" << endl;
+ if ( ! m_zone ) {
+ return;
+ }
+ QString newTxt = m_txt_desc->text().simplifyWhiteSpace();
+ if ( m_allowEdit && newTxt != m_zone->description() ) {
+ blockAllSignals( true );
+ KMFUndoEngine::instance()->startTransaction(
+ m_zone,
+ i18n( "Change documentation of Zone: %1" ).arg( m_zone->guiName() )
+ );
+ m_zone->setDescription( newTxt );
+ KMFUndoEngine::instance()->endTransaction();
+ emit sigZoneChanged( m_zone );
+ blockAllSignals( false );
+ }
+}
+
+void KMFNetworkWidget::focusOutEvent( QFocusEvent * e ) {
+ kdDebug() << "void KMFNetworkWidget::focusOutEvent( QFocusEvent * e )" << endl;
+ if ( e->lostFocus() && m_txt_desc->text().simplifyWhiteSpace() != m_zone->description() ) {
+ slotDescriptionChanged();
+ }
+}
+
+void KMFNetworkWidget::blockAllSignals( bool onOff ) {
+ m_sb_from_1->blockSignals( onOff );
+ m_sb_from_2->blockSignals( onOff );
+ m_sb_from_3->blockSignals( onOff );
+ m_sb_from_4->blockSignals( onOff );
+ m_txt_desc->blockSignals( onOff );
+ m_sb_mask->blockSignals( onOff );
+}
+
+void KMFNetworkWidget::allowEdit( bool allow ) {
+ m_allowEdit = allow;
+ m_sb_from_1->setEnabled( allow );
+ m_sb_from_2->setEnabled( allow );
+ m_sb_from_3->setEnabled( allow );
+ m_sb_from_4->setEnabled( allow );
+ m_txt_desc->setEnabled( allow );
+ m_sb_mask->setEnabled( allow );
+}
+
+}
+
+
+
+
+#include "kmfnetworkwidget.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfnetworkwidget.h b/kmyfirewall/kmfwidgets/kmfnetworkwidget.h
new file mode 100644
index 0000000..81357a4
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfnetworkwidget.h
@@ -0,0 +1,65 @@
+//
+// C++ Interface: kmfnetworkwidget
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef KMFNETWORKWIDGET_H
+#define KMFNETWORKWIDGET_H
+
+#include "kmyfirewallnetworkwidget.h"
+
+// QT includes
+#include <qwidget.h>
+#include <qguardedptr.h>
+
+// KDE includes
+#include <kdemacros.h>
+
+// project includes
+#include "../core/kmfnetzone.h"
+#include "../core/ipaddress.h"
+
+class QFocusEvent;
+
+/**
+@author Christian Hubinger
+*/
+
+namespace KMF {
+class KDE_EXPORT KMFNetworkWidget : public KMyFirewallNetworkWidget {
+ Q_OBJECT
+public:
+ KMFNetworkWidget(QWidget *parent = 0, const char *name = 0);
+ ~KMFNetworkWidget();
+
+ void loadZone( KMFNetZone* );
+ void allowEdit( bool );
+private slots:
+ void slotAddressChanged( const QString& );
+ void slotDescriptionChanged();
+ void slotShortMaskChanged( int );
+ void slotZoneDeleted();
+
+protected:
+ void focusOutEvent( QFocusEvent * );
+
+private:
+ void blockAllSignals( bool );
+
+private:
+ QGuardedPtr<KMFNetZone> m_zone;
+ bool m_allowEdit;
+
+
+
+signals:
+ void sigZoneChanged( KMFNetZone* );
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp b/kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp
new file mode 100644
index 0000000..bf313a2
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfnewdocdlg.cpp
@@ -0,0 +1,96 @@
+/***************************************************************************
+ begin : Thu Apr 17 2003
+ copyright : (C) 2003 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#include "kapplication.h"
+#include "kmfnewdocdlg.h"
+#include "../version.h"
+#include "kmfnewdocdlg.moc"
+
+// QT includes
+#include "qpixmap.h"
+#include "qpainter.h"
+#include "qlabel.h"
+#include "qstring.h"
+#include "qpushbutton.h"
+#include "qrect.h"
+
+
+// KDE includes
+#include "kstandarddirs.h"
+#include "kdebug.h"
+namespace KMF {
+KMFNewDocDlg::KMFNewDocDlg( QWidget *parent, const char *name, WFlags fl ) : KMyFirewallNewDocument( parent, name, fl ) {
+ KStandardDirs std_dir;
+ QString dir = std_dir.findResource( "data", "kmyfirewall/pics/splash_cut.png" );
+ kdDebug() << "Found Splashscreen at: " << dir << endl;
+
+ QPixmap pic = QPixmap::fromMimeSource( dir );
+ QFont f( "helvetica", 8, QFont::Bold );
+ if ( pic.isNull() )
+ return ;
+ QPainter p( &pic );
+ p.setFont( f );
+ p.setPen( Qt::white );
+ p.drawText( 165, 45, QString( "Version %1" ).arg( KMYFIREWALL_VERSION ) );
+ p.drawText( 93, 215, QString( "%1" ).arg( COPYRIGHT_DATE ) );
+ p.drawText( 70, 230, QString( "%1" ).arg( COPYRIGHT_OWNER ) );
+ if ( pic.isNull() )
+ return ;
+ l_pic->setPixmap( pic );
+ connect( b_cancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
+ connect( b_close, SIGNAL( clicked() ), this, SLOT( reject() ) );
+ connect( b_empty, SIGNAL( clicked() ), this, SLOT( loadEmpty() ) );
+ connect( b_template, SIGNAL( clicked() ), this, SLOT( loadTemplate() ) );
+ connect( b_load_saved, SIGNAL( clicked() ), this, SLOT( loadSaved() ) );
+ connect( b_help, SIGNAL( clicked() ), this, SLOT( slotHelp() ) );
+ QRect screen = QApplication::desktop() ->screenGeometry();
+ QRect mainRect;
+ screen = QApplication::desktop() ->screenGeometry( QApplication::desktop() ->screenNumber( mainRect.center() ) );
+ move( screen.center() - QPoint( width() / 2, height() / 2 ) );
+}
+
+KMFNewDocDlg::~KMFNewDocDlg() {}
+
+
+
+void KMFNewDocDlg::reject() {
+ close();
+}
+
+void KMFNewDocDlg::loadEmpty() {
+ hide();
+ emit sigNewDocLoadEmpty();
+ close();
+}
+void KMFNewDocDlg::loadWizard() {
+ hide();
+ emit sigNewDocLoadWizard();
+ close();
+}
+void KMFNewDocDlg::loadTemplate() {
+ hide();
+ emit sigNewDocLoadTemplate();
+ close();
+}
+void KMFNewDocDlg::loadSaved() {
+ hide();
+ emit sigNewDocLoadSaved();
+ close();
+}
+void KMFNewDocDlg::slotHelp() {
+ kapp->invokeHelp();
+}
+
+}
diff --git a/kmyfirewall/kmfwidgets/kmfnewdocdlg.h b/kmyfirewall/kmfwidgets/kmfnewdocdlg.h
new file mode 100644
index 0000000..a473a72
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfnewdocdlg.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ begin : Thu Apr 17 2003
+ copyright : (C) 2003 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFNEWDOCDLG_H
+#define KMFNEWDOCDLG_H
+
+#include <qwidget.h>
+#include <kdemacros.h>
+#include "kmyfirewallnewdocument.h"
+
+
+/**
+ *@author Christian Hubinger
+ */
+
+class QKeyEvent;
+namespace KMF {
+class KDE_EXPORT KMFNewDocDlg : public KMyFirewallNewDocument {
+ Q_OBJECT
+public:
+ KMFNewDocDlg(QWidget *parent=0, const char *name=0, WFlags fl = 0);
+ ~KMFNewDocDlg();
+
+
+
+private slots:
+ void reject();
+ void loadEmpty();
+ void loadWizard();
+ void loadTemplate();
+ void loadSaved();
+ void slotHelp();
+signals:
+ void sigNewDocLoadWizard();
+ void sigNewDocLoadTemplate();
+ void sigNewDocLoadSaved();
+ void sigNewDocLoadEmpty();
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfobjectinfo.cpp b/kmyfirewall/kmfwidgets/kmfobjectinfo.cpp
new file mode 100644
index 0000000..5ab4b5c
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfobjectinfo.cpp
@@ -0,0 +1,110 @@
+/***************************************************************************
+ begin : Thu Apr 24 2003
+ copyright : (C) 2003 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#include "kmfobjectinfo.h"
+
+// KDE Includes
+#include <kdebug.h>
+#include <kapplication.h>
+#include <klocale.h>
+
+// QT includes
+#include <qstring.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qtextedit.h>
+
+// Project includes
+#include "../core/iptrule.h"
+#include "../core/iptchain.h"
+#include "../core/iptable.h"
+#include "../core/kmfdoc.h"
+#include "../core/kmfiptdoc.h"
+#include "../core/kmfnetwork.h"
+#include "../core/kmfundoengine.h"
+namespace KMF {
+KMFObjectInfo::KMFObjectInfo(QWidget *parent, const char *name, bool modal ) : KMyFirewallObjectInfo(parent, name, modal) {
+}
+
+KMFObjectInfo::~KMFObjectInfo(){
+}
+
+void KMFObjectInfo::loadNetfilterObject( NetfilterObject* obj ) {
+ if ( ! obj )
+ return;
+ m_netfilter_object = obj;
+ m_doc = 0;
+ switch( m_netfilter_object->type() ) {
+ case NetfilterObject::RULE:
+ m_header->setText( i18n("Rule Documentation") );
+ break;
+ case NetfilterObject::CHAIN:
+ m_header->setText( i18n("Chain Documentation") );
+ break;
+ default:
+ m_header->setText( i18n("Object Documentation") );
+ break;
+ }
+ te_desc->setText( m_netfilter_object->description() );
+}
+
+void KMFObjectInfo::loadKMFDoc( KMFDoc* obj ){
+ if ( ! obj )
+ return;
+ m_doc = obj;
+ m_netfilter_object = 0;
+ m_header->setText( i18n("Firewall Documentation") );
+ te_desc->setText( m_doc->description() );
+}
+
+void KMFObjectInfo::accept() {
+ if ( m_netfilter_object ) {
+ if ( m_netfilter_object->description() != te_desc->text() ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_netfilter_object,
+ i18n("Edit Documentaion for: %1").arg( m_netfilter_object->name() )
+ );
+ m_netfilter_object->setDescription( te_desc->text() );
+ kdDebug() << "Description Changed: " << te_desc->text() << endl;
+ KMFUndoEngine::instance()->endTransaction();
+ }
+ } else if ( m_doc ) {
+ if ( m_doc->description() != te_desc->text() ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_doc,
+ i18n("Edit Documentaion for: %1").arg( m_netfilter_object->name() )
+ );
+ m_doc->setDescription( te_desc->text() );
+ KMFUndoEngine::instance()->endTransaction();
+ kdDebug() << "Description Changed: " << te_desc->text() << endl;
+ }
+ }
+
+ emit sigDocumentChanged();
+ emit sigHideMe();
+}
+
+void KMFObjectInfo::reject() {
+ emit sigHideMe();
+}
+
+void KMFObjectInfo::slotHelp() {
+ kapp->invokeHelp( "rule_documentation" );
+}
+
+}
+
+#include "kmfobjectinfo.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfobjectinfo.h b/kmyfirewall/kmfwidgets/kmfobjectinfo.h
new file mode 100644
index 0000000..0ef0327
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfobjectinfo.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ begin : Thu Apr 24 2003
+ copyright : (C) 2003 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFOBJECTINFO_H
+#define KMFOBJECTINFO_H
+
+#include <qwidget.h>
+#include "kmyfirewallobjectinfo.h"
+
+#include <kdemacros.h>
+
+/**
+ *@author Christian Hubinger
+ */
+namespace KMF {
+class NetfilterObject;
+class KMFDoc;
+
+class KDE_EXPORT KMFObjectInfo : public KMyFirewallObjectInfo {
+ Q_OBJECT
+public:
+ KMFObjectInfo(QWidget *parent=0, const char *name=0, bool modal=false);
+ ~KMFObjectInfo();
+
+ void loadNetfilterObject( NetfilterObject* );
+ void loadKMFDoc( KMFDoc* );
+
+private slots:
+ void accept();
+ void reject();
+ void slotHelp();
+
+private: // data
+ NetfilterObject* m_netfilter_object;
+ KMFDoc* m_doc;
+signals:
+ void sigDocumentChanged();
+ void sigHideMe();
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfportwidget.cpp b/kmyfirewall/kmfwidgets/kmfportwidget.cpp
new file mode 100644
index 0000000..a27bfd3
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfportwidget.cpp
@@ -0,0 +1,294 @@
+/***************************************************************************
+ begin : Fri Nov 1 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#include "kmfportwidget.h"
+
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+
+#include <kcombobox.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "../core/kmferror.h"
+
+namespace KMF {
+KMFPortWidget::KMFPortWidget( QWidget *parent, const char *name ) : KMyFirewallPortWidget( parent, name ) {
+ m_err = new KMFError();
+ m_err->setErrType( KMFError::OK );
+ m_err->setErrMsg( "" );
+ QStringList *l = new QStringList();
+
+ cb_port_name->clear();
+ l->append( "tcpmux" );
+ l->append( "tcpmux" );
+ l->append( "echo" );
+ l->append( "discard" );
+ l->append( "systat" );
+ l->append( "daytime" );
+ l->append( "netstat" );
+ l->append( "qotd" );
+ l->append( "msp" );
+ l->append( "chargen" );
+ l->append( "ftp-data" );
+ l->append( "ftp" );
+ l->append( "fsp" );
+ l->append( "ssh" );
+ l->append( "telnet" );
+ l->append( "smtp" );
+ l->append( "time" );
+ l->append( "rlp" );
+ l->append( "nameserver" );
+ l->append( "whois" );
+ l->append( "re-mail-ck" );
+ l->append( "domain" );
+ l->append( "mtp" );
+ l->append( "bootps" );
+ l->append( "bootpc" );
+ l->append( "tftp" );
+ l->append( "gopher" );
+ l->append( "rje" );
+ l->append( "finger" );
+ l->append( "www" );
+ l->append( "link" );
+ l->append( "kerberos" );
+ l->append( "supdup" );
+ l->append( "hostnames" );
+ l->append( "iso-tsap" );
+ l->append( "csnet-ns" );
+ l->append( "rtelnet" );
+ l->append( "pop2" );
+ l->append( "pop3" );
+ l->append( "sunrpc" );
+ l->append( "auth" );
+ l->append( "sftp" );
+ l->append( "uucp-path" );
+ l->append( "nntp" );
+ l->append( "ntp" );
+ l->append( "pwdgen" );
+ l->append( "netbios-ns" );
+ l->append( "netbios-dgm" );
+ l->append( "netbios-ssn" );
+ l->append( "imap2" );
+ l->append( "snmp" );
+ l->append( "snmp-trap" );
+ l->append( "cmip-man" );
+ l->append( "cmip-agent" );
+ l->append( "mailq" );
+ l->append( "xdmcp" );
+ l->append( "nextstep" );
+ l->append( "bgp" );
+ l->append( "prospero" );
+ l->append( "irc" );
+ l->append( "smux" );
+ l->append( "at-rtmp" );
+ l->append( "at-rtmp" );
+ l->append( "at-nbp" );
+ l->append( "at-echo" );
+ l->append( "at-zis" );
+ l->append( "qmtp" );
+ l->append( "z3950" );
+ l->append( "ipx" );
+ l->append( "imap3" );
+ l->append( "pawserv" );
+ l->append( "zserv" );
+ l->append( "fatserv" );
+ l->append( "rpc2portmap" );
+ l->append( "codaauth2" );
+ l->append( "ulistserv" );
+ l->append( "ldap" );
+ l->append( "https" );
+ l->append( "snpp" );
+ l->append( "saft" );
+ l->append( "npmp-local" );
+ l->append( "npmp-gui" );
+ l->append( "hmmp-ind" );
+ l->append( "ipp" );
+ l->append( "exec" );
+ l->append( "biff" );
+ l->append( "login" );
+ l->append( "who" );
+ l->append( "shell" );
+ l->append( "syslog" );
+ l->append( "printer" );
+ l->append( "talk" );
+ l->append( "ntalk" );
+ l->append( "route" );
+ l->append( "timed" );
+ l->append( "tempo" );
+ l->append( "courier" );
+ l->append( "conference" );
+ l->append( "netnews" );
+ l->append( "netwall" );
+ l->append( "gdomap" );
+ l->append( "gdomap" );
+ l->append( "uucp" );
+ l->append( "klogin" );
+ l->append( "kshell" );
+ l->append( "afpovertcp" );
+ l->append( "remotefs" );
+ l->append( "nntps" );
+ l->append( "submission" );
+ l->append( "ldaps" );
+ l->append( "tinc" );
+ l->append( "silc" );
+ l->append( "kerberos-adm" );
+ l->append( "webster" );
+ l->append( "rsync" );
+ l->append( "ftps-data" );
+ l->append( "ftps" );
+ l->append( "telnets" );
+ l->append( "imaps" );
+ l->append( "ircs" );
+ l->append( "pop3s" );
+ l->append( "socks" );
+ l->append( "mysql" );
+ l->append( "jabber-client" );
+ l->append( "jabber-server" );
+ l->append( "postgres" );
+ l->append( "x11" );
+ l->append( "x11-1" );
+ l->append( "x11-2" );
+ l->append( "x11-3" );
+ l->append( "x11-4" );
+ l->append( "x11-5" );
+ l->append( "x11-6" );
+ l->append( "x11-7" );
+ l->append( "font-service" );
+ l->append( "kerberos4" );
+ l->append( "kerberos_master" );
+ l->append( "passwd_server" );
+ l->append( "krb_prop" );
+ l->append( "krbupdate" );
+ l->append( "kpasswd" );
+ l->append( "swat" );
+ l->append( "kpop" );
+ l->append( "knetd" );
+ l->append( "zephyr-srv" );
+ l->append( "zephyr-clt" );
+ l->append( "zephyr-hm" );
+ l->append( "eklogin" );
+ l->append( "linuxconf" );
+ l->append( "poppassd" );
+ l->sort();
+ cb_port_name-> insertStringList( *l );
+ sb_port1->setMaxValue( 65535 );
+ sb_port2->setMaxValue( 65535 );
+ sb_port1->setMinValue( 1 );
+ sb_port2->setMinValue( 1 );
+}
+
+KMFPortWidget::~KMFPortWidget() {}
+
+KMFError* KMFPortWidget::getPortString( QString* value ) {
+ QString port1 = "";
+ QString port2 = "";
+ QString portname = "";
+ QString ddot = ":";
+ if ( c_port_name->isChecked() ) {
+ portname = cb_port_name->currentText();
+ kdDebug() << "Found portname: " << portname << endl;
+ value->append( portname );
+ kdDebug() << "Return portname: " << *value << endl;
+ m_err->setErrType( KMFError::OK );
+ m_err->setErrMsg( "" );
+ return m_err;
+ } else {
+ port1 = port1.setNum( sb_port1->value() );
+ value->append( port1 );
+ if ( c_portrange->isChecked() ) {
+ port2 = port2.setNum( sb_port2->value() );
+ value->append( ddot );
+ value->append( port2 );
+ }
+
+ if ( c_inv->isChecked() ) {
+ value->prepend( "! " );
+ }
+ m_err->setErrType( KMFError::OK );
+ m_err->setErrMsg( "" );
+ return m_err;
+ }
+ return m_err;
+}
+
+void KMFPortWidget::loadPortString( QString& port ) {
+ kdDebug() << "void KMFPortWidget::loadPortString(QString&)" << endl;
+ kdDebug() << "Try to load PortString: " << port << endl;
+ setEnabled( true );
+ if ( port.startsWith( "! " ) ) {
+ port = port.right( port.length() - 2 );
+ c_inv->setChecked( true );
+ }
+
+ int pos = -1;
+ pos = port.find( ":" );
+ if ( pos > -1 ) {
+ c_port_name->setChecked( false );
+ c_portrange->setChecked( true );
+ sb_port2->setEnabled( true );
+ l_to->setEnabled( true );
+ c_port_name->setEnabled( false );
+
+ QString port1 = port.left( pos );
+ QString port2 = port.right( port.length() - pos - 1 );
+ kdDebug() << "Found Ports: " << port1 << " and " << port2 << endl;
+ int p1, p2;
+ bool bp1, bp2;
+ p1 = port1.toInt( &bp1, 10 );
+ p2 = port2.toInt( &bp2, 10 );
+ if ( p1 )
+ sb_port1->setValue( p1 );
+ if ( p2 )
+ sb_port2->setValue( p2 );
+ } else {
+ kdDebug() << "Found Port: " << port << endl;
+ int p;
+ bool ok;
+ p = port.toInt( &ok, 10 );
+ if ( ok ) {
+ sb_port1->setValue( p );
+ } else {
+ c_port_name->setChecked( true );
+
+// for ( uint i = 0; i < c_port_name->count(); i++ ) {
+// QString tmp_item = c_port_name->text( i );
+// if ( tmp_item == port ) {
+// c_port_name->setCurrentItem( i );
+// }
+// }
+
+
+ cb_port_name->setCurrentText( port );
+
+ }
+ }
+}
+
+void KMFPortWidget::reset() {
+ c_portrange->setChecked( false );
+ c_inv->setChecked( false );
+ l_to->setEnabled( false );
+ c_port_name->setChecked( false );
+ cb_port_name->setCurrentItem( 0 );
+ sb_port1->setValue( 0 );
+ sb_port2->setValue( 0 );
+}
+
+}
+
+#include "kmfportwidget.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfportwidget.h b/kmyfirewall/kmfwidgets/kmfportwidget.h
new file mode 100644
index 0000000..f4a3965
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfportwidget.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ begin : Fri Nov 1 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFPORTWIDGET_H
+#define KMFPORTWIDGET_H
+
+#include <qwidget.h>
+#include <kdemacros.h>
+#include "kmyfirewallportwidget.h"
+
+/**Widget for input of portnumbers, portranges or names
+ *@author Christian Hubinger
+ */
+
+namespace KMF {
+class KMFError;
+
+class KDE_EXPORT KMFPortWidget : public KMyFirewallPortWidget {
+ Q_OBJECT
+public:
+ KMFPortWidget( QWidget *parent = 0, const char *name = 0 );
+ ~KMFPortWidget();
+ KMFError* getPortString( QString* value );
+ void loadPortString( QString& );
+ void reset();
+private:
+ KMFError *m_err;
+
+signals:
+ void sigMultiPortChanged( bool );
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfprocout.cpp b/kmyfirewall/kmfwidgets/kmfprocout.cpp
new file mode 100644
index 0000000..7112468
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfprocout.cpp
@@ -0,0 +1,208 @@
+/***************************************************************************
+ begin : Thu Sep 5 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#include "kmfprocout.h"
+
+// KDE includes
+#include <klocale.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <kpushbutton.h>
+
+
+// QT includes
+#include <qtextbrowser.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qfont.h>
+
+// Project Includes
+#include "../core/xmlnames.h"
+namespace KMF {
+KMFProcOut::KMFProcOut( QWidget *parent, const char *name, WFlags fl ) : QWidget( parent, name, fl ) {
+ stderrbuf = new QString( "" );
+ stdoutbuf = new QString( "" );
+ m_job_name = XML::Undefined_Value;
+ childproc = new KProcess();
+
+ connect( childproc, SIGNAL( receivedStdout( KProcess*, char*, int ) ), this, SLOT( slotReceivedOutput( KProcess*, char*, int ) ) );
+ connect( childproc, SIGNAL( receivedStderr( KProcess*, char*, int ) ), this, SLOT( slotReceivedError( KProcess*, char*, int ) ) );
+ connect( childproc, SIGNAL( processExited( KProcess* ) ), this, SLOT( slotProcessExited( KProcess* ) ) ) ;
+ initGUI();
+ hide();
+ kdDebug() << "KMFProcOut: Finished initialisation." << endl;
+}
+
+KMFProcOut::~KMFProcOut() {
+ delete childproc;
+}
+
+void KMFProcOut::initGUI() {
+ KIconLoader * loader = KGlobal:: iconLoader();
+ QString icon_name;
+
+ icon_name = "stop";
+ icon_stop = loader->loadIcon( icon_name, KIcon::Small );
+
+ icon_name = "quit";
+ icon_close = loader->loadIcon( icon_name, KIcon::Small );
+
+ m_layout = new QGridLayout( this, 0, 0, 2, 2, "layout" );
+
+ m_lbview = new QTextBrowser( this, "m_lbview" );
+ m_lbview->setTextFormat( RichText );
+
+
+ m_lbview->setFont( QFont( "Nimbus Mono L", 9 ) );
+
+ m_ljob_name = new QLabel( this, "m_ljob_name" );
+ QFont ljob_name_font( m_ljob_name->font() );
+ ljob_name_font.setBold( TRUE );
+ m_ljob_name->setFont( ljob_name_font );
+ m_ljob_name->setFrameShape( QLabel::StyledPanel );
+ m_ljob_name->setFrameShadow( QLabel::Sunken );
+ m_ljob_name->setText( i18n( "Nothing to do yet..." ) );
+
+ m_bkill = new KPushButton( icon_stop, i18n( "Kill Process" ) , this, "m_bkill" );
+ m_bkill->setEnabled( false );
+ connect( m_bkill, SIGNAL( clicked() ), this, SLOT( slotKillJob() ) );
+
+ m_layout->addMultiCellWidget( m_ljob_name, 0, 0, 0, 9 );
+ m_layout->addMultiCellWidget( m_bkill, 0, 0, 9, 10 );
+ m_layout->addMultiCellWidget( m_lbview, 1, 1, 0, 10 );
+}
+
+
+void KMFProcOut::runCmd( const QString& cmd, const QString& job_name, const QString& job_description, bool useKdeSu ) {
+ kdDebug() << "KMFProcOut::runCmd(QString& cmd)"/* << cmd */<< endl;
+ show();
+ m_lbview->clear();
+ m_lbview->setTextFormat( RichText );
+ m_ljob_name->setText( job_description );
+ m_job_name = job_name;
+ startJob( cmd, useKdeSu );
+}
+
+void KMFProcOut::startJob( const QString &cmd, bool useKdeSu ) {
+ m_bkill->setEnabled( true );
+
+ childproc->clearArguments();
+ if( useKdeSu ) {
+ *childproc << "kdesu" << "-t" << "-i" << "kmyfirewall" << "--noignorebutton" << "-d" << "-c" << cmd;
+ } else {
+ *childproc << "bash" << cmd;
+ }
+
+ childproc->start( KProcess::NotifyOnExit, KProcess::AllOutput );
+}
+
+void KMFProcOut::slotKillJob() {
+ kdDebug() << "void KMFProcOut::killJob()" << endl;
+ childproc->kill();
+}
+
+bool KMFProcOut::isRunning() {
+ return childproc->isRunning();
+}
+
+void KMFProcOut::slotReceivedOutput( KProcess *, char *buffer, int buflen ) {
+ // Flush stderr buffer
+ if ( !stderrbuf->isEmpty() ) {
+ insertStderrLine( *stderrbuf );
+ stderrbuf = new QString( "" );
+ }
+
+ *stdoutbuf += QString::fromLatin1( buffer, buflen );
+ int pos;
+ while ( ( pos = stdoutbuf->find( '\n' ) ) != -1 ) {
+ QString line = stdoutbuf->left( pos );
+ insertStdoutLine( line );
+ stdoutbuf->remove
+ ( 0, pos + 1 );
+ }
+}
+
+void KMFProcOut::slotReceivedError( KProcess *, char *buffer, int buflen ) {
+ // Flush stdout buffer
+ if ( !stdoutbuf->isEmpty() ) {
+ insertStdoutLine( *stdoutbuf );
+ stdoutbuf = new QString( "" );
+ }
+
+ *stderrbuf += QString::fromLatin1( buffer, buflen );
+ int pos;
+ while ( ( pos = stderrbuf->find( '\n' ) ) != -1 ) {
+ QString line = stderrbuf->left( pos );
+ insertStderrLine( line );
+ stderrbuf->remove
+ ( 0, pos + 1 );
+ }
+}
+
+void KMFProcOut::slotProcessExited( KProcess * ) {
+ kdDebug() << "KMFProcOut::slotProcessExited()" << endl;
+ emit processExited( childproc );
+ childFinished( childproc->normalExit(), childproc->exitStatus() );
+ return ;
+}
+
+void KMFProcOut::insertStdoutLine( const QString &line ) {
+ m_lbview->append( line + "" );
+}
+
+void KMFProcOut::insertStderrLine( const QString &line ) {
+ const QString & line2 = i18n( "<b>Error:</b> %1" ).arg( line );
+ m_lbview->append( "<font color=\"red\">" + line2 + "</font>" );
+}
+
+void KMFProcOut::childFinished( bool , int status ) {
+ QString stat;
+ stat.setNum( status );
+ const QString& job_name = m_job_name;
+ if ( status != 0 ) {
+ m_lbview->append( i18n( "<br><font color=\"red\"><b>Execution failed</b></font>" ) );
+ m_lbview->append( i18n( "<font color=\"red\"><b>Exit(Code): %1</b></font>" ).arg( stat ) );
+ emit sigJobFinished( false, job_name );
+ } else {
+ m_lbview->append( i18n( "<br><b>Finished successfully</b>" ) );
+ emit sigJobFinished( true, job_name );
+ }
+ m_bkill->setEnabled( false );
+ kdDebug() << "childFinished" << endl;
+ return ;
+}
+
+void KMFProcOut::setText( const QString& str, const QString& commandName ) {
+ kdDebug() << "void KMFProcOut::setText(const QString& text)" << endl;
+// kdDebug() << "Text: " << str << endl;
+ m_ljob_name->setText( commandName );
+ m_lbview->clear();
+ m_lbview->setTextFormat( PlainText );
+ m_lbview->append( str );
+/*
+ QString *text = new QString( str );
+ int pos;
+ while ( ( pos = text->find( '\n' ) ) != -1 && !text->isEmpty() ) {
+ QString line = text->left( pos );
+ insertStdoutLine( line );
+ text->remove( 0, pos + 1 );
+ }*/
+}
+
+}
+
+#include "kmfprocout.moc"
diff --git a/kmyfirewall/kmfwidgets/kmfprocout.h b/kmyfirewall/kmfwidgets/kmfprocout.h
new file mode 100644
index 0000000..64553af
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfprocout.h
@@ -0,0 +1,82 @@
+/***************************************************************************
+ begin : Thu Sep 5 2002
+ copyright : (C) 2002 by Christian Hubinger
+ email : chubinger@irrsinnig.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. *
+ * *
+ ***************************************************************************/
+
+#ifndef KMFPROCOUT_H
+#define KMFPROCOUT_H
+
+// QT includes
+#include <qwidget.h>
+#include <qstring.h>
+#include <qpixmap.h>
+
+// KDE includes
+#include <kprocess.h>
+
+/**
+ *@author Christian Hubinger
+ */
+
+class QLabel;
+class QGridLayout;
+class KPushButton;
+class QTextBrowser;
+namespace KMF {
+class KDE_EXPORT KMFProcOut : public QWidget {
+ Q_OBJECT
+public:
+ KMFProcOut( QWidget *parent = 0, const char *name = 0, WFlags fl = 0 );
+ ~KMFProcOut();
+
+ bool isRunning();
+ void runCmd( const QString& cmd, const QString& job_name, const QString& job_description, bool useKdeSu );
+ void setText( const QString&, const QString& coomandName);
+
+public slots:
+ void slotKillJob();
+
+protected slots:
+ void slotReceivedOutput( KProcess*, char*, int );
+ void slotReceivedError( KProcess*, char*, int );
+ void slotProcessExited( KProcess* );
+
+private:
+
+ void startJob( const QString &dir, bool useKdeSu );
+ // void prepareJob( const QString &dir );
+ void childFinished( bool normal, int status );
+ void insertStderrLine( const QString &line );
+ void insertStdoutLine( const QString &line );
+ void slotSetButtons();
+ void initGUI();
+
+private: // data
+ QString* stderrbuf;
+ QString* stdoutbuf;
+ KProcess* childproc;
+
+ QPixmap icon_stop, icon_close;
+ QString m_job_name;
+ QTextBrowser *m_lbview;
+ QLabel *m_ljob_name;
+ QGridLayout *m_layout;
+ KPushButton *m_bkill;
+
+signals:
+ void processExited( KProcess * );
+ void rowSelected( int row );
+ void sigJobFinished( bool, const QString& );
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfprotocollistview.cpp b/kmyfirewall/kmfwidgets/kmfprotocollistview.cpp
new file mode 100644
index 0000000..fba225d
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfprotocollistview.cpp
@@ -0,0 +1,197 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfprotocollistview.h"
+
+// QT includes
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qwidgetstack.h>
+#include <qtextedit.h>
+#include <qtimer.h>
+
+
+// KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <kcombobox.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <knuminput.h>
+
+// Project includes
+#include "../core/kmfprotocolcategory.h"
+#include "../core/kmfprotocol.h"
+#include "../core/kmfprotocollibrary.h"
+#include "../core/kmfprotocolusage.h"
+#include "../core/kmfnetzone.h"
+#include "../core/kmfnethost.h"
+#include "../kmfwidgets/kmflistviewitem.h"
+#include "../kmfwidgets/kmfchecklistitem.h"
+namespace KMF {
+KMFProtocolListView::KMFProtocolListView ( QWidget* parent, const char* name, WFlags fl )
+ : KMyFirewallProtocolListView ( parent,name,fl ) {
+ m_reloading = false;
+ loadProtocols();
+ connect( m_lv_protocols, SIGNAL( pressed( QListViewItem* ) ),
+ this, SLOT( slotNewProtocolSelected( QListViewItem* ) ) );
+
+}
+
+KMFProtocolListView::~KMFProtocolListView() {}
+
+/*$SPECIALIZATION$*/
+void KMFProtocolListView::setHost( KMFNetHost* host ) {
+ setEnabled( true );
+
+ QValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols();
+ QValueList<KMFProtocol*>::iterator it;
+ for( it = allProts.begin(); it != allProts.end(); ++it ) {
+/* QPtrListIterator<KMFProtocol> it( *KMFProtocol::protocolLibrary() );
+ while ( it.current() ) {*/
+ KMFProtocol * prot = *it;
+ QListViewItem *qitem = m_lv_protocols->findItem( prot->name(), 0 );
+ if ( ! qitem ) {
+ kdDebug() << "No item found for protocol: " << prot->name() << endl;
+ }
+
+ KMFCheckListItem *item = dynamic_cast<KMFCheckListItem*>( qitem );
+ if ( ! item ) {
+ kdDebug() << "Item is no KMFCheckListItem" << endl;
+ }
+
+ if ( host->findProtocolUsageByProtocolUuid( prot->uuid() ) ) {
+ item->setOn( true );
+ item->setEnabled( true );
+ }
+ if ( host->protocolInherited( prot->uuid() ) ) {
+ item->setOn( true );
+ item->setEnabled( false );
+ }
+ if ( ! host->findProtocolUsageByProtocolUuid( prot->uuid() ) && ! host->protocolInherited( prot->uuid() ) ) {
+ item->setOn( false );
+ item->setEnabled( true );
+ }
+ }
+}
+void KMFProtocolListView::setZone( KMFNetZone* zone ) {
+ setEnabled( true );
+ QValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols();
+ QValueList<KMFProtocol*>::iterator it;
+ for( it = allProts.begin(); it != allProts.end(); ++it ) {
+ KMFProtocol * prot = *it;
+ QListViewItem *qitem = m_lv_protocols->findItem( prot->name(), 0 );
+ if ( ! qitem ) {
+ kdDebug() << "No item found for protocol: " << prot->name() << endl;
+ }
+
+ KMFCheckListItem *item = dynamic_cast<KMFCheckListItem*>( qitem );
+ if ( ! item ) {
+ kdDebug() << "Item is no KMFCheckListItem" << endl;
+ }
+
+ if ( zone->findProtocolUsageByProtocolUuid( prot->uuid() ) ) {
+ item->setOn( true );
+ item->setEnabled( true );
+ }
+ if ( zone->protocolInherited( prot->uuid() ) ) {
+ item->setOn( true );
+ item->setEnabled( false );
+ }
+ if ( ! zone->findProtocolUsageByProtocolUuid( prot->uuid() ) &&
+ ! zone->protocolInherited( prot->uuid() ) ) {
+ item->setOn( false );
+ item->setEnabled( true );
+ }
+ }
+}
+
+void KMFProtocolListView::loadProtocols() {
+ kdDebug() << "KMFProtocolListView::loadProtocols(" << endl;
+
+ m_reloading = true;
+ QListViewItemIterator listViewIt( m_lv_protocols );
+ while ( listViewIt.current() ) {
+ QListViewItem * qitem = listViewIt.current();
+ ++listViewIt;
+ KMFCheckListItem * item = 0;
+ item = dynamic_cast<KMFCheckListItem*> ( qitem );
+ if( item && item->protocolUsage() ) {
+ item->protocolUsage()->deleteLater();
+ }
+
+ }
+ m_lv_protocols->clear();
+
+
+ setEnabled( false );
+ QValueList<KMFProtocol*>& allProts = KMFProtocolLibrary::instance()->allProtocols();
+ QValueList<KMFProtocol*>::iterator it;
+ for( it = allProts.begin(); it != allProts.end(); ++it ) {
+ KMFProtocol * prot = *it;
+/* disconnect( prot, SIGNAL( destroyed( QObject* ) ),
+ this, SLOT( slotOnProtocolDeleted( QObject* ) ) );
+ connect( prot, SIGNAL( destroyed( QObject* ) ),
+ this, SLOT( slotOnProtocolDeleted( QObject* ) ) );*/
+
+ KMFProtocolUsage *protUsage = prot->createUsage();
+ protUsage->setProtocol( prot );
+
+
+
+
+ QString cat = prot->category()->name();
+ QListViewItem *parentItem = m_lv_protocols->findItem( cat, 0 );
+
+ if ( ! parentItem ) {
+ KMFListViewItem *newParentItem = new KMFListViewItem( m_lv_protocols, 0, prot->category() );
+ newParentItem->setText( 0, cat );
+ newParentItem->loadNetfilterObject( prot->category() );
+ newParentItem->setOpen( true );
+ parentItem = newParentItem;
+ }
+
+ KMFCheckListItem *item = new KMFCheckListItem( parentItem, 0 , prot->name() , QCheckListItem::CheckBox, protUsage );
+ item->setText( 0, prot->name() );
+ // item->setText( 1, prot->uuid().toString() );
+ }
+ m_reloading = false;
+}
+
+void KMFProtocolListView::slotOnProtocolDeleted( QObject* ) {
+ if ( m_reloading ) {
+ return;
+ }
+ // loadProtocols();
+}
+
+void KMFProtocolListView::slotNewProtocolSelected( QListViewItem* qitem ) {
+ if ( KMFCheckListItem * item = dynamic_cast<KMFCheckListItem*> ( qitem ) ) {
+ emit sigProtocolClicked( item->protocolUsage(), item->isOn() );
+ } else if ( KMFListViewItem * item = dynamic_cast<KMFListViewItem*> ( qitem ) ){
+ emit sigProtocolCategoryClicked( item->protocolCategory() );
+ }
+}
+
+}
+
+
+#include "kmfprotocollistview.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfprotocollistview.h b/kmyfirewall/kmfwidgets/kmfprotocollistview.h
new file mode 100644
index 0000000..9a21510
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfprotocollistview.h
@@ -0,0 +1,66 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFPROTOCOLLISTVIEW_H
+#define KMFPROTOCOLLISTVIEW_H
+
+#include "kmyfirewallprotocollistview.h"
+
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qguardedptr.h>
+#include <qpixmap.h>
+#include <quuid.h>
+
+
+
+class QListViewItem;
+
+namespace KMF {
+class KMFProtocolUsage;
+class KMFProtocolCategory;
+class KMFNetZone;
+class KMFNetHost;
+
+class KMFProtocolListView : public KMyFirewallProtocolListView {
+ Q_OBJECT
+
+ public:
+ KMFProtocolListView ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFProtocolListView();
+ /*$PUBLIC_FUNCTIONS$*/
+ void setHost( KMFNetHost* host );
+ void setZone( KMFNetZone* zone );
+ void loadProtocols();
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+
+ protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+ protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotNewProtocolSelected( QListViewItem* );
+ void slotOnProtocolDeleted( QObject* );
+
+ private:
+ QGuardedPtr<KMFNetHost> *m_host;
+ QGuardedPtr<KMFNetZone> *m_zone;
+ bool m_reloading;
+
+ signals:
+ void sigProtocolClicked( KMFProtocolUsage*, bool );
+ void sigProtocolCategoryClicked( KMFProtocolCategory* );
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp
new file mode 100644
index 0000000..b79e346
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.cpp
@@ -0,0 +1,230 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfprotocolpropertieswidget.h"
+
+// QT includes
+#include <qlistview.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qwidgetstack.h>
+#include <qtextedit.h>
+#include <qframe.h>
+
+// KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <kcombobox.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <knuminput.h>
+
+// Project Includes
+#include "../core/kmfnethost.h"
+#include "../core/kmfnetzone.h"
+#include "../core/kmfundoengine.h"
+#include "../core/kmfprotocol.h"
+#include "../core/kmfprotocolusage.h"
+#include "../core/kmfprotocolcategory.h"
+namespace KMF {
+KMFProtocolPropertiesWidget::KMFProtocolPropertiesWidget ( QWidget* parent, const char* name, WFlags fl )
+ : KMyFirewallProtocolPropertiesWidget ( parent,name,fl ) {
+
+ connect( m_cb_limit, SIGNAL( toggled( bool ) ),
+ this, SLOT( slotEnableProtocolLimit( bool ) ) );
+
+ connect( m_sb_limit_rate, SIGNAL( valueChanged( int ) ),
+ this, SLOT( slotSetProtocolLimitRate( int ) ) );
+
+ connect( m_cb_limit_interval, SIGNAL( highlighted( const QString& ) ), this, SLOT( slotSetProtocolLimitInterval( const QString& ) ) );
+
+ connect( m_cb_log, SIGNAL( toggled( bool ) ),
+ this, SLOT( slotEnableProtocolLogging( bool ) ) );
+
+}
+
+KMFProtocolPropertiesWidget::~KMFProtocolPropertiesWidget() {}
+
+/*$SPECIALIZATION$*/
+
+void KMFProtocolPropertiesWidget::slotProtocolDeleted() {
+ m_gb_protocol_option->setEnabled( false );
+ m_gb_protocol_description->setEnabled( true );
+ m_protocolUsage = 0;
+}
+
+void KMFProtocolPropertiesWidget::blockAllSignals( bool onoff ) {
+ m_cb_limit->blockSignals( onoff );
+ m_sb_limit_rate->blockSignals( onoff );
+ m_cb_limit_interval->blockSignals( onoff );
+ m_cb_log->blockSignals( onoff );
+}
+
+void KMFProtocolPropertiesWidget::loadProtocolCategory( KMFProtocolCategory* protCat ) {
+ blockAllSignals( true );
+ m_gb_protocol_option->setEnabled( false );
+ m_gb_protocol_description->setEnabled( true );
+ m_l_protocol_desc->setEnabled( true );
+ QString text = i18n( "<qt><b>Description: </b>%1<br>" ).arg( protCat ->description() );
+ text += "</qt>";
+
+ m_l_protocol_desc->setText( text );
+ blockAllSignals( false );
+}
+
+void KMFProtocolPropertiesWidget::loadProtocol( KMFProtocol* prot ) {
+ blockAllSignals( true );
+ m_gb_protocol_option->setEnabled( false );
+ m_gb_protocol_description->setEnabled( true );
+ m_l_protocol_desc->setEnabled( true );
+ QString text = i18n( "<qt><b>Description: </b>%1<br>" ).arg( prot ->description() );
+ const QString& tcpports = prot->tcpPortsList();
+
+ if ( ! tcpports.isEmpty() ) {
+ text += i18n( "<b>Affected TCP ports: </b>" );
+ text += tcpports;
+ text +="<br>";
+ }
+ const QString& udpports = prot->udpPortsList();
+ if ( ! udpports.isEmpty() ) {
+ text += i18n( "<b>Affected UDP ports: </b>" );
+ text += udpports;
+ }
+ text += "</qt>";
+
+ m_l_protocol_desc->setText( text );
+ blockAllSignals( false );
+}
+
+void KMFProtocolPropertiesWidget::loadProtocolUsage( KMFProtocolUsage* prot ) {
+
+ kdDebug() << "KMFNetHostPropertiesWidget::loadTarget( KMFNetHost* host " << endl;
+ if ( ! prot ) {
+ return;
+ }
+
+ if ( m_protocolUsage ) {
+ disconnect( m_protocolUsage, SIGNAL( destroyed() ),
+ this,SLOT( slotProtocolDeleted() ) );
+ }
+
+ m_protocolUsage = prot;
+ connect( m_protocolUsage, SIGNAL( destroyed() ),
+ this,SLOT( slotProtocolDeleted() ) );
+ setEnabled( true );
+
+ blockAllSignals( true );
+ loadProtocol( m_protocolUsage->protocol() );
+
+ m_gb_protocol_option->setEnabled( true );
+ m_gb_protocol_description->setEnabled( true );
+ m_cb_log->setChecked( m_protocolUsage->logging() );
+ if ( m_protocolUsage ->limit() > 0 ) {
+ m_cb_limit->setChecked( true );
+ m_sb_limit_rate->setValue( m_protocolUsage ->limit() );
+ if ( m_protocolUsage ->limitInterval() == "second" )
+ m_cb_limit_interval->setCurrentItem( 0 );
+ if ( m_protocolUsage ->limitInterval() == "minute" )
+ m_cb_limit_interval->setCurrentItem( 1 );
+ if ( m_protocolUsage ->limitInterval() == "hour" )
+ m_cb_limit_interval->setCurrentItem( 2 );
+ } else {
+ m_cb_limit->setChecked( false );
+ }
+
+ blockAllSignals( false );
+}
+
+void KMFProtocolPropertiesWidget::slotEnableProtocolLimit( bool onoff ) {
+ kdDebug() << "void KMFProtocolPropertiesWidget::slotEnableProtocolLimit( bool )" << endl;
+ if ( ! m_protocolUsage ) {
+ kdDebug() << "WARNING: No Current Protocol activated" << endl;
+ return;
+ }
+ if ( onoff ) {
+ KMFUndoEngine::instance()->startTransaction(
+ m_protocolUsage,
+ i18n("Enable package limit for protocol %1.").arg( m_protocolUsage->name() )
+ );
+ m_protocolUsage->setLimit( m_sb_limit_rate->value() );
+ m_protocolUsage->setLimitInterval( m_cb_limit_interval->currentText() );
+ KMFUndoEngine::instance()->endTransaction();
+ } else {
+ KMFUndoEngine::instance()->startTransaction(
+ m_protocolUsage,
+ i18n("Sisable package limit for protocol %1.").arg( m_protocolUsage->name() )
+ );
+ m_protocolUsage->setLimit( -1 );
+ KMFUndoEngine::instance()->endTransaction();
+ }
+}
+void KMFProtocolPropertiesWidget::slotSetProtocolLimitRate( int rate ){
+ kdDebug() << "void KMFProtocolPropertiesWidget::slotSetProtocolLimitRate( int )" << endl;
+ if ( ! m_protocolUsage ) {
+ kdDebug() << "WARNING: No Current Protocol activated" << endl;
+ return;
+ }
+
+
+ KMFUndoEngine::instance()->startTransaction(
+ m_protocolUsage,
+ i18n("Set package limit for protocol %1 to %2/%3.").arg( m_protocolUsage->name() ).arg( rate ).arg( m_protocolUsage->limitInterval() )
+ );
+ m_protocolUsage->setLimit( rate );
+ KMFUndoEngine::instance()->endTransaction();
+}
+
+void KMFProtocolPropertiesWidget::slotSetProtocolLimitInterval( const QString& interval ){
+ kdDebug() << "void KMFProtocolPropertiesWidget::slotSetProtocolLimitInterval( const QString& )" << endl;
+ if ( ! m_protocolUsage ) {
+ kdDebug() << "WARNING: No Current Protocol activated" << endl;
+ return;
+ }
+ if ( interval.isEmpty() ) {
+ return;
+ }
+
+ KMFUndoEngine::instance()->startTransaction(
+ m_protocolUsage,
+ i18n("Set package limit for protocol %1 to %2/%3.").arg( m_protocolUsage->name() ).arg( m_protocolUsage->limit() ).arg( interval )
+ );
+ m_protocolUsage->setLimitInterval( interval );
+ KMFUndoEngine::instance()->endTransaction();
+}
+
+void KMFProtocolPropertiesWidget::slotEnableProtocolLogging( bool onoff ){
+ kdDebug() << "void KMFGenericInterfaceProtocol::slotEnableProtocolLogging( bool )" << endl;
+ if ( ! m_protocolUsage ) {
+ kdDebug() << "WARNING: No Current Protocol activated" << endl;
+ return;
+ }
+
+ KMFUndoEngine::instance()->startTransaction(
+ m_protocolUsage,
+ i18n( "%1 logging of dropped packets for protocol %2." ).arg( onoff ? i18n( "Enable" ) : i18n( "Disable" ) ).arg( m_protocolUsage->name() )
+ );
+
+ m_protocolUsage->setLogging( onoff );
+ KMFUndoEngine::instance()->endTransaction();
+}
+
+}
+
+#include "kmfprotocolpropertieswidget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h
new file mode 100644
index 0000000..d72063b
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfprotocolpropertieswidget.h
@@ -0,0 +1,63 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFPROTOCOLPROPERTIESWIDGET_H
+#define KMFPROTOCOLPROPERTIESWIDGET_H
+
+#include "kmyfirewallprotocolpropertieswidget.h"
+
+
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qguardedptr.h>
+#include <qpixmap.h>
+#include <quuid.h>
+
+namespace KMF {
+class KMFProtocol;
+class KMFProtocolUsage;
+class KMFProtocolCategory;
+
+class KMFProtocolPropertiesWidget : public KMyFirewallProtocolPropertiesWidget {
+ Q_OBJECT
+
+ public:
+ KMFProtocolPropertiesWidget ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFProtocolPropertiesWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ void loadProtocolUsage( KMFProtocolUsage* );
+ void loadProtocol( KMFProtocol* );
+ void loadProtocolCategory( KMFProtocolCategory* );
+
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+
+ protected:
+ /*$PROTECTED_FUNCTIONS$*/
+ void blockAllSignals( bool );
+
+ protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotEnableProtocolLimit( bool );
+ void slotSetProtocolLimitRate( int );
+ void slotSetProtocolLimitInterval( const QString& );
+ void slotEnableProtocolLogging( bool );
+ void slotProtocolDeleted();
+
+ private:
+ QGuardedPtr<KMFProtocolUsage> m_protocolUsage;
+ // QGuardedPtr<KMFProtocolUsage> m_protocol;
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp
new file mode 100644
index 0000000..df65455
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.cpp
@@ -0,0 +1,73 @@
+//
+// C++ Implementation: kmfqtdesignerplugin
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "kmfqtdesignerplugin.h"
+
+// Qt includes
+
+
+// Prokject includes
+#include "kmfipv4addresswidget.h"
+namespace KMF {
+Q_EXPORT_PLUGIN( KMFQTDesignerPlugin )
+
+KMFQTDesignerPlugin::KMFQTDesignerPlugin()
+ : QWidgetPlugin() {}
+
+
+KMFQTDesignerPlugin::~KMFQTDesignerPlugin() {}
+
+QStringList KMFQTDesignerPlugin::keys() const {
+ QStringList list;
+ list << "KMFIPv4AddressWidget";
+ return list;
+}
+
+QWidget* KMFQTDesignerPlugin::create ( const QString &key, QWidget* parent, const char* name ) {
+ if ( key == "KMFIPv4AddressWidget" )
+ return new KMFIPv4AddressWidget ( parent, name );
+ return 0;
+}
+
+
+QString KMFQTDesignerPlugin::group ( const QString& feature ) const {
+ if ( feature == "KMFIPv4AddressWidget" )
+ return "Input";
+ return QString::null;
+}
+
+QIconSet KMFQTDesignerPlugin::iconSet ( const QString& ) const {
+ return QIconSet ( QPixmap ( "filechooser_pixmap" ) );
+}
+
+QString KMFQTDesignerPlugin::includeFile ( const QString& feature ) const {
+ if ( feature == "KMFIPv4AddressWidget" )
+ return "kmfipv4addresswidget.h";
+ return QString::null;
+}
+
+QString KMFQTDesignerPlugin::toolTip ( const QString& feature ) const {
+ if ( feature == "KMFIPv4AddressWidget" )
+ return "File Chooser Widget";
+ return QString::null;
+}
+
+QString KMFQTDesignerPlugin::whatsThis ( const QString& feature ) const {
+ if ( feature == "KMFIPv4AddressWidget" )
+ return "A widget to change an IPv4 Address";
+ return QString::null;
+}
+
+bool KMFQTDesignerPlugin::isContainer ( const QString& ) const {
+ return FALSE;
+}
+
+}
diff --git a/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h
new file mode 100644
index 0000000..5a2f0ed
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfqtdesignerplugin.h
@@ -0,0 +1,44 @@
+//
+// C++ Interface: kmfqtdesignerplugin
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef KMFQTDESIGNERPLUGIN_H
+#define KMFQTDESIGNERPLUGIN_H
+
+#include <qwidgetplugin.h>
+
+// Qt includes
+#include <qstringlist.h>
+#include <qstring.h>
+#include <qiconset.h>
+#include <qpixmap.h>
+
+// Prokject includes
+/**
+ @author Christian Hubinger <chubinger@irrsinnig.org>
+*/
+namespace KMF {
+class KMFQTDesignerPlugin : public QWidgetPlugin
+{
+public:
+ KMFQTDesignerPlugin();
+ ~KMFQTDesignerPlugin();
+ QStringList keys() const;
+ QWidget* create( const QString &classname, QWidget* parent = 0, const char* name = 0 );
+ QString group( const QString& ) const;
+ QIconSet iconSet( const QString& ) const;
+ QString includeFile( const QString& ) const;
+ QString toolTip( const QString& ) const;
+ QString whatsThis( const QString& ) const;
+ bool isContainer( const QString& ) const;
+
+};
+}
+#endif
diff --git a/kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp b/kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp
new file mode 100644
index 0000000..7802541
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfselectactivetarget.cpp
@@ -0,0 +1,190 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <e9806056@student.tuwien.ac.at>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfselectactivetarget.h"
+
+// QT includes
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qlistview.h>
+#include <qradiobutton.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qtextedit.h>
+#include <qlabel.h>
+#include <qbuttongroup.h>
+#include <qgroupbox.h>
+#include <qspinbox.h>
+
+// KDE includes
+#include <klocale.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <kio/job.h>
+#include <ktrader.h>
+#include <klibloader.h>
+#include <klistview.h>
+#include <klistbox.h>
+#include <knuminput.h>
+#include <kpushbutton.h>
+#include <kmessagebox.h>
+#include <ktempfile.h>
+
+// Project includes
+#include "kmflistviewitem.h"
+#include "../version.h"
+#include "../core/kmfnetwork.h"
+#include "../core/kmfdoc.h"
+#include "../core/kmftarget.h"
+
+
+//##### static stuff
+namespace KMF {
+KMFTarget * KMFSelectActiveTarget::selectTarget( KMFNetwork* network, const QString& msg ) {
+ kdDebug() << "KMFTarget * KMFSelectActiveTarget::selectTarget( KMFNetwork* network, const QString& " << msg << " )" << endl;
+ QPtrList<KMFTarget> *list = new QPtrList<KMFTarget>;
+ network->netzone()->getAllTargets( network->netzone(), list );
+ if ( list->count() == 1 ) {
+ return network->currentTarget();
+ }
+
+
+
+ KMFSelectActiveTarget *selTG = new KMFSelectActiveTarget( 0, "KMFSelectActiveTarget",
+ QWidget::WType_Dialog | QWidget::WShowModal
+ );
+ selTG->setMessage( msg );
+ selTG->loadNetwork( network );
+ selTG->exec();
+ KMFTarget *tg = selTG->selectedTarget();
+ if ( tg ) {
+ kdDebug() << "Selected Target: " << tg->guiName() << endl;
+ return tg;
+ }
+ return 0;
+
+}
+
+//##### end static
+
+KMFSelectActiveTarget::KMFSelectActiveTarget ( QWidget* parent, const char* name, bool modal, WFlags fl )
+ : KMyFirewallSelectActiveTarget ( parent,name,modal,fl )
+{
+ m_cmd_ok->setEnabled( false );
+
+ connect( m_lv_zones, SIGNAL( pressed( QListViewItem* ) ) ,
+ this, SLOT( slotNewItemSelected( QListViewItem* ) ) );
+
+ connect( m_lv_zones, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ) ,
+ this, SLOT( slotNewItemDBLClicked( QListViewItem*, const QPoint &, int ) ) );
+
+ connect( m_cmd_cancel, SIGNAL( clicked() ) ,
+ this, SLOT( slotCancel() ) );
+ connect( m_cmd_ok, SIGNAL( clicked() ) ,
+ this, SLOT( slotOk() ) );
+
+ adjustSize();
+}
+
+KMFSelectActiveTarget::~KMFSelectActiveTarget()
+{}
+
+/*$SPECIALIZATION$*/
+
+
+void KMFSelectActiveTarget::loadNetwork( KMFNetwork* net ) {
+ kdDebug() << "KMFSelectActiveTarget::loadNetwork( KMFNetwork* )" << endl;
+ if ( ! net ) {
+ return;
+ }
+ m_network = net;
+ m_lv_zones->clear();
+ KMFListViewItem *it = new KMFListViewItem( m_lv_zones, 0, m_network->netzone() );
+ it->setupZoneView();
+}
+void KMFSelectActiveTarget::setMessage( const QString& msg ) {
+ kdDebug() << "KMFSelectActiveTarget::setMessage( const QString& )" << endl;
+ m_lbl_message->setText( msg );
+}
+void KMFSelectActiveTarget::slotTargetSelected() {
+ kdDebug() << "KMFSelectActiveTarget::slotTargetSelected()" << endl;
+
+
+}
+
+void KMFSelectActiveTarget::slotNewItemDBLClicked( QListViewItem* item, const QPoint &, int ) {
+ slotNewItemSelected( item );
+ if ( m_target ) {
+ slotOk();
+ }
+}
+
+void KMFSelectActiveTarget::slotNewItemSelected( QListViewItem* item ) {
+ kdDebug() << "void KMFMyNetworkWidget::slotNewItemSelected( QListViewItem* item )" << endl;
+ if ( ! item )
+ return ;
+ m_target = 0;
+
+ m_lv_zones->blockSignals( true );
+ m_lv_zones->clearSelection();
+ m_lv_zones->setSelected( item, true );
+ m_lv_zones->blockSignals( false );
+
+ m_cmd_ok->setEnabled( false );
+
+ KMFListViewItem* kmfitem = dynamic_cast<KMFListViewItem*> ( item );
+
+ if ( ! kmfitem ) {
+ kdDebug() << "No Item Selected!" << endl;
+ return;
+ }
+
+ if ( kmfitem != 0 && kmfitem->netfilterObject()->type() == NetfilterObject::KMFTARGET ) {
+ m_target = kmfitem->target();
+ m_lbl_currentTarget->setText( m_target->guiName() );
+ kdDebug() << "Selected Target: " << m_target->guiName() << endl;
+ m_cmd_ok->setEnabled( true );
+ } else {
+ m_lbl_currentTarget->setText( i18n( "No Target Selected" ) );
+ kdDebug() << "No Target Selected" << endl;
+ m_cmd_ok->setEnabled( false );
+ }
+ kdDebug() << "Laving slotNewItemSelected()" << endl;
+}
+
+void KMFSelectActiveTarget::slotCancel() {
+ kdDebug() << "KMFSelectActiveTarget::slotCancel()" << endl;
+ m_target = 0;
+ QDialog::reject();
+}
+void KMFSelectActiveTarget::slotOk() {
+ kdDebug() << "KMFSelectActiveTarget::slotOk()" << endl;
+ QDialog::accept();
+}
+
+KMFTarget *KMFSelectActiveTarget::selectedTarget() {
+ kdDebug() << "KMFSelectActiveTarget::slectedTarget()" << endl;
+ return m_target;
+}
+
+}
+
+#include "kmfselectactivetarget.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfselectactivetarget.h b/kmyfirewall/kmfwidgets/kmfselectactivetarget.h
new file mode 100644
index 0000000..426e17f
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfselectactivetarget.h
@@ -0,0 +1,61 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <e9806056@student.tuwien.ac.at>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFSELECTACTIVETARGET_H
+#define KMFSELECTACTIVETARGET_H
+
+#include "kmyfirewallselectactivetarget.h"
+
+// QT Includes
+#include <qstring.h>
+#include <qguardedptr.h>
+#include <qpoint.h>
+class QListViewItem;
+
+namespace KMF {
+class KMFNetwork;
+class KMFTarget;
+
+class KMFSelectActiveTarget : public KMyFirewallSelectActiveTarget
+{
+ Q_OBJECT
+ public: static KMFTarget* selectTarget( KMFNetwork* network, const QString& msg );
+
+ public:
+ KMFSelectActiveTarget ( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~KMFSelectActiveTarget();
+ /*$PUBLIC_FUNCTIONS$*/
+ void loadNetwork( KMFNetwork* );
+ void setMessage( const QString& );
+ KMFTarget *selectedTarget();
+
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+ void slotTargetSelected();
+ void slotNewItemSelected( QListViewItem* item );
+ void slotNewItemDBLClicked( QListViewItem*, const QPoint &, int );
+ void slotCancel();
+ void slotOk();
+
+ protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+ protected slots:
+ /*$PROTECTED_SLOTS$*/
+
+ private: // DATA
+ KMFNetwork *m_network;
+ QGuardedPtr<KMFTarget> m_target;
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfselectinterface.cpp b/kmyfirewall/kmfwidgets/kmfselectinterface.cpp
new file mode 100644
index 0000000..96bb3d1
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfselectinterface.cpp
@@ -0,0 +1,117 @@
+//
+// C++ Implementation: %{MODULE}
+//
+// Description:
+//
+//
+// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR}
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include "kmfselectinterface.h"
+
+// QT includes
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qcolor.h>
+
+// KDE includes
+#include <kdebug.h>
+#include <kcombobox.h>
+#include <kpushbutton.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kglobal.h>
+#include <kapplication.h>
+
+// Project Includes
+#include "../core/kmfconfig.h"
+namespace KMF {
+KMFSelectInterface::KMFSelectInterface( QWidget *parent, const char *name, bool modal, WFlags fl )
+ : KMyFirewallSelectInterface( parent, name, modal, fl ) {
+ m_cob_interface->setBackgroundMode( PaletteBase, PaletteBase );
+// m_opt_showOnStartup->setBackgroundMode( PaletteButton );
+ m_cob_interface->setBackgroundColor( QColor( 204, 0, 49 ) );
+ m_descs << i18n("<qt><p>The generic interface provides an easy-to-use tool for setting up common personal firewalls or simple network routers.</p></qt>");
+ m_cob_interface->insertItem( i18n("Generic Interface") );
+ m_lbl_descripton->setText( *m_descs.at( 0 ) );
+
+ m_descs << i18n("<qt><p>The IPTable interface is meant to be used by advanced users who like to have full control over the rules generated; as such, the IPTables interface provides an almost 1-1 view on your iptables configuration.</p></qt>");
+ m_cob_interface->insertItem( i18n("IPTables Interface") );
+ KStandardDirs dir;
+ QString filename = dir.findResource( "data", "kmyfirewall/pics/kmf_snapshot_generic_interface.png" );
+ QPixmap *p = new QPixmap( filename );
+ m_pic_screenshot->setPixmap( *p );
+
+
+
+
+
+
+ connect( m_cob_interface, SIGNAL( activated( int ) ), this, SLOT( slotInterfaceChanged( int ) ) );
+ connect( m_cmd_ok, SIGNAL( clicked() ) , this, SLOT( accept() ) );
+ connect( m_cmd_help, SIGNAL( clicked() ) , this, SLOT( help() ) );
+ connect( b_close, SIGNAL( clicked() ) , this, SLOT( reject() ) );
+
+ adjustSize();
+}
+
+KMFSelectInterface::~KMFSelectInterface() {}
+
+/*$SPECIALIZATION$*/
+void KMFSelectInterface::slotInterfaceChanged( int index ) {
+ kdDebug() << "KMFSelectInterface::slotInterfaceChanged( int index )" << endl;
+ m_lbl_descripton->setText( *m_descs.at( index ) );
+
+ KStandardDirs dir;
+ QString filename = "";
+ switch ( index ) {
+ case 0:
+ filename = dir.findResource( "data", "kmyfirewall/pics/kmf_snapshot_generic_interface.png" );
+ break;
+ case 1:
+ filename = dir.findResource( "data", "kmyfirewall/pics/kmf_snapshot_iptables_interface.png" );
+ break;
+ }
+ QPixmap *p = new QPixmap( filename );
+ m_pic_screenshot->setPixmap( *p );
+}
+
+void KMFSelectInterface::accept() {
+ kdDebug() << "KMFSelectInterface::accept()" << endl;
+ kdDebug() << "Found item: " << m_cob_interface->currentItem() << endl;
+ switch ( m_cob_interface->currentItem() ) {
+ case 0:
+ KMFConfig::setUseGenericInterface( true );
+// Config().m_useGenericInterface = true;
+ break;
+ case 1:
+ KMFConfig::setUseGenericInterface( false );
+// Config().m_useGenericInterface = false;
+ break;
+ default:
+ KMFConfig::setUseGenericInterface( true );
+// Config().m_useGenericInterface = true;
+ }
+ KMFConfig::setShowSelInterface( ! m_opt_showOnStartup->isChecked() );
+// Config().m_show_selInterface = ! m_opt_showOnStartup->isChecked();
+// Config().write();
+ KMFConfig::self()->writeConfig();
+ QDialog::accept();
+}
+
+void KMFSelectInterface::help() {
+ kapp->invokeHelp( "gui_interfaces" );
+}
+
+void KMFSelectInterface::reject(){
+ QDialog::reject();
+}
+
+}
+
+#include "kmfselectinterface.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfselectinterface.h b/kmyfirewall/kmfwidgets/kmfselectinterface.h
new file mode 100644
index 0000000..b275ac5
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfselectinterface.h
@@ -0,0 +1,53 @@
+//
+// C++ Interface: %{MODULE}
+//
+// Description:
+//
+//
+// Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR}
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFSELECTINTERFACE_H
+#define KMFSELECTINTERFACE_H
+
+#include "kmyfirewallselectinterface.h"
+
+// QT Includes
+#include <qstringlist.h>
+
+// KDE Includes
+#include <kdemacros.h>
+
+// Project Includes
+
+
+namespace KMF {
+class KDE_EXPORT KMFSelectInterface : public KMyFirewallSelectInterface {
+ Q_OBJECT
+
+public:
+ KMFSelectInterface( QWidget *parent = 0, const char *name = 0, bool modal = true, WFlags fl = 0 );
+ ~KMFSelectInterface();
+ /*$PUBLIC_FUNCTIONS$*/
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotInterfaceChanged( int );
+ void accept();
+ void help();
+ void reject();
+private: // DATA
+ QStringList m_descs;
+
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp
new file mode 100644
index 0000000..2eab94b
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.cpp
@@ -0,0 +1,189 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmfsystemsettingslinux.h"
+
+
+// QT Includes
+#include <qlabel.h>
+
+// KDE includes
+#include <klocale.h>
+#include <kcombobox.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <kguiitem.h>
+#include <kpushbutton.h>
+#include <knuminput.h>
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kiconloader.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+
+// Prokject includes
+#include "../core/kmftarget.h"
+#include "../core/kmftargetconfig.h"
+#include "../core/kmfundoengine.h"
+namespace KMF {
+KMFSystemSettingsLinux::KMFSystemSettingsLinux(QWidget* parent, const char* name, WFlags fl)
+: KMyFirewallSystemSettingsLinux(parent,name,fl)
+{
+ m_url_ipt_path->setMode( KFile::Files | KFile::LocalOnly );
+ m_url_mod_path->setMode( KFile::Files | KFile::LocalOnly );
+ m_url_init_path->setMode( KFile::Directory | KFile::LocalOnly );
+ m_url_runlevel_path->setMode( KFile::Directory | KFile::LocalOnly );
+
+ connect( m_url_ipt_path, SIGNAL( textChanged( const QString& ) ),
+ this, SLOT( slotSettingChanged() ) );
+ connect( m_url_mod_path, SIGNAL( textChanged( const QString& ) ),
+ this, SLOT( slotSettingChanged() ) );
+ connect( m_url_init_path, SIGNAL( textChanged( const QString& ) ),
+ this, SLOT( slotSettingChanged() ) );
+ connect( m_url_runlevel_path, SIGNAL( textChanged( const QString& ) ),
+ this, SLOT( slotSettingChanged() ) );
+ connect( m_cob_distribution, SIGNAL( activated( const QString& ) ),
+ this, SLOT( slotDistributionChanged() ) );
+}
+
+KMFSystemSettingsLinux::~KMFSystemSettingsLinux()
+{
+}
+
+
+/*$SPECIALIZATION$*/
+void KMFSystemSettingsLinux::loadTarget( KMFTarget* target ) {
+ kdDebug() << "KMFInterfaceWidget::loadTarget( KMFTarget* target )" << endl;
+ m_target = target;
+ updateView();
+}
+
+void KMFSystemSettingsLinux::updateView(){
+ kdDebug() << "KMFInterfaceWidget::updateView()" << endl;
+ if ( ! m_target ) {
+ kdDebug() << "KMFInterfaceWidget::updateView() - ERROR: m_target == 0 " << endl;
+ return;
+ }
+ KMFTargetConfig *conf = m_target->config();
+
+ kdDebug() << "KMFInterfaceWidget::updateView() - config: " << endl;
+ kdDebug() << conf->toString() << endl;
+
+ m_url_ipt_path->blockSignals( true );
+ m_url_mod_path->blockSignals( true );
+ m_url_init_path->blockSignals( true );
+ m_url_runlevel_path->blockSignals( true );
+
+ if ( conf->distribution() == "sysv" ) {
+ m_cob_distribution->setCurrentItem( 0 );
+ } else if ( conf->distribution() == "gentoo" ) {
+ m_cob_distribution->setCurrentItem( 1 );
+ } else if ( conf->distribution() == "slackware" ) {
+ m_cob_distribution->setCurrentItem( 2 );
+ }
+ slotDistributionChanged();
+
+
+
+ kdDebug() << "set conf->IPTPath()" << conf->IPTPath() << endl;
+ m_url_ipt_path->setURL( conf->IPTPath() );
+
+ kdDebug() << "set conf->modprobePath()" << conf->modprobePath() << endl;
+ m_url_mod_path->setURL( conf->modprobePath() );
+
+ kdDebug() << "set conf->initPath()" << conf->initPath() << endl;
+ m_url_init_path->setURL( conf->initPath() );
+
+ kdDebug() << "set conf->rcDefaultPath()" << conf->rcDefaultPath() << endl;
+ m_url_runlevel_path->setURL( conf->rcDefaultPath() );
+
+ m_url_ipt_path->blockSignals( false );
+ m_url_mod_path->blockSignals( false );
+ m_url_init_path->blockSignals( false );
+ m_url_runlevel_path->blockSignals( false );
+}
+
+void KMFSystemSettingsLinux::slotDistributionChanged() {
+ KMFTargetConfig *conf = m_target->config();
+ switch ( m_cob_distribution->currentItem() ) {
+ case 0:
+ conf->setDistribution( "sysv" );
+ m_url_init_path->setShown( true );
+ m_lab_init_path->setShown( true );
+ return;
+ break;
+
+ case 1:
+ conf->setDistribution( "gentoo" );
+ m_url_runlevel_path->setURL( "/etc/runlevels/default/" );
+ m_url_ipt_path->setURL( "/sbin/iptables" );
+ m_url_mod_path->setURL( "/sbin/modprobe" );
+ m_url_init_path->setURL( "/etc/init.d/" );
+ m_url_init_path->setShown( true );
+ m_lab_init_path->setShown( true );
+ break;
+
+ case 2:
+ conf->setDistribution( "slackware" );
+ m_url_runlevel_path->setURL( "/etc/rc.d/" );
+ m_url_ipt_path->setURL( "/usr/sbin/iptables" );
+ m_url_mod_path->setURL( "/usr/sbin/modprobe" );
+ m_url_init_path->setShown( false );
+ m_lab_init_path->setShown( false );
+ break;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ conf,
+ i18n( "Change system settings of target: %1" ).arg( conf->target()->guiName() )
+ );
+ conf->setIPTPath( m_url_ipt_path->url() );
+ conf->setModprobePath( m_url_mod_path->url() );
+ conf->setInitPath( m_url_init_path->url() );
+ conf->setRcDefaultPath( m_url_runlevel_path->url() );
+ KMFUndoEngine::instance()->endTransaction();
+}
+
+void KMFSystemSettingsLinux::slotSettingChanged() {
+ kdDebug() << "KMFInterfaceWidget::slotSettingChanged()" << endl;
+ KMFTargetConfig *conf = m_target->config();
+ switch ( m_cob_distribution->currentItem() ) {
+ case 0:
+ conf->setDistribution( "sysv" );
+ break;
+
+ case 1:
+ conf->setDistribution( "gentoo" );
+ break;
+
+ case 2:
+ conf->setDistribution( "slackware" );
+ break;
+ }
+ KMFUndoEngine::instance()->startTransaction(
+ conf,
+ i18n( "Change system settings of target: %1" ).arg( conf->target()->guiName() )
+ );
+ conf->setIPTPath( m_url_ipt_path->url() );
+ conf->setModprobePath( m_url_mod_path->url() );
+ conf->setInitPath( m_url_init_path->url() );
+ conf->setRcDefaultPath( m_url_runlevel_path->url() );
+ KMFUndoEngine::instance()->endTransaction();
+}
+
+}
+
+#include "kmfsystemsettingslinux.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h
new file mode 100644
index 0000000..ed8331a
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmfsystemsettingslinux.h
@@ -0,0 +1,57 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFSYSTEMSETTINGSLINUX_H
+#define KMFSYSTEMSETTINGSLINUX_H
+
+#include "kmyfirewallsystemsettingslinux.h"
+
+#include <qstring.h>
+
+#include <qguardedptr.h>
+
+namespace KMF {
+class KMFTarget;
+
+class KMFSystemSettingsLinux : public KMyFirewallSystemSettingsLinux
+{
+ Q_OBJECT
+
+public:
+ KMFSystemSettingsLinux(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~KMFSystemSettingsLinux();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ void loadTarget( KMFTarget* target );
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+ void updateView();
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotSettingChanged();
+ void slotDistributionChanged();
+
+ signals:
+ void sigTargetChanged();
+
+private:
+ QGuardedPtr<KMFTarget> m_target;
+
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmftemplatechooser.cpp b/kmyfirewall/kmfwidgets/kmftemplatechooser.cpp
new file mode 100644
index 0000000..2d989bb
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmftemplatechooser.cpp
@@ -0,0 +1,154 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+// License: GPL
+//
+
+// Qt includes
+#include <qlistbox.h>
+#include <qfile.h>
+#include <qdom.h>
+#include <qlabel.h>
+#include <qdir.h>
+#include <qpushbutton.h>
+
+// KDE includes
+#include <kstandarddirs.h>
+#include <kglobal.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+
+// project includes
+#include "../core/kmfconfig.h"
+#include "xmlnames.h"
+
+#include "kmftemplatechooser.h"
+namespace KMF {
+KMFTemplateChooser::KMFTemplateChooser(QWidget* parent, const char* name, bool modal, WFlags fl) : KMyFirewallTemplateChooser(parent,name, modal,fl) {
+ connect( lb_templates, SIGNAL( highlighted ( int ) ),
+ this, SLOT( slotNewTemplateSelected( int ) ) );
+ connect( lb_templates, SIGNAL( doubleClicked( QListBoxItem* ) ),
+ this, SLOT( slotNewTemplateSelected( QListBoxItem* ) ) );
+ connect( b_help, SIGNAL( clicked() ),
+ this, SLOT( slotHelp() ) );
+
+ parseTemplates();
+ b_accept->setEnabled( false );
+}
+
+KMFTemplateChooser::~KMFTemplateChooser() {}
+
+/*$SPECIALIZATION$*/
+void KMFTemplateChooser::reject() {
+ QDialog::reject();
+}
+
+void KMFTemplateChooser::accept() {
+ if ( lb_templates->currentItem() == -1 ) {
+ KMessageBox::error( this, i18n("No Template selected.") );
+ return;
+ }
+ if ( *m_templateFilePaths.at( lb_templates->currentItem() ) == "-1" ) {
+ // emit sigLoadEmptyDocument();
+ } else {
+ emit sigLoadTemplate( *m_templateFilePaths.at( lb_templates->currentItem() ) );
+ }
+ QDialog::accept();
+}
+
+void KMFTemplateChooser::slotHelp() {
+ // kdDebug() << "void KMFTemplateChooser::slotHelp()" << endl;
+ kapp->invokeHelp();
+}
+
+void KMFTemplateChooser::slotNewTemplateSelected( QListBoxItem* i ){
+ // kdDebug() << "void KMFTemplateChooser::slotNewTemplateSelected( " << index << " )" << endl;
+ slotNewTemplateSelected( lb_templates->index( i ) );
+ accept();
+}
+
+void KMFTemplateChooser::slotNewTemplateSelected( int index ){
+ // kdDebug() << "void KMFTemplateChooser::slotNewTemplateSelected( " << index << " )" << endl;
+ b_accept->setEnabled( true );
+ lbl_description->setText( *m_templateDescriptions.at( index ) );
+}
+
+
+
+void KMFTemplateChooser::parseTemplates(){
+ lb_templates->clear();
+ lbl_description->clear();
+
+ // Add Empty template
+ lb_templates->insertItem( i18n("Empty Ruleset") );
+ m_templateFilePaths.append( "-1" );
+ if ( KMFConfig::useGenericInterface() ) {
+ m_templateDescriptions.append( i18n("Clean Ruleset that does only setup connection tracking e.g block everything not related to connections you initialised.") );
+ } else {
+ m_templateDescriptions.append( i18n("Clean Ruleset that does not do anything. Use this if you like to setup your firewall from scratch.") );
+ }
+
+ KStandardDirs std_dir;
+ QString tmp_dir = std_dir.findResourceDir( "data", "kmyfirewall/templates/" );
+
+ QDir dir( tmp_dir + "/kmyfirewall/templates/" );
+ kdDebug() << "Found Data dir at: " << dir.path() << endl;
+ QString type;
+ if ( KMFConfig::useGenericInterface() ) {
+ type = "*.tkmfgrs";
+ } else {
+ type = "*.tkmfrs";
+ }
+ QStringList templates = dir.entryList( type );
+ if ( templates.isEmpty() ) {
+ KMessageBox::information( this, i18n("No templates (%1) could be found; please check your installation.").arg( type ) );
+ return;
+ }
+ for ( QStringList::Iterator it = templates.begin(); it != templates.end(); ++it ) {
+ parseFile( dir.path() + "/" + *it );
+ }
+}
+
+void KMFTemplateChooser::parseFile( const QString& file ) {
+ // kdDebug() << "Parsing Template: " << file << endl;
+ QFile f( file );
+
+ if ( !f.open( IO_ReadOnly ) ) {
+ KMessageBox::information( this, i18n("Template %1 could not be opened.").arg( file ) );
+ return;
+ }
+
+ QDomDocument doc;
+ if ( !doc.setContent( &f ) ) {
+ f.close();
+ KMessageBox::information( this, i18n("Template %1 is not a valid XML document.").arg( file ) );
+ return;
+ }
+
+ QDomElement root = doc.documentElement();
+ QDomNodeList list = root.elementsByTagName ( XML::Abstract_Element );
+ if ( list.count() == 0 ) {
+ KMessageBox::information( this, i18n("Template %1 does not contain the \"abstract\" tag.").arg( file ) );
+ return;
+ }
+ QDomNode node = list.item( 0 );
+ QString desc = node.toElement().attribute( XML::Description_Attribute );
+ QString name = node.toElement().attribute( XML::Name_Attribute );
+ lb_templates->insertItem( name );
+ m_templateFilePaths.append( file );
+ m_templateDescriptions.append( desc );
+}
+
+}
+
+#include "kmftemplatechooser.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmftemplatechooser.h b/kmyfirewall/kmfwidgets/kmftemplatechooser.h
new file mode 100644
index 0000000..7a25ef0
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmftemplatechooser.h
@@ -0,0 +1,72 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+// License: GPL
+//
+
+#ifndef KMFTEMPLATECHOOSER_H
+#define KMFTEMPLATECHOOSER_H
+
+#include "kmyfirewalltemplatechooser.h"
+
+// Qt includes
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+
+// KDE includes
+#include <kdemacros.h>
+
+// project includes
+
+
+class QListBoxItem;
+namespace KMF {
+class KDE_EXPORT KMFTemplateChooser : public KMyFirewallTemplateChooser {
+ Q_OBJECT
+
+public:
+ KMFTemplateChooser(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ ~KMFTemplateChooser();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ void setFileExtention( const QString& = "kmfrs" );
+
+
+public slots:
+ /*$PUBLIC_SLOTS$*/
+ void parseTemplates();
+
+protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+protected slots:
+ /*$PROTECTED_SLOTS$*/
+ virtual void reject();
+ virtual void accept();
+ void slotHelp();
+ void slotNewTemplateSelected( int );
+ void slotNewTemplateSelected( QListBoxItem* );
+
+private:
+
+ void parseFile( const QString& );
+
+private: // data
+ QStringList m_templateDescriptions;
+ QStringList m_templateFilePaths;
+
+signals:
+ void sigLoadTemplate( const QString& );
+ void sigLoadEmptyDocument();
+
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmftransactionlog.cpp b/kmyfirewall/kmfwidgets/kmftransactionlog.cpp
new file mode 100644
index 0000000..79f9e4b
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmftransactionlog.cpp
@@ -0,0 +1,278 @@
+//
+// C++ Implementation:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include "kmftransactionlog.h"
+
+// QT includes
+#include <qstring.h>
+#include <qvaluelist.h>
+#include <qlistview.h>
+#include <qptrlist.h>
+#include <qtimer.h>
+#include <qtextedit.h>
+#include <qtextstream.h>
+#include <qtextbrowser.h>
+
+// KDE includes
+#include <klistview.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kpushbutton.h>
+#include <kpopupmenu.h>
+#include <kprocess.h>
+#include <ktempfile.h>
+
+// project includes
+#include "../core/netfilterobject.h"
+#include "../core/kmfundoengine.h"
+#include "../core/kmftransaction.h"
+namespace KMF {
+KMFTransactionLog* KMFTransactionLog::s_instance = 0;
+KMFTransactionLog* KMFTransactionLog::instance() {
+ if ( ! s_instance ) {
+ s_instance = new KMFTransactionLog( 0, "", 0 );
+
+ }
+
+ return s_instance;
+}
+
+KMFTransactionLog::KMFTransactionLog ( QWidget* parent, const char* name, WFlags fl ) : KMyFirewallTransactionLog ( parent,name,fl ) {
+ m_contextMenu = new KPopupMenu( this, "m_contextMenu" );
+ m_currentTransaction = 0;
+ m_undoXMLFile = new KTempFile();
+ m_undoXMLFile->setAutoDelete( true );
+ m_redoXMLFile = new KTempFile();
+ m_redoXMLFile->setAutoDelete( true );
+
+ connect( m_cmd_clearStacks, SIGNAL( clicked() ),
+ this, SLOT( slotClearStacks() ) );
+ connect( m_cmd_clearLog, SIGNAL( clicked() ),
+ this, SLOT( slotClearLog() ) );
+
+ connect( KMFUndoEngine::instance(), SIGNAL( sigStackChanged() ),
+ this, SLOT( slotUpdateView() ) );
+
+ connect( KMFUndoEngine::instance(), SIGNAL( sigLog( const QString& ) ),
+ this, SLOT( slotLog( const QString& ) ) );
+
+ connect( m_lvUndoTransactions, SIGNAL( contextMenuRequested ( QListViewItem*, const QPoint&, int ) ),
+ this, SLOT( slotZoneRBM( QListViewItem*, const QPoint&, int ) ) );
+
+ connect( m_lvRedoTransactions, SIGNAL( contextMenuRequested ( QListViewItem*, const QPoint&, int ) ),
+ this, SLOT( slotZoneRBM( QListViewItem*, const QPoint&, int ) ) );
+
+ connect( m_cmd_update, SIGNAL( clicked() ),
+ this, SLOT( slotUpdateStatistics() ) );
+
+ m_lvUndoTransactions->setSorting(-1);
+ m_lvUndoTransactions->setSortColumn(-1);
+
+ m_lvRedoTransactions->setSorting(-1);
+ m_lvRedoTransactions->setSortColumn(-1);
+}
+
+KMFTransactionLog::~KMFTransactionLog() {}
+
+void KMFTransactionLog::slotUpdateStatistics() {
+ kdDebug() << "KMFTransactionLog::slotUpdateStatistics()" << endl;
+ m_txt_stats->setText( "" );
+
+ m_txt_stats->append ( "Object count: " + QString::number( NetfilterObject::objectCount( -1 ) ) );
+ m_txt_stats->append ( "\n" );
+
+ m_txt_stats->append ( "KMFNETWORKs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::KMFNETWORK ) ) );
+
+ m_txt_stats->append ( "IPTABLES_RULESETs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::IPTABLES_RULESET ) ) );
+ m_txt_stats->append ( "GENERIC_RULESETs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::GENERIC_RULESET ) ) );
+
+ m_txt_stats->append ( "TABLEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::TABLE ) ) );
+ m_txt_stats->append ( "CHAINs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::CHAIN ) ) );
+ m_txt_stats->append ( "RULEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::RULE ) ) );
+ m_txt_stats->append ( "RULEOPTIONs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::RULEOPTION ) ) );
+ m_txt_stats->append ( "PROTOCOLs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::PROTOCOL ) ) );
+ m_txt_stats->append ( "NETZONEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::NETZONE ) ) );
+ m_txt_stats->append ( "NETHOSTs: " +QString::number( NetfilterObject::objectCount( NetfilterObject::NETHOST ) ) );
+ m_txt_stats->append ( "KMFTARGETs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::KMFTARGET ) ) );
+ m_txt_stats->append ( "KMFTARGETCONFIGs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::KMFTARGETCONFIG ) ) );
+ m_txt_stats->append ( "PROTOCOLUSAGEs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::PROTOCOLUSAGE ) ) );
+
+
+ m_txt_stats->append ( "PROTOCOLCATEGORYs: " + QString::number( NetfilterObject::objectCount( NetfilterObject::PROTOCOLCATEGORY ) ) );
+}
+
+void KMFTransactionLog::slotZoneRBM( QListViewItem* item, const QPoint& point, int ) {
+ if ( ! item ) {
+ kdDebug() << "No item Setelcted" << endl;
+ m_currentTransaction = 0;
+ return;
+ }
+
+
+ QUuid uid( item->text( 1 ) );
+ KMFTransaction *t = KMFUndoEngine::instance()->findTransction( uid );
+ if ( ! t ) {
+ m_currentTransaction = 0;
+ return;
+ }
+
+ m_currentTransaction = t;
+ m_contextMenu->clear();
+ QString name = i18n("Transaction: %1").arg( m_currentTransaction->uuid().toString() );
+ // QString lab_str = i18n("Zone: %1").arg( m_zone->guiName() );
+ m_contextMenu->insertTitle( name );
+ m_contextMenu->insertItem( i18n( "Show XML diff using Kompare" ), this, SLOT( slotShowDiff() ) );
+ m_contextMenu->popup( point );
+
+ if ( m_undoXMLFile ) {
+ m_undoXMLFile->unlink();
+ delete m_undoXMLFile;
+ m_undoXMLFile = 0;
+ }
+ if ( m_redoXMLFile ) {
+ m_redoXMLFile->unlink();
+ delete m_redoXMLFile;
+ m_redoXMLFile = 0;
+ }
+ m_undoXMLFile = new KTempFile();
+ m_undoXMLFile->setAutoDelete( true );
+ m_redoXMLFile = new KTempFile();
+ m_redoXMLFile->setAutoDelete( true );
+
+ QTextStream& sUndo = *m_undoXMLFile->textStream();
+ sUndo << m_currentTransaction->undoXML();
+ m_undoXMLFile->sync();
+
+ QTextStream& sRedo = *m_redoXMLFile->textStream();
+ sRedo << m_currentTransaction->redoXML();
+ m_redoXMLFile->sync();
+}
+
+void KMFTransactionLog::slotShowDiff() {
+ kdDebug() << "KMFTransactionLog::slotShowDiff()" << endl;
+ if ( ! m_currentTransaction ) {
+ return;
+ }
+
+ KProcess* childproc = new KProcess();
+ kdDebug() << "kompare " << m_undoXMLFile->name() << m_redoXMLFile->name() << endl;
+ *childproc << "kompare" << m_undoXMLFile->name() << m_redoXMLFile->name();
+ childproc->start( KProcess::NotifyOnExit, KProcess::NoCommunication );
+}
+
+void KMFTransactionLog::slotKompareExited( KProcess* ) {
+}
+
+void KMFTransactionLog::slotClearStacks() {
+ KMFUndoEngine::instance()->clearStacks();
+ slotUpdateView();
+}
+
+void KMFTransactionLog::slotClearLog() {
+ m_txt_transactionLog->clear();
+}
+void KMFTransactionLog::slotLog( const QString& msg ) {
+ m_txt_transactionLog->append( msg );
+}
+
+void KMFTransactionLog::slotUpdateView() {
+// kdDebug() << "KMFTransactionLog::updateView()" << endl;
+ KListViewItem* last = 0;
+ QValueList< KMFTransaction* > undos = KMFUndoEngine::instance()->undoTransactions();
+ QValueList< KMFTransaction* >::iterator itUndo;
+ for ( itUndo = undos.begin(); itUndo != undos.end(); ++itUndo ) {
+ KMFTransaction* trans = *itUndo;
+ last = setupListItem( trans, m_lvUndoTransactions, last );
+ }
+
+ QPtrList<QListViewItem>* del = new QPtrList<QListViewItem>;
+ del->setAutoDelete( true );
+ QListViewItem* item = m_lvUndoTransactions->firstChild();
+ while( item ) {
+ bool found = false;
+ for ( itUndo = undos.begin(); itUndo != undos.end(); ++itUndo ) {
+ KMFTransaction* trans = *itUndo;
+ if ( trans->uuid().toString() == item->text( 1 ) ) {
+ found = true;
+ }
+ }
+ if ( ! found ) {
+ del->append( item );
+ }
+ item = item->nextSibling();
+ }
+ del->clear();
+
+ last = 0;
+ QValueList< KMFTransaction* > redos = KMFUndoEngine::instance()->redoTransactions();
+ QValueList< KMFTransaction* >::iterator itRedo;
+ for ( itRedo = redos.begin(); itRedo != redos.end(); ++itRedo ) {
+ KMFTransaction* trans = *itRedo;
+ last = setupListItem( trans, m_lvRedoTransactions,last );
+ }
+
+ item = m_lvRedoTransactions->firstChild();
+ while( item ) {
+ bool found = false;
+ for ( itRedo = redos.begin(); itRedo != redos.end(); ++itRedo ) {
+ KMFTransaction* trans = *itRedo;
+ if ( trans->uuid().toString() == item->text( 1 ) ) {
+ found = true;
+ }
+ }
+ if ( ! found ) {
+ del->append( item );
+ }
+ item = item->nextSibling();
+ }
+ del->clear();
+}
+
+KListViewItem* KMFTransactionLog::setupListItem( KMFTransaction* trans, KListView* list, KListViewItem* after ) {
+ // kdDebug() << "Search transaction: " << trans->uuid().toString() << endl;
+ QListViewItem* found = 0;
+
+ found = list->findItem ( trans->uuid().toString(), 1 );
+ if ( found ) {
+ return (KListViewItem*) found;
+ }
+ // kdDebug() << "No Item Found" << endl;
+
+
+ KListViewItem* item = new KListViewItem( list, after );
+ item->setText( 0, trans->name() );
+ item->setText( 1, trans->uuid().toString() );
+
+ KListViewItem* last = 0;
+/* QValueList<int>& objectIds = trans->objectIDs();
+ QValueList<int>::iterator it;
+
+ for ( it = objectIds.begin(); it != objectIds.end(); ++it ) {*/
+ QString obj_uuid = trans->objectUuid().toString();
+ KListViewItem* itemID = new KListViewItem( item, last, "", obj_uuid );
+ last = itemID;
+ NetfilterObject *obj = 0;
+ obj = NetfilterObject::findObject ( obj_uuid );
+ if ( obj ) {
+ itemID->setText( 0, i18n("Object: %1").arg( obj->name() ) );
+ // itemID->setText( 2, obj->name() );
+ // itemID->setText( 3, obj->getXMLSniplet() );
+ }
+// }
+ return item;
+}
+
+}
+
+#include "kmftransactionlog.moc"
+
diff --git a/kmyfirewall/kmfwidgets/kmftransactionlog.h b/kmyfirewall/kmfwidgets/kmftransactionlog.h
new file mode 100644
index 0000000..fe8b432
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmftransactionlog.h
@@ -0,0 +1,72 @@
+//
+// C++ Interface:
+//
+// Description:
+//
+//
+// Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2007
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef KMFTRANSACTIONLOG_H
+#define KMFTRANSACTIONLOG_H
+
+#include "kmyfirewalltransactionlog.h"
+
+class KPopupMenu;
+class KProcess;
+class KTempFile;
+class KListView;
+class KListViewItem;
+
+namespace KMF {
+class KMFTransaction;
+
+
+class KMFTransactionLog : public KMyFirewallTransactionLog
+{
+ Q_OBJECT
+
+ public: static KMFTransactionLog* instance();
+
+ public:
+
+ ~KMFTransactionLog();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+ void slotUpdateView();
+
+ protected:
+ /*$PROTECTED_FUNCTIONS$*/
+
+ protected slots:
+ /*$PROTECTED_SLOTS$*/
+ void slotUpdateStatistics();
+ void slotClearStacks();
+ void slotClearLog();
+ void slotLog( const QString& );
+ void slotZoneRBM( QListViewItem*, const QPoint&, int );
+ void slotShowDiff();
+ void slotKompareExited( KProcess* );
+ private:
+ KMFTransactionLog ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ KListViewItem* setupListItem( KMFTransaction*, KListView*, KListViewItem*);
+
+ // DATA
+ private:
+ KPopupMenu *m_contextMenu;
+ KMFTransaction* m_currentTransaction;
+ KTempFile *m_undoXMLFile;
+ KTempFile *m_redoXMLFile;
+
+ static KMFTransactionLog* s_instance;
+
+
+};
+}
+#endif
+
diff --git a/kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui b/kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui
new file mode 100644
index 0000000..58d4a79
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewalldocumentinfo.ui
@@ -0,0 +1,184 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMyFirewallDocumentInfo</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KMyFirewallDocumentInfo</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>681</width>
+ <height>491</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Document Info</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lbl_description</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Ruleset&amp;nbsp;Description:&lt;/b&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lbl_name</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Ruleset&amp;nbsp;Name:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>txt_name</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="1" column="1">
+ <property name="name">
+ <cstring>txt_description</cstring>
+ </property>
+ <property name="wordWrap">
+ <enum>WidgetWidth</enum>
+ </property>
+ <property name="readOnly">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_help</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <string>F1</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>300</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_saveAsTemplate</cstring>
+ </property>
+ <property name="text">
+ <string>Save as &amp;Template</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Save</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallDocumentInfo</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallDocumentInfo</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui
new file mode 100644
index 0000000..a3ccecc
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallgenericinterfaceeditprotocolwidget.ui
@@ -0,0 +1,351 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallGenericInterfaceEditProtocolWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallGenericInterfaceEditProtocolWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>732</width>
+ <height>436</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KMyFirewallGenericInterfaceEditProtocolWidget</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;qt&gt;Here you can define custom protocols for the &lt;b&gt;Generic Interface&lt;/b&gt;.&lt;br&gt;
+This required if you like to use a protocol not directely suppotred by KMyFirewall.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>splitter4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_cb_showAll</cstring>
+ </property>
+ <property name="text">
+ <string>Show All</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>If checked the list view also contains all protocols that are available by default, not only the ones you defined</string>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Protocol</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Properties</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_lv_protocols</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_b_new_protocol</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Protocol</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_b_del_protocol</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Protocol</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_gb_edit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Edit Protocol</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout33</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListBox" row="1" column="1">
+ <property name="name">
+ <cstring>m_lb_udpPorts</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>TCP Ports</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Protocol Description</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>UDP Ports</string>
+ </property>
+ </widget>
+ <widget class="KListBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_lb_tcpPorts</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>80</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_te_desc</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>150</height>
+ </size>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="2" column="0">
+ <property name="name">
+ <cstring>m_bg_protocol</cstring>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>m_rb_tcp</cstring>
+ </property>
+ <property name="text">
+ <string>TCP</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>m_rb_udp</cstring>
+ </property>
+ <property name="text">
+ <string>UDP</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout27</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>m_le_protocolName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout37</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_b_add_port</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add Port</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_b_del_port</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;elete Port</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QSpinBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_sb_port_num</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistbox.h</includehint>
+ <includehint>klistbox.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui
new file mode 100644
index 0000000..36603ce
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallhostwidget.ui
@@ -0,0 +1,437 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallHostWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallHostWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>416</width>
+ <height>246</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KMyFirewallHostWidget</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout19_3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_host_0</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_5</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_host_1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_4_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_host_2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_3_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_host_3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel3_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>IP Address:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_host_sshPort</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>22</number>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_cmd_testSSH</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Test SSH Connection</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel3_3_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>SSH Port:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="2" column="4">
+ <item>
+ <property name="text">
+ <string>Linux</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_cb_os</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="3" column="4">
+ <item>
+ <property name="text">
+ <string>IPTables</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_cb_backend</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel3_3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Operating System:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel3_3_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Backend:</string>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="4" column="4" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>m_host_desc</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Notes:</string>
+ </property>
+ </widget>
+ <spacer row="5" column="1">
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>71</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="7" column="1">
+ <property name="name">
+ <cstring>m_lbl_configStatus</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Config Invalid!</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="7" column="4">
+ <property name="name">
+ <cstring>m_cmd_autoConf</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Try Auto Configuration</string>
+ </property>
+ </widget>
+ <spacer row="7" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>241</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KLed" row="7" column="0">
+ <property name="name">
+ <cstring>m_led_configStatus</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="state">
+ <enum>Off</enum>
+ </property>
+ <property name="shape">
+ <enum>Circular</enum>
+ </property>
+ <property name="look">
+ <enum>Flat</enum>
+ </property>
+ <property name="darkFactor">
+ <number>300</number>
+ </property>
+ </widget>
+ <widget class="Line" row="6" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kled.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui
new file mode 100644
index 0000000..094a5f9
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallinterfacewidget.ui
@@ -0,0 +1,152 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallInterfaceWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallInterfaceWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>327</width>
+ <height>192</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KMyFirewallInterfaceWidget</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>l_int</cstring>
+ </property>
+ <property name="text">
+ <string>Please add your available network Interfaces here:</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ <property name="wordwrap" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>41</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListBox" row="0" column="2" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>m_lb_int</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can see the currently entered network interfaces</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_b_del_int</cstring>
+ </property>
+ <property name="text">
+ <string>Remove Interface</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_b_add_int</cstring>
+ </property>
+ <property name="text">
+ <string>Add Interface</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>eth</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>ippp</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>ppp</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>ppoe</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>lo</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_cb_int_name</cstring>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>m_sb_int_num</cstring>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui b/kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui
new file mode 100644
index 0000000..ff040cf
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewalliptdocoptions.ui
@@ -0,0 +1,402 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMyFirewallIPTDocOptions</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KMyFirewallIPTDocOptions</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>673</width>
+ <height>649</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Document Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel7</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <property name="text">
+ <string>Here you can configure several general options that your firewall has.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>GroupBox58</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>IPTables</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Enable the iptables you like to use in your firewall.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Use tables:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>c_use_filter</cstring>
+ </property>
+ <property name="text">
+ <string>Filter</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>c_use_nat</cstring>
+ </property>
+ <property name="text">
+ <string>Nat</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>c_use_mangle</cstring>
+ </property>
+ <property name="text">
+ <string>Mangle</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>Layout65</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_cancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer45</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>51</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_help</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Help</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer46</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_ok</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>GroupBox59</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Misc Kernel Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>c_use_modules</cstring>
+ </property>
+ <property name="text">
+ <string>Load modules</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Enable this if you compiled iptables as modules&lt;/b&gt;. For details about the required modules, take a look at the iptables man page.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>c_use_ipfwd</cstring>
+ </property>
+ <property name="text">
+ <string>Use IP forward</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Enable this if your host should act as a router&lt;/b&gt;.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>TextLabel6_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Enable if you like to use Syn Cookies.&lt;/b&gt; (needs support compiled in the kernel)</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>c_use_syn_cookies</cstring>
+ </property>
+ <property name="text">
+ <string>Enable Syn cookies</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Enable&lt;/b&gt; if you like to use &lt;b&gt;Reverse Parse Filtering&lt;/b&gt;.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>Layout11</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>c_use_rp_filter</cstring>
+ </property>
+ <property name="text">
+ <string>Use reverse path filter</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>c_use_martians</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Log dropped packets</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>b_cancel</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallIPTDocOptions</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>b_ok</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallIPTDocOptions</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>b_help</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallIPTDocOptions</receiver>
+ <slot>slotHelp()</slot>
+ </connection>
+ <connection>
+ <sender>c_use_rp_filter</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>c_use_martians</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>b_ok</tabstop>
+ <tabstop>c_use_filter</tabstop>
+ <tabstop>c_use_nat</tabstop>
+ <tabstop>c_use_mangle</tabstop>
+ <tabstop>c_use_modules</tabstop>
+ <tabstop>c_use_ipfwd</tabstop>
+ <tabstop>c_use_syn_cookies</tabstop>
+ <tabstop>c_use_rp_filter</tabstop>
+ <tabstop>c_use_martians</tabstop>
+ <tabstop>b_cancel</tabstop>
+ <tabstop>b_help</tabstop>
+</tabstops>
+<slots>
+ <slot>slotHelp()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui
new file mode 100644
index 0000000..5e1260f
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallipv4adddresswidget.ui
@@ -0,0 +1,161 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallIPv4AdddressWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallIPv4AdddressWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>371</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form2</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_4</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>IP Address:</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui
new file mode 100644
index 0000000..0c1ff9b
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallmultiportwidget.ui
@@ -0,0 +1,229 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KMyFirewallMultiPortWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallMultiPortWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>625</width>
+ <height>190</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>MultiPortWidget</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QListBox" row="0" column="3" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>lb_ports</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>b_remove</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>b_add</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="2">
+ <property name="name">
+ <cstring>sb_port</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>65335</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="1" rowspan="2" colspan="2">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>rb_equ</cstring>
+ </property>
+ <property name="text">
+ <string>Equal ports</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>rb_dest</cstring>
+ </property>
+ <property name="text">
+ <string>Destination ports</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>rb_src</cstring>
+ </property>
+ <property name="text">
+ <string>Source ports</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="1" column="0" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;You may filter for up to 15 ports within one rule if you are using the multiport extention.&lt;br&gt;
+Use this to avoid too large (slow) rulesets.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>c_use_multiport</cstring>
+ </property>
+ <property name="text">
+ <string>Use multiport extention</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>c_use_multiport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ButtonGroup1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_use_multiport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lb_ports</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_use_multiport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_use_multiport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>sb_port</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_use_multiport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>b_add</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_use_multiport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>b_remove</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<signals>
+ <signal>sigMultiPortChanged(bool)</signal>
+</signals>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>qwidget.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui
new file mode 100644
index 0000000..cd639d9
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallmynetworkwidget.ui
@@ -0,0 +1,189 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallMyNetworkWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallMyNetworkWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>686</width>
+ <height>571</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Protocols</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QSplitter" row="0" column="0">
+ <property name="name">
+ <cstring>splitter1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="childrenCollapsible">
+ <bool>false</bool>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Network/Target</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Address/Mask</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>System</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Backend</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_lv_zones</cstring>
+ </property>
+ <property name="resizePolicy">
+ <enum>AutoOneFit</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QWidgetStack">
+ <property name="name">
+ <cstring>m_wsEdit</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>ws_pageHostProperties</cstring>
+ </property>
+ <attribute name="id">
+ <number>0</number>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>5</number>
+ </property>
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <widget class="KTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>kt_hostProperties</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentPage">
+ <number>-1</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>ws_pageZoneProperties</cstring>
+ </property>
+ <attribute name="id">
+ <number>1</number>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>5</number>
+ </property>
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <widget class="KTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>kt_zoneProperties</cstring>
+ </property>
+ <property name="currentPage">
+ <number>-1</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<slots>
+ <slot>m_lv_zones_itemRenamed( QListViewItem *, int, const QString &amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>ktabwidget.h</includehint>
+ <includehint>ktabwidget.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui b/kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui
new file mode 100644
index 0000000..bf025a8
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallnethostproperties.ui
@@ -0,0 +1,234 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallNetHostProperties</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallNetHostProperties</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>642</width>
+ <height>209</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Host Documentation:</string>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>m_host_desc</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>m_frameAddress</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_gb_host_protocol_option</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Host Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>m_cb_host_log</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Log packets from/for this host</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout9_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_cb_host_limit</cstring>
+ </property>
+ <property name="text">
+ <string>Limit matches</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>m_sb_host_rate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl_slash</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>/</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>second</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>minute</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>hour</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_cb_limit_host_interval</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="editable">
+ <bool>false</bool>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_cb_host_limit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_sb_host_rate</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cb_host_limit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_cb_limit_host_interval</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cb_host_limit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_lbl_slash</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui
new file mode 100644
index 0000000..0926fbd
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallnetworkwidget.ui
@@ -0,0 +1,330 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallNetworkWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallNetworkWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>633</width>
+ <height>128</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KMyFirewallNetworkWidget</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout27</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Network:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Mask Length:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignBottom</set>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_from_4</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>255</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>m_sb_mask</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>32</number>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>19</width>
+ <height>2</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Mask:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lbl_mask</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>255.255.255.0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>45</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QTextEdit" row="1" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>m_txt_desc</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Zone Documentation:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Zone Properties:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui b/kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui
new file mode 100644
index 0000000..3da2b6c
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallnewdocument.ui
@@ -0,0 +1,409 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallNewDocument</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallNewDocument</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>580</width>
+ <height>330</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>580</width>
+ <height>330</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>580</width>
+ <height>330</height>
+ </size>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="caption">
+ <string>New Document - KMyFirewall</string>
+ </property>
+ <property name="icon">
+ <pixmap>image0</pixmap>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QFrame" row="0" column="0">
+ <property name="name">
+ <cstring>frame3</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>l_pic</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout20</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>splitter3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ </font>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>&lt;h3&gt;New/Open Document&lt;/h3&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_close</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>x</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>Please choose how you would like to start your new firewall configuration.
+</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_empty</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;New Empty Configuration</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;b&gt;Empty Ruleset&lt;/b&gt; lets you start with an completely empty ruleset.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_load_saved</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Load &amp;Saved Configuration...</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Open a save KMyFirewall Ruleset</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_template</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Load Configuration &amp;Template...</string>
+ </property>
+ <property name="accel">
+ <string>Alt+T</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;b&gt;Loading a Template&lt;/b&gt; will load a Template configuration that may be adopted to the requirements.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_help</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_cancel</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="685">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000027449444154388d6d93bf4b5b5114c73fef47f2a2491c02050d0551323445ec5014151497d2c176f0f7e41fd0a1438538bb75b385824eede4a654688b8a8b62a0b4521d148594686930d568f0477c7d2f2fcdbbb7439e62ad072e9c7beef77c0fe77bee51b8c504c40ea1cb80a8099603db0256ef817d13ab5cbf5cf8fd71b7b7f795d6d6f628108fab6a2482741c9cfd7dce37368ef717175fe6b6b6de3c85f27f045978ec1f1b9bad191808a9800a28aa8a140209b8807372c2b7d1d14fdb3b3b83cfa18887a300f11ccceacdcda17226839bc92032190887110707b85e0cd3241a8b3d09c3e465610d6004a64db8af99269aeb22b359945008bdbd1d717646697d1d676f0f3b9de664610169590fa2b0f2197e6a0262dfe115a088dd5d443a8d383cc4e8e8c0dfda8a1a8950cee7399d9ae26c799962a18004c584aa2578af66a1cbf15a118093cba1363541305811291ca6babf1f6118b8c522977dd74027e0532d88ea97627824d53d3d0407072b01d745f1f9a84f26919eea1ae0875ac0a72a60f9019ff750ddd242cdf0f0d568f3e3e3159e7c1ecdc3f92b056d40d155d8aef2923540334d144da3984c224e4fb16666b8686c24383444b8b5156b6d0d1db0210508bd08ab061c1b704701820d0d0014120910022595c29a9c243c3282717e0e547ed126cc032500bec08b5f208f40e60301595a5a92662221f3208f41dad3d3d29e9890471ee603641ba0feaacf39d0bfc2c70b90bf415a9a269dee6e6981b40c43da7575151fe426147ba10fd0ff598ad71098877747e0ba20c5b5e3822c815c866c5f25d9b8759900c6a0eb213cbb0b9d5550fb07ec1ca456607e0edefe802cb72dd30d53bc89f93c5f7882956f02ff02854c0fcf287a72340000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="189236">789cecbd47931cb9b2b6b9bfbfe2d8c5eeda587ca9c5621625b25496cad25563b300104068953a73fefc20f07a80d54d9eee668bc34bb20c46b21e028140b83b1c0e1151ffe77ffef5727bf5affff93fffb558f26524ff25433effd7fff8ab2cdbfd3fffeffffdfffdd77f77069d7f755bbd7fb587e3cebf3afffd7ffdd77f6fefff25ffc5e4b0d5e9b66a5e4e2c8f5aad8eaa79b774ac6df96be24eb75b73501177713d1f3a6edbeba5e5b1b95ed6ecbd38b6f57b278e51ff53c3b85e4c89dbc8f79e1bc6fdf663c7f679762be26eb757f3e68cb887fa9273c778fea6fe3e9e27b9211e75873567b165deb45f8e1ca3fd9ff2d1bea46192e7b1637b7fcf776cef2f9afc76c7b7f9dab1ad8f2962d20f678e6d7dfaceb16dbf7743dc47fd6cedd8e66fcf890790cfaae578609f3f271ea2fec594788cfc8d472cc07b9417e6f985bddf89633c0f730cf98886f13cdeab63e8e3c1b16d9f1711b7497e99633ccf237107fae1678ea19fa061dc4f0c88c93e79e9d8de7fd9736cefbf7e26eea1fdcb4be23e9e5fde120fd01e5938b6d78b8478d8eddbfe72ead8dad7aeb9ff08f7cf0f1de3faa63e8efb89a5637bfd2a743cb6f52d8825f2e5d4f1a866857ce9ecf7d4b17dbed9b261b2afc8319eef86b84dd7870d933e73e20ed9f7ad633ccf3d7197ecfbae61dc4f4a62ea9fcc776cefbfe28ead3c9743e23ef58f27e2019e7f7be3d8ca67d9251ea27ece1dc3de668e6dfdfe23f108f25f0e1c5b796e5f88c7e43f0e1ddbeb852016289f4e1d73eb5f18b1ecdafe239be7f5d1de0cfe4db6db5d6bdf7edfb1953fd3c4ddae95a7b8b0ecbbfec71da3ffa50d435eace7d8cac35b13933fddae1c5bf92c8f883b545f733df9a355ec18f63724ee92fe4e1d5bf9c890b847f673e518fadf1093ff6213c7b63d32716cf5b33d211e90fd5e120f21ffd59b632b7fddd43f42fdfcdeb16d1ffbc4b67e56108f697c908eadbeb6b7c49cec69e518feb3d107f54771e9d85e2f94636b0f614eec43ff79233f85f2e5ab63fb3cf99e58e37aaf036e77bad61e02d25fbb0756f43ced410ffde18e78d8b3fa5090976afc4572e118fa970d93fe94632bffb0706cebf7a78e315e2d8869fc5a9e38867d30628a2fbc37c7b6be95766ce5c932e21ef99b23c756fe79d3de3ef99bc0b1bdbf6eea23ffcdb863f4e73bc756ffeb7362f227cb267f44f670e1d8ea43cc88c7a85fef1ddbf685c2b1ad9f37f2e2783eefd2b1d5b7d72216689fd7756caf0f1b7d903fd1678eedf572ec18f159d31e05fb5831c7f02f43628deb79db31c6ff0370bb85fae427b6f69347c46d942f97c45de47bd70dc3fe9207e23eeebf6b37dcb3faf32be261cfea2f5f118f7b886fe8f9da1ce5b790bf76e35fd530d9d7dcb12d1f3c3946bc71e718f57bc414aff9470d53bc72e018f6714adcc4175dc788a746c414af46178eedfd3743c7569f4a10f7693c3c730cff941337f1deb363abbf2424a6f18e3f3bb6ed89c78e31de35f9e42f9309f118f5ad1f1d5bfd474b628a5724770cffb72216789ee4d5b1b58fb4797ef2972b9f98fc9d908e6df9e5c631fc5bf3fc9aec0bf6a38d3d62bc7d736cdbab9afc36ae9713c7b0ff3e7107e5454cdc43be1f340c7bcb7ac47ddcdf27fb33fe16e3af746ced432e8847b05f4ef669ecd9e687642fc69e31ff0a1c5bfdad5f88650ff1a926563df847d28f09c7303ed8f1ca0cff64efdb81638cff878e31fee5c414dfe51bc7e87f5b628acff627c47de86bd927a6f9c626756cdbb71c13933d7a67c434fe46478ead3d2d478eadfde48298fc6bf44acca1eff99098ec4df58825dae74bc756bfbb6bc7567f9b3db14ff1fb8163d8ef9258e3fa79e2d85e1fb4c0c6deacbdec0b628aef58df31e237aacfd89bbd5ef186613ff915719fc66bed18faa1f635e3b978716cf5cdba8e311e93be8dbd61be32706c9f77bf778c7885f4d7d8a32c8905ecd79b38c6f8dbb44fe3fa5c813bed9e7d7e5d11f7c009c9afc3fb789e9de57663afeb1e31c597db4b629a5f6507c4643fdb98b8195f2f1dc31fb51d5b7bd85e1173d8e3362716148f6f897d8ab74ac7d05f414cfe6a49f7370db6f95c3bb6f6c04f89dba4af8898f41f86c414efaba786a14f79e9d8ca637748dc23ff37261e90fe4f1d23fe9a120fa12fe1138f604f22708cf8a8a99fa37cba718cf926c9dfd9439f58c2bef8deb1d5c7e29858a13e35746ceb93b0b776a7d583ff1f39c67843f230f664cbf3257107fece27fd18fbb2f2cbe9f93a7de4abb563ab9facc91ff4ad3e3637c4a33ed693489e1d01f6d1be4e331fe70362097d472362b297f48458c19ec2c8b1d597e81037f115fc5ba7b10fb925ee50ff6bf2bb905f7c46dc43797eecd8ea73f3e018fef28a7848e351ee18f1f40df108fada35f7a7f129b8748cf9d4b963ab6f352516b8dedf11933da8e6fe3eb5ff135b7dc6af8eadfed98a58417f3226d6a89f7f62f82bf8bb8e79605b3e5939b6fa5924c41d940f67c45db2b7ad63f8a737e23eeca3aa88073df8fb8c7844f6d6f018fe2cde137394f76dbce3771b7d899098e2ddb8e718fe7ae3d8ca6fb7271e927c8f8947a48f1131a7fecb1c5b79eb01b184bcf3d031c6c7e6fea49f684bac20aff49158433ec533d8f44ff45fe518f30f8fb883f232720cf9913c1af9eb07e21ef5d79163ab3f963ab6f22e24f100fd337b718cf91ec9a73344791e108fa09ff496780cfd464dfd1cf5c999635b5fc5897d62d85fd728c83eff9aeaef0efbf6f938c6879ee91f569ec19c58507f38710c7dae887dc83b5b38867f98116bc88b53be91b7958fe81193fd8b317117f9fa9998e41b5d12f7a11f71ee18f1c87dc3904f7c4d3c84fc78877884f27cd730caab47e231e495d3f39afe60f5113f350c79e74d7b04ea0f4ac7984f37f529f07ce4d8ca77d1c843f7ad3c4bd85bafdbea637eff4adc417e1239c67cbe4bdcef5bf9c4d077bf991f2c113ff48dbc6d79ffc931ca33c7d0075d6ff461e5233362ea0f814fdc437eee110f201f6fd430e4b33d261e23bfec378c7c7e40cc219ffc8858401f61c7b1956f71472ca9bf5c39b6f22ad6c41a2c5b8e215f7a7e235f6bff61e2d8da6749cf63fa07e2c333e22eca07b163ac6f4d887b285f96c47de827f51c63bc1f13eb01d62fe14ffabdde00f30bb46fd0c87f9d1277c85f33629a2fe9a963abbf7d42dc837fab02e221e4992e1c5b796615f118f22f3bc414dffa2d6201796677c424ff7244ece3fa6ceed8caa3c0f30d8c7cc153c798ff95c46dc8aba0fb35f69e1f13f790afee1c637e7deed83e7f48f232f2b6f25b1c110fa0af4a3a863d6f8987b83eed3ab6f2d6d7c423dc6fdeb497237fd7b4970fb03e52100bd417e4c47280f1b329af07582fc4f831e88d07d80f803d0f3b5df2471b62ea6fe18498e2bdfc9a98e43fcf8815f455cd1d239e85be8646de96d983637b7fd6e47720afa8efd8ca6bd922ee429f72e018e3f398b88febf5c4b1bd3e65c403c86fbe241e92ff3a778cf948423c823ee5a661c873a189c7a83fd9130be46f468e315fbb2396a82f29887db427520d439fcb43c7f03788afccec155c45c46df4e7f0dc31d627ce1cc39ea7c41db427bc24eea2ff2f85635b7ef34cdc877d6c489ebd01f2d7f43cbde1c0ca7b754fccc14bc44b23e3ff6c7bfc07c7d8ff41ff1819fda23f1e1377a18f458f78000eb863cc4742c7567ee1887808f9af72e211f4a3268e115fbe128fc91e7c628efaf30eb1843e9213c756fef31b62d2dfb229af70ffe2c631fc59db31c667e87b64f4097fdf25267d66197107fac973c756fed1a363ac17ed887ba8af62c403e863231d5b79166fc4435cbf4b8847d07774e3d896df917e8cbf407f5e128b8195d7e68258e2fabc2256032b9f0dfc85f11ee012f63936fe18e355424cfa5f6e897bd4ff2531f56ffe424cf1e3aea96f047ded7bc463e853bd3ac6fdc7c41cfa5a4f1d63bcef13fbe0dddcb1d54fd1dc5fc31efc9163ec9751fb9bfe570862d2a7ba20ee425f7ee818ebbb4be21eee1755c47dd4173e3bc6f8754b3c84be962f8eb1fe9613937e977be231ec233d708cf5be805882a343c78877493e46bf98cf6bc78817e8f9fa9d21f61376c4a321d67331def0ee98e47b4fcca1cff4a1611abf0e8905e977edd8ca3f7e2156e005e4c94dff823e4f1ddbfbab1631f59fa24b4cfad0e7c43dd2df89632bbfd58163acf753fb8d3ee04f3f31fa5b877880fbf9d78eb1ffed118f20ef7d9b788cf2d5d8b12d3f97c41cf5e703c788c74ac7e81f97c402cf5336f2f1513e4b1d239e6e9e5f0de1ffe6c41af549c7d0ef1afd8ff75b28bfbf25a6febe7824ee0ead7ef60f8e317ed1f3f787432bff1de251d1e85bc0be44a3cf4d46dc853eaa1631e98b3f10f749bf03c7567e3bdf31e67f3be201f4bfca1cc3ff34f50da97ecfb1bd7f30766cebcbdac463c8d7bb23267df10b6281fa45eed8ca37db3bb6f24b9be757c8d74d7b15e4bf518e21ff39b11e5a7995983f98d90dea2b560da37cf446dc46f9fdc4b1d5d77aed18ebe187c4d4bfcb7be21ee9f3847880eb179fd85e5f0ae2d110ebe99963cc6f305f9046dfb6fce28eb803fd6cde88a9ffad12c7188f5e89fb28bf78718cf1f2807800fd2dee1d5bfdec0f8949dfeb63e211aecfcf1d23bed78ead3e170531f5bfb2691fe95b758925da5b3d3ab6fa49bc8621df4544eca37d8b9858a3bc281b863e7dc85336fa1413e20ef4b15939b6fa5a28e22ed9c390b88ff2e9c031e663c231d6bfa8bd46bf9097768cf97f933fc4fd22e618fbbd3ef16868e5513e138f8756de8b8e63f477d27f5f80c59a58e2fab0c9f78758df84bff5cdf880f5258cd77e13ff6e1b267b488e8829bedd6e1c5bfdc57de231f421ef1cc3ff56c4d47fd71362d2f77c4dec43bf399ed737fd11ebd333c7f077747fa34fccb73ce20ef4959e3ab6fa0ab7c4e45f37c78eedf36eae887ba87fb1231ea07cda778cf585ca31e2cf7be221f4b364c423d4bfa81c63beb724e6d057de3c9f40febcb99f44ff4fcf1d637ef648acc00bf8377fd01adafeb5bc216e43ffdb367187f2af1de37c2dc63bd5f88fbd20e634febe3ac67ea74fdcf4c74b621ff9fb0531f9df70e818fac378a81a7fca2a62d20f7b22ee417ef13331f53fbe251e425efea163f48f73e211e41bbf1153ff29dbc402f255678ee1ef481ea6bf60bd7fe518fd67e018fb93a7c41abc0c1ce3bc00f4ad8c3e20ef56c323accf917c1bfdec22e2ee08eba54df901788bfeaf8d7d235ecc88bbb0cff4d231ce071d13933cd33131f9abc5b563cc770f89c9fee75be211ca7b53c7d8cf6bee37863c8b3931d977b02726fbd5078eadbc364d7d8dbc8f8815ea2bef1c237ed78e31bed1fd8cfd23be7c726cf30bed18f17a53be33c2fcb424ee423f7392efa087fcfcdeb1d5d786e43118421f79db31f64b3de2d1c8ca6fc71dc3df5e11f311c6ffa63d7284f5fb01b11ec11fd8eb55abd15770464cfe273e25a6f120e93ab6f28be7c464eff37362b2dff9b3638cbf1e31d96fb5758cf59a17b0b167cc4f5a8e114f6d88bb90d74212f7503e7b6c18f25d1c12f7513ef21dc3de2be211e58f1dc3bf6bc7988fee89c790afbc770cfbee1073d4bfd78eedf5494c2ca02fdeb4cf1f61fdac699f1a59fbdf33f0b033b2f6b71e1077c7f6f9b654ff7030b2f25cb78947232baf9520e6638c3f767c54edc6bef3377063bfaba963ccdf5f88c99ffb9b8621dff91d710fcfbbe81393bcbd2d31f9177fef18e7054e894724bfe6fa31caeb9163c8ffc831fc779798439ebaef18fee39658a03c3f2196b89f6aead3e81f3ee50f5bd0c74e3bc67c6045dc1e597b0fe97ec32ecaafce88fbd0c7bee518f1669b7888fa3605b118637fcfce5754a7e90f21ecbb336891bdbe11b721ff3422ee923e2ac7181f036292ff2e26267f922c1ce37cf3a163ac970c88c99f646bc7c87f21169067d8b0447ede23f691cffb8ead7e929d63ecafef8935e4b9a5eb8dfce18f2e1c231ebd768ceba9bd463f884f268eb15e724bdc41f968e6d8f6af6a49dcc3f5d5b563ec0f660d435fbb31711fedcd6f88a93fce778ee1dfb60da3ff0643e221ea5b0862eabf7e42cc919f29c7982fb61c5bfd24642f4389fe1ea1bf761bfbf17d621a6f5627c4640fe28198fcddfede31e2cd3362d277794c2ca1cf558798fc17578eadbee4ab632bef15fa77d7e80ffee889b88dfc441377203fe61177912f98632bff7241dc47f960d730e4bd3e728cf70f1a267dedaf1a867c25c9a7e9affeb963e8e7ae61e86739271ea1fe153dff708cf2cb55c3e4bf97c47c8cfdca925890fe4e1de3fcee9858e27e15b57fd422fd93be469c63bd02e361cff863bc0f31271e429f69c363e8cb17c402fd63be21267fc9e68e6df9f91931e93b888835ae973bc7563f199eaf67f48b78f4a161c8a3f0883b281f1f117721bf6dd4309e7f1310f770bfed27b6d7574f8eb13e7d4d3c407d55bb61d4a7d78eb19ee21393fed7ab86a10fd521a6fe2a160de379a2a9639c1f58128f51ffe6de31d6ab1931f5f7a8b99f44f9f2c631d6bfcf89d518fb11747f630f982f52fb476de4f3b1632b8ff880b833c6fa7642dc1fe37ce1a3635b7e97120fc7d027fc69dff45f9c07591077208f7d9798fae7fcc531cecf5c11f720af521353ff8dce8987c89fdf3ac67876e2d8ea238e89491ffb3762ea6ffebd632bdf62e618f3bf9c98a3be4a10537fac7c629feed7728cf595e6f914ea4bce8835f455dc3bc67806ff69a225c87f991077905f0d88bb63acd7cd897bd06fbe261e20dfd78e11bfbc128fa0bf34241e8fad7c2b7ade9184bf504d7b14873f83bc07a6ff623c85fd0c8cff44fe9a98fa130b8847d43f0f1c633fef9498f491c7c464ef3c728cf9cf8b632befe09858409ed19c98fac7624bac903f178eb15ef6e0d8ca7b0e790c4c7fc1facbca31c62fbadee803fbad297197e44ff5197d60fd4438467f1911f7a97f15c443e4473bc7b0d725f108fa081b267d2d9e8839cab30eb10ff66f1b26fde58ead7c32c477c3a63f6d12629267f54c2cc99e778e218f0931d97fb521d6c8df9c3b86ff477b87469ef00f17c46de8237a718cf9e9037117e5d7078e71de6241dc877d8b37c7563ec59898fa83bc261ea17cbc756ccbc7ab8621efed9a780c792d3c628efbfb13c7d82f382616b87e31768cf56092a7e94f38afb9776cf3e733c7b0ef461e9a431fc4e316dac3a8be7107f9d9d231ce1f14c43d0e7b267d8f47dcca7383f174d4f4cfd531b10f7d2c3531f51f0ef98c8cfee08f66c4d41fc21e710ff29d9f10f7c91f5d120f20bfc58563acd74ae221f45d36f58f911fac8939e4b57a728cfdfda63e92bfbc2296b07f76eb18f6df27a6fe520c8935f2ab07c7185fa14f339a439e21e58fdbb8ff9c9ebfded0b6cf7be518eb85b78eb15e3225ee435f11271ea2fc1afe6cdc8cb765403c84bd46cfc464cf724f4cf11e4b8805d9cb1131c92368f27dc893cf1d63fe87f9a3f1cee045ee18e7bba83de6f9e14faf1c23be5f137770ff60e318f3f588b887eb8b9d63ace7a5c403dc2f7f748cf9fca163ac071e10937d8ba63ce7789f70e718e7b9487e632130df62c49a63be70dbb0c0fc1af1eab8fe00817dbe63e236ea4b113f72236f5bdf7c404cf21519b1823ccaad632b8f10f18419fd90efcf1d63fc3a728cfe971277208fe0de31ce6b34e5bb64ef8563d8e79ab88febc303c758af568e11dfcd8887d08f5e3ac67af605f108f28bee88c7a49f9e639cdf0a8805caaf160d431f1ec96fec43befeb061e4cfe97e461f98ff1c13b78595b77a768cf3e97d622eb0de80e717c6bf5bfdea7b621ff2ce4b620dfb0f29dfc817f69f1277210f1510933d0721f100f229ae89479047b5728cfd8f88788ce7cd6e8839aecf53c7382fb7219628bf7c6c18f2582a621fe583e67e0af6cc305e1a6f29b03f48ed37f242fc77ea18f12ed5c73bb0ff72ea18eb019cb88bfb6f48bebc87fa572bc7905f4c3c12785f85e4630cc0ca2f85bdc946fe29f2a5f13fb8df8ab80779a677c47de867b9748cf7ab9e88c790c72e27e678def5a963ac97c5c402fa29a563c40b3b621fd7eb8c58215fbf106be847cd1a46fdbba163f44ff863d9d86b7546dc4179ffd9b12daf06c45dc8b7ba728cefa96c887bd0df7ee018e34be118f37b922fef937e5b8e71bea6700cffd3b47708fd6db78e31bed1f319fd229e581053ffe329b144f9f2c431d64f23621fe5638f5809cc3f48fea285f23ef467665fe88feb8898437f6b4edcf8fb36b1843d94a78eb1debd235628af3cc738ff74e318fde78198f4bd837ff24dff827d1c39b6fa58ef1cc3be03e20ef4b7ce88bb289f078eb17f3925ee51ff7b758cefb3ac89499ff3827880fac3b9639c77ea128fa00fd9f098e4dfd4c705be0f714d2c70bf403846fcfe46eca3bc7c768cfdb4e6f915d90fe9876bdc7fcb1c63fda6e318e305c95f7425fc4d49dc97f0577de2a1c47e3cf46b667ff017912016d07f7ae518e75b33621ffdd93f20d6d0470cfb518d7e2b2a6ffa2fec23778cfdff057117f25a9f10f7a8ff0f1da3ffef88fb640f33e201e49305c443d4b7281d633cda138f21ffadef18fd6149cc71bd5c3946fcd52716282f1f1d63bde89258d278da738cf589576285ebf92786fe36c4a4efd5a46189780be3ad19ad703f79e618e7e5485ea28df23be118fe95117770bfa443dc43f9f2c031fae385639c973b26ee93fd54c403d45f70c7d8bf22fb112389f5d49858903d623eac1b7f12623ea14d7fc77c66e018f176403c20ff5939c679e113e211ec23fec478dfaded18f19722e6d047d09417c8e7b7c412f2de4bc7589f5d13fbb87fba778cf95a9758e37a3d730c7f88fe6aa269945fbe350c792e39711bf7f39bf2a45f3d24eea03cbb26eea2feea82b88ffcbce518ebddd231d6cf499e467f565fab57e221f4b5c91d637c2d89c712fe13fa36d62a719edbf68ffaf312e8bf3a27a678466c1c63bd69e518feb44d4cfd6bcd8825e9bbe518f25e13fb90d7e6c431f67b0b6205fdfa6f8e313f8fc0461f582f796d18f28e5c3ee439bf226ee3fae494b883fbb1e67ad24f7c47dc25796ac7983ff589a93feea8bd463ff08fc231cefff68807a84f3d38c6fcffc931be4771433c84be364d7d23dc3fed38c6fb77cdf371dc7fbe778cf3aca45fd39fb11ef0422c915fe68e319e2d881598d3f5b22d719e6a48dc97d80fb6f1906e37f3cbd596d887fe36036245fd2924d6b087c59b63ec571e808dbe70dee4be61e84754c41df25f77c45df2cffd86a19f7ce418dfc71a1293bfdccc1ce33ccaad63ccdf97c47db427dc348cf6f85de221ea53378eb1bedbd437827e524e3cc6fd58cb31de57ea100be8479c39c6f7ea368e713e784dec23bfba748c78f68158e1fe624eac51bf668e114f1f828dbe713e92f26547e2bc2ab5577625f693ca867d9c47f48907b00f3f271efa18dfa03f331b207f9613f720cf543a463c72484cfe6f1538c67ee101f100face9e1de3fcc50df188fcdf9a788ce7cf3831477dde8563c487e7c4d43fe2c231e2bdbd63ac3774897d5ccf2e8915c937758cf5873e31e963b7738cf9980736fe1adf3f281ce3fb2754dee807e72d48be463f38dfb520ee215f3e38467fec100f7cd82f3dafd117e20dee18e7c5ef88473ef6d76dbca0bb8d7f9c4f88299e5da4c4e4df36978e111f36d70fa1ffc58c9843de598758a07c31728cf5a38298ecddef38c6fb6007c41a1ce58e715e09f665bc05ee270e1c433ed386f1fce90d711bd7abc431e663197117d7cf9f887b641fd78eb1ded423267f5a3e360cf9ab17e201ea4f14f188fa176b18ed8b278ef13ecb31f118facd9af670e4a74b6281fce2cc31fc21e9434ad4ef93bea4f2a1cf31d86ff9382f79e518ef83f7893b3ed6df30def78cfef0fee59658a2bff84bc7f0771eb1c6f34ac8abd7d8ff5e11b751df86ae37fd01fe31748cf7c7f78eadfcb782b88bfbe95be21ee45f35d7937e424e3c407e913b867feb128f209ff89e780c79cb17c758af98107392f79b639c4f6813937eb2a63e89fab7678e71feac918f22791f126be887bf3946bc42f235fa42bcd8738cf58d6be236da1357c45de4e7dc31e65b47c43ddc3f69110b1ff283fdf51bfd0b8fd8477f5e613ce99bfe067fde22a6fe150d1c23de8e88bbb0876ae218fe70e018fb254df93ef49527c403944f470de3fee12b31f9bfe4d831d6a7668e313eed8939ca2f6e1c43df578e6d799f130be873bd708cefb10e8925ee97dc12fbd0e78aea6bfa9b3c778cf767491e467f984f937c4d7fc47ad68d63ec7f9c12f7507e593a467cffea18fbbd8fc47dd843f1403c803dacae89476076e318f1de2131477d8b35b152e80fa43f5f2bcc9fd01fcce801795437c4a49f4c1393ff5b468e313e3d120be42f0e1ce3bcf11bb1a4fe22897de4a78a58917ea463cc2fd11f8df5407e3e956ffa4f36728cf8ba4bdc817ca26bc758af6dca77a97ce618eb29afc47d5cbfc81c233e6bee3f207d3e110fe97eb163cc9f0f1c63fc0a88470afef094788cfa83a6fd02f9d1b1639c6f792196a86f5535ace0bf3c621ffaad0a628dfc3dec7f507f50d33eef86b803fb88d1ff864d7f5efbc402f2ae6e89499ff339b10ffd852d6245f98c98fc63de778cfda68563acffe0f94cb404fbc822e236e4bb691353ff4a32c758cf3b23ee42fef363e21ef9dfbd63c42f21f100e5fd33c7e88f2b62ea5f51d731f4f5d030f455d2f3fa63c83f11c4d41f75492c919fee1c63be7744eca3be55f3bc0ae5a303c7e8aff78e719e1cfe6b68f48b78f092b80bfd2753e2a182bc1f8985c2793ae86764f4077926c41acf9fc37e46463f56fefb1bc7e89f0be22ec93723ee415ede3d31f5aff0827888fc64d4309e7f774e4cf2f71e88c7906799360cf9a81531877c02e918eb775d621a3f59dc30eea75bc43e5def3946ff081c637f85116be82f7c748cf51fd8d748b515cec752fb4d7f837fdc107715f66342c7b0d71e710ff75b34d7f715bebf7c443c52f81e15c9438d15ce4b1f107394cf9af252e1fcd0a0618ddf6740f2560af650c15ec68d7f9d2f88a9bf2443e211e4194b624ef29c3bc67acd9658405e8122a6fe50dd112be4a7c231fc5b46ac51df863986bca83e63ff580fea3886be2ae20ee42d4e88bbc8cf1aee91bcce1c637e1912f7a1cf70473c407dd995639c3f0f1de37dad67e231f2e3d431c69b0d315738afd0e40bdc7ff94aec233ff11da3ffce1bd6985f92fe9486bee7b007def4b734251e439ee12db1803e828e639c7f3a259690ef6ae618ef5bf8c4d47ff697c41ae5a3b6637c5f513a46fc047be7cdf8b47f768cfd8809711bf6103c3bc6f9c9057117e593269ffa8faa88fb907f76ea18e7c114f110d7c7b78ef13da0a9638cef241fa33f8cc74d798ef2d9ca31f6dfdf8805f411270d6bc457244fd33ff1be5f40acd03fcbc231e2ad3db1d68887d17fb96e41ff9b27e236cac7a163c483478e61ff3be21e5835dcd7587f85bf16a63f63fe5a1093ff0cef8825f43fef12fbd0d7bc454cfdbb82ff3057437ff337e20ef4550e1ca37f5d12f7a0bff0d431d6b31f88fb547e4a3c803e76ca31f4171093beb7470d43de5b7a3ee35fd19f23c758efa81c231e68eec7717db4708cf7759af60a5c1f5c3bc6fcea8c58c29ea275c3d0e736718cf8bb9107f983f59e5869cc977d628debe3a5638c57d45e632f583fdc3a46fc7048dcc6f304778ef13e4287b883fa54e818f32f6aafeee2fe45535f1ff96ae918ef5f8d8987b87fba758cf97b933fd6787f18f62d1bff12c03f9a6818fa2e18f110f25e751dc31f36e549bf7187788ceb839963ec57b71ce33ce20db1c0f3ad0e8925ca877bc7781fe094d8873c933bc790e7de31f441cf67c663e8f7da31d6e7a1fffa03e3583f693b863f3f748cf7137ce236e9e7cd31d6d39f893b789ea8748cf3eb240fa34fc8fbd131c6d7d231de573c22eea13de98a7880f27ae118eb15778ee19f2f88871ae3ef867884f696178e719e7a42cc51be5a139b64ef87f1c537fa863e5f88693cde868ef13ed2393187fd14978eb1de281b86fcd3a63e9ffcfba061d24f53bf827cab91638c779e639c579b106bd8cf06fec7d486e75f6f88dba82f79748cef97a58ee10f347187faf7d031d6cb493e467ff87e89ef18e7df6e887ba82f683bc6f8bb710c7d90fc8cfe70beb3728cf19c118fa09ff489788cf6a8d831ce77e5c482f4d9e44be4af868e711e3323f6610fc5d631ce7bbc126bd4579d38c67a26c60bd5e87ff14c4cfa2b7c624de371d731e61bb067531acfb3ee1377507eae1ce3fccfda31fac72b7117f2dbc4c43df2dfc78ea10f4ddcc7f541cf31c6c363c7f09f9c7880fb9797c42394d763c7287fed18ebef5be231e4a9e9f94dffc37a29770cf92f8925954f88493fcb8c58a1fee4c931dee73e778cf9b424d66085ebcd6c00fa598f8835f93bf8775dff42062bcf9098e49bf68829fe89268ea1bf5be23ee4a50bc7d84fa1fb1b79a23f948e315f3e730cfff44a4ce39b6e3b86bd0f89c7b83eb9740c7fb8758cf3894dfb38e967e218fb5f8258a0fe843bc6faff29b144fde5d031d65362629ffaeb9b639c1fb82226fda9d231f4131193be66cb8ff491903eece123bd4f1ff6f091dea70f7bf848efd3873d7ca4f7e9c31e3ed2fbf4610f1fe97dfab0878ff43e7dd8c3477a9f3eece123bd4fbf650f1ef3b827ec4fd2f3cddfc2244579c2d3e67f559d6ffe0dcc1f69fe2ff0185d199abcc88bed3591f963fec7fcbfb9da4bcc1f6ed8d465feaeafad4bb3af6d795d33b509ff26688dfd3935b50ad46aef9f9a9fb9f99b7999977b85577af9179eb64961fd349fe5872605e6a9439bbebabddf47faf7f660f5a68c0c1323a1cafcdbc85a7cb20c2bbb5aaff3ba14646a7399b7f096decac88fdb1a542d43d803d512d0ffa726ad6bcbfbda96db7624f6a7d4d4636cc1dc4bc2b66cab22d3aad8fcbfb5519baf4c89c8db785b6fe7edbf5867dd1e7ac2cff298b55e69ebb7d6fd23a6dfb00765f4554bb591b168acc1e5e37f9a72ccfccb6dbf54de8177e81d79c7dec4fcc4a8f7864d79f4595bc789f51d69ed2fbeb6e5b69ec85a434aed39a5bbfbd696eb5e9e5bdbe464ddf5939c79e7de8537f52e3fabaff1348949d1bfbd6bfda4d197ece5c748bf610fc2e8921be94aefcabbf66e20af4f3eda784e8c0581776bbdb1b4ba096cfeccbbf3eebd07efd17b325733abf3d0f64e617b6a5d4b60fbdb33d5a2bfbeedf6cadabf4456872fc6cfbc9adadfbc96d7f63a5ed7eb91b52a3b6224d657f4bd8137f446dec1e7b591a7497f4bd7f67eeaa7b40769c7dbbadf8f8d8364755fb3ff6fb5606380d04b18678249e69b72a1d5b4e9954c31cd0216b288c52c61a9d110b3f99c7c85bd9e652cb79e1716f6a7fc2fe926b175302f608577c84a56b1395bb0255bb1b5b55a655b1b788a6dd896edd89e1d7c7ebf77d103fbf2f805cf616d4cfd84f6a0eb78affe971db22376cc26e4a3d1c31376e2bdb15376c6ced90593d63aa8ef1b691eb229bb6457ec9addb05b366377f67fa5fd63ed81ddb307f6c8b8bd8eff19f9dabba5b006dbabdf4c3b9fd8337b61afec8db5589b7558d7d6ff6c470fc67aaccf066cc846ccff427da14b751cfd993dd8c882ece1a7f40fa119ddd1af0fd9d874edfb77f61073c6b937e2824bee73c5b58de5226b0fb9c779c0431ef198273ce519cf79c14bdbf3ea31dd460abce273d6e10b1b9f5074f2b5c96a884620b6e64bbee26bbee15bbee37b7ec00ff911abed4f9b72075693313fe6137ec24fcdd8a2be505f133f4475ad5fc845f45bdf33f9d67afba7d26fc60faf753ccdcff8b9b1870b3ead476192cb9a5ff22b7ecd6ff82d9ff13b7667c7174402a7fc9e3ff047b6e54ffc99bff057fec65bbc6db51e581f61467cdee15ddee37d3e30fad2cdbcf66b12b5a68e0a241ff2111f9bdb33c185b09e2a1752f86c62f2d1e6b08e6d84125a04c662e517f49df292b745fd15aab07ed62f4984f92232f9b1f809edc18ea8757f09452a32918bc28d073d6f294a5189b958f04090ac6aef508fd3b3a55889b5d8886d1d81b042ecc45e1c884371248e6d39e9293e151371224ec59938af3d477d2f7151ebccce134231ad6317eb01223b6e7da9bf66762ca8733371c92a7125aec58db86d669c9f954f4c64732766750943af4ddce245e2ceb4e7de44a387e2413c8a27f1cc9ec44b338bb09e4fd74fc79fc42b8f4c8937d1126d1b2fbd5a0f9a8b8ee88a9ee88b81a7c4ad188a91189b21f45832f32491e462643a9690d2461eba96a9f465fd01452d03db3f427b3765738c3f96918c25e2dfd48edcf50c29e4461f6c235399c95c16ff697bf0d0cfccb82f4b59c9b9e933d23c1d67777221977225d77223b71c737266e3b6b59d5526ac2f7772cfcf6b59cd96f2401eca2379ccd25a5a884be4449ec8537926cfe5859c5acfb29697a22fa59d7724769e50d18a4168e7069faf0f2116d1b5eec58bbc92d752d9f9653dfee49f7b74c4bbf2c6d4ddcc50ed5a9abc95337967e6c71d792f1fe4a37c92cff245beca371a3f989d33a53290f51776eaaf76d45f1a18c8a1cdedc9911cfb9ecfeacfcfc9034ff9d2f7e50b8bebe3d9bed1a7b8f3433ff2633f11917d7a3327f6533ff373bf6043bf346d8dc88679fd9c7ee5cffd85bff457f6ff11a3733b9332d2e3b169c1a93f67a7dfc01e98edf5c63ff86b7fe36fe5c8b4eccadff97bffc03fe47b56aff531ffc83e23b76b4ea2b664ffd89ff82766c6677bb5f1c2b17fea9ff9e7fe85c99bd69a62d2bff4affc6bffc6bff567a6874e45ecdff9f7fe83ff68f4794033dac87a07c4aa9fad4fd8354e1317d6adf29ff8ab77c79fbd1ebcda17eda7b62b615aebdb5ecaedf3bd9a98e28c1ff8cffe8bffeabfb123bf255efcb6dff1bb7e8f64001fa4fcfafdf9a13f12f57ba266aaa2b88d254ccb94f0eb77217da55877b6545a052a54918a55c217c62349ff45a52af3cf55eea5e6fee66954e15f99f2a5aad45cac38530bfb34b57d2b7628576aa956aaee5d92ec81d939b5b17db5515bb5537b6ff20decc1aee398d61fa84375c4fae6e72ba9e44e1dab8989070e783d2feb59cd619d505bfd25ea449daa3371697d9db16319f8af2a51e7eac2cc276a6d3035554a5daa2b75ad6e78c78e116d75cb866aa6ee8c95d959a82959cf3ee6f59cd668fab3f1bc5921ad230975af1ed4a399c530bb8250dbd1e7f6204dfbd7c67a6a4b50626adb6b57a9d413bb923df5ac5ed4abbc556fe252b5e452b5c957534d22541dd5553d7f2a56aaaf066ae8a2d950d5ef0a8f8d8bec7a89186b663f5d27ebf3cd5a1b4b9fe84087c65e9feaf23af27afc40bee858273ad5193bacdbe5d672381fe95c17bad4157c24e646d6328d6761a99eeb85198dd36f600f217a083bd44bbd323ebe10e762a1d7fe83de7c5aaf746bc5b51ddba8dd1be9addee9bd9d7184b5d713521fe8437d24785da718e863ff861dfb8f7aa24ff4a93e3333c13b11eb73bed1177aeadd58395b49cf96fa525fe96b3efd621b131b8bc66aad6f7860ec4123ae859d7c660fb5df60eacdc835b66becccabcc08a8a45477fa96857ac6665eaaef4cd77f563d13d7a476f492368a11460af7fac18c79267ed28ffa493f5beb13b577e3957ed1af2c960376afdfeaf72aeb77a1eaf72d78bb3ee5af5f7dae8f75642512894b3d62911e075ec0d84dc0cdc8a3b11286d97d20f422309d08ebeb33da0d428cc6d240053a10ec1fda3ff9ddf1c2f4e62008c220127e100749900699d6b4ce0fbb4eac358434f20bc6833c2882d250642ddb3c695005f360c1bbc1d29ff9472251ad6025e37a6409d6c12608bcda272856045bff2ad8a9a9d1acb2fd3931d18a6217c1defb2c7eb27b4ba9bd8354a3e02038345e047b28b585069f3f0f5372a8b477859534371aa5fc2c380a8e834970625a52d908446275dd78937a54b77d511fab1b3f0c4e3da5f2e02c380f2eac3fb43116eb07cb60aa2af6145c0657c1757013dc06b3e02eb8f7c6ea3178081e65db9b044f36ceeaf1bd3e5261f01cbc04afc19b58042d1b81d5ebc126daf40e4d3bda41478d4c1b6de442eb78f6dfc00fba412fe807836f600f218d9f13bd0c86c1487655128c8d6f48cdb8ab6daf61b44f441ecdc65d3cf442a646e6e767f3043d783c396423751372390f85bf3541b4ef1f7b66980d8d71e989e921f5bd24bb0f387b0e83b05ea9a8472b1146fa348cc3447eaedf10b354af947998f29b30f35b616ea2f2032f0a8b2fcc47e61e0f2ec3d2f8800831bdf519f57370b661c76115cebd89dd67ab9f25a35892fc209bb06db80897fe93d886ab701d6e74ed29b4991599f1c43cf336dc85fbb0d4c7e14178a85be151c8c363f5104ec293f0343c0b4b33fef8b59db12c3c0f2fc2a93c0e2fc32b9d861bc1edda7dbd27f86c6470185e8737e1adb1878856fa2524cb143b0967e19db116e11dfec7ed21b21ad1e60918df84f7e143f8183e85cfa17922f207c2ee1f09ac175be9999f783b7c095fc598223e663567a4aecfc2b7b015b6c34ed80d7b615f9808896df4241cf80331ac7b06333ec1445717fa251cea33a357cd36e1281c479e577ebebf61bd522a2e2316994960b88f6420223f52669e3b3656f1f97eb6192bc456df44dabbc4fccd485f21def784f0f93c0a646962dd9eddd70e69459e6196a1daea9a4551182ea3288aa324ec9b5e9dd4f31566bd51944659f02836917140fa35caa342cda252ada22a9a478be035dc46b6cd3ae23a5a45ebe035da44db6817eda383e8303a727b43524debf1223a1663fb846b4f34b3e77aadc5afeb9cc8d537b00769c7336315bcf206d149742a7bd199b88aced59d6a471774c2012b4c18196dec65f2a6ac1d7dbe7fd88bae8265741d24d14d741bcde45bad93686bb478a70ec8d744667c3888eea387e831145e1e3d45cfd18b89dc22efb3f8c99e4448a3d7e82d6af93c6a4765d4d161d48d7a721ff5d917e36f358a06d150f2663471fb7351348ac6b117333be60534ea088a6252ce621e8b58c67eacd84d38e75b81f32009f6d64d4c94ca55ace5b99ac7411cc6517419c77112a77116e7ca37d7748cc7a9ec1e4b1a17711957c1969fc7f378112fe395774d6735541dadc5ebd8cc228c3d987e54cfc7bccaae97d452566a5d8f177265a2cec8fa65ec13fc89fde1afb68766ef49b2d3781befe2bd188b3c3e880ff5303e0a6233dfca29fe0d3eed601a5ac6c7f1a41e2f7e9dc42ddfc527ba151c44ddf8d4cc3f8ce5c767c607b3f8bc1e31663865732082f8229e065b3de0fdf832d8da9599cfe34365f72ed7fa2cbe8aaf4d507913dfc6b3f82ebe8f1fe247affcacbc994bc44f6c173ff3292255670fa61efe1cbf989860ebbd19bf1d34bbf3339cad31f9b2885fe337b5e799dcc948d8ebedba08f4919aa76e05d3f02c6e9b3f9db81bf7e2be0ee3413c8c4751c986f11574168feba028e18908976610dc24bef959f13a82aae325a1de824bb9d245d055236b6bafe46703ebabe6fa41fb41dbcc480ff8196217dbc6f597d6dfff667b0869a788cb49a293c0f4619584e2258992383e61afc12e498c64035ab56c4e4a097590a449f6b93d18ffff9ae449211f9232a992392bea7e17aa649164fe5d62d70f6985e92a5925eb64936ca33cd99979ae30f381cfe387d49eafe2582f0a45b24f0e9285384f567c21a27a05fd57e54572981c25c7be974cf4bbfd756a7fa48f830313cd9cd1fe1a471ee5d7250271999c24a7c959b44dce930b672d767f8e4ff569324d2e932b15eb32b94e6e4c4b6ef5abf790cc92bbe43e79a857544d3bc3f02179d43c9cc60b1daa2a68274fc973f292bcd2ea2c63ccae3f6c93b7662cb673636e7768c3c04f5a414fed83809dd0f9018155cc7fdc1e523a2115cab1bfe7b7666e5d4be7d4686ba91e9376d2895a4937be62138abc229c589365d24bfa9fdb8389d5d7c945b24c06c9301925882f84f7961a0388a7f5aa147615ad4fcd5296f2d43861d3f319b7e7b33e6b5f8fa293147a132ffe39afa312667c2cfb82fd48de4efd54a59a3febe8d3fe65b30aafa6699086acebe1440d4ebda4b3e69445ed9b5395a7511af3be1fbcb3955a67a91ca6499aa6599a27976921ba6220d2b48cb5e62a4aab746eecccf8505ea68b7499aea203f6aaf3e0446cf4537297aebd41ba3172ae63f024ddc4eb749beef415bf8c96a6c7758dad5de2b481893fa6ba0c7ae95e8df854f2fa4fb4f4ce8c457cf6bc7fbb3d289a7306b2480fd2c3f4480ea957c4de3a0c55cb1b887d7a1cc4ecde5ac21c32aaed3bfdc27851fb435dcfbe7d759df4646ce77546d6e9497aaa5ad2b7a320e2ecd88bfc59bc4acfd2f3f4a28e1dd897e68f8cd60ee123c2749a5ea65766767ac77ad0e4afca0bd64dafd39bf4d6eebee37cd6bbb37fe2259da577a2d674ddcec4f985a4d1bbf93737b3c6617a9f3e30ffdd692f1b4fa78fea217d32da7f8e236f6cfaf98129f992bea66fbae58f8c519f784cf5d256bc10a7693b19ab03d3c70fa37eda49b7519c7679e9adedfa03139bb417dffa2f69dfa4413a604faacff77258b7586c63990ed391b7353963f654e7675ef627ce1b7ead3d50ffb52b28e96dc6339149336669ec18ce96fc29f33395e92cc8426311a1f11c56cab53d64d117ec21c46aa0d15757dd795d2fcae2da8332c52f33ec95d7da9ddb5327077e2f4be29d4cedffd45ee3f3f308d2136e8c379e341499e9de5996e56680565f928f08b222abe77d36ee7d7f1ab7fe89df67556666c376ed41d1692fd5acbddafbd5b692d7a72cb285187cb2245a9d1d67cb7a0d3a5b656bdef6d2249477d94645d936bd919e1d7d0f8241b0ca76e163b6cf0e687438c80eb3a370efdfc949bd32cf5410f0343bce26719a9d64a7d999aab2137d2872ef4c4cbd6796aa6d769e5d6453f3ff97f6efabec5a8cd053ff497ba0f54956afe50597d94d761bb4664b5ab37fb1f3e13b59f27e709ecd642eea7e8c08d4cc8678579c7f561fb311426d63666a68bdf1ad9509c64d496b1df5aa6d65a2b7177699bc18af7160774dc417ec41e3ec5a3307f0c2ec2ebbcf1e3c3b27fa3cbe3273974cdc18a9affd23cc1e7e690fa6674eecfe78e84e050b27099c0fac6c0479c5a7a61c6bce83d21f1309658fd953741c56c9de9bd9ddf56ef6cc62339348ec6868468bec453d64afd99b8970eee9d4f995bacb5a71154722b096c85937d8c4955aa955786bfede069de838ea656d332ac87a3f2beb042add2933a244c7ba34f92aeba68f7fe6bce157da83b212afd72279d60b8eb3be5c60c785f456cf2972a5b9970dfc00eb49b51c459a0db3d117fc833d63cd993d0b2febfd66ab957ad6f86a679baf763e66f720b331dbcbe7dcb3a53956033eab0f6799b85d2de0753d39cb79d06787b6d59fef6f4adc6f462b6d9f228777166b773f1a1b98d12928ec2cda318437e7f8b13249b6a0ecb3e4f24d2afd2c552e708a944df4a0def7f6c6b9acc73071c1ee79aca722b57b34a19d1f85de8cad64c447ccb7fb9b420e652ea3dc0f7c35ca7dfd105cb03457e985ae473921031eabb532f215e3c0176335d2d35c9bfafeed09e0bfcd1e129a37304ff381b7cd83bce939763d9f63353b0a4d04508fa6465ef6447d1e4553ee4bef6b5b427bdbf664b408f4451eab27acc434a3f7ef5c1f1a292679cacf8daf7afebbe65f3f5bfacdf102c978b14c865efc9067788b827cb5987d3a538811d4f69824ccf3bc509f9d5ffebde4fc4ebde27198977965cf9ce0fd9e3f707aca537291cffdbd3cc0baeab796ecf7997e339e844fada3f759bec897c95e3527a434ed1aa1046665497261cfa304667c3d659baf6f8bf5c5f52c85e5ab7c1d5fe71bda0f137fc81ea27ccb6b6b58dbf77b3edbeffe487f24fdde79393b5a9ad1d00fc484ce1f45362e74b1776d172ec616760f4b627fe3eb9287d304f3daa2148fe7fcd4da5d68a3c6e00f8c17754b7bb685b597fa9be2ed9f2dfdcefe262ca23eb9b38e5e4d9410d2089f7e8ab85c54657566f4a9e4c844f05f1ddfb8f774cc3df28d5f99bb3571be6c568f7ff37a6ddfbac1a9fe1ff6bceb3f9d7ec73f346fe732bb5ba53d7af316eba8bf98ad89e64c22f5eaaf3f2fcddc5b3eda7a9c146fd5d2298adfad8fd6caf0d66de07de10d8b8ff4fbe977cec330775e2bb22b8775ffd3765df5935fa877179ab3ca12b3927cf7f53d94def4833d24f5db54b47e1d591dff81f985fd1b3bd9bc8e433ed2d7a7df3e3f496753998d17423a7d1ee0a4f227fff0694dc6fa8f97e65ce3d7250f2708ed2e9e3dcb96d0789536b39adfb93eb4d61ad2153fe8fbf8ff74faf81ec8477a9f3eece123bd4f1ff6f091dea70f7bf848efd3873d7ca4f7e9c31e3ed2fbf4610f1fe97dfab0878ff43e7dd8c3477a9f3eece123bd4f1ff6f091dea70f7bf848efd3873d7ca4f7e9c31e3ed2fbf4610f1fe97dfab0878ff43efd3cf6604f5945ee4dcce6eb58782bdd7d9ff48f9de5fe71d34f650fcc9d0166cdf929bcc78d77727ffd1b1d7ec6f4b3d903fd54a7b51cb28c4d985fbf39fdfefcdfcf9c7e227b60f6dd1e9cf10cbd37ce59212ec5a5b7e2f7ded5fb777b7f662ff113d983b0df30acbd444f0ea3a37c2f5ebcbed7cf0fbc767e2806f8d68a2bfb610f3f78a2d3e17514b960f7acafaef2a3fc389fe427b2cc4fe56dfd45ba776f937cd8c34f90f0857596f1b61ae667f97978925fe4d3fc32bf0a851c365fd1ff79ade167b2077af330afc70ad6cdaff94518e437f96d3ecbef78accc18f2fe37427debd67eabf413d903879ed9c4df8a9e7ecbeff387fc513ce74f599bef549b719a79e00b613fe9fb3c3f913de05db3dc9b856176973fe72f7c93bf269b7c1ebfb1d21bfb8f262ff09a2fc7fda4df13f989eca18e24233934b3cc544df2373ef76f4296b7f2226fe79df84aacf005b7f76f27ff7ce9e7b2873a9614973ccebb79cf1b0407793fbbf69f835de6e963d667f5d7a2c30f7bf8d66df8cf24bc8f5ccf2dc4793e100bd9f5398bf3613e8ab7f13c1ff3bdf4d984ddc122be756bbf55fa89ecc1ae562ba1daf1939f71919cf22ca9b49f5d07abc2cbda61879d4ace32fb55d09f7686f173d98397f36711cb56c4fc89bef11eb255c1b2d782f379de2e4421f9b158b1496d113f6bfa89ecc1fe564e762f5ed8283d97155feb56bc2cfca4f279a1c45bf292657c275ec4257cc4cf997e1c7bf8c59745c5bf49b57f785177852e02d90b9e951fb48b307c2ca2222e12355717612732330d6f51ff9661bbf7a5e81bba3fc97ac48f640fef7f7ebf13f1eee7da3ff87a92b68a346449153caab8c874a0fd228f4ffccbec515da4b7fe2c1466d4089b6f657dd8c3f79d3e7dc7e897a71a1a7b08b8bf090fb26b134dbe26f5af18df8ad3f0319e14aa288a52bfa911eb7b33fb7b52f10dad9f68c6f1e3d9c32f47884ffff3c91ef4a4b687b0823da46f695e54e23415c9717cc245318fcfe32b7d663c444ea726d8cf33dff8d1ece1df460e9fe207e31fd43c3c281666bc68a779f2943c15cba28afdc0cbaef551745eac8ab5f0f9540eed37ee3eece1bb4dbf7de6adb687e828b88ccf8b8d3accaee3857e2db6c993962aaa2d223c8bbae2aad8157b7521c6f24d16f57ae5a728e267483f8e3dfcfa04a419fd73333ef8ccafff3554af33e5a150073c89fce240df5a7b58a66f2a5291f112bc388c6fb3919e050bb60c62ef5008fb7b413fece1bb4cbfb60736619cdd87c2cc15eecd4ff5ef7ccdd944acd455de298ef8a638ceae825eb1853d6899be1593a8d41de33776e2ba38116376606719acf9ed293f43fa81ec41599f80c871edcdc4a59cb0ae4845ca4ea5b10363151bb6513da98a53aed4697156b0b8d449ed1bea114395c622ce8337ef9e5de76bbe2d2ebc7128c4e0d36f35a4fbb0e6abcd3f62fa71eca14ef68be6f52c221397de587ad93c3fcec7c5541feb81b71497ac906f62abcfe3a32ce06fc5a51e1757b577404a9ed23c780c9eb3ebe2da1f14373c36b38c4db356f9eeb7e1a4f8a6ff8f987e1c7ba0b9a5d1931c9a7e1d8bf364af776c19aed24171ab27e25cf822caaf822c1f14b342f12c3c5371f244d650d67fd75165b6e237818856a98e9fc2d09bc11ee837b5c053b8df00f3e3a51fc81ef02d7e630fcc1797fe2e1fb327bde222dec6c7e2da9b16a2b88bb6d1563f9af9e4bd7f533c885315237a207b302386e6e1a12e8b4791154ff1b99a9a7126aba3517657ff9e956ffd8cff7cfaf1ecc15b9ba85116cfc58bb74d8fd9b4780dfa791abd149be2ad6865776a12bf15857af01e8ab6e64d34893fb58708dad9557caf4ef3dba223ce4d4c796f7fefdeac4ef5db5cf84df13f6a7cf903d943d8ac2bb349b29459d1e5fda2c75a3ecfee358b87f1366f9b91a25f0c8ab21816a3c0537ef2993d98d8722c4ea390bd16e3b45f7ac2573db1125244ea4971f9c6a7c62afce664fe8f977e287be076d619b1ccce225eb275d1ab7f77bcee94ace472152ee36e29d852b0528683e039784cf34ff6d0c494092ffd52f1309b85ba78115b762a021ea7b7fc80efa4e71daadccc60b36ffdb4ff54fa81ec8135f62087a6174fd444cdfd2bbe6671303349853c3ed117eabad4652057c9adaaf4a258fe329eac533deb8cd3e4363ef1efcbb08cc4d8d8425274cab84c8ad3d293a91fd46bd9dffa79ff99f4e3d8c3bb1961ceeebd312be3377f121f96697856b4c3333d2fb342e9a57fa54ecb3c0acb428f5d34f92ed53165ec972cdcf893c4cc3acbd2fca9ca79342d1779dbcf7862bcc4323ab2ef7335bf35ea87997ffe38f6f0ee77f5448c974bf5e867e5aa5ccbd3f02c68ebd7e03a1121570fec5576f85bb951bee6ce3b44cd4fc953bddf59faf52a8478e44a9445873d155eb9d547e52e2fcb453a5613a98464dcee7faa4ff7fe11d20f6a0f137610f8715f2cb2409e076f45a5b99937ac748b67a92af7ba234e8baa587eee1dec1c635b9c0733735d9f0b3537b391bdbe08fada0b5979501e063b3f63253b149776355be237d3fe28e947b2076713517daa5e7afa5cb03cc8eee3b4a8d2dc58444f07e55176924dc569d04bde79875f2633c73023462c8b915e8a0557718b6fd8a5771fcb6c94768a5d799c9fc74ffe8c1566cc0870ef1fc5267e247b70e75f7296e9b35ce75d75a466e524bead2347d3eb972a56cb6416de18df30f977de01ab10fa35bbf479d02f86f9031b9727e6e7e7609654fc4d9e85cbe42552a227dfea31a37e63fcc7797fe787b207f2dcb57f1097d1b678e1fd78571cc7b74555c705aa34f3096ea2065eef72ffda3b7c9a73da98722c4ebd07ed654179caa6e22a0a83eba853b483e778c2a6d13cdc9667fc5cf27a2dc2ae607fd8c3ffb2d4d843fd85b0da3fd87dccbe9ad5f6604687a75afff5df9f5b824b6ece59af42243355f11b7619dfb156711c3e96e7e585b1ab3bb5e26b7fcd4ff479f226eb75cbfcc31efe7726fa926062fd83145d75913f95d3ec9e4571d9ac3bfd7abda1662dc937949fbc44fa565e16a10e79565e25b751379b86c7f5d9db6812a7e5b5ff963dd4e72cd5545cda5375a25efbf811d2f76b0f9f9d8db4a756ec79a69e7d4b735cdcfa77e19cbf65abf4e94b2b0dbf9dcc98b212a7e244b7c2c7ec2a5ea64ff528a3b94e7527acbc41d8cf077c677740f31fe7bcccf76e0fef984e31d5a75558c60ef82e4bcb1b3367ccc2b366dfea6b52adfb40177eb837e930e895b7b53dd467b1b355b967afe5acbcd313be371ea268be62f9fda7efd71e9ae4fc4348f610ce9626ee5f1677e57df6c05ea36eec1793afb7877af73bcd55ac17667652d973f96f766d621275ca87f231de4533ff5a9cab767d46e247390ff1e3d9433ddfe4cfdeb87c2a9ffd096ba5bba2ddec5b7d9d3de024beb9d6a44fe76eeb3333c135cffc9bfc21edb332ba0ac58f7332e2fbb587cfc60b670f7228b93a5093f225d80407ba13eb3f650f346a9828b344f48958d3cc4f2e93c7a8ad3dbdac7740a52a5fcdac33f8d6f2f87bd2f76e0fefced7874d4ebdfaa086fec87f296591672741afe9dd5f9fccfca3fc340fad7faa4f59ea058bcab72c0896591a3f954be38f3eece11ba75ff80613cf7dd2089bf0b61a15b7e5a26c25b776b5fa4f5ac3e76308f98c38f6bd0775a32fcab6baf30e25f77adf5a1e7f4ffadeedc14472b9fd2e79e65dd53fdb3f336f5976a2b7725576b357716afcfbbf5b81fa5dddfffaffea31c3cc3c44e997bdecba9471d71fc954c81fe584ccf7630fef7f1b01ed5bf5ea776e241797bccda7ec5e06c626ecf7464510c4c9203d662d3d0fa7f53b9a7f937fa0547b887a0754ae782ef2b22f226383d1bb13d8efde2effd4faef217dcff6507f3b50bec93cbee2316379fd4ef63df3ed3b58c3bce3efb35938280741bb1cda28e06fb507cd8b3011eaa19cd55faf143e2b9aef5fd3fe56f84b7bf85ed2f7680fce1aee559bc7e528d8966375173fa9a97cb3efe7f5d5883f08a606c92d8bec3987f2efb687348fb50e79a897919fecf99e4fbd45d3cefae49e271d7d5716f1fdda83f503d3f2291897cf95c7b7156365b4657d7de68d2bee67c57dfe5a9f8dfa336b93bf9f8a65d08b6f7dee3f47337d2e334410f69d417c43847d6af7f7e427be1f7ba853335ad46b4ede8cf5c5792192974a048bb855d46f6395f1953f8bb6950cf62cf12e7459b471a6fefd6ef6dfe321541c9e95fb745ff97a173f794bec74523b034fbf8f1d3eece19f49bfb487fa3bd47a572ef4320b2ac592b85be96c2eba5550886c9da7559854b1b6a3c53f600fc5a4689b39e743bc8ddf8a0bf1627f63c2dace6f727ac7ef239efc87d37b7b60f7f9557191f6b9905d76a93db52f8ab45545c60426c52a585649bdb3f9f7ad3dfc728e529f9088752ad86595aab9aaf7b556de8c3f87a29ee99859cf90be3ff5610fff6072b38ba8feb2477ec54ab63411fe5df9968dd8aeca7864fa6a27ee179b2a67c37a27cbad3dfcadf1a4f50fcba252553c0956bc5f9c8a6d18ca376f995f095fc4c9d25805be3f25decf8bfef7a7efc71edef9863a6acba3236fcc46655b5eb156f65a15e5be2ad561b9904b35cf54bc930f3a4c66e52dbef5f1f75a439d8aa55e04b35485f3649bb5f9811ec45755a5afaab99c89aea8bf15c079e97ee74ef8d79efe3f95be1f7b40c2db2ff8f28ff0d55d79570c83f340c5b78971dcc5ab0aa297e8451db2619215976eb4f89bbd03ec41c5e2d4bbd7b36a116ef524ec944f79d7c4b495c8f30edf8900df3ea63734be93ef877cbff66066fc87f179fd4e9ef674273c3333cb4e393163478b4dcddf93e0392addb9877fc01eec9a543b96eac69f18ab147927f3d25669663ad5b26633e718d727f26985ea3b394ff73dd9c3a755e07a354aacf83eef248b6a552cb293a80cdae1592ae479f95866a90a3c331bbca8d6ffc44841a92c96a51f3ed6116571244a33d379a936e2291b96327aa9b6c58dd8be3f91ffada5f7c7d2f76b0ff509eabc5b9fa8972ff16d78a3c77a214e55153e065ebc08cf829eddb7f8073c03527d32462dcb4df9c837d5325c252ffe7d29f54d9989fa0dd19bb41fc4f5897cfcdebe0f7bf8fbd3fb130ff5373fa4e75fc7476c9aaa6c1597092f264555fac19d99553cea85f1e6cb7f66a4f8640f412f9b9657d52e3e36730cafda5707fcad3ae499ec04a1ffe287629c2cad87f86edef6fd3eeda17e4353bee9e32ce5399d981dd7e71b4dcc5fbf6f73995cda37f9ff315bb0a9feba50bbb8cc46c56bf8501d1545755c4d742b4eebb7b8f86d7c9c8962ca64283eece19f49efbf3bcc78bd3a196eb960af511cfbc61b6cab137b9aed09a7a1d2d75f6aefefb607fb2e47ac83ea3438afcefc75755e5d54d358991873a0cbead2cc74fcbca386e292f9f55b21df5a7a7f2c7d3ff6d0cce33d5dff5655ffd11bcb015bcaabaad465f298e6ffa82ff837f69070e597039fa71dfe9ab7b2a78419cb5c8437aa2a27d555755ddc5695892927dfcffb19df973dd8bd435d47937c5a9f9855f3224d6f82e7d2ffcfdb439dd23ce805d76a9baaeaa6ba6571b60ab419b1c6e13e7b2d5eab19abca9188bdd9b796dd1f4fdf8f3d20e1b7a2b1cccc36e3e226eef28dcf54559f98fd16f650c72be14d70adc3ea2ea982eb645647b19a0777d5bd19451e2aaf9222adbf2ec4eebeb5e4fe58faeeec816617fa4c8c8b4eb564d3e4b6deb5fa36f650c72ab545c4be380da7e94a77ebf3f9e530d0d949d4cbd36c5ddc445b33331e7e2fef6f7d3ff6f06eff62cdb86a5741f518b7f82d6617ff797b68be4f68bf2130ae53fdd64e3daba9bf48c6a2ec5e0daa277d2e3d13417c37a76dbf277b707bc7eb7aaf3b9bb3a7a26043efa19e5dfc83eb907fc04b18abd8d6f35d3303b5bf4b237d0af7e59edf56cfd563f3bbe2bf8ff4fdd8c3a7355f33db2c82cb7a2fab7a09ce032feafcf9f7af7e9d6a9dfe95d3d8741e9fc77ed48deff287709bcdfd80dd7f2f6ff47d5ff6d0bc8f272ef520d97bdb6c564d924a2ddf7d47f22ff5f3628984af877c552af13b13605349fd558092b5f44531670faccbee3fe2c9bf9a3eade0d04c13df23565ec47c7dc6977e28aefde7e22cbe3573bce4eff00fc5b68e04d2a7f4c98c3f7963139ff4fcc7ed2ae1c1a3eea445b6944b3de1e77c5adbc3fbb331ff5bd723fef7dac3bbd350bffc6d79b9125ce75ed68ecec5261b05d7d5ebdfe11fec3cb1973c16ede451bfd6112a56bc610f5f73fe327932338c765295995ee6ed725c7f25dfee7b7fd8c35f4abffafe4b84df86250bc9f9717117bdb10bff260afff4fb78bf4ae5d0cc5adb665e70a2aae03ad676cee2fcc2d79dc7adcf4e6557f225def92f453fbeaabf2af4610f7f2dd56f38d97fe9fc0bcb94088558e933d657d3b2acdeeaaf3be8322aeb33717f35d9afc1b48359ba93a7d96be0056fe14dc23fe57f9d3d981967c5229feb23de2f5ea2ed873dfcf5f48b775a7236e153f9e68dfd1d8f452fec5491bfcf8ae020b94a66eff5f617ec615c7f4d30ef9759384855f8284ecb3fed776a7b88d3da1ed451716a7fef52f6610f7f2d35bf29b94ecce753118b6eb18ecff34ed1af5a69bf6a97bb228a17f5b997bfc31eeabdca4464d7f15df11a9cf34c55e1f19f7d13b8b10735abfd83b1e0cb0f7bf8abc97e29ceda03bd8bd55313390ff6f97de4278beaa9da571d791eccfe96b5eafaecdb45f0264f59ab52e569d50d2bb52dc23fbbce85f8219ef04ddcb5f1c3473cf99753630fdebadecd14ff7f7befd5dc38ae858bbe9fbf817796952ca9ce9365cbb692956ccbd21b0022308351a1eafef7bb0052dd6a77983d3d3d7bdba758abba258b09043eac8c0549af8862b7b24d63b1a771b0a43066c8250fd598fdb3fc0655aec7543bbc0d323767037b1eb7cb3ac77f9f437c6f5fe089b5abf1f04fa9d4202c870a92875cf5d59b7b88bdb883aed0157954d891c14434fe44e442d70062999b7a77f626be164795aba33f8f576265f644f80fb1f61539d101ec93a6b811fbd8e2436b80a2f3eaef8f4e1f1a0fd254517028656dd20a02df0e7d11e1408e9d9647f85584bc973f13b9d0785076dc651e3ce118aef1bd3db4ba38a8d6fbfd8778f85adbd60fe54058d698ce508694f64f7e96fd743e071e08d5f5a0d8537c54332ea3a97ce4428de49cb9bf5f29ec5b3c78d87bf1092e04487cf41a252a158b58aa6b977bff31e2bed8a4cac371cf7a46dd73fce272edf7c7a68f8b872f1e6abdbb49071f492895e804bd20977751cc5ce69ee3cbdf8cc5ef118ca0a3fc2399d199f7168ee27ea4fcbb60633d475263ee3fbf4fc91f38d6b50054e15ef1a3ea583ac7bace7ff88764f0808cef01134736fd07f7ce9e3b6015f27eb963c13f8b445e52199114cfea46a4511275543fb1a40a4482825c8dff06073aeff26b7664439338c316eb990cca1a0fff90ca3a2b251ea48c560916a9ce76881a3a9bfebb31fa47f685f63e900775c2db84f80f613f1af351d896aec4c17d34f81b364685079d1f25b1ae3ea7bd0f757ed49fa00b3cac198f0abd5b5eac84057cfd5fa817a76b10d3914cd85342550f1f133bb6688ca68a29fbe73b2b7d4f65d675c27c2246ea90703e14535d5baad61ffe399de585b5645cbdb2477b81de7ce228a3e1a96a3efe917515ba9683bb5033b6140e1b83aed2f66ff1813ef94dd1d2bb3aff4d3c4cc94322d0d6256a1d15c4d5d930357ff8a7f465b5a6a90483946a44dd78ea939fced75f23c31c2dab0f5f64bb54a8d2bb767b713c0c96f6296c9216768395182432711ca96b8af8bbc42dd7fa987d977eaebdaaaa36e553d8d1fbb95a2b324abc6a870cef2266ff61d7737e0e3ce8dd55651e7513df69fc6778d023f7ed59e5ca2dd5555d9d0175d63fcaec063fe4beb068333ea9155be19335c0473cc68eb8d7d9ba669d78a077e8bbac74ff333c685fb5bba06fea88590486b24dcbfdbe2f57237f5cfac87838472fd01ab5d82ab622e147bca9e3d0bfe6df7a0e97796f5f7d49ba468cce785163bd9b05c7e751d5fc5d57ac77afe5186de36bf49a04c4b6fa30af439526915e2b2cda70dd1446992b9ba75a9bfdd5b3755d29b1f1e7d1d1b113c5baa62a4858ca8b8f5f7bf033e041123c7247492c6fd0d18bff120f0a78c082f761d4fb95a6517a0542de67920bf2009665a35afd5d490bbdff6a92c447f61434f41e48c42507b0305e4361e308c1f836a2469007d3602a1f5dcedc9f3f5fefdd2907c8455774264e61dfeab03623a5b7fa7d45fe8f481f1b0f1a11666ddec43b45b7a11f856e2af8afe7277081becb5d9b0b66eb5d57cb3c78b019a7de0b72781334906b7912fcac95eaec576fa9a34f66fdcc1b65a8c31ae4105f85af81a7862c7633f9e8c54e2be8a9937c114f5565899ff107e035498ab6da939164d4721f599b0383f9160f1f15131f1a0fa8c403c94de50fa6f7560d267efe133c987d4b74552747053997bcc962bd2b735915c454ff7a422edec13d7abcc9858e93eb512d7d51f1c06ffa77e5ee0584a20ee98bbe779049b0567b8da2b0cb2dbf890bbc833bfb3f8d9a80aeaaa6e229e885db78294e1189ae580fc7b8a12318ef2b9e7f44faf878d0d9d4a4a5f75ed6f5a8c5321afd5c9f2bb3de90e3529fa95d92baa98e7895fbe2394d2ed58ecc50578ce8c84d9959c55356f5408ecf921c8749219b202b722bc3c7f845dc890edc87693458e3a08bf7f1114d9d56596de2c7cf07d913e81d19c3ad12c93e3990309ac7d83eda8772fff73adefdbb74f647956b35eda7e4984478279ed4f4c76351ad84e947d23fd2b7e484aed48b78164f9a0f80c478250f722ca224b2ae65124f931ba770f57ebd20ef1de53492419cbbade881b4d00d99dacb2440afe1b33d0f3bc053026b2c72996192dcdaf3a06772700e3fc743902777c9d05925f7c943f2988ca25db4b2face6db597ef9775871f913e381ecab5dc945aa21f37dc7b9d5dfff3b59a5ab7e75b16e31d7bf6851b863d1b07f73a42191d340fd07b6f4742a4f189366ca4ebcf99bd9b63f164a7f451b6ad09bd2636c9c9148ff830e1f6c25d790bc060948c9d377587ef3171bbc13a99f0f4c72bc2b4a6a2a6c9d4a5d84e66c913de075142d42a99531737ce3952264a57e3e16fd27b3c240bbdda429e7e8e076d374652308ed00e2d92a59af891b0b47fd10fc58b1747a1bd89d6ec561c23115ee9ec86e0085664a6583cc47bf204988b590345fcd19d79a76445e3644d4eb41974e36bc7f6af55c35edb1b350b0c1e7eec03010ed57254f29ca4c94bf2ea0f682798c7594245803aa61a658d87dfa4eff140733cff397f3096458a1c3ac25bb4881bce04f5dd55b0958f6aca5bcaf690b89137e409b4fe8d33718fcce34aecbc55708f77f62e7c8e123e44035d855a6d756d09c7a6b3245205bf956dc78e5f224254f2c696f44de3e17d8cebfc97ceac8946919d6c935d72653d278d60878975a77a529aca62e54ec21fd6e6fc3c787026b4a5f1f0d37c04ed77b0bd59005cda99b0c44b310104edc45270ff15b8844257f12969263468c48730a12d778ddca4e5057e3369bb5a631d1147d722676d77666fbd6b278fba51178dd45bdc8f690cd745167bd0fbc3ebaca91ff187cabb85a391b774946b23c77175bd52bd8a339ca1b5c103fbc8b56affdfc143292d9c167ba633fb8462774752900f777a7da7de9bdda5eec03d249d68ce8670b77e72ed9ffc792cd99cbca8942865113fe9a221b229462dd50b1ae14edd45b7ee2e6a45e3d04a7a204f5ed9b58dbfee0fff1e0d251eb456e987493f8a5dbbf4828b93e758fdaf78f8a8dce133e101e445eba7f242d7e0386869013a63cbbdc2073e0a7cdc097dfaecc57c1bc571cf23a86b4fad893b524dd4c363fb2db55294e2a49d12bf23b073c00dcdd169176fd00d65a817b692908ddd113e02bf38baaf81153792c85b00c2da605fbc8b9f81a542abb5bfaaf46b989c2b2246f1493590fa8207bf9617bf437fc3be507a3eea6ad2bc193c7902336b656ff92859c9359afac47b896239102dbfe91eac095b91160da22be5a534b559932d529672d2067d6f6dcd4cb59100450cbb33d6f31764e4ce80d3dfd84bf81e3a9354689b455b26efe35aefe587ceaaf596a0cff6ec85ceaafd222f6a3cfc16bdc7833806828e7e848772df75ef052ccd20bca2b38847736579302bf9185d21d7d4001c709bccf8d84dc2477c0a67ce41f552993aa94b8ef43af5ac4c9ac754f58886146b2f257b65217fa4184fb4872a688823bf0d9e908b1cedcdfa59de54153335fc81e5a92f330725a6cedc173c7cd8faa41f170f653e8c258d7fb21db508d2b5c3b42fa8d2e5d4d79ed7fa228bad35d7fade920c85cbef500fbdba77f4310d3c5b704729b04369acd743a001dda10ef1f92658452bb0316fe0ef48ef68f3e5c97a8f578c30480e0c1ac59078b8410e11896ed3902fbd3bc098afca2a453fcdba3051533b7e705758e7e04dadb272b1acb2be6afef0b7a9cc8fd2fbe881fdf7863b3a7e51ae99ba9c8966b5c3dcf54193f7dc2ecc45db96fe82327c9346c0df95cf5c5fce1d95ec646c17c10bf6d8843fa2884c512704596065ac8d3756bbda37f31c5f70f43e5866d7a350d71920b93b8ba983ec953dc3db2864b97cd4b1919ffbcecb3ca960cb97d19a1ffd056be8acda1a0fbf4f251ecef14d2fade29bef5664e99dcd409e4bfa16313ec6f7f14b347167c466bd88e07bbc8f422f56b69c0753ef4ed1e8e4305d8f41cf7a6b09d6e51a78c010adf4eedfefb3972ef7fa94c47de477d13c8de3d7d847dbb0a36bea7f5d49fcbde4d07890271c88fb98e83c297cc683acfd51bf4365bebdce8f2af31fecbdce7f50d77a142e7b5f67b944921dd094bcc6af641853caa4640dd6c55e9a445d6bac57793acd6012aced4df8cac6a40dbac1b0dc070ff842db8cd10ff31b2fea650f599b087c8c3aee4edcb16b77a851f6b525df67d081bdd1d791ce40b0276c510bf010d478f87d2af31fca7c391a0a37e1a89ff8bca9eb3d5ce2a1dc3b9927b18a9f935544e258472881033ca81e19466bbc087a11d2955ff03c6e45cba04146604be0ea1914e8cbf8bccf57f95a9b062384f9231e81bed10f16d6b57ae1f2020f3fa827a473b6831cefd0447674154a5d03a292171f782fad8f8b87b236f1399f56bd46099d818560ebfceaf7d6056893073253878863cf9dc1b86d00433bd26763ed83c0325e8b9d586a59ae72bc94cd4ab7732a4de19bbc84f7fbe17dd527c05eccc8888f84e31ebd3b5d1fe25799393a8ecee2e8ced48078a0acaa1153e3e1b7a9d4bbcaf538fcc5ef47117b76a98e4fbdc783a3e40bb7ec59b8d6da22c951005a2841033e8c1291f2a5ce7708ee1da93d52f890a6e10c34c8f09b2a65ef2ad05be52edcb8dc7b5913b9466b86fd459ab12799780bd7d755b34b7df247766794e93c4a2cd33c59556bfe538371cdf56a7bf33708387951aecfb232c7b703b35e4fba3673cf7d5eee7851ae878a42bcc7f7ba5a93dee910d9f68b958596fd8419cf70116c53f8e737d1ad6a089708e7166c07ed0b60e739fb9e3f949640357ef03fa514d3102907c936da46cf55568cfa291e8620a35c3ee763d5081f898d22f336e5fdfc5a7ff8bb548d8c672a89856444427b2d4819c1d0b3f26b3e3d202248f77897aa641134425d2f1ad32e7088a93510ae7f0dfadf0398261d6fc19e010fabb08f6327bbacd8f223fdcef0068d1852ad2a0ebc8cb4a2b7e8c4336e7988c9cb753aa547a4f2583be56e8ce2090778e15ed94138ada29b5f76d2aaf1f077e9cb4c8591b04ea08f8d42134d02dd30fed633e8bdfa5d2e747de0e0d9bfa657e8c1eca59de20d8c603b6c7ad7ae464413bd796db5d47820b63ee32ff020cfedd0d204f01591b7a467076aeede7b0b75ab7375bfe70b673ce80a316eaab0c885a3b549fffe4bb4bbc6c36fd1c558a564eacea2b9e4a1af022fd61e884b7d5ee745690dc209633f5cab3ebfd6f59ad00a018f262ebf0b5b114f0fd1912ded2226e931bad2bbaf5feea6fc433cf8df56d4a73b6a8134b223419b2c4f4fde4ff2f6ca9c6db0796c9683cd738ab83b6237ba45678f57bd3eeb77a8ac3f598d4644444cf55ebcb459aee87dafbbf97930496f421167310f2d5d511ead40031c8216d7c7c7e8cddd61161392a683b82f9b656ce91b7fe4cff1e0e8780699b21b7a8d5edd2bb76b63bd03cb4f5781a873668ecfe2969adb41b422ae37387bc33ff60a8c8f8d876aac0ab4963248508cc9b9226d1953fe6a63e8f5fa603f6ca3c8dd21457c42acd48c6440f270c67a4926faf2805ee37e7aab5758584ba3ddfd45febb392ab47792b8f8889fd59dbcc1857367f66ffba9ad097818329b5f718b0da2dbe8a1f47f5dac40acf1f01b0478f0be7807b1d95dd1b257dad27b9f8fa26587ded98c37fd799c0745d8a2969781d6119ac854a4a393e91d3e2a8b5ec35c6db98f6091dae619bfe20fa2fc34f9101d6a85cd741845780bb6eb42347e5ef3d2d83b6de4a827ba71effceb68e2ccf4aeac97feef1a0f7f9f2a6f946f747b13d30a9b92f32c19f0e6b73520ca3d48ca6c18d189d6641815565f926acc4d860b7fb4321c23446c2b0334e04b69f1133c942b2e436b891bd88d697a1f9398a917ded415497e5c8fe4bcfb4564a70fe28667e96310e8fa30c08d2a7f788d87dfa5caded3fe0161ead3da48a5a374ecae1ce95efbddf751ce6828075ce1223a4a1ebd9116a1e5be76c647bc437b98e511a06a924ed01074bbe2aff060ae05cd416dd1009e3c25287ac28578d671cd1fd4183be34179583482593aa3799ca64fa5ec2a575e983bd678f80774114f0a4c468aa552769dce592ce7679bb3cc5a8cef5557afb3f7193bb95764a87a4418abb3e2fa96b00aa0d450f1437e408ddfc9ffeaa1d639106a6b0d8224bc5677e9823d8760edf2ad5ecf71c911befaa3cc7a9c583e3aad74e93ad16dba227d7453ea2a9f833e3e1e4a9fb55ec5a9b39eed3d8d75c4920ba3d1a9af75623487706de446bd2072fa9a4368bfd417ad9e7f7fdf77cf42a5be72c68a9632c06306d12a5d47b7c9b53df759faec726e5608ff280fa6dc6d4f67edf145e04995bea8579ae20970870feb9f7e4f9f030fc66bbd0e67a00daa9804425b7c555ecc190fa51ed760b1dad196f7a8d6d1151e9575a3b5ed7879c79fc806ff1227c01bd684b249d28b16f6297d0d766a283662a5b3bb7fbeb69b6365eb163857368f2def4459b59ffb87f54fbfa78f8c876f638ea00134a81fcdf195d85b63e593079d497951e745af8deac73d76c0855dd86f5193df818cd9545e627979cf1ff2876a0e97562ac53a8302a47f18ddd2935bb8c3a4956e785f752f76517a6757e8d58260579c5097c66296bee94a1267cba2c6c33fa5ef62d03b49ac3e7fb1031ca65bfae6c555b562c5be5487f243d021fca097eeeca96a888373d0963f56a03d88efeffbddf33c13fb367b6d10975a317576e429eaaa82bef944eb91d1e147f92f3aaa66f6cc6a4753f14c9b714e50e047054d751ed66742c3c7c6c337d14662ac4e4a59d86449b20cafe8835846836fed4eb3de7fc59bb1640fec891f55cfeaeb19aad393fe6a4c4acf97d621591b3d8496eaa3d7388b7cb4b5b17c017de572cda67a173fd13918a047b2437a15df890cbdf2a13bd3164e65d7d6f2e21fd3a537cf7c377ec27016acd24876d286b8910bcf7e17db52aaeb2a79725ab18a04d89d84f5ccba8ae21ccffe8be7cdf00637d040a88878d738242f6c4e475eecda958df9557ffd060d6a21daf2c455f0a4aedc3bd5507d1ab006de1859c14c76c527d1283f301e8c0e788107b4cc18d16baff9306d264426de9d7c495bd54e7817525c34b4dd293aee9dfb90b6dd995e7755faa6bebde3bbe785c8960475d2bb681c586927be8e035ca8138b4b2df2d2db71c683d65eca1a24e93572d36e20c267ff2a7a8b63294d06bfd0b90ecbecabfef2d1e9e3e2e17b02d9de06332e23604deabd30fc537a23366e065a6451ee94fca55a9c1d47e82872718cf2b4671f09c5ba5ecf57ff825e43e957dff51a8f151c5d92dc5e522bec13a5eed2be5b60e9b490e328defa5a8deecc13ce1aac5e09245ec4d27a8e874924d248452d7c442d9d1d77cec8336dafe5c51f26adef698e4e08e37419a3ccb217f63c5873e9da6a7cd6fbcf355ac4138ce5151398b15674e5cee8ae8c6856fcc1bfe03b0e05398f27a82312f7359a6748a54c6458cdb82d1fe55c67bd9cd7ff7cab419a95dcb11ce895404e180af7866619612fe84167ec9535063f7abec37bfa7478284c2c63142474953ed2d89edbb8ac0ef6d587aced0c3957b7410f6d698c3bfc285cecb20648035309d2dcc73b8f94f634a82dcce87e46139a34333b637e533d71c9857fa8f654f8aefa6de97b62997c141b9fb139de673c13614b750c1a866585e28f9ffff29e3e111eaa55f266ff038a4f99541ebe8f4f789b39fe513cf1edb9ee3d8cd54157697153b543db48384bff810fa30dea7cc98a62157f28b48e9ab9ee4cf5c296bb939da84bf3e02a49830958b3fd725785af354d4b249c3903b35d9fe5f4cd9ebb8ebd7277e48adf9137e034dac2fd060d351efe3c9d2d46d0d16608e3063e456312ba2d3e4e72d0159edd45d4387309d0263cbd9fa617879df02aba51a93c847dad597edda906f00577f224ddb159f888c7d621f3ac6bf66c63618927617655f8ea6df88a05bd96dc9bca3bb027240ed0144d6466bf45b93b220729351abe64f27f93b5ffbfeebfff8c3e111ecefc41e727cf4c46c47534091af649a481870b3c57cfe441579e3d572065aed279f63dbf29a4c77d4eaf4a0f519917013c22d4d932c457bd84b2051f07c29f07dbe05eaf07f7f0b7f5af4d8ec5abae81cc7134200f6eeab80a03f769ab39cd445fbd629738462239e738fd67a4cf84878a039739f0055a7b993b034458d1de7913399bab9dd390a7b2266da9573297fbc114cfdd55fceca5e8c0d6b68019bcd66bb711b65f74a54972089b6a95f9492463a7a5f76853dfefb7a2be78a4fb8e428e5cd898ccd0849ec257bf13cddd5734c00de7d69a7dcdcafc9cf499f050497d6d353aba4e29c5baceb438d841fa184581678d839eb63fb5d4d035698d1ed1f75e827b35a30d34b626d8630511e10cae03b297c48e36ca723bf69bd8bb2bbc537bd78e46dcf3b7df72064d590032088356e2233773d40dde63e2a5fcc886ac07779c626cedcab536c60385befad23e133a3e0f1e2ec948e7b6593fd7c79eb3735bf192bc445befcea5417eb611cbeab3ba42a95ce0227a22c8ba8bdec2c7681c155191a6d1846c531e3555c3f68239baf282e0fe5ccff6fbe86574d03aa4abb3f21858b20f51843b76005a43df7d049e139c5bf6f93070499f090f5f7313ca35f83a674af5b0e53b38a431035d90be2542dd3a4a738868566a11808d65f2ec337b8efa71c3b1938ebb4b6377870fd6244ad4cae9b3a72c545789af4ec1bdd649a3a1d624df93f13c3540d3b4d41075458e89e441835ea1017fa4d1b7d9d3351efe7dfa26b645b41f023728537dd57092f085b6407f08e8881d90e3daf28e37d49437781fb8c3c8698aa54bd50bdee23deadb437b2a52fd4fff6f0fa32ecfb2087523c7915eec5e2b5bb4799fb9def45b8a748efd8b58a60f80ad2c5538095f892ab32c905dedcdf0a9b1a0e973e2a1f44ba18e5e6d1d9de8ccbdb7c67c11ac33c5722e8359908b9da7bd8b9a4eae1fdcf3c467fe1c38c863c4dcfb400482b6340912ec80735cd1b61ad287781ddc23473c5557be23f1e42eb864391d054fbc4b5ed4dcdd25997dd4fea7cfcf194afabc78b09674c77ad17d74425e16a7be13aac0bb53336f01e3d5039b22c601d01cb4821e688ab3281591df8cb0bb425bb4f51ed093fe445bf8bb0b16e9c88fd44b748777e6eae07bf280e8c8d33b21056486b7a18f871a0ff864f883f3ff021a3e2b1e4a79a1b321bc53bccb92f8d9bab6374994aa54cffb9ce682b885b8d79ffaaf2c8d3d75150af6908c452e72eb5affef1e4b1279320ebc98a14912d1967bafaff89eca3bb9f7f1915dbbc72c13a9baf3b9b2888d275f2a957f72347c263cfc509f14c12a08f0c14b9da54a53425267445286ec3543e5f72c2769f9bf3dca0ac5551abfc619d0abf97c726f15d79fe2a8d2ac604ffa2a7dddf794e50ce9bbb2a7e4283bea8e2578a9faac27a5ce73286de16fdbfa19e933e1e12b9519b6d632dbeb9df0b243d4c98ed80a80621ef7e37e38127dfd3db0b25338d2fb710756b4d0e53d9250f4a385fe9edd94df44df7e127dfd3d5dc7dcbfd1d7ff88cafb6073d7248c5ad9003d933e7933d12bf16dbecde7e5149f130f25e99c6bfe485c34c02e69c1d8fcab44ad6f89cdc4f462add727f54fbfa7cf8b079891ba6ae810ad416ee4800bfa5fa6299ee8784595d1ff816bd6ff1dfac478282bef143a660db808a8f877c99a7d4b7acd5fb9eecab444fcd3f7f918f489f1f025bfa9a4ff592baa1a53ffebfef833f4d9f1709971f2dfa6324fd6a001d5f2e27f4d9768d031c5af9501ff3b649e5bd59eabf9c3c723ebbd01f06f132e33b63e763da8bf4b9f170fd53c25157760bfcbf5ffa1bcf846667d7efabc78a8e9dfa01a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd47449351e6abaa41a0f355d528d879a2ea9c6434d9754e3a1a64baaf150d325d578a8e9926a3cd474493fc78325e11fb13c0b5914be7956603e1df8cdb7843d815fa8b5b57c7d2690f7df6e39b40271c74264624fbcb1692b39ff6f8e3374cf756b856923f9c7cfc3f0ee18ded903da5ae82fcf67d0739a24b4a1f8fe7cf85ddfad3c03fad8b4d47c9ab7a0df9d0fc7586ace35f4eff4ea2ff080a17da2ec49f81e5b948ca19d88cef548c037fdbe655f338b5bf8df69df2ffadb83bea1d00209eda1553b2b34e84fd4ce6e4debb069e93fc703601e7a8158d2d3fdf097efabdb004fd6ff4bcbd5b3ebdd718d03417bf00e6ff08dc35b9457a0f2e88fcf87f3c4ff060fa6c791990f7a16dee91619ae607801b4ca336f212cb79c0bff4efb7ed9dfbc9a59ba87d8790cce9f7c85eecbdfadcdf7b3ed379ee7433f08d3176378aef397e773cbc9eecc751ab7dfe3e1ccc734067c208d9dc0e0ce07be267e7047b73cf3f2ea3f4d3fc7036a1b649f671e32dc8058c9791e9af6333303371a11ff4efb7ed1dfd2b4a2e44fa4ecefafd2c2fcaae5d8067ebbd173ef0f3c51f3c544e3507fffcbb385e929695af883d9625aed55f2b74403323c489abfbec3c397ded647dd7fab577f212f84e14fc860d28cbf4145292768a95f00669c72eefd0ff843a9dfb4a1357e8907d3ca2f1c02e45a29e930f0e4bf9ccdffc1f33c23f1cfb361f397e7b32fda01c13f9057e7796ef9faa86e219d439b9db38cf9c1fdcef8d16df897f4b55fe0819632d27089526b80b1cf86c007dbc8d61a9225000fa063649a2f7fd7fe7f9bcc5cd1989d19d9452e79a8ee5f6b576a71b46be4da3fc62b5a01c6bc4a5fc17f2d81b47e08cf4ef51c92d1f7fcd3a0c070ff9207c378877076a9afca1fe0877ce110dfbceb9fa55fe0019e08fa824fae2d943d04144528b25f18c18fe4e0de92bec500235b4bd2149db2c7ff017f00be8956d908c5800872eea38a3b782820281bc3f109cfb3e99fc0ab25b35964911160cbcc90bf6e1feddafbec09e68eb4ec1fd80b1586e133d4df5040b36c8e02f3dbdb0feee719943be62af7df92cfbfd427351e25dbd1285b644b7927ef2229eeb355b6968fd9b315187b6ee68edd05bac3eadf69df2ffa1bc6443c642fd92b9f6a9df2ab85a1fbcdb9958ff6c893ec36dba09e9edbfff87961f6966da3054828fd9cbfd627255adbf36ce7f641af25e8fe87bd0b3c1705d915562035b03db7e764a579596975be3b1f3803b1b30620424b98877fa7577f8907667406df0a499fb582d780c72f7c48bb81e5a8f8c59a32c27616f08dac49811f92055af3131a6a196bb82ac3af9c672d49a880f7731046d89364a1bd06682f09c2591b9e80b1ca3a9eb496d013308bd110adb36b9831c25af213e7dec8e8853bb4262b49b22e9f66d7703fcda5c65a86b21bd5b342749f3d642b6f400520d4876b71d693936849bb4ee6dd677d3d1a34c21b69e434b2d1daca916ea74436dee08d3740437b42eed0caed03271cea3eb766f0bc55105a9e8c724b3c58d3345276388256834e02b3b5b0f2ec1ed9ce2d052d817625e15cb7d86833f0379fe6c81db82b6b69e11c7b03bc4601f05b1e526b995da300de16380d59e5449e5803de7199539fe6ba3daad2879601252bc0b2633892b49478ca19596a3b87dcf2a9270defc1688d867c8a56cb2ceb0521bccb9a523886b1b60068ceed172bd73ce8d243f3b3f9f16b79a1f5443db7ac30a0b97007b9a45d728d2d9ee60ebf0a0bb4cedddccbfd3ca0dd3cc4d26d268446e5b5702ccad25ce5719ed008ade3669eda38cfb042833c8fa67991b60169eb949313deb9dd7ceff6c5437ec88ff929bfb1f6fc361f60193460b4b1c7e9333cfd36bfcb87fc2abfa75d8d567b923fe48ff908186d97f7e8281fe7134ab54eb6ccf8299fba2e5e3b713ec8d6c89644a4f92c7f420f80b722ec082b2c00bd7b8282a77cce6df20c2859610f1df385f708fdcbe3061fe4cb28b21e2d9e4d92483eca225fe56bc081c6d10aee3cca9fc351fe92df20ecc4f2317f15739be760d1a06166e56f3613ad7c9beff22b92e25dde500246ce7696b9f01ef2a695923bab88af22db7bcd5b7a16e46deb39eff001dd83eec3dcd7fc5aec685bf52d47cb6dbca19bbcebf2bc8782bc6f4f053444721404b440054e1aec8a907c91bd70bb204e225a5e534c2d8778054c9fc2463dabf8aa715fda61ff311eb0d166352e41af4458ddc83d863915eeb1150db0433672e0234ac36b65c3a992df16ace085007e6af421b47607859479e190076b8870e1165e3a2e7cb42e02dbf11f924111128ff3222a94ffa0a037d2095915b15f14098f3927cf9957a4f9d2014ecd9acaf6ed0033294e45e634bc81b11f10b28b9cd930ae6b963b5745c1ef2c01b382228627cc7626c4f36fbc65cc31ce8ab8c73bd9337e8d79b177efe87d71f03bc423a9bcf38eb2e0cdac8786c5d191e8551c909d84c5a9b8c98a6210107e2a6e23197167c5b2ec595b55c0b917c59d9c1443b7c364dc47c037f8968fc946acdc915588a9d3885bfcc665b900f9fae6daf1d25ea951fa64bfd8a37c55dc3b312efd4efde241ce59cb0af13a174e503c060fbe28467c5a8c3d968eac316d03e784b98e51318906a11f5ad6cc191553fb54cc8a273c821e9c7b2ff4898c50542cd83379f2f362191fbc97e21638d1c8b3e36b7f642dbff7e0fe4d3cd0cabad7de14443cb90f7b9eb19d024bd9f10bc80ebf58a121b69c6638a20b6ba54e62e84c342724637b8231edf84d2b92ddc22bd678a26e72416d0b7ad729e20d6e14cfd9b67891a478c5432f0391d8b596ce6d84e18da6c5a678a3cfc5961de43c9d84d45e173bd429aebc97cc954a0ef004dab58591d9178da209fdd04a1ed473a69c75d1d69e543a97c495c0a87aa25f74e2be37cc87d6183750e08c8beb68e8aaa22befe25749a0677be8a6e81787bd0592b081e77b142dadc738f3b07f50b668206b8fe92330924efce217715f6b2aa011ccf6d4510edfdb5a86502f0999bd67f18bd3147dd0239f94cd8fd97e4ff63c407be17779cab77b3033d209bccb0137cc6cc5f6040d19da3baccd1dbcf141a4b110755117f0bb929360b87783317990daf3a6add72b47edbdbd0fb366ec6179171ce5601f90cc6bee436f6b39fc2407527959d4d84774e7a86441453820afc500db7268f8da176fdd6ff007aff43299380570abbdda73d02c6fad59123a4d67a03cee3b7346e23ef45a9f46d1b55acb8673e7dc9231cc51c4a7fb3898ee9338f709c5f835a7ee0a458074bc4ff7d93ec7725f0057e1ce35b6f7fbe09ebf5acbbd1f5ec93df0cefbbcc7fdfd617f947318cb0724a0b74ffb1b66d3be03331fe42135f64d3b5aba929f6004acfdc0011e059a8cb1deb2155c01f323e64e335a10cf755d9b77f8086136746df76e7f977440f253923acd6c9f25c53eeb59edfd501ef6f71ec153d973edcc970794811631152997fc61ff20dad969ff68fc30c0e8c46a3fc24e3488166828fafe663f0e4e8e8a16f983358864e8ef27c5740f521e7be989beee676e82d754b02797830cda1abdc8b3667196307f4441fbf49aee8a3fc6639fe2753808057d0b5ef64f0af005f609581714bb997cdacfd1de5e898decec17240461b024f17e89d6f81145fb5596d07edadaaf259313f82ef6cf6cba7fd9bf4696955e7288bf8f872fd2a6b48b96f99e3e6ad998ddef37fbb7c0ca4ed966bf45fbfd6e7f15dde38dcac564dfd837d15e6b897015c8c97d0be65b7bdfd1fae0fe3a8ff65d8b926bbfa5aef211bbc6a0fd91eb7d6fdfc7f260c563ad171dd001f32958e7e2400ef4601f9824e4f6c0dda64de327b1a4fd833848498cef01858783839c838b5fc9e3c1639ebdd55a951580603df176fe985dcb4dbe38f8568163d73904ca67a071d17b2cc51c4dc5186137709b8750a5870866e1dc79134f077588914d17bc60de2139a47c0212104647b043964cf7c121d7f202faa12f5238bb9027b9a18bf42dc80ffbb81fe4fbc00a431add7a0b7775381c8e0c58ab389a7b9d588182f8f570634db515417b8701468e1f760eb79ef4e67c196ed5366ec620bbb873b8b3378ab10358f35d3d232dd0d1480a4f191eee89ed1cf9e0f020161c64a12a5c0b3464c04b84e20cd4f7e5c151db202788f3f0eef0a8a27d8150c91ffecacefa057ff02b4454366fd63f8caa58c10ee6f90c2bb01140f7052d6c62cde0edc40146d4190316807759a027ef797895eded97c344eb13e101346da43577da051b0b3477b8bf0d76499fb4f99d1707cf30b725689e3a8e862dcaa7640942330264312b756e2d277fc06be0d5c0554a6f8ff694665de756c4968730cce39e89406adb867027eb655de020bb6c45a9b15c026d9b809e8d299ced807ece1db074023cd1dc1f2421b26fc92dc59c837de173075ab93e4c8ddc85e761b01082103891c886a03de8370ad030a06041adccdb77c12e59596d4055a8bde4cef8300359bac13a9a0682c05ac29b2cc9daf2911ddce84890897048102181b670ac2dc88e3dbc7b4cb44dc32d7a786204eeb6b4e62001b760898ce13ed4b90574c8430ef239776e0f73cdabc006c1c64a25560b9e440e0b786366ac0f90ee60f7ece12ee25b69f11bf2421a3b879a9851e943c55594003e0dbff3bfc4fca8f94ddb375b63297907e060e1166f813fef403b2eed2769a8e41ea645305eb3601180b616afd88b194d1d95d8ea780e9c9354d162f33fcca69541670cc702dd3b70b60d1ab4fea6650731914ca7f25b6ae44933933ded3b3256a07fe17fd7def67b7315aa3cc1c2f4a8968edcb495014e7ccb2e3d1da8ad7d89587f6a74612333b8b9da336f6fda6e4f0e6b6facf5a7c3b391b77ee53ff2ab6becaacf988e0c0377bc33d732edcb29910c9f9ef1a5488b8335ef579123c7b4acec7556459585b9d2f4a9f670680c55d19c327aee194fbee9bf4af25fd816bf232ffe1e95c88191a4a68ddace87b9a6637665a456cf07da33d8219577f1def43a967e4c2936f385550894065d76153111e68db87d6b7c38c67a319fd88c85d6771d7dc661591d9355ee81f1539b6b89f18ad825daa09f6589890a37be19ab077336337d4e4d6f1233f6655c9f94311a33ca041b1d425b81704d51a1e38c3e52e6282c3398fb129e5522507bfc3df32e1a43d88c9f3e22cf11816a4e99734c9e03d79a107eacda4f4d5601aa720da4e92b597dffa1ffeaf7e80fe281ebf7d7fdc84baeed1b4983a8841ea3a6af1e6044f538f98717e0d3caa018c12ced028fa57a66c0ecd358e755f48878633a87df0c2fd2c74086f6ccb3b6067f1446d8f87f50bb8a0f42af1c5ee99ca586c380d4d012a91c4bed3bd36d82df1e8c4c91a66f752b35263077cca8eabfb9f94dbf4b01baa189f29a6b0beb1efe692ec3c46b356ba91e37969a77d0c802790452ecdedae9a8780e7c832c0eafda776646d0379c441a0fb646a36e09018b4c98fbd806a5257f323c4d7bd7400ae112b7cb4cf31e5ce2907ec1aba3a5c99fca3ff993fcc1e041639fb19de160800cd974966108d614d29204b4b0d2db3b931d36b642c3dd44c913e06a613216bc2af217134f7b3cf909fa18f4f0c3f8b0d11135bcb6607e538a22aafbb59dadc8b54191f642c1588206b3248dc39b3503393f663bc38b841965ac51577225f85b73001d2d2867b7a8629755b682f6bad0ee617bd81a4fa29991600e4ef9c9935480fe204a8fb3f65c5b5ef670d8c199fb32ae0e5af1d5a101327c76681e5a56db604993679e12821e20b56fb344149cdd26b69103411977d39eb632a255493a5ccaa24aa7f34a09aaf98df9ed019ec0ff543ce30fe201e61c4babf67a2653cdc79343c706c30f0d35b2ad0d8ce1b5f658932579c80ad0db98b5317d5a6655181bec706db9d0836d845c47a66e76e8f26730d1632ef0dcba426bb18c9f002723d0b47bc83ef8d9266a6a5b4a4b603a071dab7fb454c4d57e8f6c782a459afbfb557c9699b944e0a9894185aff9963736d840206f086206c9941b797744a0486e8c2605765dd2966047aaa723c84118315c4921907ca0a776d116b4368d2517ad8fe4087a9c731b3df30001de8e95442b3373ace2688b251f695e42d6313db22307ed15f81f191becdd00def4273ebc542895959ea2bfb74d2f23830a83034004fd53f1ef3f88073d03b56f7fa7e30454bfc1ec28c02abfb3f2ca9f323d4adaa17de07993b4c5903f262be813841f31c26b6d4d800c396758b49241d8755b313f3ab96bb59d396fc4dba39bede50009fc1af7997d043b41c752b293e1ff5a431f1e7d4ffb9356c780f53412906dbfe0b5f6ab8234029bc7b9456b2acaf8a4b62dc403707a9dc9d4437be03cfe21c7afceadfd02a8d51ed6157b3656118c0d9fbaabcc51ee315491980247d22ec37b720bdc688cd761ef18695b4a7bd28f4aee8f7176cd1dfb0a9fe09d64768b5fa14fb4971db46facd2b5f69a1a1ee358e93139a6463e15f8956beb125b376e5f92801ae926c10ed7f610371209e73824560eed4b00371ebc1d0890e31fcb3ff98378d05c99528f77f67d4ce30659d92f62128c9c42f48eb985b5e75eb4997b2cdc3e89dcfd714f4779e778802b7774753c8a793c3b9e405ade5b31edaa386ac084888e37640a12c011fd28e60a07c7c1f1364bf0e678e76fb0954d93d051d0b3a999391ca1e390219015396bc3c8df5bcbe3fd81f2ab02aec81e0892717895df1e1f608c045d7afb201737c747720d739926cbe3285bd9cbe3f8901c27c72958d26b02e78365af257d0ca3d23dcec46d7c881a6ce5f631584fc7a7707b9cc3f7d7e3e2b8f41ee4e2e802ae36c5f8b8d2d13bbedc5f8b072b3cc29ddc66de433a6bc4c1ca99177b676e624c124fc53279a3022b7b1bf6c4f2f84c3dc73fbec8478e8eaf68055c667adc1cdff20e1e693fd071eb93e38e5e63e5beaa2b3177c2e395d66a3e1a1e340fc3ca47c593b8c3a16b8b3e8ac2b762116f8e8d320b53758ecd63cbdec268e4c7f6b193379da638c22c8d8fd7c7aee4f9d3b107d21a742414b02766f347e7d65d70ffd83f8cb293b26360042774c2c120bb8efbc51efeb58a3b47614beb0e20097631929313f127271ac97467e579a0bd8c87be58d983ace34cfc1cdf07d8690037c0e8c91d9e6cda3cb170e0dcc2346edb234ab3871377ded4305e010e96daa70afca13096c0326f9f44318f7b329604aff77cbfa4fdf04a9fe1dceec393e43727279258c0dddcbddafbd6321e93186f08e12abc226151e5b2a055dcf7378087b691581193ce0878d7246fc4e3a338799a2fb94336b5c6fe9c4fad5ccefd26dd7a4aa5d0c12a1f84c9c9cfafa03d1db93d05d6184bb23a851f0d0f1aebb41b67de0b6b9ca2e290bc114f798e3a29cd9f752695739bb7e3319e584412391099741ce54c2c90a4c138defa8568273390c48ef622850db13ac5787d4afcdc19e1b5f63b9fd25376ca61362df0c606bc3803b466ade2e08ed0aab469dd57261972b2536123feea6de38cf74f7b6547030212497bbd5968af99b45a2872e5e9e02d05270fde10c6c43e1db30e56a7532c8bad607ccb4f3a8607b3526760ea98c5ba884f37457e1a58ad32da80bab91d5e853d9d2514613ec70d7e3cddeeb7013dddb9c01dd15a7bdff929bf719472ada5e64a46df28a205b32ded272b74d4c1515a02ee0368c3f0748f56a6350fa7dbd3e36924c9e12d6d856fe886d924a51ec6a771dae28bf01e458ef2f0b10d674db2d59fc818fec378008d06242307ce00fc21926c98758f1ef7e3beb6b08c06b42471c1347fc05339c9994dbd1767029c72e213bc40afa98b8fda9ad79a38bb394d0327e9d801206a86d75a2eb81d7eaddaa7a72c4101c5a739ea9e16fb25de515c8e18f095b5f7c02549c5e0b4745721c9c3e310137960c069d0305a729fd02ce7bece7e90fdd32a59d941083a8c73ab7b1bd968e8dec2f3d678e1c26d603c7bb4037c427bd0909eb5f1d8db9af8bf44c3a09ba4a7e7d3cb5eeb3d1bfeaaf6c9e8343ebd52accfdc738cddbef9dc5883d3863de331f2cb0c3e8ce23edf9ede4edb48a31f034fdba1a1987a33f69c46a18dd6beb051da3925de497b81c50a90d0e77ece80ed4994a50309f886e74ce4365911a5fa6586d507c383f6a85234d4790378c79ed010ade426c89db86c2d1cbfb607f15a7440038af2857b4bfb6279baca1fc8f5a9c1bb8724589f9e33eda783b94eaed936143e210f45acde108eee4fcda889d659523c9d5ab48b5562a3ad784293531b46c82fed6fb41253bbc0f3644a9f3181f1c5f6ea6889dda943fa681f3fa57bfea8f8a9099a63e0bec6330fb143ded3b92c41eede86d462fe024b9fc52db1b35a74c197dac36ade0ef447be84bf5fab1cfe30e5fbb6cf0a3843ebabf6cebd8753765e0af87e0db7e136bb265eb83dc02c40c3e42063b18cd66051698f58981d23e9bdc881ba95c4930e8d5fb50f3f8d258aa6c533c2fe42bf7bfa40c1da054ed68457a1f9227e650420957271ba263e5a61e1ed4f5d60394f20653f1c1e8c2fc18591bcb51e81667aed94350349bd32b62835de9b19cc3a6df3a3c306f47a8137a79ee1f421dee87965b58de7adcc400fb5566d3dc2d8cd40fba3fc049f1c64cf23d5be1bc71b59cb6cc5f50a1093bb567912db6808d288e08d898f389462ac73b1cab849d6b16fad19de94b103fc8a3787a9f6f2a355a6a3882643914f81d3636d6b680cb0d29b68ec3d4682b05a7da26dc730eb588f30c2cb65c64187c8fa688d37f0b7a7a32926a25030c28ce702f421827464061b8f172bdb4831bc1387a3e60d2d026ddd642b1ac12f2b34d49e173434ed3477057d56fbaddada7ad31885b616547803381afcb96cca3fc81f4a4bd92be7b7f1c2959663b95ec1e462ea2844151df0cac84275b4f4331baf6135b6654ebf5fad563adf497ba9cb9537a57fa77c2635ab2248e5ada1a5bf7af9757500ab7cf8674ff739b2432b8b1e559ea872ecf54896791fb88ada88ea6d64e9ebac5a54c62d4ab4d0ea89cc2a57e1913283d7f403374785b9de645eea27e87b68efbdfe048cfa95f7995577d856eb08fccaf7ae331359e5b9965fa234c878e01c4bfc27f9bdff753c94bef732b685ab3954be43e9a32fbdc3b4f413979a76d567bee96fdf7805a9b947b9f28a5cdc551f753506aab1f0ab0886f1899b3b94b9eba5af9c182e63627aa697bdca7f2ecd9dceb9d8f8bcfaace2304e19ef3091d3739481991693cafb745e05563ec9e8b02cadc6de8cb1f14096d83923925bb1b1c5cb989e6feec3ab1e2bf3094accf36ade08e3874725faaaf7708c3f8d635445a99c924b01a729574dc93fb5dee14fea0f55dc656b56f1698c238b6b6fa489c4d0121db89cb3b88c08590ee01e9bbe76ccc8e0b2afca1eafe25060fb9b3ee6663ee30a3565343ed0337459ae55311ae5976859197160e63ac73cf31ca3e555cc099ffa5fda6cd65354ebe10283b67295458996725d0d3133b17c1aae305afeeac3bb7a2592cd51ffcb3cd6d75333a6e5318c58b5e2c6af3040abd819af625bb6e985b641825856ab60acf36a385efd45aa99212b64fd21ef03e0e1fffbbfffe7ff07835e35f2</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui b/kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui
new file mode 100644
index 0000000..a39c64a
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallobjectinfo.ui
@@ -0,0 +1,166 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMyFirewallObjectInfo</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallObjectInfo</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>496</width>
+ <height>383</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Documentation</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_header</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <property name="text">
+ <string>Rule Documentation</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>te_desc</cstring>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="wrapColumnOrWidth">
+ <number>50</number>
+ </property>
+ <property name="readOnly">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_cancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_help</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_apply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>b_apply</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallObjectInfo</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>b_help</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallObjectInfo</receiver>
+ <slot>slotHelp()</slot>
+ </connection>
+ <connection>
+ <sender>b_cancel</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallObjectInfo</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>reject()</slot>
+ <slot>accept()</slot>
+ <slot>slotHelp()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui
new file mode 100644
index 0000000..cb76884
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallportwidget.ui
@@ -0,0 +1,177 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMyFirewallPortWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallPortWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>444</width>
+ <height>72</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>PortWidget</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>sb_port1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>l_to</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>to:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="2">
+ <property name="name">
+ <cstring>c_port_name</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Service name:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>cb_port_name</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>sb_port2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>c_portrange</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Use port range</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="4">
+ <property name="name">
+ <cstring>c_inv</cstring>
+ </property>
+ <property name="text">
+ <string>Invert</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>c_portrange</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>c_port_name</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_port_name</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>c_portrange</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_portrange</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>l_to</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_portrange</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>sb_port2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_port_name</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>sb_port1</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>c_port_name</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cb_port_name</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui b/kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui
new file mode 100644
index 0000000..c83583d
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallprotocollistview.ui
@@ -0,0 +1,70 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallProtocolListView</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallProtocolListView</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form3</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="KListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Accept Protocol</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_lv_protocols</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>3</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui b/kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui
new file mode 100644
index 0000000..55dc297
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallprotocolpropertieswidget.ui
@@ -0,0 +1,173 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallProtocolPropertiesWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallProtocolPropertiesWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>557</width>
+ <height>95</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form2</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="1">
+ <property name="name">
+ <cstring>m_gb_protocol_option</cstring>
+ </property>
+ <property name="title">
+ <string>Protocol Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>m_cb_log</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Log packets maching this protocol</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_cb_limit</cstring>
+ </property>
+ <property name="text">
+ <string>Limit matches</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>m_sb_limit_rate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl_slash</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>/</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>second</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>minute</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>hour</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_cb_limit_interval</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="editable">
+ <bool>false</bool>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>m_gb_protocol_description</cstring>
+ </property>
+ <property name="title">
+ <string>Protocol Documentation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_l_protocol_desc</cstring>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_cb_limit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_sb_limit_rate</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cb_limit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_lbl_slash</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cb_limit</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_cb_limit_interval</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui b/kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui
new file mode 100644
index 0000000..622bf93
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallselectactivetarget.ui
@@ -0,0 +1,181 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallSelectActiveTarget</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KMyFirewallSelectActiveTarget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>560</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Select Target</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="4" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>339</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Current Selected Target:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>m_lbl_message</cstring>
+ </property>
+ <property name="text">
+ <string>NO Message loaded!</string>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="4" column="4">
+ <property name="name">
+ <cstring>m_cmd_ok</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Ok</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>m_cmd_cancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ <spacer row="2" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>178</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="2">
+ <property name="name">
+ <cstring>m_lbl_currentTarget</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>NO Target Selected</string>
+ </property>
+ </widget>
+ <widget class="KListView" row="3" column="0" rowspan="1" colspan="5">
+ <column>
+ <property name="text">
+ <string>Network/Target</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Address/Mask</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>System</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Backend</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_lv_zones</cstring>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui b/kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui
new file mode 100644
index 0000000..ac46984
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallselectinterface.ui
@@ -0,0 +1,392 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMyFirewallSelectInterface</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KMyFirewallSelectInterface</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>545</width>
+ <height>443</height>
+ </rect>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="caption">
+ <string>Select Interface</string>
+ </property>
+ <property name="icon">
+ <pixmap>image0</pixmap>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QFrame" row="0" column="0">
+ <property name="name">
+ <cstring>frame5</cstring>
+ </property>
+ <property name="font">
+ <font>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>m_pic_screenshot</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>300</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>400</width>
+ <height>300</height>
+ </size>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>m_cob_interface</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl_descripton</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="alignment">
+ <set>AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_cmd_help</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl_header</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>11</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Welcome to KMyFirewall&lt;/b&gt;
+
+&lt;p&gt;KMyFirewall provides two different inerfaces for setting up your firewall. Please select the Interface you like to use.&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_close</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>x</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_opt_showOnStartup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Never show this dialog again</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_cmd_ok</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Start KMyFirewall</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="685">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000027449444154388d6d93bf4b5b5114c73fef47f2a2491c02050d0551323445ec5014151497d2c176f0f7e41fd0a1438538bb75b385824eede4a654688b8a8b62a0b4521d148594686930d568f0477c7d2f2fcdbbb7439e62ad072e9c7beef77c0fe77bee51b8c504c40ea1cb80a8099603db0256ef817d13ab5cbf5cf8fd71b7b7f795d6d6f628108fab6a2482741c9cfd7dce37368ef717175fe6b6b6de3c85f27f045978ec1f1b9bad191808a9800a28aa8a140209b8807372c2b7d1d14fdb3b3b83cfa18887a300f11ccceacdcda17226839bc92032190887110707b85e0cd3241a8b3d09c3e465610d6004a64db8af99269aeb22b359945008bdbd1d717646697d1d676f0f3b9de664610169590fa2b0f2197e6a0262dfe115a088dd5d443a8d383cc4e8e8c0dfda8a1a8950cee7399d9ae26c799962a18004c584aa2578af66a1cbf15a118093cba1363541305811291ca6babf1f6118b8c522977dd74027e0532d88ea97627824d53d3d0407072b01d745f1f9a84f26919eea1ae0875ac0a72a60f9019ff750ddd242cdf0f0d568f3e3e3159e7c1ecdc3f92b056d40d155d8aef2923540334d144da3984c224e4fb16666b8686c24383444b8b5156b6d0d1db0210508bd08ab061c1b704701820d0d0014120910022595c29a9c243c3282717e0e547ed126cc032500bec08b5f208f40e60301595a5a92662221f3208f41dad3d3d29e9890471ee603641ba0feaacf39d0bfc2c70b90bf415a9a269dee6e6981b40c43da7575151fe426147ba10fd0ff598ad71098877747e0ba20c5b5e3822c815c866c5f25d9b8759900c6a0eb213cbb0b9d5550fb07ec1ca456607e0edefe802cb72dd30d53bc89f93c5f7882956f02ff02854c0fcf287a72340000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui b/kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui
new file mode 100644
index 0000000..4c45d9a
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewallsystemsettingslinux.ui
@@ -0,0 +1,202 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallSystemSettingsLinux</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallSystemSettingsLinux</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>560</width>
+ <height>262</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>KMyFirewallSystemSettingsLinux</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="KComboBox" row="1" column="0" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>LSB Distribution</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Gentoo</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Slackware</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_cob_distribution</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>As Gentoo and Slackware are using non-standard SysV init system it is required to select your distibution in order to make the firewall install properly into your boot setup.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Path to the defaul &lt;b&gt; runlevel&lt;/b&gt; directoy:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>m_lab_init_path</cstring>
+ </property>
+ <property name="text">
+ <string>Path to the &lt;b&gt;init&lt;/b&gt; directory:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>l_path_ipt_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Path to the &lt;b&gt;modprobe&lt;/b&gt; program:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>l_path_ipt_2_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Path to the &lt;b&gt;iptables&lt;/b&gt; binary:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="3" column="1">
+ <property name="name">
+ <cstring>m_url_mod_path</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="1">
+ <property name="name">
+ <cstring>m_url_ipt_path</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="4" column="1">
+ <property name="name">
+ <cstring>m_url_init_path</cstring>
+ </property>
+ <property name="mode">
+ <number>25</number>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="5" column="1">
+ <property name="name">
+ <cstring>m_url_runlevel_path</cstring>
+ </property>
+ </widget>
+ <spacer row="6" column="0">
+ <property name="name">
+ <cstring>spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="6" column="1">
+ <property name="name">
+ <cstring>spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>41</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui b/kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui
new file mode 100644
index 0000000..778a705
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewalltemplatechooser.ui
@@ -0,0 +1,474 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMyFirewallTemplateChooser</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KMyFirewallTemplateChooser</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>580</width>
+ <height>401</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>580</width>
+ <height>400</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>500</width>
+ <height>600</height>
+ </size>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="caption">
+ <string>Select a Ruleset Template</string>
+ </property>
+ <property name="icon">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QFrame" row="0" column="0">
+ <property name="name">
+ <cstring>frame5</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_help</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <string>F1</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_accept</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Load Template</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_cancel</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;h3&gt;Description:&lt;/h3&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lbl_description</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Template docu</string>
+ </property>
+ <property name="textFormat">
+ <enum>AutoText</enum>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ <property name="indent">
+ <number>1</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&lt;h3&gt;Template Chooser&lt;/h3&gt;
+&lt;p&gt;Select a ruleset template you like to use as the starting point for your firewall setup.&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>b_close</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>x</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;h3&gt;Available&amp;nbsp;Templates&lt;/h3&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>lb_templates</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>2</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>204</red>
+ <green>0</green>
+ <blue>49</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="685">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000027449444154388d6d93bf4b5b5114c73fef47f2a2491c02050d0551323445ec5014151497d2c176f0f7e41fd0a1438538bb75b385824eede4a654688b8a8b62a0b4521d148594686930d568f0477c7d2f2fcdbbb7439e62ad072e9c7beef77c0fe77bee51b8c504c40ea1cb80a8099603db0256ef817d13ab5cbf5cf8fd71b7b7f795d6d6f628108fab6a2482741c9cfd7dce37368ef717175fe6b6b6de3c85f27f045978ec1f1b9bad191808a9800a28aa8a140209b8807372c2b7d1d14fdb3b3b83cfa18887a300f11ccceacdcda17226839bc92032190887110707b85e0cd3241a8b3d09c3e465610d6004a64db8af99269aeb22b359945008bdbd1d717646697d1d676f0f3b9de664610169590fa2b0f2197e6a0262dfe115a088dd5d443a8d383cc4e8e8c0dfda8a1a8950cee7399d9ae26c799962a18004c584aa2578af66a1cbf15a118093cba1363541305811291ca6babf1f6118b8c522977dd74027e0532d88ea97627824d53d3d0407072b01d745f1f9a84f26919eea1ae0875ac0a72a60f9019ff750ddd242cdf0f0d568f3e3e3159e7c1ecdc3f92b056d40d155d8aef2923540334d144da3984c224e4fb16666b8686c24383444b8b5156b6d0d1db0210508bd08ab061c1b704701820d0d0014120910022595c29a9c243c3282717e0e547ed126cc032500bec08b5f208f40e60301595a5a92662221f3208f41dad3d3d29e9890471ee603641ba0feaacf39d0bfc2c70b90bf415a9a269dee6e6981b40c43da7575151fe426147ba10fd0ff598ad71098877747e0ba20c5b5e3822c815c866c5f25d9b8759900c6a0eb213cbb0b9d5550fb07ec1ca456607e0edefe802cb72dd30d53bc89f93c5f7882956f02ff02854c0fcf287a72340000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="20489">789cb5db5753643bb627f0f7fe1415adb78e09ddf4266ecc0390786f920426e641de6c208134904ccc77bf4aadff1670ea949be91b44f539bfd24eada59df29cfe8f7f7dbb393bfef6affff8c76c2ee6417d535ebc7cfb975e3c3cacfed7fffe9fffe71fffec36bef5dbdf068df6b7d63fffc73ffec9f437f58d29d968b4ecda5cd66e37b25571736d7d0637f1bca88de797c5f979df805b64fe08b7db14ff3d5b95f8ac36d5773e2fa6cf1bb88e372aa6f26931d5af60c4671bc5b93c6818f9f0d7e2f6da6a0177c866bfb8b3b698c15db279807b644ef5ebf23e8f8ae9fd9cc1688faa8aa93d9d62ca6f0c237f7e589cf3e316467be47d31950718ed91c3626acf098cf60853dccdf93dc2681f9b16e772760af7c9dc15f7b23d3cc0f347c5b93ccee121d94f8afb397efd3e05395e649b3a7fd581917f382bcef1fc068cfced4b712e8f23b8ce7f519cf311cf30f215f362caaf0d235f715c3cc8f5d51664656049162fc5c3fc7c5d9f82af8a45f616acc946c3a62df3f7db806d5be5e7a97f9a6683cac339dc6ceb6c1abfb66e8f3d87d11edb2fcef9fa4718edf1bde29cafba87d11e2be0ba3d4fc5397fb905a33d6a599cf3e5d730dac7bb30dac7e87ddad4be6c7d5a9cdba711af6eaf7a28366b3b07b7da793e0ab7709bcafd41712e67b9be343c11cf3c16e7fa7984eb78d3e25c9f3d825b54ceee8a7379181753bc4d18f9a8589ccbfd4bed4e9e4fe20ceee0f3abda546e167097ac5ac579fe317b708f2c1f8a69fedc85fb28af8a73b9bf84079d3cdf04fa7cb3cecf5dc3c8c7eec1881f0c8c78761346fdecac98e6b70318f1eca098e6877778d8a1f9a08205958b5e712ed7135892c551711effecb898c6ff06aca83cd6edd39d3c3e0ce5d7aaf3f1a730e2b12e8c786aaf38d767cf60d4afdbc5393e3b29cef1e40046fc70011be4b3846d278f47795e9cc71f6b905b0d94378ba9bc0737c9feae388f4f5b97b7c9f1ae98e6a37bb8439fe76fd9edbabd6e00237f358791afa0f7d52ef93cc2c84768b845f1c541718eefebf23a9f0aee20dfdbe25cee3e4cf3e50bdca572cd8af3f8e4c8b7d5238756711e8ff101ee9315b5a793eaa7f9a80da33ecd8b697eeac1a8dff0e25cae4770bf4bfb8f5631ede76a0fa8dcf3e25c5e4de1219533599ccbe356711e8faafebc20fbd7e23c1e75fd79496687c5b45fda861595c71bd874f37830545fb7ce57d5aee35d17e7cfbb3718f1ec1446fdeaa898e6875d5893c5a298f607e7c5d43f8730f2f30eb6545ea1be76a39bc767407eed7697c60bf5ff5e2aa7f9c516d37ee9b2387f9e3fc34db2fe30adbf0f708bca952aa6f16e8a69fc1cc21dca47ade06e37f77fd328a6f1b209f7bbb9fffb263cec52ffccebbbeed7ed8b0bb843f1e466712eaf4630e205569ce3c506dcc3f35bc534bfc4e2fcbcadcbfb64658b69bc1ec103e43b85913f3f814597c6e304d63d1a0fd43f0775bed54e718e27228c78b1f680cc3ac5395edc8305593c15d3f8aeeb57143f1c17d378bb80919fbc2bcee5a2011bb299c2b647eb7120771abddcdf2bc4ef34c996c6ebb0ae8f6fc2863eafde608be7693d19a6fa68bcdfc3cd5eeedfb60bb7c8e6b098f6fbb5db647d524cfd7f02777bb49eddc13db2a1fe2e527c8ab701a3fed88651bfad8a69bc1c16e7fa22833b54eece8a73b9ebc05d948f8b29bf3a3ef25337c5b41f9e15e7feadcfe13e95876e31ad6f6ff080ac9ee0618fd6a70758f472ff7434bfcbfaf3cec2f8bc8cc5b4de1d15d37efa161e52b95d15d3783b8511cfef14d37ada2ba6f1577f5e52b9b92fa6f20fd3fab7092bb80f1b7a9e356bf7693f897cba0d329fc1fd3e9d57a9fdaaae8f3d17e7f1263ab021ab666daa8fd1fca252fd79bcd95db84916cd625a8fdee11659edc3ed3edd27bcc15dcacfd3f7adebcfdb05dcc2f317709b9e3773b843d63770b79ffb7f65e05e3ff7f7302aa6f1b40ff7c9f2111ed0f362bf98d6afba7cd8cffd336ec2a69fbfcf403675fba286bb549fd985fb64fd504cf14730e2991e3cecd3faf6564ce7c7152cc8f602966456d7affa347edac5747e7c8135954b7cbed7e8d37989c6a34df9507c034b3c7f066b6abfda84f13ef47571eeafb20f5bb23f29a6fe48eba74df1e9bcc98ae97eac0937c962036e91e3126e937df120f7df90fba369d4f1dd63318daf8362aabf4f4ef1f3f316cfa7f8f9796961d4cffac5b4bfecc0dd01f5ff5931edc7eacf0fc8a15f4cf3377dbe59c7735b30ea3747708feab737c5b4ffdb8707833c3edc0c1e9259ab38c70b6fb01850ffdc2aa6fb1c054b2af7cfb0a27275594ce7afba7e4d0ef47cabfebc9bc0f8bc7e2ca6fe760beb41eecf7e0b36e4f05a4ce79d53d892e35971eeef6a40eeb706f9fb1415dc1ed0fe4e1553ffc8f38b69d79fb786dc6f90e30bdc2457cfc534bf5fc22db27b8551bfeac19d01edc72ab83ba0fdcfacf690e6f72edca3cf1b06f7e9f9b85b9b9e8f437830ccfda3cae713d3a9f30b0a467c7f0323be3a867b549fba86513f3b28a6f9ff0e1e90d54131c567f090ec7ab0c0e71d2c87b47f52c534dfdfc26a48e7917dd890459edfd2745ad7bf010baa8f5fc0a84fd6e58a2c5ac574ffb9036bd41f6033a4fe7b0e5bb25816d378c0e7070db2cbfb51d3abebf3fbb0a1f248fdab979ea7fddc31dc24c70fd3fda2845b43eaffef709bac0fe0ee90e6fb0d7830ccdf7ff5569cbfffaafefc7098bf7f97f723a69feaa7f5e51046fd610fee517dfaa598faa785517f382ca6fe7a090fa95cbf17e7f26a031682e6bb3e2c05f5efaa98f6ffb7b022bb2b580bfa7d4080ada0fd7e5e3fcda0cec79fc382eab7c7c574de7f84115f0f8be97c72052b2a37cd622ae7c5345f0718f9552fb011b9bf8a296cc94e1553fe349f0c860d780937e14531ed874431cdeff47e87757bc4268c7c7dab98f2abcb91af1dc1c8b79ac1c8376c17d378a3fc8625df398c7cbd2dcef9a95bb82568ff3585db647b5b4ceb451fee50b9b929cee59af211f5f3fc14c6f3ec15ee0adadf0d8ae9bc710ef7a89cbfc37d2ad7c7c5b45e287820e83ccf6129e8fcdb82b5a0f1503f6f24ed5768be90757d6e050fc8c117d37af3040fa9dc1f15d3fa53c112f9bc16d37895c5b4bf31c5b41fba8235e5e7eaf8c8d7e962ea3f785e34c8eea998f63ff77053d2f8443ea225a97f507f50297fba4fd880919f6dc30a66c5395f7b02e3fdba266c910fca533e749fff04231f7603b7c87abf98faf75631eda7105fb491ff23dc9574de9ec33d72a4fd8faee3f94571aedf4f61d4cf6f60d46f4e8be9fefc1eee906d03467cf75c9cfbbb8f30f231153c90b97f9b2b5848ba9fde832539d0f3a6aecf31386df072b985fb541ec7c5b9dc3ec103b21f1553fc3b7848e566554ce3af5f4ce3b301d7f9d69692cef30e56e42ac25ae6f1c25e8a693ddb848dccfdafaadb6b25edc769fcdb3a9e7b81ebfa038cfa7ca798ce43a7b0413c574cf7016d18f1ec7e319dcfe87d59d920fb19dc54b4fe9cc32db218c35d45f763f9fbb48df479ba7ff3c5747f7e0be3f366564ce79b43b84de5eaaa98d6e329dca17871a798cef36318f9c8ed62ba5ffb28a7df670fe01e95c7d3623adfd4ede953b9bd2ca6fb8171318d970b7840e586f26bd6f1e3338cfa4313467d5114e7fa5c8407f4792f8ae9f7595bf050d1f9e9021664e98a693cd5e592cac5a098d6bf87623a6f5dc28a6caee134e5e5f879bf625bf5f3b6369e7777b0268bcb62eadf5318f5c983623a6f1d16d3ef9b56b0a572be5b4ceb137ddfa97791d9a0388f07e9e1265948b8450e1fa6f1f40e7714cdf71cee6adacfd1fb6dd7edad3e9cf3b36fb0a6f6854b18f9eb2eb9cecf2d61e4e72e8b69bdda2ea6f5fe0a46be4e14d3feb7fe7c9bec3d8cf6c84318ed916db8a7697f3a85fb9ac65b80879af667797db69d3a5eb881db547fb470972cce6a533cb60ff7c8fea998ce7b7db88f7c6a0f281f7b5d4cfbdb7b18f9994d58681a6f02969aee27eaf84ad37dde02d6e4f8061b7255d76f35edf7f27c68bb753e66ab98ce9b11463ee216463ee2159664bf574ce3fb045664dd84919f0b30f233dd62daaf9ec1c8d753ffeed5ed8def30ead3f47da66f43d3f866701316c5b43e6ec32db269c16d4dfbd583621a7f377087caf5aa98caebfabb9aeef3e6f040e7fe63683cf7ebcf8bad621abfb198fefb140ba33e7e06f750ee8b693dbc83fb643d83ebf80e1e92dd516d43ebe1232cc8ac2aa6fbed3a9e845bb031741ea3f96c90f2a5fdf7a498f6cf6f30f2611c467c3d80112f9cc088a71cac0cdd1fdec19a5c3dc0c847ee17d37a56d767c97e504cfd93d6bb816990ad869b86fadb4131ddcf1dc12d2a97d43f87291f9a5f3c5ce7a38b69fcbcc188afe8fb1dd6f1f56b31c547fd753e7a09b7281f5b3fdf26f3db625abfaee18ec9e3c12de02e3938b867687da3f7917a03e5eb4c31dd07ddc175fcf7625a4fc730f2619362babf3929a6fb140e233f1560e4a7ef8a69bc8e60e42b4f8ae97ef3b998c62783fbf8fc73319d1f87f0802c57c5f4f923784836efc5745e8cc5341eebfa053d1f9bc5b43ef760490ea7c5345e3bb0a2fae25331ed6fe9fdcad43efafdfd4531ed27028cf6987631e5bf01237f3e28a6f5761746befaa298dab7534ceb63fdbca472e68b69bccf6a5b5a2f8f61b4c7c9da541e57b0a6726d6a53b979818da5f3eba898cea70dd8d2f3f2a998ceb3b45ea56cc866bb98d6bb21dc247b7a7faa6eaf5fc168afbe82d11eb65d1bed71c5741e58c09a2cce61b447ee14d3797c025b2ab71fa6fd04e2d7ed51a3623a3fbcc0688f5e14d37d54fdf916da2f8ae9bcd02ba6fbe60edca672362ca6f344843b96e6c73a7e97ac03dcb3b4ded7f1fa96f6df37f0c0d2efef683f987a03e5e7e8fdeaba3d952ca6f68c61e46fb78b697e6fc2c8970f8b29df6b18f957aa987eff7303a33d6c594cf7dda730da2767c5741e0930da2b79319d278e61b45f8c8ae97c710f0ff17c9d5f3a10e7720fa70d7b2eefc28aacdf8a69fea1efd3d4efc71dc2687f98c3685f3828a6efeb18467bf5bc98da3b84ebf6edc1689ffe30cdcf1e46fbf46e31ddef3f14d37eac0f0b2a97cfc5b41ef862baffb88625958b4931bdaf3a7fbc2fd929a6ffdea02ed7f04e31cd7f0bd890e56e31cd0f63d8923dbd1f5bb72f7661b427f68a29ff00d7f94e60e4277660e4275831e577051b94f362baffd82ea67c7761e47b3effd50f675ca43f92b3f4ef8a6b2ed33fe5af3ff7f1f3db71520c6eb8e58e7b1e92fe28ca1fc4d1e94fe09157fc9e3ff0476ad1ba7dffce38b9ce297fe2cffc85cff89c2ff8f2cfdedc1fbcb757fec657fc9d6ff04dbec547e9e7dfde9efcfd3bbecd77f82edfe3fbfc801fe6361efd37c439e627fc949ff1737ec12ff9151fffb7bcb711bfe6137ec36ff91d6ff0266ff136effcbbe2acfb2f7e46bccb7bbccf077cc838634c30c98f99627afdee7efd3dfd2cce4794f4ef236698658e7916586415bb670fec914df992ad7bfcff479c4f6dc9ed614fec99bdb0199bb3055bf233f6caded88a8fd9fbeff4bb1fc5412ba63cb0f59f8df4b3c9b6d8886db31db69b62edb17d76c00ed9519a257ea377ff308e4a913abccd8e79c54e78979db23376ce2ed825bb62e314e99a4dd80dbb65774cd17b5bffef8f23fe7d9cfcb9a354778335598bb5598775598ff5d9800dd384bacb760513eb6b7625d261793d6629b73f6d0fc5e1c7698171c23327029f88282a71cf961427457a108f622a9ef8b578162fe9d91945fbb338e94789b95888a578156f6225dec586d8145b6224b6116747ec8a3db1cf7ae2401cf24b71248e7f1ce987df4f9ad1c449aae1549c897371212ec595188b6b31a128290e1737e256dc8986688a96688b8ee8aee7d7bfff8e7ed21ec65f454ff4c5400c53e763524899c6e8a28ec376a5927a7dd811413ae96590515669edd07f17e9877152af96f7f2413ecaa97c6273f92c5fe44cce3fa2ac5b24177c572ee5ab7c932bf92e37e4a6dc621b7f379e7ef2de14db90951cc96db9c3167297edd43de0538bf6e4be3c9087f2481ecb13792acfe479ea0f7fd3bfff1aa78cffbc4a8b9ebc9097f2eafb08681193637e27aee5b59ca4d6dec85b79271b6ce3f7de5b8ec2f27b6bca966ccb971fc6d9969d9cd624fd5b57f6d23beecb811c7e3f92be6f0fbdb5fcbf8b34296ca83431ff280e46ec36bead995aff4a4c29fd7dfffe1a278fcf119fa6b9248df1f5c1514c9553fec7513e5a96fe4c54482b544f4555fd2a0e0fea5e3dc82df5c85fd5543db17bf52c3bbf8e432d522ff240cdd45c2d300fb37acda538182f926da8a57a556f6aa5def9b1da509b6a4b8d04fbcd38db92ab6db5a376f9625d775a3158fd4d7c6e0f976aa1f6d4be785707ea30453952c7ea449dd633cd6f449aa83375ae2ed27e689abf0159ef5ceb381439cd345a5daa2b3556d76aa26ed4adba93cfbf1b258da70e1fa8866aaa966af376fa13d23c94dfdf477bd6bb24b5fe1d444ff5c5a36a8853355057a2f4a7dffad9512335e44dcd35d3eb5fbf467142adf81a874d99d44a6b6dd291c1a51fafc3cffaf4dff4baa58ebad2f7fa41b4f4a39eea273efe1c87e60031d7cffa45cff45c2ff452bfaa917efb83d6a43862a457fa9d09bd210ff4a6ded2a334878f3e7d3feb384b65f889ded63bcacb8eded57bb2f32751d63fe9935aefeb037da88f52bec7fa449faef7791fef4d9fadf768fa9c31c9d81c6fe18f62504fd0173af524792384bed2637dad27f2fe739cd49eb16ae91b7d2b17794ff3fff6b390337d27de7423f5f153dd6407ba95764ca32fe327e8b6eee8aeeefdc977ffddcf8ede4d33629a59f5fa371043b9c98f3f7f3f69fc4e0d374c378df8759cf48db3cf6beb77a579bee3b7461a6534b5a7de79a9b631e948eb8cff8d3813138cff793f9113134d65ee559a97739cd4d3f8ab79308f666a9ef432eda07f1585f1a1be33cf6997f593b94f30f3626666ce566c23c71989b95998a579356f6665de7f3d6fa6d66c984db36546695ffa93776bb6cd8ed9357b7c9cef5df6cd8139947d73648ef9ae1afdbab749654ef4a6393567f2fac7ef58f0d49e7373b1deede7fb85e7b43dba3457666caea5947bbf6ccdb63c361373636ed9c8fc6c75dae1037397be9f074eff3fbeb66998a66999b6e9881b36ff751c3d375db1343dd3370333fc515f9013cb2dd3f7a9bf4df37de2fa3f445156a77edff99d119a7aed8d6ce7fb266b9d18fee8cdc967eb6db0319d6ca95f5fdbcadefff40dfce5bdeb857db08f762a3af6c93effe00d8cd7ad56693eb02f14272d02333b376d39f959dde9edd4e37287cde4a95dc8a65d9a27fb9ac63e4f7fb7f8ee13c2be49abdb6a41f3013376652a7df1d7f6a49d5287cdf3c8e6eb712968a7301613fb9eb6d51b76d36ed9515a71b90936ed0dfef2cee7768739bb6bf7e43da7ff3f46144dbbafaffe326e76f45c3ef161da03a62872a15f538bf7d6ed4ab51ed843fd6c8fe4a63dd633f322f7451a4bfaebb733e777f6c49eda337b4ee35456f6c25eda2fbbdb54dbd08eb54e278219db497bda37e9ec35f3eb9e6227e2d2deb01eef8a277b6befd21679661bba699b1f35ac67d1f5bdbcedac6f9be97ed50ef4b51dcaf197383b72e1b84b47392765c74ea477ca69edd35cbfeb8cb8725645e76474de05732e3778da87dbc9478f4863ecd98e5d7495bb770f664171dca39bcaf1e76f523c48e99e44cb3deb659a2f8fdc8b9bb9b939770b3e704bf7eadef8b1d9635b6ee5dedd86db745b72db8d3ef73cd971db6ec7edba3db7afe6887360ae85f8dc6a7728eef98ee989a93b72c72ab81377eacedcb9bb7097eeca8dddb5385153bee9266edf2ec522bd91d49e4f6f24bd1d397737eac56caa9ebb2dedb913a26e4fea0fd7e63dbd8dbebe778df51ca6ef5cd3b55cdb755cd7f55cdf0dd8299fa6f9aaed869ecb8a353cf322edc1265fe78634c3052fbdf2741f7ce6cd7a7f5bdedbb5362e78cb27dee947efc5d0071fed4a3ef8cadffb07d615cf2c9d3cd2c96de11fc59c9dfa8aeffba919a4efb1f3358eb8f14ffed92cf3bdf18b5df89936d4ffd36efcd4cffdc22ffdab6cfab7f55ed1af84f7efaac54ed319e2de6fac77b47947b1beed5bb20df3e837fd961fa559f8f8cbd858d8a6df4e637592e78347bf632abf8b5d0e97d77ecfefeba98afec01ffa2329fdb17df027fe348db8913f4b273df5716bb95e25c5093bb34b7fae57267c6d8f1af90bf6e02ff3f8d93287feca8f05da2367a6ab95bf566d3f716ffe465fea3beffdadbf4b27359c373e9dfcd2dff8865afaa66f8947fd7537b6e3dbbee3bb6c95df5b8f9ff8be1fe4bb8131dbf54356051e9878497daac57bec35a4a37b507c9e6644dce4d4e725ba150b3a18b6156c70e2cb1cb93e3f041f02bfceebdcdc3bf11ea218d53d5fb25085fbf0904ec2cf698bfd18a6e1293c871736fdbb5b5e55a5b3d26e98f9a7b423fb347789ed300f0badec34e47eb0bef708afe9bc7b5d9f34d3eeba1bdebc4efbfa0d75ef6ec32abc870dd635fbdfc749df8ed193b019b6acfe7a86d16fe6ddeef3953f55793ee0af76338cd848a027a43136d2b3b01d76f8f5fae64dccc3aed07aa2eef9f4e38631c7483b74b5602b330d7b61df6e7f99b9783850dbe1301cc92d5a7f98925be1382d7d279871c76c1e4ee5366f9ad49372dfb5e12cfddbf8d339162742791fce03f337f6810f3e8f52b19d06e79dde9467e142cc68fde18a4dddad9b844bf9c476f27a93e67eb115aed48579ac6f1d3eff4ea13edfca611887ebd41367fc36f5b44fad919d300969a7924ebacbf5e91bfbc471b80d77a1a1d7bb0a4ecf311f9a6e3fb4524f6870f3354ebe6f1cd917bbc94fcc6568a7d5837f99db76424731b90c5df9b01e0b258ee08bd00bfd300843ba2d48f3fa9e7291bbcd5457f8febe269d2ddaec2432731b4594eb35eae31c23277c68efa28a3adf941d7d3e6ff3b13e154fd1441b5df4f9dd31bd88412c63e4711da9de85af671bb5e05beed67763e5966614ef3fcdf469edd50b7ea6f7653f3eac6fb869c495fb8374d6b683d08d8f711a9fe433edf7e5517c8e2fcac659ee0f79ecf3699cb3b3b888cbf81adfe22af5e58f752b9d49988fef71236ec62dfe94665af5f9bc4df72d71a4db7e47bfc76d792267eb7387f17a1977e26edc0b63feba6e0b53e97d3d8655dcf733c6d3eea33e31a45532ed4f9af1201e9abedad7693609fa63b47dba0f49db16be708378148fede5faee30ed40983c8e27f1349ec573be254ee20577b272e37819afd279217c8c7e39497be1b6e9c6b1ea99c378bdde7b7cee375fef43d6bfad70437ded6d3ad5dda59d763a419aa1d471a21fe24dbc8d777c1e1bd2fac82a79fd69955ec8e7d814b7b1c55acada3dbc65f611e9e33e24bffb43b68a6dd7f0511e46193bb11b7b7a37ae623f0ee230bec4978a57ac12512857c9b49f9bd08f7cae543ca9741cc833d76647eb79e2eb38f8720e963c885e652a5b39b3a9576977dc3227954fb37d530cfcac0a55642f5595761c97d5bd78ac1ecc09fd48ad9c3df0be7a0ccf555acff36dfe9779f02f71c66c553d55cff1b27aa966d5bc5ac865b5ac5eab17bd91feee6dfdabdc6a55bd571bd5663593cbfa273d33b723fd2eda69ad69ac578fbfceb67fbd4f6447fed25f8bc3c06cacb6423a42565beb7f56a36a641ad5f6fa6ff2dfeeaccbcbcf68fda356d5aee8e61bdfefef61ffef7ffee3bf00ce86dc04</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>b_accept</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallTemplateChooser</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>b_cancel</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallTemplateChooser</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>b_close</sender>
+ <signal>clicked()</signal>
+ <receiver>KMyFirewallTemplateChooser</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui b/kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui
new file mode 100644
index 0000000..7f50160
--- /dev/null
+++ b/kmyfirewall/kmfwidgets/kmyfirewalltransactionlog.ui
@@ -0,0 +1,344 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KMyFirewallTransactionLog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMyFirewallTransactionLog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>520</width>
+ <height>467</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Transaction Log</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget2</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Undo/Redo Stacks</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QSplitter" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>splitter4</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="opaqueResize">
+ <bool>false</bool>
+ </property>
+ <property name="childrenCollapsible">
+ <bool>false</bool>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl_lvUndoTransactions</cstring>
+ </property>
+ <property name="text">
+ <string>Undo stack</string>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>ID</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_lvUndoTransactions</cstring>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="shadeSortColumn">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl_lvRedoTransactions</cstring>
+ </property>
+ <property name="text">
+ <string>Redo stack</string>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>ID</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_lvRedoTransactions</cstring>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ <widget class="KPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_cmd_clearStacks</cstring>
+ </property>
+ <property name="text">
+ <string>Clear stacks</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>225</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Application Log</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lbl__transactionLog</cstring>
+ </property>
+ <property name="text">
+ <string>Transaction Log</string>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>m_txt_transactionLog</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>LogText</enum>
+ </property>
+ <property name="undoRedoEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="KPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_cmd_clearLog</cstring>
+ </property>
+ <property name="text">
+ <string>Clear log</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>201</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Statistics</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QTextBrowser" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_txt_stats</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Nimbus Mono L</family>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Object statistics:</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>m_cmd_update</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Update</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kmyfirewalltransactionlog.ui.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>