/***************************************************************************
 *   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.             *
 ***************************************************************************/
#ifndef __KVPNCCONFIG_H__
#define __KVPNCCONFIG_H__

//BEGIN INCLUDES
#include <tqobject.h>
#include <tqptrlist.h>
#include <tqstring.h>
#include <tqapplication.h>
#include <tqcolor.h>
#include <tqpoint.h>
#include <tqsize.h>
#include <tqfile.h>
#include <tqtextstream.h>
#include <tqtextedit.h>
#include <tqcolor.h>
#include <tqstringlist.h>
#include <tdeconfig.h>
#include <tdewallet.h>
#include <kstatusbar.h>

#include "toolinfo.h"
#include "vpnaccountdata.h"

// ID for statusbar
#define ID_STATUS_MSG 1
#define ID_CONNECTION_MSG 2
#define ID_FLASH_MSG 3
//END INCLUDES

/**
This class holds global configuration data.
@author Christoph Thielecke <crissi99@gmx.de>
*/
class KVpncConfig : public TQObject
{
public:
	KVpncConfig(TQWidget *parent,KStatusBar *statusbar);
	~KVpncConfig();

public:
	enum ConnectionStatus {disconnected=0, connecting=1, connected=2};
	enum LogType {info=0, remote=1, error=2, success=3, debug=4};

	TQString pathToVpnc;
	TQString pathToCiscoVpnc;
	TQString pathToRacoon;
	TQString pathToRacoonctl;
	TQString pathToSetkey;
	TQString pathToIptables;
	TQString pathToOpenssl;
	TQString pathToIpsec;
	TQString pathToPppd;
	TQString pathToPptp;
	TQString pathToL2tpd;
	TQString pathToXl2tpd;
	TQString pathToOpenl2tp;
	TQString pathToKill;
	TQString pathToKillall;
	TQString pathToPing;
	TQString pathToOpenvpn;
	TQString pathToIp;
	TQString pathToIfconfig;
	TQString pathToRoute;
	TQString pathToNetstat;
	TQString pathToPkcs11Tool;
	TQString pathToVtund;
	TQString pathToCiscoCertMgr;
	TQString pathToTail;
	TQString pathToSsh;
	TQString pathToKsshAskpass;
	TQString pathToGnomeSshAskpass;
	TQString AutoConnectProfile;
	TQString RacoonDebugLevel;
	TQString Vpnc_pid_file;
	TQString Pppd_pid_file;
	TQString lastProfile;
	TQString logfileName;
	TQString InterpreterShell;

	TQString TmpPassword; //< from enter password dialog
	TQString TmpGroupPassword; //< from enter password dialog
	TQString TmpUsername; //< from enter password dialog
	TQString TmpPrivKeyPassStr;
	TQString TmpGatewayIP;
	TQString TmpXauthInterPasscode; //< from Xauth interactive passcode dialog
	TQString TmpPrivateKeyPass;
	TQString TmpHttpProxyPassword;
	TQString DnsDevice; //< device which the dns entry was added

	TQString OldDefaultGw; //< default gw before connect
	TQString OldDefaultDev; //< default gw dev before connect

	TQString NewDefaultGw;

	TQStringList PlutoDebug;
	TQStringList KlipsDebug;

	bool minimizeAfterConnect;
	bool showDebugConsole;
	bool writeLogFile;
	bool useDefaultPaths;
	bool useSilentQuit;
	bool holdGeneratedScripts;
	bool programsInPath;
	bool enableDebugPppd;
	bool enableDebugPptpd;
	bool enableDebugL2tpd;
	bool enableDebugXl2tpd;
	bool enableDebugOpenl2tp;

	bool enableDebugXl2tpdNetwork;
	bool enableDebugXl2tpdpacket;
	bool enableDebugXl2tpdstate;
	bool enableDebugXl2tpdtunnel;

	bool enableFreeswanVerbose;
	bool enableDebugOpenvpn;
	bool useColorizedLogOutput;
	bool showInterfaceIPinTooltip;
	bool dontQuitOnCloseEvent;
	bool doAutoConnectAtStartup;
	bool useKwallet;
	bool showStatusBar;
	bool showToolBar;
	bool hideMainWindow;
	bool PppdDebugLevel;
	bool firstUseOfKwallet; //< for importing passwords if there are stored before
	bool shutdownIsCalled;
	bool haveUserData; //< flag if user data already collected, set after data is entered and unset if authretry
	bool skipKwalletStoring; //< true if save should skip saving into tdewallet
	bool hideOnCloseInfo;
	bool feedbackMailSent;
	bool doKillL2tpdIfStillRunning; //< kill l2tpd if its still running and not started from kvpnc
	bool doKillXl2tpdIfStillRunning; //< kill xl2tpd if its still running and not started from kvpnc
	bool doKillRacoonIfStillRunning; //< kill racoon if its still running and not started from kvpnc
	bool showConnectionTimeInTooltip; //< True if the connection duration should be shown in kicker tooltip
	bool WaitingForXauth; //< if waiting for xauth is set to true, needed to detect wrong xautn data on strongswan
	bool prefDlgOpen; //< if true prefDlgOpen is open

	bool OpenvpnNeedSecurityParameter;

	int VpncDebugLevel;
	int KvpncDebugLevel;
	int OpenvpnDebugLevel;
	int PptpLogLevel;
	int PppdKernelLogLevel;
	int SshDebugLevel;
	int LogViewerFontSize;
	int mainwindow_pos_x;
	int mainwindow_pos_y;
	int mainwindow_height;
	int mainwindow_width;
	int connectSleepDelay; //< time beetween retry
	int connectSleepRetry; //< count of retries
	int tryConnectTimeout; //< timeout in at connecting
	int connectionStartTime;
	int runningCheckCounter;
	int runningCheckTimeout;
	int OpenvpnManagementPort;
	int AuthRetryCount; //< count of autn retry
	int maxConnectRetry; // max connect tries
	int currentConnectRetry;

	TQPtrList<ToolInfo> *ToolList;
	TQPtrList<VpnAccountData> *AccountList;
	VpnAccountData *currentProfile;

	TQColor InfoLogColor;
	TQColor RemoteLogColor;
	TQColor ErrorLogColor;
	TQColor SuccessLogColor;
	TQColor DebugLogColor;
	TQColor DebugBackgroundcolor;

	TQApplication *appPointer;
	TQPoint pos;
	ConnectionStatus status;
	TQFile logfile;
	TQTextStream logFileStream;
	TQTextEdit *LogOutput;
	KWallet::Wallet *wallet;
	TDEConfig* config; //< configuration data

	TQPoint WindowPos;
	TQSize WindowSize;

	struct IpsecImportSection {
		TQString SectionName;
		TQStringList SectionData;
	};
	
	TQPtrList<VpnAccountData> *ImportedAccountList;

	TQWidget *parent;
	KStatusBar *statusbar;

	/**
	 * Appends a log enty to debug console and log file
	 * @param msg the text to append
	 * @param type the type of the msg (info, debug, error, etc)
	 */
	void appendLogEntry( TQString msg, LogType type );

	/**
	 *  Sets the output textedit for debug output
	 * @param LogOutput
	 */
	void setLogOutput(TQTextEdit *LogOutput);

	/**
	* save configuration
	*/
	void saveOptions(bool saveOneProfile=false, TQString Profile="" );

	/**
	* load configuration
	*/
	void loadOptions();
	
	/**
	* check the value of the paths
	*/
	void checkStandardPathValues();

	/**
	 *  collects the information of the external helper programs
	 */
	void getToolsInfo();


	/**
	 *  removes a entry from configuration file
	 * @param Name the entry which should be removed
	 */
	void removeEntry(TQString Name);

	VpnAccountData* findProfile(TQPtrList<VpnAccountData> *list,const TQString& Name);
	TQString removeWhiteSpaceAtBegin(const TQString);

	void slotStatusMsg( const TQString &text, int id = ID_STATUS_MSG );
	void doBackupConfig();
	void restoreBackupConfig();

	bool exportKvpncConfig(TQString filename);
	bool importKvpncConfig(TQString filename, TQString& Name, bool& openProfileManager); //< true if profiles imported

	bool importIpsecConfig(TQString filename, TQString& Name, bool& openProfileManager);
	bool importFritzboxConfig(TQString filename, TQString& Name, bool& openProfileManager);

};

#endif