/***************************************************************************
 begin                : Wed Mar 27 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 "kmfruleeditortos.h"

// TQt includes
#include <tqcombobox.h>
#include <tqcheckbox.h>
#include <tqstring.h>
#include <tqlabel.h>
#include <tqgroupbox.h>

// kde includes
#include <tdelocale.h>
#include <kdebug.h>
#include <tdeapplication.h>

// project includes
#include "../../core/xmlnames.h"
#include "../../core/iptruleoption.h"
#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 {
KMFRuleEditorTos::KMFRuleEditorTos( TQWidget *parent, const char *name, WFlags fl ) : KMyFirewallRuleEditorTos( parent, name, fl ) {
	m_option_type = "SETTOS";
}
KMFRuleEditorTos::~KMFRuleEditorTos() {}

void KMFRuleEditorTos::setType( const TQString& type ) {
	m_option_type = type;
	if ( m_option_type == "SETTOS" ) {
		gb_title->setTitle( i18n( "Set Type of Service" ) );
		c_use_tos->setText( i18n( "Set TOS" ) );
		setItems();
	} else if ( m_option_type == "CHECKTOS" ) {
		gb_title->setTitle( i18n( "Match Type of Service" ) );
		c_use_tos->setText( i18n( "Check TOS" ) );
		setItems();
	} else if ( m_option_type == "REJECTTYPE" ) {
		gb_title->setTitle( i18n( "Reject with icmp-type" ) );
		c_use_tos->setText( i18n( "Reject with type:" ) );
		setItems();
	}
}

void KMFRuleEditorTos::loadRule( IPTRule* rule ) {
	kdDebug() << "void KMFRuleEditorTos::loadRule( IPTRule* rule )" << endl;
	m_rule = rule;
	if ( m_option_type == "SETTOS" ) {
		setItems();
		IPTRuleOption* opt = rule->getOptionForName("target_set_tos_opt");
		if ( ! opt ->isEmpty()) {
			TQStringList values = opt->getValues();
			TQString val = *values.at(0);
			if ( val != XML::Undefined_Value) {
				c_use_tos->setChecked( true );
				int index = getItemNum( val );
				if ( index > 0 )
					cb_tos->setCurrentItem( index );
			} else {
				c_use_tos->setChecked( false );
			}
		} else {
			c_use_tos->setChecked( false );
		}
	} else if ( m_option_type == "CHECKTOS" ) {
		setItems();
		IPTRuleOption* opt = rule->getOptionForName("tos_opt");
		if ( ! opt ->isEmpty() ) {
			TQStringList values = opt->getValues();
			TQString val = *values.at(0);
			if ( val != XML::Undefined_Value) {
				c_use_tos->setChecked( true );
				int index = getItemNum( val );
				if ( index > 0 )
					cb_tos->setCurrentItem( index );
			} else {
				c_use_tos->setChecked( false );
			}
		} else {
			c_use_tos->setChecked( false );
		}
	} else if ( m_option_type == "REJECTTYPE" ) {
		setItems();
		IPTRuleOption* opt = rule->getOptionForName("target_reject_type_opt");
		if ( ! opt ->isEmpty() ) {
			TQStringList values = opt->getValues();
			TQString val = *values.at(0);
			if ( val != XML::Undefined_Value) {
				c_use_tos->setChecked( true );
				int index = getItemNum( val );
				if ( index > 0 )
					cb_tos->setCurrentItem( index );
			} else {
				c_use_tos->setChecked( false );
			}
		} else {
			c_use_tos->setChecked( false );
		}
	} else {
		kdDebug() << "Misuse of this class no type set !!" << endl;
	}
}

void KMFRuleEditorTos::accept() {
	KMFUndoEngine::instance()->startTransaction( 
		m_rule,
		i18n("Edit Rule: %1 TOS Target Option").arg( m_rule->name() ) 
	);
	if ( m_option_type == "SETTOS" ) {
		bool use_tos = c_use_tos->isChecked();
		TQPtrList<TQString>* options = new TQPtrList<TQString>;
		TQString* name = new TQString( "target_set_tos_opt" );
		if ( use_tos ) {
			TQString val = cb_tos->currentText();
			options->append( new TQString( val ) );
		} else {
			options->append( new TQString( XML::BoolOff_Value) );
		}
		// emit sigAddTargetOpt( name, options );
		m_rule->addTargetOption( *name, *options );
		KMFUndoEngine::instance()->endTransaction();
		emit sigDocumentChanged();
	} else if ( m_option_type == "CHECKTOS" ) {
		bool use_tos = c_use_tos->isChecked();
		TQPtrList<TQString>* options = new TQPtrList<TQString>;
		TQString* name = new TQString( "tos_opt" );
		if ( use_tos ) {
			TQString val = cb_tos->currentText();
			options->append( new TQString( val ) );
		} else {
			options->append( new TQString( XML::BoolOff_Value) );
		}
		// emit sigAddRuleOpt( name, options );
		m_rule->addRuleOption( *name, *options );
		KMFUndoEngine::instance()->endTransaction();
		emit sigHideMe();

	} else if ( m_option_type == "REJECTTYPE" ) {
		bool use_tos = c_use_tos->isChecked();
			TQPtrList<TQString>* options = new TQPtrList<TQString>;
			TQString* name = new TQString( "target_reject_type_opt" );
		if ( use_tos ) {
			TQString val = cb_tos->currentText();
			options->append( new TQString( val ) );
		} else {
			options->append( new TQString( XML::BoolOff_Value) );
		}
		// emit sigAddTargetOpt( name, options );
		m_rule->addTargetOption( *name, *options );
		KMFUndoEngine::instance()->endTransaction();
		emit sigHideMe();
	}
}

void KMFRuleEditorTos::setItems() {
	kdDebug() << "void KMFRuleEditorTos::setItems(const TQString& type)" << endl;
	cb_tos->clear();
	if ( m_option_type == "SETTOS" || m_option_type == "CHECKTOS" ) {
		cb_tos->insertItem( "Normal-Service" );
		cb_tos->insertItem( "Minimize-Cost" );
		cb_tos->insertItem( "Maximize-Reliability" );
		cb_tos->insertItem( "Maximize-Throughput" );
		cb_tos->insertItem( "Minimize-Delay" );
	} else if ( m_option_type == "REJECTTYPE" ) {
		cb_tos->insertItem( "icmp-port-unreachable" );
		cb_tos->insertItem( "icmp-net-unreachable" );
		cb_tos->insertItem( "icmp-host-unreachable" );
		cb_tos->insertItem( "icmp-proto-unreachable" );
		cb_tos->insertItem( "icmp-net-prohibited" );
		cb_tos->insertItem( "icmp-host-prohibited" );
	}
}

int KMFRuleEditorTos::getItemNum( const TQString& option ) {
	kdDebug() << "int KMFRuleEditorTos::getItemNum(const TQString& option)" << endl;
	int index = -1;
	for ( int i = 0; i < cb_tos->count(); i++ ) {
		TQString tmp_item = cb_tos->text( i );
		if ( tmp_item == option ) {
			index = i;
		}
	}
	return index;
}

void KMFRuleEditorTos::slotHelp() {
	kdDebug() << "void KMFRuleEditorTos::slotHelp()" << endl;
	kapp->invokeHelp( "tos" );
}

void KMFRuleEditorTos::reject() {
	kdDebug() << "void KMFRuleEditorTos::reject()" << endl;
	loadRule(m_rule);
	emit sigHideMe();
}

}

#include "kmfruleeditortos.moc"
