OPAL
Version 3.10.10
|
#include <callprocessor.h>
Public Member Functions | |
IAX2CallProcessor (IAX2EndPoint &ep) | |
virtual | ~IAX2CallProcessor () |
void | AssignConnection (IAX2Connection *_con) |
void | PutSoundPacketToNetwork (PBYTEArray *sund) |
IAX2Encryption & | GetEncryptionInfo () |
void | ClearCall (OpalConnection::CallEndReason releaseReason=OpalConnection::EndedByLocalUser) |
virtual void | OnReleased () |
void | SendDtmf (const PString &dtmfs) |
void | SendText (const PString &text) |
virtual PBoolean | SetUpConnection () |
PBoolean | Matches (IAX2Frame *frame) |
virtual void | PrintOn (ostream &strm) const |
void | ReportStatistics () |
PBoolean | MatchingLocalCallNumber (PINDEX compare) |
unsigned short | GetSelectedCodec () |
void | AcceptIncomingCall () |
virtual PBoolean | SetAlerting (const PString &calleeName, PBoolean withMedia) |
void | Hangup (PString messageToSend) |
PBoolean | IsCallTerminating () |
void | SendHold () |
void | SendHoldRelease () |
void | SetUserName (PString &inUserName) |
PString | GetUserName () const |
PString | GetCallingName () const |
void | SetPassword (PString &inPassword) |
PString | GetPassword () const |
void | SendTransfer (const PString &calledNumber, const PString &calledContext=PString::Empty()) |
void | StartStatusCheckTimer (PINDEX msToWait=10000) |
virtual PBoolean | IncomingMessageOutOfOrder (IAX2FullFrame *ff) |
void | SendAnswerMessageToRemoteNode () |
![]() | |
IAX2Processor (IAX2EndPoint &ep) | |
virtual | ~IAX2Processor () |
IAX2SequenceNumbers & | GetSequenceInfo () |
IAX2Encryption & | GetEncryptionInfo () |
void | IncomingEthernetFrame (IAX2Frame *frame) |
IAX2EndPoint & | GetEndPoint () |
void | SetCallToken (const PString &newToken) |
PString | GetCallToken () |
IAX2Remote & | GetRemoteInfo () |
const PTimeInterval & | GetCallStartTick () |
void | Main () |
PBoolean | IsStatusQueryEthernetFrame (IAX2Frame *frame) |
void | SetSpecialPackets (PBoolean newValue) |
void | Terminate () |
void | Activate () |
void | ReportLists (PString &answer) |
Protected Attributes | |
IAX2Connection * | con |
![]() | |
IAX2EndPoint & | endpoint |
PTimeInterval | callStartTick |
IAX2Remote | remote |
PTimer | noResponseTimer |
IAX2WaitingForAck | nextTask |
PSyncPoint | activate |
PBoolean | endThread |
IAX2Encryption | encryption |
IAX2SequenceNumbers | sequence |
IAX2ActiveFrameList | frameList |
SafeString | callToken |
PBoolean | specialPackets |
PAtomicInteger | controlFramesSent |
PAtomicInteger | controlFramesRcvd |
IAX2IeData | ieData |
DWORD | currentSoundTimeStamp |
This class does the work of processing the lists of IAX packets (in and out) that are associated with each call. There is one IAX2CallProcessor per connection.
|
protected |
bit mask of the different flags to indicate call status
|
protected |
This is the current state of the sound buffer for the packets that are being recieved. It is used so if a bad event occurs like the buffer gets to big or the buffer gets to small then we can reduce the amount of audiable disturbances.
Enumerator | |
---|---|
BufferToSmall | |
Normal | We need more sound packets to come in. |
BufferToBig | Everything is functioning ok. We need the buffer size to be reduced there is too much latency |
IAX2CallProcessor::IAX2CallProcessor | ( | IAX2EndPoint & | ep | ) |
Construct this class
|
virtual |
Destructor
void IAX2CallProcessor::AcceptIncomingCall | ( | ) |
Send appropriate packets to the remote node to indicate we will accept this call. Note that this method is called from the endpoint thread, (not this IAX2Connection's thread). In other words, the application calls this method.
Referenced by GetSelectedCodec().
|
protected |
We have received an ack message from the remote node. The ack message was sent in response to our Answer message. Since the Answer message has been acked, we have to regard this call as Established();.
Referenced by IsCallAnswered().
void IAX2CallProcessor::AssignConnection | ( | IAX2Connection * | _con | ) |
Assign a pointer to the connection class to process, and starts thread
|
protected |
We have to send a new frame to the remote host. This builds the frame, and adds many of the information elements required. does not add the calltoken ie - that is added elsewhere. This method assumes this class already holds the relevant information on the destination box
Referenced by IncVideoFramesRcvd().
|
protected |
A stop sounds packet has been received, which means we have moved from waiting for the remote person to answer, to they have answered and media can flow in both directions
Referenced by IncVideoFramesRcvd().
|
protected |
Check to see if there is an outstanding request to send a hangup frame. This needs to be done in two places, so we use a routine to see if need to send a hanup frame.
|
protected |
If the incoming frame has Information Elements defining remote capability, define the list of remote capabilities
void IAX2CallProcessor::ClearCall | ( | OpalConnection::CallEndReason | releaseReason = OpalConnection::EndedByLocalUser | ) |
From the IAX2Connection class. CAlling this sends a hangup frame
Referenced by GetEncryptionInfo().
|
protected |
Make a call to a remote node
|
protected |
Code to send a PING and a LAGRQ packet to the remote endpoint
Referenced by IsCallAnswered().
|
inline |
Report the calling name - which we send to the remote endpoint when making a call
References callingName.
|
inline |
Get the iax2 encryption info
References ClearCall(), IAX2Processor::encryption, OpalConnection::EndedByLocalUser, OnReleased(), SendDtmf(), SendText(), and SetUpConnection().
|
inline |
Get the password
References IncomingMessageOutOfOrder(), password, SendAnswerMessageToRemoteNode(), SendTransfer(), and StartStatusCheckTimer().
|
inline |
Get the bit pattern of the selected codec
References AcceptIncomingCall(), Hangup(), selectedCodec, and SetAlerting().
PString IAX2CallProcessor::GetUserName | ( | ) | const |
Get the username
Referenced by SetUserName().
void IAX2CallProcessor::Hangup | ( | PString | messageToSend | ) |
Cause this thread to hangup the current call, but not die. Death will come soon though. The argument is placed in the iax2 hangup packet as the cause string.
Referenced by GetSelectedCodec().
|
inlineprotected |
Increment the count of audio frames received
References audioFramesRcvd.
|
inlineprotected |
Increment the count of audio frames sent
References audioFramesSent.
|
virtual |
Test the sequence number of the incoming frame. This is only valid for handling a call. If the message is outof order, the supplied fullframe is deleted.
Implements IAX2Processor.
Referenced by GetPassword().
|
inlineprotected |
Increment the count of video frames received
References BuildNewFrameForSending(), CallStopSounds(), ProcessIaxCmdAccept(), ProcessIaxCmdAck(), ProcessIaxCmdAuthRep(), ProcessIaxCmdAuthReq(), ProcessIaxCmdCallToken(), ProcessIaxCmdDial(), ProcessIaxCmdDpRep(), ProcessIaxCmdDpReq(), ProcessIaxCmdFwData(), ProcessIaxCmdFwDownl(), ProcessIaxCmdHangup(), ProcessIaxCmdInval(), ProcessIaxCmdMwi(), ProcessIaxCmdNew(), ProcessIaxCmdPage(), ProcessIaxCmdProvision(), ProcessIaxCmdQuelch(), ProcessIaxCmdReject(), ProcessIaxCmdTransfer(), ProcessIaxCmdTxacc(), ProcessIaxCmdTxcnt(), ProcessIaxCmdTxready(), ProcessIaxCmdTxrej(), ProcessIaxCmdTxrel(), ProcessIaxCmdTxreq(), ProcessIaxCmdUnquelch(), ProcessIaxCmdUnsupport(), ProcessIncomingAudioFrame(), ProcessIncomingVideoFrame(), ReceivedHookFlash(), RemoteNodeHasAnswered(), RemoteNodeIsBusy(), and videoFramesRcvd.
|
inlineprotected |
Increment the count of video frames sent
References videoFramesSent.
|
inlineprotected |
Get the current value of the call status flag callAccepted
References callAccepted.
|
inlineprotected |
Get the current value of the call status flag callAnswered
References AnswerWasAcked(), callAnswered, DoStatusCheck(), OnStatusCheck(), RemoteNodeIsRinging(), and RingingWasAcked().
|
inlineprotected |
Get the current value of the call status flag callAuthorised
References callAuthorised.
|
inlineprotected |
See if any of the flag bits are on, which indicate this call is actually active
|
inlineprotected |
Get marker to indicate that some packets have flowed etc for this call
References callNewed.
|
inlineprotected |
Get the current value of the call status flag callRegistered
References callRegistered.
|
inlineprotected |
Get the current value of the call status flag callRinging
References callRinging.
|
inlineprotected |
Get marker to indicate that we are waiting on the ack for the iaxcommandringing packet we sent
References callSentRinging.
|
inline |
Report the status of the flag callEndingNow, which indicates if the call is terminating under iax2 control
References callStatus, callTerminating, SendHold(), and SendHoldRelease().
Referenced by IAX2Connection::IsCallTerminating().
|
inline |
Return true if the remote info in the frame matches the remote info in this connection
References IAX2Frame::GetRemoteInfo(), PrintOn(), IAX2Processor::remote, and ReportStatistics().
|
inline |
Return true if the arg matches the source call number for this connection
References IAX2Processor::remote, and IAX2Remote::SourceCallNumber().
|
protectedvirtual |
A call back when there has been no acknowledgment and the timeout peroid has been reached
Implements IAX2Processor.
|
virtual |
Call back from the IAX2Connection class. This indicates the IAX2Connection class is in the final stages of destruction. At this point, we can terminate the thread that processors all iax packets
Referenced by GetEncryptionInfo().
|
protected |
A pwlib callback function to invoke another status check on the other endpoint
This method runs in a separate thread to the heart of the Connection. It is threadsafe, cause each of the elements in Connection (that are touched) are thread safe
Referenced by IsCallAnswered().
|
virtual |
A method to cause some of the values in this class to be formatted into a printable stream
Implements IAX2Processor.
Referenced by Matches().
|
protectedvirtual |
Process a full frame and respond accordingly to it
Implements IAX2Processor.
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Allow this call to procee
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Acknowledge a Reliably sent full frame
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is A reply, that contains authentication
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Ask remote end to supply authentication
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is CallToken. This is an authentication like packet that IAX2 added in sep 2009 to prevent a DOS attack from too many incoming callers.
Reply with a NEW packet and the calltoken from supplied frame.
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Request a dial on channel brought up TBD
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Request status of a dialplan entry
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Request status of a dialplan entry
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Firmware Data
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Download firmware
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Request to terminate this call
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Destroy this call immediately
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Stand-alone message waiting indicator
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Create a new call
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Paging description
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Provision device
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Stop audio/video transmission
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Refuse to accept this call. May happen if authentication faile
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Request remote transfer
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Transfer Accepted
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Transfer Connect
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Transfer ready
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Transfer reject
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Transfer release
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Transfer Request
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Resume audio/video transmission
Referenced by IncVideoFramesRcvd().
|
protected |
Process a FullFrameProtocol class, where the sub Class value is Unsupported message received
Referenced by IncVideoFramesRcvd().
|
protected |
Process the audio data portions of the Frame argument, which may be a MiniFrame or FullFrame
Referenced by IncVideoFramesRcvd().
|
protected |
Process the video data portions of the Frame argument, which may be a MiniFrame or FullFrame
Referenced by IncVideoFramesRcvd().
|
protectedvirtual |
Go through the three lists for incoming data (ethernet/sound/UI commands.
Implements IAX2Processor.
|
protected |
Internal method to process an incoming network frame of type IAX2Frame
|
protectedvirtual |
Internal method to process an incoming network frame of type IAX2MiniFrame
Implements IAX2Processor.
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrame
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameDtmf
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameVoice
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameVideo
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameSessionControl
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameNull
|
protectedvirtual |
Internal method to process an incoming network frame of type IAX2FullFrameProtocol.
A frame of FullFrameProtocol type is labelled as AST_FRAME_IAX in the asterisk souces, It will contain 0, 1, 2 or more Information Elements (Ie) in the data section.
Reimplemented from IAX2Processor.
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameText
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameImage
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameHtml
|
protected |
Internal method to process an incoming network frame of type IAX2FullFrameCng
void IAX2CallProcessor::PutSoundPacketToNetwork | ( | PBYTEArray * | sund | ) |
Handle a sound packet received from the sound device. Now onsend this to the remote endpoint.
|
protected |
A callback which is used to indicate that the remote party has sent us a hook flash message (i.e, their hook was flashed)
Referenced by IncVideoFramesRcvd().
|
protected |
A callback which is used to indicate the remote party has accepted our call. Media can flow now
Referenced by IncVideoFramesRcvd().
|
protected |
A callback which is used to indicate that the remote party has sent us a message stating they are busy.
Referenced by IncVideoFramesRcvd().
|
protected |
we have received a message that the remote node is ringing. Now wait for the remote user to answer.
Referenced by IsCallAnswered().
|
protected |
Test the value supplied in the format Ie is compatible.
void IAX2CallProcessor::ReportStatistics | ( | ) |
Invoked by the User interface, which causes the statistics (count of in/out packets) to be printed
Referenced by Matches().
|
protected |
We have told the remote node that our phone is ringing. they have acked this message. Now, we advise opal that our phone "should" be ringing, and does opal want to accept our call.
Referenced by IsCallAnswered().
void IAX2CallProcessor::SendAnswerMessageToRemoteNode | ( | ) |
Advise the other end that we have picked up the phone. This method is public, as it is called by the IAX2Connection class, in response to the user accepting an incoming call.
Referenced by GetPassword().
void IAX2CallProcessor::SendDtmf | ( | const PString & | dtmfs | ) |
Ask this IAX2CallProcessor to send dtmf to the remote endpoint. The dtmf is placed on a queue, ready for transmission in fullframes of type dtmf.
Referenced by GetEncryptionInfo().
|
protected |
Cause the dtmf full frames to go out for this dtmf character
void IAX2CallProcessor::SendHold | ( | ) |
Put the remote connection on hold
Referenced by IsCallTerminating().
void IAX2CallProcessor::SendHoldRelease | ( | ) |
Take the remote connection of hold
Referenced by IsCallTerminating().
|
protected |
Send a message to put the remote connection on hold
|
protected |
Cause a sound frame (which is full or mini) to be sent. The data in the array is already compressed.
void IAX2CallProcessor::SendText | ( | const PString & | text | ) |
Ask this IAX2CallProcessor to send text to the remote endpoint. The text is placed on a queue, ready for transmission in fullframes of type text.
Referenced by GetEncryptionInfo().
|
protected |
Cause the text full frames to go out for this text message
void IAX2CallProcessor::SendTransfer | ( | const PString & | calledNumber, |
const PString & | calledContext = PString::Empty() |
||
) |
Send a transfer request, to transfer the remote party to the specified number and optionally with a context
Referenced by GetPassword().
|
protected |
Sends a transfer message ONLY if doTransfer is true
|
protected |
Send a message to take the remote connection off hold
|
virtual |
Indicate to remote endpoint an alert is in progress. If this is an incoming connection and the AnswerCallResponse is in a AnswerCallDeferred or AnswerCallPending state, then this function is used to indicate to that endpoint that an alert is in progress. This is usually due to another connection which is in the call (the B party) has received an OnAlerting() indicating that its remoteendpoint is "ringing".
The default behaviour is pure.
withMedia | Name of endpoint being alerted. Open media with alerting |
Referenced by GetSelectedCodec().
|
inlineprotected |
Mark call status Accepted (argument determines flag status)
References callAccepted.
|
inlineprotected |
Mark call status Answered (argument determines flag status)
References callAnswered.
|
inlineprotected |
Mark call status Authorised (argument determines flag status)
References callAuthorised.
|
inlineprotected |
Mark call status as having received a new packet
References callNewed.
|
inlineprotected |
Mark call status Registered (argument determines flag status)
References callRegistered.
|
inlineprotected |
Mark call status Ringing (argument determines flag status)
References callRinging.
|
inlineprotected |
Mark call status as having sent a iaxcmdRinging packet
References callSentRinging.
|
inlineprotected |
Mark call status as terminated (is processing IAX2 hangup packets etc)
References callTerminating.
|
inline |
Set the password for when we connect to a remote node we use it as authentication. Note this must only be used before the main thread is started. This is optional because some servers do not required authentication, also if it is not set then the default iax2Ep password will be used instead.
References password.
|
virtual |
Start an outgoing connection. This function will initiate the connection to the remote entity, for example in H.323 it sends a SETUP, in SIP it sends an INVITE etc.
The behaviour at the opal level is pure. Here, the method is defined.
Referenced by GetEncryptionInfo().
|
inline |
Set the username for when we connect to a remote node we use it as authentication. Note this must only be used before the main thread is started. This is optional because some servers do not required authentication, also if it is not set then the default iax2Ep username will be used instead.
References GetUserName(), and userName.
void IAX2CallProcessor::StartStatusCheckTimer | ( | PINDEX | msToWait = 10000 | ) |
Set up the acceptable time (in milliseconds) to wait between doing status checks.
msToWait | time between status checks, default = 10 seconds |
Referenced by GetPassword().
|
protected |
Flag to indicate we have to answer this call (i.e. send a FullFrameSessionControl::answer packet).
|
protected |
Flag to indicate we are ready for audio to flow
|
protected |
The number of bytes from compressing one frame of audio
|
protected |
The time period, in ms, of each audio frame. It is used when determining the appropriate timestamp to go on a packet.
|
protected |
A flag to indicate we have yet to send an audio frame to remote endpoint. If this is on, then the first audio frame sent is a full one.
|
protected |
Count of the number of sound frames received
Referenced by IncAudioFramesRcvd().
|
protected |
Count of the number of sound frames sent
Referenced by IncAudioFramesSent().
|
protected |
the context index - used in creating a cmdNew packet for creating call
|
protected |
The Dnid - used in creating a cmdNew packet for creating call
|
protected |
The calling extension - derived from the destination of the call
|
protected |
The calling Name - used when we send a new packet to the remote host - this name is put the new packet
Referenced by GetCallingName().
|
protected |
Array of remote node we have to make a call to
|
protected |
Contains the bits stating what is happening in the call
Referenced by IsCallTerminating().
|
protected |
The connection class we are charged with running.
|
protected |
Whether we want a transfer event to occur or not
|
protected |
Array of received dtmf characters (These have come from the network)
|
protected |
Contains the concatanation of the dtmf we have to send to the remote endpoint. This string is sent a character at a time, one DTMF frame per character. This list is threadsafe.
|
protected |
Flag to indicate if we are waiting on the first full frame of media (voice or video). The arrival of this frame causes the IAX2Connection::OnEstablished method to be called.
|
protected |
Array of requests to end this current call
|
protected |
Flag to indicate we have to send hold call
|
protected |
Flag to indicate we have to send hold release
|
protected |
This is the timestamp of the last received full frame, which is used to reconstruct the timestamp of received MiniFrames
|
protected |
Optional password for when we connect to a remote node we use it as authentication. Note this must only be set before the main thread is started.
Referenced by GetPassword(), and SetPassword().
|
protected |
Phone number of the remote endpoint
|
protected |
Bitmask of FullFrameVoice::AudioSc values to specify which codec is used
Referenced by GetSelectedCodec().
|
protected |
This holds the current state for the sound recieving buffer
|
protected |
Array of sound packets read from the audio device, and is about to be transmitted to the remote node
|
protected |
Flag to indicate we need to do a status query on the other end. this means, send a PING and a LAGRQ packet, which happens every 10 seconds. The timer, timeStatusCheck controls when this happens
|
protected |
The timer which is used to do the status check
|
protected |
Flag to indicate we should not send the hangup frame on call termination. Normally, when a call ends, we send a hangup frame. However, in the case where the remote endpoint rejects our call, we are not supposed to send a hangup frame
|
protected |
Array of the text we have to send to the remote endpoint. This array is threadsafe.
|
protected |
The context to call for a transfer – this is optional
|
protected |
The number to call for a transfer
|
protected |
A mutex to make the transfer related fields atomic
|
protected |
Optional username for when we connect to a remote node we use it as authentication. Note this must only be set before the main thread is started.
Referenced by SetUserName().
|
protected |
Count of the number of video frames received
Referenced by IncVideoFramesRcvd().
|
protected |
Count of the number of video frames sent
Referenced by IncVideoFramesSent().