00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef OPAL_IAX2_CALLPROCESSOR_H
00033 #define OPAL_IAX2_CALLPROCESSOR_H
00034
00035 #ifndef _PTLIB_H
00036 #include <ptlib.h>
00037 #endif
00038
00039 #include <opal/buildopts.h>
00040
00041 #if OPAL_IAX2
00042
00043 #include <opal/connection.h>
00044
00045 #include <iax2/processor.h>
00046 #include <iax2/frame.h>
00047 #include <iax2/iedata.h>
00048 #include <iax2/remote.h>
00049 #include <iax2/safestrings.h>
00050 #include <iax2/sound.h>
00051
00052 class IAX2Connection;
00053
00057 class IAX2CallProcessor : public IAX2Processor
00058 {
00059 PCLASSINFO(IAX2CallProcessor, IAX2Processor);
00060
00061 public:
00062
00064 IAX2CallProcessor(IAX2EndPoint & ep);
00065
00067 virtual ~IAX2CallProcessor();
00068
00070 void AssignConnection(IAX2Connection * _con);
00071
00074 void PutSoundPacketToNetwork(PBYTEArray *sund);
00075
00077 IAX2Encryption & GetEncryptionInfo() { return encryption; }
00078
00080 void ClearCall(OpalConnection::CallEndReason releaseReason = OpalConnection::EndedByLocalUser);
00081
00086 virtual void OnReleased();
00087
00091 void SendDtmf(const PString & dtmfs);
00092
00096 void SendText(const PString & text);
00097
00104 virtual PBoolean SetUpConnection();
00105
00108 PBoolean Matches(IAX2Frame *frame) { return remote == (frame->GetRemoteInfo()); }
00109
00112 virtual void PrintOn(ostream & strm) const;
00113
00116 void ReportStatistics();
00117
00119 PBoolean MatchingLocalCallNumber(PINDEX compare) { return (compare == remote.SourceCallNumber()); }
00120
00122 unsigned short GetSelectedCodec() { return (unsigned short) selectedCodec; }
00123
00128 void AcceptIncomingCall();
00129
00140 virtual PBoolean SetAlerting(
00141 const PString & calleeName,
00142 PBoolean withMedia
00143 ) ;
00144
00148 void Hangup(PString messageToSend);
00149
00152 PBoolean IsCallTerminating() { return callStatus & callTerminating; }
00153
00155 void SendHold();
00156
00158 void SendHoldRelease();
00159
00166 void SetUserName(PString & inUserName) { userName = inUserName; };
00167
00169 PString GetUserName() const;
00170
00173 PString GetCallingName() const { return callingName; }
00174
00181 void SetPassword(PString & inPassword) { password = inPassword; };
00182
00184 PString GetPassword() const { return password; };
00185
00188 void SendTransfer(
00189 const PString & calledNumber,
00190 const PString & calledContext = PString::Empty());
00191
00194 void StartStatusCheckTimer(PINDEX msToWait = 10000 );
00196
00203 virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff);
00204
00208 void SendAnswerMessageToRemoteNode();
00209
00210 protected:
00211
00213 IAX2Connection * con;
00214
00219 PBoolean RemoteSelectedCodecOk();
00220
00224 void CheckForHangupMessages();
00225
00227 void ProcessNetworkFrame(IAX2Frame * src);
00228
00231 void ProcessNetworkFrame(IAX2MiniFrame * src);
00232
00235 void ProcessNetworkFrame(IAX2FullFrame * src);
00236
00239 void ProcessNetworkFrame(IAX2FullFrameDtmf * src);
00240
00243 void ProcessNetworkFrame(IAX2FullFrameVoice * src);
00244
00247 void ProcessNetworkFrame(IAX2FullFrameVideo * src);
00248
00251 void ProcessNetworkFrame(IAX2FullFrameSessionControl * src);
00252
00255 void ProcessNetworkFrame(IAX2FullFrameNull * src);
00256
00263 virtual PBoolean ProcessNetworkFrame(IAX2FullFrameProtocol * src);
00264
00267 void ProcessNetworkFrame(IAX2FullFrameText * src);
00268
00271 void ProcessNetworkFrame(IAX2FullFrameImage * src);
00272
00275 void ProcessNetworkFrame(IAX2FullFrameHtml * src);
00276
00279 void ProcessNetworkFrame(IAX2FullFrameCng * src);
00280
00283 virtual void ProcessLists();
00284
00286 void ConnectToRemoteNode(PString & destination);
00287
00289 void SendDtmfMessage(char message);
00290
00292 void SendTextMessage(PString & message);
00293
00296 void SendSoundMessage(PBYTEArray *sound);
00297
00299 void SendTransferMessage();
00300
00302 void SendQuelchMessage();
00303
00305 void SendUnQuelchMessage();
00306
00308 void IncAudioFramesSent() { ++audioFramesSent; }
00309
00311 void IncAudioFramesRcvd() { ++audioFramesRcvd; }
00312
00314 void IncVideoFramesSent() { ++videoFramesSent; }
00315
00317 void IncVideoFramesRcvd() { ++videoFramesRcvd; }
00318
00321 void RemoteNodeHasAnswered();
00322
00326 void CallStopSounds();
00327
00330 void ReceivedHookFlash();
00331
00334 void RemoteNodeIsBusy();
00335
00338 void ProcessIncomingAudioFrame(IAX2Frame *newFrame);
00339
00342 void ProcessIncomingVideoFrame(IAX2Frame *newFrame);
00343
00346 void ProcessIaxCmdNew(IAX2FullFrameProtocol *src);
00347
00350 void ProcessIaxCmdAck(IAX2FullFrameProtocol *src);
00351
00354 void ProcessIaxCmdHangup(IAX2FullFrameProtocol *src);
00355
00358 void ProcessIaxCmdReject(IAX2FullFrameProtocol *src);
00359
00362 void ProcessIaxCmdAccept(IAX2FullFrameProtocol *src);
00363
00366 void ProcessIaxCmdAuthReq(IAX2FullFrameProtocol *src);
00367
00370 void ProcessIaxCmdAuthRep(IAX2FullFrameProtocol *src);
00371
00374 void ProcessIaxCmdInval(IAX2FullFrameProtocol *src);
00375
00378 void ProcessIaxCmdDpReq(IAX2FullFrameProtocol *src);
00379
00382 void ProcessIaxCmdDpRep(IAX2FullFrameProtocol *src);
00383
00386 void ProcessIaxCmdDial(IAX2FullFrameProtocol *src);
00387
00390 void ProcessIaxCmdTxreq(IAX2FullFrameProtocol *src);
00391
00394 void ProcessIaxCmdTxcnt(IAX2FullFrameProtocol *src);
00395
00398 void ProcessIaxCmdTxacc(IAX2FullFrameProtocol *src);
00399
00402 void ProcessIaxCmdTxready(IAX2FullFrameProtocol *src);
00403
00406 void ProcessIaxCmdTxrel(IAX2FullFrameProtocol *src);
00407
00410 void ProcessIaxCmdTxrej(IAX2FullFrameProtocol *src);
00411
00414 void ProcessIaxCmdQuelch(IAX2FullFrameProtocol *src);
00415
00418 void ProcessIaxCmdUnquelch(IAX2FullFrameProtocol *src);
00419
00422 void ProcessIaxCmdPage(IAX2FullFrameProtocol *src);
00423
00426 void ProcessIaxCmdMwi(IAX2FullFrameProtocol *src);
00427
00430 void ProcessIaxCmdUnsupport(IAX2FullFrameProtocol *src);
00431
00434 void ProcessIaxCmdTransfer(IAX2FullFrameProtocol *src);
00435
00438 void ProcessIaxCmdProvision(IAX2FullFrameProtocol *src);
00439
00442 void ProcessIaxCmdFwDownl(IAX2FullFrameProtocol *src);
00443
00446 void ProcessIaxCmdFwData(IAX2FullFrameProtocol *src);
00447
00454 void ProcessIaxCmdCallToken(IAX2FullFrameProtocol *src);
00455
00461 IAX2FullFrameProtocol *BuildNewFrameForSending(IAX2FullFrameProtocol *inReplyTo = NULL);
00462
00464 PAtomicInteger audioFramesSent;
00465
00467 PAtomicInteger audioFramesRcvd;
00468
00470 PAtomicInteger videoFramesSent;
00471
00473 PAtomicInteger videoFramesRcvd;
00474
00476 SafeString remotePhoneNumber;
00477
00479 SafeStrings callList;
00480
00484 SafeString dtmfText;
00485
00488 SafeStrings textList;
00489
00491 SafeStrings dtmfNetworkList;
00492
00494 SafeStrings hangList;
00495
00497 PBoolean holdCall;
00498
00500 PBoolean holdReleaseCall;
00501
00504 IAX2SoundList soundWaitingForTransmission;
00505
00511 enum SoundBufferState {
00512 BufferToSmall,
00513 Normal,
00514 BufferToBig
00515 };
00516
00518 SoundBufferState soundBufferState;
00519
00522 PINDEX lastFullFrameTimeStamp;
00523
00525 PBoolean audioCanFlow;
00526
00529 unsigned int selectedCodec;
00530
00532 enum CallStatus {
00533 callNewed = 1 << 0,
00534 callSentRinging = 1 << 1,
00535 callRegistered = 1 << 2,
00536 callAuthorised = 1 << 3,
00537 callAccepted = 1 << 4,
00538 callRinging = 1 << 5,
00539 callAnswered = 1 << 6,
00540 callTerminating = 1 << 7
00541 };
00542
00544 unsigned short callStatus;
00545
00547 void SetCallSentRinging(PBoolean newValue = true)
00548 { if (newValue) callStatus |= callSentRinging; else callStatus &= ~callSentRinging; }
00549
00551 void SetCallNewed(PBoolean newValue = true)
00552 { if (newValue) callStatus |= callNewed; else callStatus &= ~callNewed; }
00553
00555 void SetCallRegistered(PBoolean newValue = true)
00556 { if (newValue) callStatus |= callRegistered; else callStatus &= ~callRegistered; }
00557
00559 void SetCallAuthorised(PBoolean newValue = true)
00560 { if (newValue) callStatus |= callAuthorised; else callStatus &= ~callAuthorised; }
00561
00563 void SetCallAccepted(PBoolean newValue = true)
00564 { if (newValue) callStatus |= callAccepted; else callStatus &= ~callAccepted; }
00565
00567 void SetCallRinging(PBoolean newValue = true)
00568 { if (newValue) callStatus |= callRinging; else callStatus &= ~callRinging; }
00569
00571 void SetCallAnswered(PBoolean newValue = true)
00572 { if (newValue) callStatus |= callAnswered; else callStatus &= ~callAnswered; }
00573
00575 void SetCallTerminating(PBoolean newValue = true)
00576 { if (newValue) callStatus |= callTerminating; else callStatus &= ~callTerminating; }
00577
00579 PBoolean IsCallHappening() { return callStatus > 0; }
00580
00583 PBoolean IsCallNewed() { return callStatus & callNewed; }
00584
00587 PBoolean IsCallSentRinging() { return callStatus & callSentRinging; }
00588
00590 PBoolean IsCallRegistered() { return callStatus & callRegistered; }
00591
00593 PBoolean IsCallAuthorised() { return callStatus & callAuthorised; }
00594
00596 PBoolean IsCallAccepted() { return callStatus & callAccepted; }
00597
00599 PBoolean IsCallRinging() { return callStatus & callRinging; }
00600
00602 PBoolean IsCallAnswered() { return callStatus & callAnswered; }
00603
00604 #ifdef DOC_PLUS_PLUS
00605
00611 void OnStatusCheck(PTimer &, INT);
00612 #else
00613 PDECLARE_NOTIFIER(PTimer, IAX2CallProcessor, OnStatusCheck);
00614 #endif
00615
00617 void DoStatusCheck();
00618
00621 void RemoteNodeIsRinging();
00622
00626 void RingingWasAcked();
00627
00632 void AnswerWasAcked();
00633
00637 PBoolean firstMediaFrame;
00638
00641 PBoolean answerCallNow;
00642
00647 PBoolean statusCheckOtherEnd;
00648
00650 PTimer statusCheckTimer;
00651
00654 PINDEX audioFrameDuration;
00655
00657 PINDEX audioCompressedBytes;
00658
00662 PBoolean audioFramesNotStarted;
00663
00666 void CheckForRemoteCapabilities(IAX2FullFrameProtocol *src);
00667
00670 virtual void OnNoResponseTimeout();
00671
00673 virtual void ProcessFullFrame(IAX2FullFrame & fullFrame);
00674
00677 PString callingName;
00678
00681 PString callingExtension;
00682
00684 PString callingDnid;
00685
00688 PString callingContext;
00689
00693 PString userName;
00694
00698 PString password;
00699
00701 PMutex transferMutex;
00702
00704 PBoolean doTransfer;
00705
00707 PString transferCalledNumber;
00708
00710 PString transferCalledContext;
00711
00716 PBoolean suppressHangupFrame;
00717 };
00718
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731 #endif // OPAL_IAX2
00732
00733 #endif // OPAL_IAX2_CALLPROCESSOR_H