/***************************************************************************
 *   Copyright (C) 2004 by Emil Stoyanov                                   *
 *   emosto@users.sourceforge.net                                          *
 *                                                                         *
 *   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 IAXWRAPPER_H
#define IAXWRAPPER_H

#include <qobject.h>
#include <qvariant.h>
#include <qpixmap.h>
#include <qapplication.h>
#include <qmainwindow.h>
#include <iaxclient.h>
#include <qevent.h>
#include <qmutex.h>
#include <qapplication.h>
#include <qtimer.h>
#include "iaxwrapperevent.h"
#include "kiaxprefs.h"
#include "kiaxaccount.h"
#include "kiaxcallrecord.h"

#include <stdarg.h>
#include <stdlib.h>

// A global callback function used by libiaxclient
int iaxc_callback(iaxc_event e);

class IaxWrapper : public QObject
{
Q_OBJECT

public:
    IaxWrapper(QObject *parent = 0, const char *name = 0);
    ~IaxWrapper();

public slots:
   
  /* High-Level GUI related methods */
  virtual void registerWithServer();
  virtual void unregisterFromServer();
  virtual void dial(QString accountId, QString contactName, QString contactNumber);
  virtual void answer_call(int callNo);
  virtual void hold_call(int callNo);
  virtual void resume_call(int callNo);
  virtual void interrupt_call();
  virtual void reject_call(int callNo);
  virtual void select_call(int callNumber);
  virtual void transfer_call(int callNo, QString number);
  virtual void send_dtmf(char digit);
  virtual void ring(); // called by the timer
  virtual void startRing();
  virtual void stopRing();
  
  /* Initialization routines */
  virtual bool init_iax_client();  // called from main win constructor
  virtual void start_iax_client();  // starts iaxclient thread
  virtual void stop_iax_client();  // stops iaxclient thread
  virtual int registerAccount(KiaxAccount* account); // register account
  virtual int unregisterAccount(KiaxAccount* account); // unregister account
  virtual void registerMultipleAccounts();
  virtual void configureCall(int accountNumber);
  virtual void shutdown_iax_client(); // called from ~IaxWrapper
  virtual iaxc_sound* initTone(int F1, int F2, int Dur, int Len, int Repeat);
  virtual void debugStatistics(int callNo, int callInterval);
  
public:  

   KiaxAccount* getAccountByRegistrationId(int regId);
   /* override eventHandling to receive events
   	from non-GUI Threads
   */
  virtual void customEvent(QCustomEvent * event); 
  int getSelectedCall();
  QString getIaxClientVersion();  
  /* Event Handling Routines */
  void handleIaxCEvent(iaxc_event e); // event callback
  void event_level(float in, float out); // monitors video and audio signal levels
  void event_registration(int id, int reply, int msgcount);// monitors registration status
  void event_state(int callNo, int state, char *remote, char *remote_name, char *local, char *local_context, int reg_id);
  void event_text(int type, char *message);
  void event_unknown(int type);
  
  KiaxPrefs * getSettings();
  KiaxCallRecord* createCallRecord(QString accountId, QString name, QString number, bool outgoing);  
  
  void debug(const char* log, ...);
  void setShowStats(bool flag);
  bool getShowStats();
protected slots:

  void callDuration();
    
public:  
  
  bool registered;     // to be sure we have a person who can receive calls
  QMap<int, KiaxCallRecord> callSession; //map callNo to callRecord
  QMutex callSessionMutex;
  
signals:
  
  /* Signals to notify the GUI */
  
  /* Wrapper events */
  //void signalCalling(QString callerId, QString callerStatus); //used only for ringing out
  void signalCalling(int callNumber, QString callerStatus); //used only for ringing out
  void signalAnsweredCall(int callNo);
  void signalHoldCall(int callNo);
  void signalResumedCall(int callNo);
  void signalRegistered();
  void signalUnregistered(); 
  
  /*Callback events */
  void signalLevels(int inValue, int outValue, int threshold ); // audio and mic levels
  void signalOutgoingRinging(int callNo); // ringing status of the tab created by singalCalling()
  void signalIncomingRinging(int callNo); // create tab and set status rining
  void signalComplete(int callNo); // call established, ready to speak
  void signalInactive(int callNo); // inactive call - hangup, forwarded to signalHangup(QString)
  void signalTextMessage(int id, int status); // inactive call - hangup, forwarded to   signalHangup(QString)
  //void signalUnregistrationRequested(KiaxAccount* account);
  void signalRegistrationRequested(KiaxAccount* account);
  //void signalRegistrationAccepted(KiaxAccount* account);
  //void signalRegistrationRejected(KiaxAccount* account);
  //void signalRegistrationTimeout(KiaxAccount* account);
  void signalTextMessage(QString message);
  void signalDebug(const char * error);
  
  void callTime(int callNo, int hours, int minutes, int seconds); // inform about the time of the call - every second
  void fatalError(QString message);
    
private:

  /* Lower level libiaxclient routines */
  void fatal_error(char *err);
  uint getCodecMaskFromName(QString codecName);
  int findAccountById(QString accountId);
private:
  KiaxPrefs * settings;
  struct iaxc_sound* ringInTone;
  struct iaxc_sound* ringOutTone;
  QTimer* ringTimer;
  QTimer* callDurationTimer;
  int * rtt;
  iaxc_netstat * localNetstat;
  iaxc_netstat * remoteNetstat;
  bool showStats;
  char* iaxc_ver;
};

#endif


syntax highlighted by Code2HTML, v. 0.9.1