/* -*- C++ -*-
 *
 *            kPPP: A pppd front end for the KDE project
 *
 * $Id: pppdata.h 728852 2007-10-24 13:08:37Z ossi $
 *
 *            Copyright (C) 1997 Bernd Johannes Wuebben
 *                   wuebben@math.cornell.edu
 *
 * based on EzPPP:
 * Copyright (C) 1997  Jay Painter
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this program; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef _PPPDATA_H_
#define _PPPDATA_H_

#include <unistd.h>
#include <sys/types.h>

#include <qstring.h>
#include <qstringlist.h>
#include <qcolor.h>
#include <ksharedconfig.h>

#include "kpppconfig.h"


// string lengths

#define PATH_SIZE 120
#define MODEMSTR_SIZE 80
#define ACCNAME_SIZE 50
#define PHONENUMBER_SIZE 60
#define COMMAND_SIZE 255
#define IPADDR_SIZE 15
#define DOMAIN_SIZE 50
#define TIMEOUT_SIZE 60

//
// keys for config file
//

// groups
#define GENERAL_GRP        "General"
#define MODEM_GRP          "Modem"
#define ACCOUNT_GRP        "Account"
#define GRAPH_GRP          "Graph"
#define WINPOS_GRP         "WindowPosition"

// general
#define DEFAULTACCOUNT_KEY "DefaultAccount"
#define DEFAULTMODEM_KEY   "DefaultModem"
#define PPPDVERSION_KEY    "pppdVersion"
#define PPPDTIMEOUT_KEY    "pppdTimeout"
#define SHOWCLOCK_KEY      "ShowClock"
#define SHOWLOGWIN_KEY     "ShowLogWindow"
#define AUTOREDIAL_KEY     "AutomaticRedial"
#define DISCONNECT_KEY     "DisconnectOnXServerExit"
#define QUITONDISCONNECT_KEY "QuitOnDisconnect"
#define NUMACCOUNTS_KEY    "NumberOfAccounts"
#define NUMMODEMS_KEY      "NumberOfModems"
#define REDIALONNOCARR_KEY "RedialOnNoCarrier"
#define ID_KEY		   "ID"

// modem
#define MOD_NAME_KEY       "Name"
#define MODEMDEV_KEY       "Device"
#define LOCKFILE_KEY       "UseLockFile"
#define FLOWCONTROL_KEY    "FlowControl"
#define SPEED_KEY          "Speed"
#define TIMEOUT_KEY        "Timeout"
#define TONEDURATION_KEY   "ToneDuration"
#define BUSYWAIT_KEY       "BusyWait"
#define INITSTR_KEY        "InitString"
#define INITRESP_KEY       "InitResponse"
#define PREINITDELAY_KEY   "PreInitDelay"
#define INITDELAY_KEY      "InitDelay"
#define NODTDETECT_KEY     "NoDialToneDetection"
#define DIALTONEWAIT_KEY   "WaitForDialTone"
#define DIALSTR_KEY        "DialString"
#define CONNECTRESP_KEY    "ConnectResponse"
#define BUSYRESP_KEY       "BusyResponse"
#define NOCARRIERRESP_KEY  "NoCarrierResponse"
#define NODIALTONERESP_KEY "NoDialToneResp"
#define HANGUPSTR_KEY      "HangupString"
#define HANGUPRESP_KEY     "HangUpResponse"
#define DLPRESP_KEY        "DLPResponse"
#define ANSWERSTR_KEY      "AnswerString"
#define RINGRESP_KEY       "RingResponse"
#define ANSWERRESP_KEY     "AnswerResponse"
#define ENTER_KEY          "Enter"
#define ESCAPESTR_KEY      "EscapeString"
#define ESCAPERESP_KEY     "EscapeResponse"
#define ESCAPEGUARDTIME_KEY "EscapeGuardTime"
#define USECDLINE_KEY      "UseCDLine"
#define VOLUME_HIGH        "VolumeHigh"
#define VOLUME_MEDIUM      "VolumeMedium"
#define VOLUME_OFF         "VolumeOff"
#define VOLUME_KEY         "Volume"

// account
#define ACC_NAME_KEY       "Name"
#define PHONENUMBER_KEY    "Phonenumber"
#define DIAL_PREFIX_KEY    "DialPrefix"
#define AUTH_KEY           "Authentication"
#define STORED_PASSWORD_KEY "Password"
#define STORED_USERNAME_KEY "Username"
#define STORE_PASSWORD_KEY "StorePassword"
#define CALLBACK_TYPE_KEY  "CallbackType"
#define CALLBACK_PHONE_KEY "CallbackPhone"
#define BEFORE_CONNECT_KEY  "BeforeConnect"
#define COMMAND_KEY        "Command"
#define DISCONNECT_COMMAND_KEY "DisconnectCommand"
#define BEFORE_DISCONNECT_KEY  "BeforeDisconnect"
#define IPADDR_KEY         "IPAddr"
#define SUBNETMASK_KEY     "SubnetMask"
#define ACCTENABLED_KEY    "AccountingEnabled"
#define VOLACCTENABLED_KEY "VolumeAccountingEnabled"
#define ACCTFILE_KEY       "AccountingFile"
#define AUTONAME_KEY       "AutoName"
#define GATEWAY_KEY        "Gateway"
#define DEFAULTROUTE_KEY   "DefaultRoute"
#define DOMAIN_KEY         "Domain"
#define DNS_KEY            "DNS"
#define AUTODNS_KEY        "AutoDNS"
#define EXDNSDISABLED_KEY  "ExDNSDisabled"
#define SCRIPTCOM_KEY      "ScriptCommands"
#define SCRIPTARG_KEY      "ScriptArguments"
#define PPPDARG_KEY        "pppdArguments"
#define PPP_DEBUG_OPTION   "PPPDebug"
#define ICONIFY_ON_CONNECT_KEY "iconifyOnConnect"
#define DOCKING_KEY        "DockIntoPanel"
#define TOTALCOSTS_KEY     "TotalCosts"
#define TOTALBYTES_KEY     "TotalBytes"

// graph colors
#define GENABLED           "Enabled"
#define GCOLOR_BG          "Background"
#define GCOLOR_TEXT        "Text"
#define GCOLOR_IN          "InBytes"
#define GCOLOR_OUT         "OutBytes"

// pppd errors
#define E_IF_TIMEOUT       1
#define E_PPPD_DIED        2
#define E_CBCP_WAIT       14

// window position
#define WINPOS_CONWIN_X    "WindowPositionConWinX"
#define WINPOS_CONWIN_Y    "WindowPositionConWinY"
#define WINPOS_STATWIN_X   "WindowPositionStatWinX"
#define WINPOS_STATWIN_Y   "WindowPositionStatWinY"

class PPPData {
public:
  PPPData();
  ~PPPData() {}

  enum { NumInitStrings = 2 };

  // general functions
  bool open();
  void save();
  void cancel();
  int  access() const;       // read/write access

  // function to read/write date to configuration file
  QString readConfig(const QString &, const QString &, const QString &);
  int readNumConfig(const QString &, const QString &, int);
  bool readListConfig(const QString &, const QString &, QStringList &);
  void writeConfig(const QString &, const QString &, const QString &);
  void writeConfig(const QString &, const QString &, int);
  void writeListConfig(const QString &, const QString &, QStringList &);

  // return the current account group
  QString currentAccountGroup() { return caccountgroup; }
  // return the current modem group
  QString currentModemGroup() { return cmodemgroup; }

  // functions to set/get general kppp info
  QString password() const;
  void setPassword(const QString &);

  const QString defaultAccount();
  void setDefaultAccount(const QString &);

	const QString defaultModem();
  void setDefaultModem(const QString &);

  void set_xserver_exit_disconnect(bool set);
  bool get_xserver_exit_disconnect();

  void set_redial_on_nocarrier(bool set);
  bool get_redial_on_nocarrier();

  void setPPPDebug(bool set);
  bool getPPPDebug();

  void set_quit_on_disconnect(bool);
  bool quit_on_disconnect();

  void set_show_clock_on_caption(bool set);
  bool get_show_clock_on_caption();

  void set_show_log_window(bool set);
  bool get_show_log_window();

  void set_automatic_redial(bool set);
  bool automatic_redial();

  void set_iconify_on_connect(bool set);
  bool get_iconify_on_connect();

  void set_dock_into_panel(bool set);
  bool get_dock_into_panel();

  const QString enter();
  void setEnter(const QString &);

  QString pppdVersion();
  bool pppdVersionMin(int ver, int mod, int patch);

  int pppdTimeout();
  void setpppdTimeout(int);

	// functions to set/get account information
  int modemCount() const;
  bool setModem(const QString &);
  bool setModemByIndex(int);

  bool isUniqueModname(const QString &);

  bool deleteModem();
  bool deleteModem(const QString &);
  int newmodem();
  int copymodem(int i);

  const QString modname();
  void setModname(const QString &);


  int busyWait();
  void setbusyWait(int);

  bool modemLockFile();
  void setModemLockFile(bool set);

  int modemEscapeGuardTime();
  void setModemEscapeGuardTime(int i);

  void setModemEscapeStr(const QString &);
  const QString modemEscapeStr();

  void setModemEscapeResp(const QString &);
  const QString modemEscapeResp();

  const QString modemDevice();
  void setModemDevice(const QString &);

  QString flowcontrol();
  void setFlowcontrol(const QString &);

  int modemTimeout();
  void setModemTimeout(int);

  int modemToneDuration();
  void setModemToneDuration(int);

  QString volumeInitString();
  int volume();
  void setVolume(int);

  int waitForDialTone();
  void setWaitForDialTone(int i);

  // modem command strings/responses
  const QString modemInitStr(int i);
  void setModemInitStr(int i, const QString &);

  const QString modemInitResp();
  void setModemInitResp(const QString &);

  int modemPreInitDelay();
  void setModemPreInitDelay(int);

  int modemInitDelay();
  void setModemInitDelay(int);

  QString modemNoDialToneDetectionStr();
  void setModemNoDialToneDetectionStr(const QString &);

  const QString modemDialStr();
  void setModemDialStr(const QString &);

  const QString modemConnectResp();
  void setModemConnectResp(const QString &);

  const QString modemBusyResp();
  void setModemBusyResp(const QString &);

  const QString modemNoCarrierResp();
  void setModemNoCarrierResp(const QString &);

  const QString modemNoDialtoneResp();
  void setModemNoDialtoneResp(const QString &);

  const QString modemHangupStr();
  void setModemHangupStr(const QString &);

  const QString modemHangupResp();
  void setModemHangupResp(const QString &);

  QString modemDLPResp();
  void setModemDLPResp(const QString &);

  const QString modemAnswerStr();
  void setModemAnswerStr(const QString &);

  const QString modemRingResp();
  void setModemRingResp(const QString &);

  const QString modemAnswerResp();
  void setModemAnswerResp(const QString &);

  QString volumeOff();
  void setVolumeOff(const QString &);

  QString volumeMedium();
  void setVolumeMedium(const QString &);

  QString volumeHigh();
  void setVolumeHigh(const QString &);

#if 0
  void setUseCDLine(const int n);
  int  UseCDLine();
#endif

  // functions to set/get account information
  int accountCount() const;
  bool setAccount(const QString &);
  bool setAccountByIndex(int);

  bool isUniqueAccname(const QString &);

  bool deleteAccount();
  bool deleteAccount(const QString &);
  int newaccount();
  int copyaccount(int i);

  const QString accname();
  void setAccname(const QString &);

  QStringList &phonenumbers();
  const QString phonenumber();
  void setPhonenumber(const QString &);

  const QString dialPrefix();
  void setDialPrefix(const QString &);

  int authMethod();
  void setAuthMethod(int);

  const QString storedUsername();
  void setStoredUsername(const QString &);

  const QString storedPassword();
  void setStoredPassword(const QString &);

  bool storePassword();
  void setStorePassword(bool);

  int callbackType();
  void setCallbackType(int);

  QString callbackPhone();
  void setCallbackPhone(const QString &);

  bool waitCallback();
  void setWaitCallback(bool);

  const QString speed();
  void setSpeed(const QString &);

  const QString command_before_connect();
  void setCommand_before_connect(const QString &);

  const QString command_on_connect();
  void setCommand_on_connect(const QString &);

  const QString command_on_disconnect();
  void setCommand_on_disconnect(const QString &);

  const QString command_before_disconnect();
  void setCommand_before_disconnect(const QString &);

  const QString ipaddr();
  void setIpaddr(const QString &);

  const QString subnetmask();
  void setSubnetmask(const QString &);

  bool AcctEnabled();
  void setAcctEnabled(bool set);

  int VolAcctEnabled();
  void setVolAcctEnabled(int set);

  bool autoDNS();
  void setAutoDNS(bool set);

  bool exDNSDisabled();
  void setExDNSDisabled(bool set);

  bool autoname();
  void setAutoname(bool set);

  const QString gateway();
  void setGateway(const QString &);

  bool defaultroute();
  void setDefaultroute(bool set);

  QStringList &dns();
  void setDns(QStringList &);

  const QString domain();
  void setDomain(const QString &);

  QStringList &scriptType();
  void setScriptType(QStringList &);

  QStringList &script();
  void setScript(QStringList &);

  QStringList &pppdArgument();
  void setpppdArgumentDefaults();
  void setpppdArgument(QStringList &);

  //functions to change/set the child pppd process info
  bool pppdRunning() const;
  void setpppdRunning(bool set);

  int pppdError() const;
  void setpppdError(int err);

  // functions to set/query the accounting info
  const QString accountingFile();
  void setAccountingFile(const QString &);

  const QString totalCosts();
  void setTotalCosts(const QString &);

  int totalBytes();
  void  setTotalBytes(int);

  // graphing widget
  void setGraphingOptions(bool enabled,
			  QColor bg,
			  QColor text,
			  QColor in,
			  QColor out);
  void graphingOptions(bool &enabled,
		       QColor &bg,
		       QColor &text,
		       QColor &in,
		       QColor &out);
  bool graphingEnabled();

  // window positions
  void winPosConWin(int &, int &);
  void setWinPosConWin(int, int);
  void winPosStatWin(int &, int &);
  void setWinPosStatWin(int, int);

private:
  QString passwd;
  KSharedConfig::Ptr config;                       // configuration object
  int accounthighcount;                  // index of highest account
  int caccount;                          // index of the current account
	int modemhighcount;                    // index of highest modem
  int cmodem;                            // index of the current modem
  QString cmodemgroup;                   // name of current modem group
  QString caccountgroup;                 // name of current account group
  pid_t suidprocessid;                   // process ID of setuid child
  bool pppdisrunning;                    // pppd process
                                         // daemon
  int pppderror;                         // error encounterd running pppd
  int pppdVer, pppdMod, pppdPatch;       // pppd version
  bool waitcallback;			 // callback waiting flag

  QStringList phonelist;
};

extern PPPData gpppdata;

#endif
