OPAL  Version 3.18.8
callprocessor.h
Go to the documentation of this file.
1 /*
2  *
3  * Inter Asterisk Exchange 2
4  *
5  * The core routine which determines the processing of packets for one call.
6  *
7  * Open Phone Abstraction Library (OPAL)
8  *
9  * Copyright (c) 2005 Indranet Technologies Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open Phone Abstraction Library.
22  *
23  * The Initial Developer of the Original Code is Indranet Technologies Ltd.
24  *
25  * The author of this code is Derek J Smithies
26  */
27 
28 #ifndef OPAL_IAX2_CALLPROCESSOR_H
29 #define OPAL_IAX2_CALLPROCESSOR_H
30 
31 #ifndef _PTLIB_H
32 #include <ptlib.h>
33 #endif
34 
35 #include <opal_config.h>
36 
37 #if OPAL_IAX2
38 
39 #include <opal/connection.h>
40 
41 #include <iax2/processor.h>
42 #include <iax2/frame.h>
43 #include <iax2/iedata.h>
44 #include <iax2/remote.h>
45 #include <iax2/safestrings.h>
46 #include <iax2/sound.h>
47 
48 class IAX2Connection;
49 
54 {
55  PCLASSINFO(IAX2CallProcessor, IAX2Processor);
56 
57  public:
58 
61 
63  virtual ~IAX2CallProcessor();
64 
66  void AssignConnection(IAX2Connection * _con);
67 
70  void PutSoundPacketToNetwork(PBYTEArray *sund);
71 
74 
76  void ClearCall(OpalConnection::CallEndReason releaseReason = OpalConnection::EndedByLocalUser);
77 
82  virtual void OnReleased();
83 
87  void SendDtmf(const PString & dtmfs);
88 
92  void SendText(const PString & text);
93 
100  virtual PBoolean SetUpConnection();
101 
104  PBoolean Matches(IAX2Frame *frame) { return remote == (frame->GetRemoteInfo()); }
105 
108  virtual void PrintOn(ostream & strm) const;
109 
112  void ReportStatistics();
113 
115  PBoolean MatchingLocalCallNumber(PINDEX compare) { return (compare == remote.SourceCallNumber()); }
116 
118  unsigned short GetSelectedCodec() { return (unsigned short) selectedCodec; }
119 
124  void AcceptIncomingCall();
125 
136  virtual PBoolean SetAlerting(
137  const PString & calleeName,
138  PBoolean withMedia
139  ) ;
140 
144  void Hangup(PString messageToSend);
145 
149 
151  void SendHold();
152 
154  void SendHoldRelease();
155 
162  void SetUserName(PString & inUserName) { userName = inUserName; };
163 
165  PString GetUserName() const;
166 
169  PString GetCallingName() const { return callingName; }
170 
177  void SetPassword(PString & inPassword) { password = inPassword; };
178 
180  PString GetPassword() const { return password; };
181 
184  void SendTransfer(
185  const PString & calledNumber,
186  const PString & calledContext = PString::Empty());
187 
190  void StartStatusCheckTimer(PINDEX msToWait = 10000 );
192 
199  virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff);
200 
205 
206  protected:
207 
210 
215  PBoolean RemoteSelectedCodecOk();
216 
220  void CheckForHangupMessages();
221 
223  void ProcessNetworkFrame(IAX2Frame * src);
224 
228 
232 
236 
240 
244 
248 
252 
259  virtual PBoolean ProcessNetworkFrame(IAX2FullFrameProtocol * src);
260 
264 
268 
272 
276 
279  virtual void ProcessLists();
280 
282  void ConnectToRemoteNode(PString & destination);
283 
285  void SendDtmfMessage(char message);
286 
288  void SendTextMessage(PString & message);
289 
292  void SendSoundMessage(PBYTEArray *sound);
293 
295  void SendTransferMessage();
296 
298  void SendQuelchMessage();
299 
301  void SendUnQuelchMessage();
302 
305 
308 
311 
314 
317  void RemoteNodeHasAnswered();
318 
322  void CallStopSounds();
323 
326  void ReceivedHookFlash();
327 
330  void RemoteNodeIsBusy();
331 
334  void ProcessIncomingAudioFrame(IAX2Frame *newFrame);
335 
338  void ProcessIncomingVideoFrame(IAX2Frame *newFrame);
339 
343 
347 
351 
355 
359 
363 
367 
371 
375 
379 
383 
387 
391 
395 
399 
403 
407 
411 
415 
419 
423 
427 
431 
435 
439 
443 
451 
458 
460  atomic<uint32_t> audioFramesSent;
461 
463  atomic<uint32_t> audioFramesRcvd;
464 
466  atomic<uint32_t> videoFramesSent;
467 
469  atomic<uint32_t> videoFramesRcvd;
470 
473 
476 
481 
485 
488 
491 
493  PBoolean holdCall;
494 
496  PBoolean holdReleaseCall;
497 
501 
511  };
512 
515 
519 
521  PBoolean audioCanFlow;
522 
525  unsigned int selectedCodec;
526 
528  enum CallStatus {
529  callNewed = 1 << 0,
530  callSentRinging = 1 << 1,
531  callRegistered = 1 << 2,
532  callAuthorised = 1 << 3,
533  callAccepted = 1 << 4,
534  callRinging = 1 << 5,
535  callAnswered = 1 << 6,
536  callTerminating = 1 << 7
537  };
538 
540  unsigned short callStatus;
541 
543  void SetCallSentRinging(PBoolean newValue = true)
544  { if (newValue) callStatus |= callSentRinging; else callStatus &= ~callSentRinging; }
545 
547  void SetCallNewed(PBoolean newValue = true)
548  { if (newValue) callStatus |= callNewed; else callStatus &= ~callNewed; }
549 
551  void SetCallRegistered(PBoolean newValue = true)
552  { if (newValue) callStatus |= callRegistered; else callStatus &= ~callRegistered; }
553 
555  void SetCallAuthorised(PBoolean newValue = true)
556  { if (newValue) callStatus |= callAuthorised; else callStatus &= ~callAuthorised; }
557 
559  void SetCallAccepted(PBoolean newValue = true)
560  { if (newValue) callStatus |= callAccepted; else callStatus &= ~callAccepted; }
561 
563  void SetCallRinging(PBoolean newValue = true)
564  { if (newValue) callStatus |= callRinging; else callStatus &= ~callRinging; }
565 
567  void SetCallAnswered(PBoolean newValue = true)
568  { if (newValue) callStatus |= callAnswered; else callStatus &= ~callAnswered; }
569 
571  void SetCallTerminating(PBoolean newValue = true)
572  { if (newValue) callStatus |= callTerminating; else callStatus &= ~callTerminating; }
573 
575  PBoolean IsCallHappening() { return callStatus > 0; }
576 
579  PBoolean IsCallNewed() { return callStatus & callNewed; }
580 
584 
586  PBoolean IsCallRegistered() { return callStatus & callRegistered; }
587 
589  PBoolean IsCallAuthorised() { return callStatus & callAuthorised; }
590 
592  PBoolean IsCallAccepted() { return callStatus & callAccepted; }
593 
595  PBoolean IsCallRinging() { return callStatus & callRinging; }
596 
598  PBoolean IsCallAnswered() { return callStatus & callAnswered; }
599 
600 #ifdef DOC_PLUS_PLUS
601 
607  void OnStatusCheck(PTimer &, INT);
608 #else
609  PDECLARE_NOTIFIER(PTimer, IAX2CallProcessor, OnStatusCheck);
610 #endif
611 
613  void DoStatusCheck();
614 
617  void RemoteNodeIsRinging();
618 
622  void RingingWasAcked();
623 
628  void AnswerWasAcked();
629 
633  PBoolean firstMediaFrame;
634 
637  PBoolean answerCallNow;
638 
644 
647 
651 
654 
659 
663 
666  virtual void OnNoResponseTimeout();
667 
669  virtual void ProcessFullFrame(IAX2FullFrame & fullFrame);
670 
673  PString callingName;
674 
678 
680  PString callingDnid;
681 
684  PString callingContext;
685 
689  PString userName;
690 
694  PString password;
695 
697  PDECLARE_MUTEX(transferMutex);
698 
700  PBoolean doTransfer;
701 
704 
707 
713 };
714 
716 
717 /* The comment below is magic for those who use emacs to edit this file.
718  * With the comment below, the tab key does auto indent to 2 spaces.
719  *
720  * Local Variables:
721  * mode:c
722  * c-basic-offset:2
723  * End:
724  */
725 
726 
727 #endif // OPAL_IAX2
728 
729 #endif // OPAL_IAX2_CALLPROCESSOR_H
unsigned short GetSelectedCodec()
Definition: callprocessor.h:118
void SendTransfer(const PString &calledNumber, const PString &calledContext=PString::Empty())
void SetPassword(PString &inPassword)
Definition: callprocessor.h:177
PString callingContext
Definition: callprocessor.h:684
void SendSoundMessage(PBYTEArray *sound)
Definition: callprocessor.h:530
PBoolean holdReleaseCall
Definition: callprocessor.h:496
void ProcessIaxCmdFwDownl(IAX2FullFrameProtocol *src)
virtual void ProcessFullFrame(IAX2FullFrame &fullFrame)
PBoolean IsCallAccepted()
Definition: callprocessor.h:592
void ProcessIaxCmdHangup(IAX2FullFrameProtocol *src)
void ProcessIaxCmdTxreq(IAX2FullFrameProtocol *src)
PString transferCalledContext
Definition: callprocessor.h:706
void SendText(const PString &text)
SoundBufferState
Definition: callprocessor.h:507
void ProcessIaxCmdAck(IAX2FullFrameProtocol *src)
Definition: frame.h:838
Definition: frame.h:667
PString transferCalledNumber
Definition: callprocessor.h:703
SafeString remotePhoneNumber
Definition: callprocessor.h:472
Definition: iax2ep.h:100
void IncAudioFramesSent()
Definition: callprocessor.h:304
void SetCallNewed(PBoolean newValue=true)
Definition: callprocessor.h:547
void SetCallAnswered(PBoolean newValue=true)
Definition: callprocessor.h:567
Definition: callprocessor.h:534
PBoolean audioCanFlow
Definition: callprocessor.h:521
Definition: callprocessor.h:508
PBoolean holdCall
Definition: callprocessor.h:493
atomic< uint32_t > videoFramesRcvd
Definition: callprocessor.h:469
Definition: iax2con.h:59
SafeStrings hangList
Definition: callprocessor.h:490
void SendUnQuelchMessage()
void ReceivedHookFlash()
PBoolean statusCheckOtherEnd
Definition: callprocessor.h:643
IAX2CallProcessor(IAX2EndPoint &ep)
void ProcessIaxCmdUnsupport(IAX2FullFrameProtocol *src)
PString GetUserName() const
Definition: callprocessor.h:529
void SendDtmfMessage(char message)
SafeStrings textList
Definition: callprocessor.h:484
Definition: frame.h:365
void RemoteNodeIsRinging()
void OnStatusCheck(PTimer &, INT)
void ProcessIaxCmdAccept(IAX2FullFrameProtocol *src)
void ConnectToRemoteNode(PString &destination)
Definition: safestrings.h:103
void IncVideoFramesSent()
Definition: callprocessor.h:310
Definition: frame.h:303
PString password
Definition: callprocessor.h:694
void SetCallAuthorised(PBoolean newValue=true)
Definition: callprocessor.h:555
void ProcessIaxCmdTxready(IAX2FullFrameProtocol *src)
void Hangup(PString messageToSend)
PBoolean IsCallTerminating()
Definition: callprocessor.h:148
PINDEX audioCompressedBytes
Definition: callprocessor.h:653
IAX2Remote remote
Definition: processor.h:223
PBoolean IsCallRegistered()
Definition: callprocessor.h:586
Definition: frame.h:1094
Definition: callprocessor.h:53
void ProcessIaxCmdAuthRep(IAX2FullFrameProtocol *src)
virtual void OnNoResponseTimeout()
void ProcessIaxCmdUnquelch(IAX2FullFrameProtocol *src)
void ProcessIaxCmdFwData(IAX2FullFrameProtocol *src)
void SendTextMessage(PString &message)
virtual void PrintOn(ostream &strm) const
SoundBufferState soundBufferState
Definition: callprocessor.h:514
PBoolean MatchingLocalCallNumber(PINDEX compare)
Definition: callprocessor.h:115
Definition: callprocessor.h:535
PString callingExtension
Definition: callprocessor.h:677
PString GetPassword() const
Definition: callprocessor.h:180
void SetCallTerminating(PBoolean newValue=true)
Definition: callprocessor.h:571
void ProcessIaxCmdDpRep(IAX2FullFrameProtocol *src)
Definition: callprocessor.h:531
void CheckForHangupMessages()
atomic< uint32_t > audioFramesSent
Definition: callprocessor.h:460
atomic< uint32_t > videoFramesSent
Definition: callprocessor.h:466
Definition: callprocessor.h:536
PBoolean RemoteSelectedCodecOk()
Definition: callprocessor.h:533
PDECLARE_MUTEX(transferMutex)
PString userName
Definition: callprocessor.h:689
Definition: frame.h:872
PBoolean doTransfer
Definition: callprocessor.h:700
void ProcessIaxCmdTxrel(IAX2FullFrameProtocol *src)
Definition: safestrings.h:49
void CheckForRemoteCapabilities(IAX2FullFrameProtocol *src)
void SetCallSentRinging(PBoolean newValue=true)
Definition: callprocessor.h:543
Definition: frame.h:1120
IAX2SoundList soundWaitingForTransmission
Definition: callprocessor.h:500
IAX2Connection * con
Definition: callprocessor.h:209
Definition: frame.h:1028
virtual PBoolean SetUpConnection()
void ProcessIaxCmdTxcnt(IAX2FullFrameProtocol *src)
PString callingName
Definition: callprocessor.h:673
void ProcessIaxCmdDial(IAX2FullFrameProtocol *src)
void ProcessIaxCmdNew(IAX2FullFrameProtocol *src)
void ProcessIaxCmdReject(IAX2FullFrameProtocol *src)
Definition: remote.h:338
Everything is functioning ok.
Definition: callprocessor.h:510
PTimer statusCheckTimer
Definition: callprocessor.h:646
PINDEX SourceCallNumber()
Definition: remote.h:70
void SetCallRegistered(PBoolean newValue=true)
Definition: callprocessor.h:551
void ProcessIaxCmdMwi(IAX2FullFrameProtocol *src)
Definition: frame.h:735
void ProcessIaxCmdQuelch(IAX2FullFrameProtocol *src)
PBoolean IsCallNewed()
Definition: callprocessor.h:579
Definition: processor.h:132
void SendDtmf(const PString &dtmfs)
Definition: frame.h:1067
void SendQuelchMessage()
void RemoteNodeHasAnswered()
void ProcessIaxCmdPage(IAX2FullFrameProtocol *src)
Definition: sound.h:61
void StartStatusCheckTimer(PINDEX msToWait=10000)
void ClearCall(OpalConnection::CallEndReason releaseReason=OpalConnection::EndedByLocalUser)
Definition: connection.h:462
Definition: frame.h:605
PBoolean IsCallAuthorised()
Definition: callprocessor.h:589
PINDEX lastFullFrameTimeStamp
Definition: callprocessor.h:518
unsigned int selectedCodec
Definition: callprocessor.h:525
void AssignConnection(IAX2Connection *_con)
void IncAudioFramesRcvd()
Definition: callprocessor.h:307
IAX2Remote & GetRemoteInfo()
Definition: frame.h:111
virtual void ProcessLists()
unsigned short callStatus
Definition: callprocessor.h:540
void ProcessNetworkFrame(IAX2Frame *src)
atomic< uint32_t > audioFramesRcvd
Definition: callprocessor.h:463
PINDEX audioFrameDuration
Definition: callprocessor.h:650
void AcceptIncomingCall()
void ProcessIaxCmdAuthReq(IAX2FullFrameProtocol *src)
SafeStrings callList
Definition: callprocessor.h:475
PBoolean audioFramesNotStarted
Definition: callprocessor.h:658
IAX2Encryption encryption
Definition: processor.h:249
virtual PBoolean SetAlerting(const PString &calleeName, PBoolean withMedia)
virtual void OnReleased()
PBoolean firstMediaFrame
Definition: callprocessor.h:633
PBoolean suppressHangupFrame
Definition: callprocessor.h:712
virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff)
void ProcessIaxCmdTxrej(IAX2FullFrameProtocol *src)
We need more sound packets to come in.
Definition: callprocessor.h:509
PBoolean IsCallHappening()
Definition: callprocessor.h:575
void ProcessIncomingAudioFrame(IAX2Frame *newFrame)
void ProcessIaxCmdTransfer(IAX2FullFrameProtocol *src)
PBoolean answerCallNow
Definition: callprocessor.h:637
PBoolean IsCallAnswered()
Definition: callprocessor.h:598
void ProcessIaxCmdTxacc(IAX2FullFrameProtocol *src)
Definition: callprocessor.h:532
Definition: frame.h:71
void ProcessIaxCmdInval(IAX2FullFrameProtocol *src)
PString callingDnid
Definition: callprocessor.h:680
void ProcessIncomingVideoFrame(IAX2Frame *newFrame)
void SetUserName(PString &inUserName)
Definition: callprocessor.h:162
PBoolean IsCallRinging()
Definition: callprocessor.h:595
void SetCallRinging(PBoolean newValue=true)
Definition: callprocessor.h:563
void PutSoundPacketToNetwork(PBYTEArray *sund)
void ProcessIaxCmdProvision(IAX2FullFrameProtocol *src)
IAX2Encryption & GetEncryptionInfo()
Definition: callprocessor.h:73
void SendAnswerMessageToRemoteNode()
void IncVideoFramesRcvd()
Definition: callprocessor.h:313
void ProcessIaxCmdDpReq(IAX2FullFrameProtocol *src)
PBoolean IsCallSentRinging()
Definition: callprocessor.h:583
SafeString dtmfText
Definition: callprocessor.h:480
PBoolean Matches(IAX2Frame *frame)
Definition: callprocessor.h:104
PString GetCallingName() const
Definition: callprocessor.h:169
Definition: frame.h:770
SafeStrings dtmfNetworkList
Definition: callprocessor.h:487
void SetCallAccepted(PBoolean newValue=true)
Definition: callprocessor.h:559
void SendTransferMessage()
IAX2FullFrameProtocol * BuildNewFrameForSending(IAX2FullFrameProtocol *inReplyTo=NULL)
CallStatus
Definition: callprocessor.h:528
virtual ~IAX2CallProcessor()
void ProcessIaxCmdCallToken(IAX2FullFrameProtocol *src)