/***************************************************************************
 *   Copyright (C) 2004 by Christoph Thielecke                             *
 *   crissi99@gmx.de                                                       *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
//BEGIN INCLUDES
#include "toolsinfodialog.h"
#include "listviewtooltip.h"
#include <klistview.h>
//#include <qlistviewitem.h>
#include <qpixmap.h>
#include <kglobal.h>
#include <qstring.h>
#include <kiconloader.h>
#include <iostream>
#include <klocale.h>
#include <qcursor.h>

#include "utils.h"
//END INCLUDES

ToolsInfoDialog::ToolsInfoDialog(KVpncConfig *GlobalConfig, QWidget *parent, const char *)
		:KDialogBase( parent, "Tool_information", true, "",
		              KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true )
{
	main = new ToolsInfoWidgetBase(this);
	setMainWidget(main);
	main->InfoListView->setMinimumSize(main->InfoListView->sizeHint());

	QPixmap ok_icon = KGlobal::iconLoader()->loadIcon( "button_ok", KIcon::NoGroup, 16 );
	QPixmap wrong_icon = KGlobal::iconLoader()->loadIcon( "button_cancel", KIcon::NoGroup, 16 );
	ToolInfo *tool=0;
	main->InfoListView->setSorting(1);

	GlobalConfig->appPointer->setOverrideCursor( QCursor(Qt::WaitCursor) );

	for ( tool = GlobalConfig->ToolList->first(); tool; tool = GlobalConfig->ToolList->next() )
	{
// 		std::cout << "tool: " << tool->Name.ascii() << std::endl;
		// 		std::cout << "Version: " << tool->Version << std::endl;
		// 		std::cout << "Path: " << tool->PathToExec << std::endl << std::endl;
		QString state="";
		QString usability="";
		QString requiredBy="";
		QString comment="";

		tool->programsInPath =  GlobalConfig->programsInPath;

// 		tool->collectToolInfo();

		if (!tool->PathToExec.isEmpty() && QFile (tool->PathToExec).exists() && QFileInfo(tool->PathToExec).isFile() )
		{
// 			state=i18n("Found");
			if (tool->Name == "vpnc")
			{
				if ( tool->Version.find("3.3",0,-1) > -1 || tool->Version.find("4.",0,-1))
				{
					usability=i18n("good");
					comment=i18n("no certificate support");
				}
				else if ( tool->Version.find("3.2",0,-1) > -1)
				{
					usability=i18n("limited");
					comment=i18n("no split DNS support");
				}
				else if ( tool->Version.find("2.",0,-1) > -1)
				{
					usability=i18n("basic");
					comment=i18n("no NAT-T, IPSec over IP, no split DNS support");
				}
			}
			else if (tool->Name == "ciscovpnc")
			{
				usability=i18n("full");
			}
			else if (tool->Name == "ipsec")
			{
				// version is like this: "Openswan U2.4.4/K2.6.15" or "strongSwan U2.4.4/K2.6.15"
				QString realversion=tool->Version.section(' ',1,1).section('/',0,0).right(tool->Version.section(' ',1,1).section('/',0,0).length()-1);
				int majorversion = realversion.section('.',0,0).toInt();
				int minorversion = realversion.section('.',1,1).toInt();
				int subminorversion = realversion.section('.',2,2).toInt();
				QString realtype=tool->Version.section(' ',0,0).lower();

				if ( tool->Version.contains("Openswan"))
				{
					comment="Openswan";
					comment+=", "+i18n("kernel %1 support").arg("2.6");
					comment+=", "+i18n("smartcard support");
				}
				else if ( tool->Version.contains("strongSwan"))
				{
					comment="strongSwan";
					comment+=", "+i18n("no aggressive mode");
					comment+=", "+i18n("kernel %1 support").arg("2.4");
					if (!(majorversion <= 2 && minorversion <= 8 && subminorversion <= 1))
						comment+=", "+i18n("kernel %1 support").arg("2.6");
					comment+=", "+i18n("smartcard support");
				}
				else
				{
					comment+="FreeS/WAN";
				}

				if ( realversion.find("2.",0,-1) > -1)
					usability=i18n("full");
				else if ( realversion.find("1.",0,-1) > -1)
				{
					usability=i18n("limited");
					comment=+", "+i18n("no aggressive mode");
				}
				else
					usability=i18n("unknown");

			}
			else if (tool->Name == "racoon")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "openvpn")
			{
				if ( tool->Version.find("2.",0,-1) > -1)
				{
					usability=i18n("full");
// 					int major=tool->Version.section('.',0,0).toInt();
// 					int minor=tool->Version.section('.',1,1).toInt();
// 					int subminor=tool->Version.section('.',2,2).toInt();

// 					if ( major >= 2 && minor >= 1)
						if (tool->Capabilities.find( i18n("pkcs11 support"), 0, FALSE ) > -1 )
						{
							if (!comment.isEmpty())
								comment+=", ";
							comment+=i18n("smartcard support");
						}
				}
				else if ( tool->Version.find("1.",0,-1) > -1)
					//else
					usability=i18n("limited");
			}
			else if (tool->Name == "pppd")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");

				Utils::PppdCapabilities pppdcap = Utils ( GlobalConfig ).checkPppdCapabilities();
				comment="";
				if (pppdcap.pppdHasMppeRequiredSupport==true)
				{
					if (!comment.isEmpty())
						comment+=",";
					comment+= "mppe required";
				}
				if (pppdcap.pppdHasRequireMppeSupport==true)
				{
					if (!comment.isEmpty())
						comment+=",";
					comment+= "require-mppe";
				}
				if (pppdcap.pppdHasReplacedefaultrouteSupport==true)
				{
					if (!comment.isEmpty())
						comment+=",";
					comment+="replacedefaultroute";
				}
				if (pppdcap.pppdHasMppeSupport==true)
				{
					if (!comment.isEmpty())
						comment+=",";
					comment+= "mppe support";
				}
			}
			else if (tool->Name == "pptp")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "vtund")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "ping")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "pkcs11-tool")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "cisco_cert_mgr")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
				requiredBy=i18n("Cisco (propritary)");
			}
			else if (tool->Name == "kill")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "ip")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "ifconfig")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "route")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "bash")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "iptables")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "killall")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "openssl")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "setkey")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "vpnclient")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "l2tpd")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
// 				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "xl2tpd")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
// 				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "openl2tp")
			{
				//if ( tool->Version.find("2.",0,-1) > -1)
// 				usability=i18n("full");
				//else if ( tool->Version.find("2.",0,-1) > -1)
				//	usability=i18n("limited");
			}
			else if (tool->Name == "tail")
			{
				comment+=", "+i18n("kernel %1 support").arg("2.6");
			}
			else if (tool->Name == "ssh")
			{
				int major=tool->Version.section('.',0,0).toInt();
				int minor=tool->Version.section('.',1,1).section('p',0,0).toInt();
// 				std::cout << "ssh version: major: " << QString().setNum(major).ascii() << " minor: " << QString().setNum(minor).ascii() << std::endl;
				if ( major > 4 || ( major == 4 && minor >= 3) )
				{
					usability=i18n("full");
				}
				else
				{
					if ( major < 4  )
						//else
						usability=i18n("unuseable");
						comment=+i18n("no vpn support");
				}
			}

			else
			{
				// other tools
				usability=i18n("full");
			}

		}
		else
		{
// 			state=i18n("Not found");
			usability=i18n("none");
		}

// 		state=i18n("Found");
		if (tool->Name == "vpnc")
		{
			requiredBy=i18n("Cisco (free)");
		}
		else if (tool->Name == "ciscovpnc")
		{
			requiredBy=i18n("Cisco (propritary)");
		}
		else if (tool->Name == "ipsec")
		{
			QString realversion=tool->Version.section(' ',1,1).section('/',0,0).right(tool->Version.section(' ',1,1).section('/',0,0).length()-1);
			QString realtype=tool->Version.section(' ',0,0).lower();

			if ( tool->Version.contains("Openswan"))
			{
				requiredBy=i18n("Openswan");
			}
			else if ( tool->Version.contains("strongSwan"))
			{
				requiredBy=i18n("strongSwan");
			}
			else
			{
				requiredBy=i18n("FreeS/WAN");
			}

		}

// 		std::cout << "Tool: " << tool->Name.ascii() << " Path: "<< tool->PathToExec.ascii() << " Version: " << tool->Version.ascii() << " Found: " << state.ascii() << std::endl;

		else if (tool->Name == "racoon")
		{
			requiredBy=i18n("ipsec-tools (racoon)");
		}
		else if (tool->Name == "openvpn")
		{
			requiredBy=i18n("OpenVPN");
		}
		else if (tool->Name == "pppd")
		{
			requiredBy=i18n("PPTP");
		}
		else if (tool->Name == "pptp")
		{
			requiredBy=i18n("PPTP");
		}
		else if (tool->Name == "vtund")
		{
			requiredBy=i18n("VTun");
		}
		else if (tool->Name == "ping")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "pkcs11-tool")
		{
			requiredBy=i18n("Smartcard support");
		}

		else if (tool->Name == "cisco_cert_mgr")
		{
			requiredBy=i18n("Cisco (propritary)");
		}

		else if (tool->Name == "kill")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "ip")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "ifconfig")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "route")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "bash")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "iptables")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "killall")
		{
			requiredBy=i18n("KVpnc");
		}
		else if (tool->Name == "openssl")
		{
			requiredBy=i18n("Certificate support");
		}
		else if (tool->Name == "setkey")
		{
			requiredBy=i18n("ipsec-tools (racoon)");
		}
		else if (tool->Name == "vpnclient")
		{
			requiredBy=i18n("Cisco (propritary)");
		}
		else if (tool->Name == "l2tpd")
		{
			requiredBy=i18n("L2TP");
		}
		else if (tool->Name == "xl2tpd")
		{
			requiredBy=i18n("L2TP");
		}
		else if (tool->Name == "openl2tpd")
		{
			requiredBy=i18n("L2TP");
		}
		else if (tool->Name == "tail")
		{
			requiredBy=i18n("ipsec (Openswan, strongSwan, racoon)");
		}
		else if (tool->Name == "ssh")
		{
			requiredBy=i18n("SSH VPN");
		}
		else if (tool->Name == "ksshaskpass")
		{
			requiredBy=i18n("SSH VPN");
		}
		else if (tool->Name == "gnome-ssh-askpass")
		{
			requiredBy=i18n("SSH VPN");
		}
		else
		{
			// other tools
		}



		QListViewItem *item = new QListViewItem(main->InfoListView, tool->Name,state, tool->Version, usability,requiredBy , tool->PathToExec, comment);
		if (tool->found)
			item->setPixmap(1,ok_icon);
		else
			item->setPixmap(1,wrong_icon);
		main->InfoListView->insertItem(item);

	}

	QToolTip::remove( main->InfoListView );
	new ListViewToolTip( main->InfoListView );

	this->resize(800,600);
	main->InfoListView->resize(main->InfoListView->sizeHint());
	main->resize(main->sizeHint());
	//this->resize(sizeHint());

	GlobalConfig->appPointer->restoreOverrideCursor();
}

