Skip to content
Snippets Groups Projects
Select Git revision
  • 329879d09e290ee25f3d61378c02632ef44b0c46
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/windowsReleaseTest
  • release/releaseTest
  • release/releaseWindowsTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 4.0.0
  • 2.2.0
  • 2.1.0
  • 2.0.1
  • 2.0.0
  • 1.4.1
  • 1.4.0
  • 1.3.0
  • 1.2.0
  • 1.1.0
31 results

Call.cpp

Blame
  • user avatar
    Jérémy Quentin authored
    329879d0
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Call.cpp 10.33 KiB
    #include "Call.h"
    
    #include "callmanager_interface_p.h"
    #include "callmanager_interface_singleton.h"
    #include "SFLPhone.h"
    #include "sflphone_const.h"
    
    const call_state Call::stateActionMap [11][5] = 
    {
    //                      ACCEPT                  REFUSE             TRANSFER                   HOLD                           RECORD
    /*INCOMING     */  {CALL_STATE_CURRENT  , CALL_STATE_OVER  , CALL_STATE_OVER         , CALL_STATE_HOLD         ,  CALL_STATE_INCOMING     },
    /*RINGING      */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_RINGING      },
    /*CURRENT      */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_TRANSFER     , CALL_STATE_HOLD         ,  CALL_STATE_CURRENT      },
    /*DIALING      */  {CALL_STATE_RINGING  , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_DIALING      },
    /*HOLD         */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_TRANSF_HOLD  , CALL_STATE_CURRENT      ,  CALL_STATE_HOLD         },
    /*FAILURE      */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        },
    /*BUSY         */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        },
    /*TRANSFER     */  {CALL_STATE_OVER     , CALL_STATE_OVER  , CALL_STATE_CURRENT      , CALL_STATE_TRANSF_HOLD  ,  CALL_STATE_TRANSFER     },
    /*TRANSF_HOLD  */  {CALL_STATE_OVER     , CALL_STATE_OVER  , CALL_STATE_HOLD         , CALL_STATE_TRANSFER     ,  CALL_STATE_TRANSF_HOLD  },
    /*OVER         */  {CALL_STATE_ERROR    , CALL_STATE_ERROR , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        },
    /*ERROR        */  {CALL_STATE_ERROR    , CALL_STATE_ERROR , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        }
    };
    
    const call_state Call::stateChangedMap [11][6] = 
    {
    //                      RINGING                  CURRENT             BUSY                   HOLD                           HUNGUP           FAILURE
    /*INCOMING     */  {CALL_STATE_CURRENT  , CALL_STATE_OVER  , CALL_STATE_OVER         , CALL_STATE_HOLD         ,  CALL_STATE_INCOMING     },
    /*RINGING      */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_RINGING      },
    /*CURRENT      */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_TRANSFER     , CALL_STATE_HOLD         ,  CALL_STATE_CURRENT      },
    /*DIALING      */  {CALL_STATE_RINGING  , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_DIALING      },
    /*HOLD         */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_TRANSF_HOLD  , CALL_STATE_CURRENT      ,  CALL_STATE_HOLD         },
    /*FAILURE      */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        },
    /*BUSY         */  {CALL_STATE_ERROR    , CALL_STATE_OVER  , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        },
    /*TRANSFER     */  {CALL_STATE_OVER     , CALL_STATE_OVER  , CALL_STATE_CURRENT      , CALL_STATE_TRANSF_HOLD  ,  CALL_STATE_TRANSFER     },
    /*TRANSF_HOLD  */  {CALL_STATE_OVER     , CALL_STATE_OVER  , CALL_STATE_HOLD         , CALL_STATE_TRANSFER     ,  CALL_STATE_TRANSF_HOLD  },
    /*OVER         */  {CALL_STATE_ERROR    , CALL_STATE_ERROR , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        },
    /*ERROR        */  {CALL_STATE_ERROR    , CALL_STATE_ERROR , CALL_STATE_ERROR        , CALL_STATE_ERROR        ,  CALL_STATE_ERROR        }
    };
    
    const function Call::functionMap[11][5] = 
    { 
    //                      ACCEPT               REFUSE            TRANSFER                 HOLD                  RECORD
    /*INCOMING       */  {&Call::accept     , &Call::refuse   , &Call::acceptTransf   , &Call::acceptHold  ,  &Call::switchRecord  },
    /*RINGING        */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::nothing     ,  &Call::switchRecord  },
    /*CURRENT        */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::hold        ,  &Call::setRecord     },
    /*DIALING        */  {&Call::call       , &Call::nothing  , &Call::nothing        , &Call::nothing     ,  &Call::switchRecord  },
    /*HOLD           */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::unhold      ,  &Call::setRecord     },
    /*FAILURE        */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::nothing     ,  &Call::nothing       },
    /*BUSY           */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::nothing     ,  &Call::nothing       },
    /*TRANSFERT      */  {&Call::transfer   , &Call::hangUp   , &Call::nothing        , &Call::hold        ,  &Call::setRecord     },
    /*TRANSFERT_HOLD */  {&Call::transfer   , &Call::hangUp   , &Call::nothing        , &Call::unhold      ,  &Call::setRecord     },
    /*OVER           */  {&Call::nothing    , &Call::nothing  , &Call::nothing        , &Call::nothing     ,  &Call::nothing       },
    /*ERROR          */  {&Call::nothing    , &Call::nothing  , &Call::nothing        , &Call::nothing     ,  &Call::nothing       }
    };
    
    
    Call::Call(call_state startState, QString callId)
    {	
    	this->callId = callId;
    	this->item = new QListWidgetItem("");
    	this->recording = false;
    	this->currentState = startState;
    }
    
    Call::Call(call_state startState, QString callId, QString from, QString account)
    {
    	this->callId = callId;
    	this->item = new QListWidgetItem(from);
    	this->account = account;
    	this->recording = false;
    	this->currentState = startState;
    }
    
    Call::~Call()
    {
    	delete item;
    }
    	
    Call * Call::buildDialingCall(QString callId)
    {
    	Call * call = new Call(CALL_STATE_DIALING, callId);
    	return call;
    }
    
    Call * Call::buildIncomingCall(const QString & callId, const QString & from, const QString & account)
    {
    	Call * call = new Call(CALL_STATE_INCOMING, callId, from, account);
    	return call;
    }
    
    QListWidgetItem * Call::getItem()
    {
    	return item;
    }
    
    call_state Call::getState() const
    {
    	return currentState;
    }
    
    call_state Call::stateChanged(const QString & newState)
    {
    	if(newState == QString(CALL_STATE_CHANGE_HUNG_UP))
    	{
    		this->currentState = CALL_STATE_OVER;
    	}
    	else if(newState == QString(CALL_STATE_CHANGE_HOLD))
    	{
    		this->currentState = CALL_STATE_HOLD;
    	}
    	else if(newState == QString(CALL_STATE_CHANGE_UNHOLD_CURRENT))
    	{
    		this->currentState = CALL_STATE_CURRENT;
    	}
    	else if(newState == QString(CALL_STATE_CHANGE_CURRENT))
    	{
    		this->currentState = CALL_STATE_CURRENT;
    	}
    	else if(newState == QString(CALL_STATE_CHANGE_RINGING))
    	{
    		this->currentState = CALL_STATE_RINGING;
    	}
    	else if(newState == QString(CALL_STATE_CHANGE_UNHOLD_RECORD))
    	{
    		this->currentState = CALL_STATE_CURRENT;
    		this->recording = true;
    	}
    	return this->currentState;
    }
    
    call_state Call::action(call_action action, QString number)
    {
    	if(action == CALL_ACTION_STATE_CHANGED)
    	{
    		return stateChanged(number);
    	}
    	call_state previousState = currentState;
    	//execute the action associated with this transition
    	(this->*(functionMap[currentState][action]))(number);
    	//update the state
    	currentState = stateMap[currentState][action];
    	qDebug() << "Calling action " << action << " on call with state " << previousState << ". Become " << currentState;
    	//return the new state
    	return currentState;
    }
    
    QString Call::getCallId()
    {
    	return callId;
    }
    
    call_state Call::getCurrentState() const
    {
    	return currentState;
    }
    
    
    
    
    
    
    
    
    /*************************************************
    *************   Automate functions   *************
    *************************************************/
    
    
    void Call::nothing(QString number)
    {
    }
    
    void Call::accept(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Accepting call. callId : " << callId;
    	callManager.accept(callId);
    	this->startTime = & QDateTime::currentDateTime();
    	this->historyState = INCOMING;
    }
    
    void Call::refuse(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Refusing call. callId : " << callId;
    	callManager.refuse(callId);
    	this->startTime = & QDateTime::currentDateTime();
    	this->historyState = MISSED;
    }
    
    void Call::acceptTransf(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Accepting call and transfering it to number : " << number << ". callId : " << callId;
    	callManager.accept(callId);
    	callManager.transfert(callId, number);
    	//this->historyState = TRANSFERED;
    }
    
    void Call::acceptHold(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Accepting call and holding it. callId : " << callId;
    	callManager.accept(callId);
    	callManager.hold(callId);
    	this->historyState = INCOMING;
    }
    
    void Call::hangUp(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Hanging up call. callId : " << callId;
    	callManager.hangUp(callId);
    }
    
    void Call::hold(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Holding call. callId : " << callId;
    	callManager.hold(callId);
    }
    
    void Call::call(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	this->account = SFLPhone::firstAccount();
    	qDebug() << "Calling " << number << " with account " << this->account << ". callId : " << callId;
    	callManager.placeCall(account, callId, number);
    	this->historyState = OUTGOING;
    }
    
    void Call::transfer(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	QString account = SFLPhone::firstAccount();
    	qDebug() << "Transfering call to number : " << number << ". callId : " << callId;
    	callManager.transfert(callId, number);
    	this->stopTime = & QDateTime::currentDateTime();
    }
    
    void Call::unhold(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Unholding call. callId : " << callId;
    	callManager.unhold(callId);
    }
    
    void Call::switchRecord(QString number)
    {
    	qDebug() << "Switching record state for call automate. callId : " << callId;
    	recording = !recording;
    }
    
    void Call::setRecord(QString number)
    {
    	CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
    	qDebug() << "Setting record for call. callId : " << callId;
    	callManager.setRecording(callId);
    	recording = !recording;
    }