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 virtual void Release(OpalConnection::CallEndReason releaseReason = OpalConnection::EndedByLocalUser);
00081
00083 void ClearCall(OpalConnection::CallEndReason releaseReason = OpalConnection::EndedByLocalUser);
00084
00089 virtual void OnReleased();
00090
00094 void SendDtmf(const PString & dtmfs);
00095
00099 void SendText(const PString & text);
00100
00107 virtual PBoolean SetUpConnection();
00108
00111 PBoolean Matches(IAX2Frame *frame) { return remote == (frame->GetRemoteInfo()); }
00112
00115 virtual void PrintOn(ostream & strm) const;
00116
00119 void ReportStatistics();
00120
00122 PBoolean MatchingLocalCallNumber(PINDEX compare) { return (compare == remote.SourceCallNumber()); }
00123
00125 unsigned short GetSelectedCodec() { return (unsigned short) selectedCodec; }
00126
00131 void AcceptIncomingCall();
00132
00143 virtual PBoolean SetAlerting(
00144 const PString & calleeName,
00145 PBoolean withMedia
00146 ) ;
00147
00151 void Hangup(PString messageToSend);
00152
00155 PBoolean IsCallTerminating() { return callStatus & callTerminating; }
00156
00158 void SendHold();
00159
00161 void SendHoldRelease();
00162
00169 void SetUserName(PString & inUserName) { userName = inUserName; };
00170
00172 PString GetUserName() const;
00173
00176 PString GetCallingName() const { return callingName; }
00177
00184 void SetPassword(PString & inPassword) { password = inPassword; };
00185
00187 PString GetPassword() const { return password; };
00188
00191 void SendTransfer(
00192 const PString & calledNumber,
00193 const PString & calledContext = PString::Empty());
00194
00197 void StartStatusCheckTimer(PINDEX msToWait = 10000 );
00199
00206 virtual PBoolean IncomingMessageOutOfOrder(IAX2FullFrame *ff);
00207
00211 void SendAnswerMessageToRemoteNode();
00212
00213 protected:
00214
00216 IAX2Connection * con;
00217
00222 PBoolean RemoteSelectedCodecOk();
00223
00227 void CheckForHangupMessages();
00228
00230 void ProcessNetworkFrame(IAX2Frame * src);
00231
00234 void ProcessNetworkFrame(IAX2MiniFrame * src);
00235
00238 void ProcessNetworkFrame(IAX2FullFrame * src);
00239
00242 void ProcessNetworkFrame(IAX2FullFrameDtmf * src);
00243
00246 void ProcessNetworkFrame(IAX2FullFrameVoice * src);
00247
00250 void ProcessNetworkFrame(IAX2FullFrameVideo * src);
00251
00254 void ProcessNetworkFrame(IAX2FullFrameSessionControl * src);
00255
00258 void ProcessNetworkFrame(IAX2FullFrameNull * src);
00259
00266 virtual PBoolean ProcessNetworkFrame(IAX2FullFrameProtocol * src);
00267
00270 void ProcessNetworkFrame(IAX2FullFrameText * src);
00271
00274 void ProcessNetworkFrame(IAX2FullFrameImage * src);
00275
00278 void ProcessNetworkFrame(IAX2FullFrameHtml * src);
00279
00282 void ProcessNetworkFrame(IAX2FullFrameCng * src);
00283
00286 virtual void ProcessLists();
00287
00289 void ConnectToRemoteNode(PString & destination);
00290
00292 void SendDtmfMessage(char message);
00293
00295 void SendTextMessage(PString & message);
00296
00299 void SendSoundMessage(PBYTEArray *sound);
00300
00302 void SendTransferMessage();
00303
00305 void SendQuelchMessage();
00306
00308 void SendUnQuelchMessage();
00309
00311 void IncAudioFramesSent() { ++audioFramesSent; }
00312
00314 void IncAudioFramesRcvd() { ++audioFramesRcvd; }
00315
00317 void IncVideoFramesSent() { ++videoFramesSent; }
00318
00320 void IncVideoFramesRcvd() { ++videoFramesRcvd; }
00321
00324 void RemoteNodeHasAnswered();
00325
00329 void CallStopSounds();
00330
00333 void ReceivedHookFlash();
00334
00337 void RemoteNodeIsBusy();
00338
00341 void ProcessIncomingAudioFrame(IAX2Frame *newFrame);
00342
00345 void ProcessIncomingVideoFrame(IAX2Frame *newFrame);
00346
00349 void ProcessIaxCmdNew(IAX2FullFrameProtocol *src);
00350
00353 void ProcessIaxCmdAck(IAX2FullFrameProtocol *src);
00354
00357 void ProcessIaxCmdHangup(IAX2FullFrameProtocol *src);
00358
00361 void ProcessIaxCmdReject(IAX2FullFrameProtocol *src);
00362
00365 void ProcessIaxCmdAccept(IAX2FullFrameProtocol *src);
00366
00369 void ProcessIaxCmdAuthReq(IAX2FullFrameProtocol *src);
00370
00373 void ProcessIaxCmdAuthRep(IAX2FullFrameProtocol *src);
00374
00377 void ProcessIaxCmdInval(IAX2FullFrameProtocol *src);
00378
00381 void ProcessIaxCmdDpReq(IAX2FullFrameProtocol *src);
00382
00385 void ProcessIaxCmdDpRep(IAX2FullFrameProtocol *src);
00386
00389 void ProcessIaxCmdDial(IAX2FullFrameProtocol *src);
00390
00393 void ProcessIaxCmdTxreq(IAX2FullFrameProtocol *src);
00394
00397 void ProcessIaxCmdTxcnt(IAX2FullFrameProtocol *src);
00398
00401 void ProcessIaxCmdTxacc(IAX2FullFrameProtocol *src);
00402
00405 void ProcessIaxCmdTxready(IAX2FullFrameProtocol *src);
00406
00409 void ProcessIaxCmdTxrel(IAX2FullFrameProtocol *src);
00410
00413 void ProcessIaxCmdTxrej(IAX2FullFrameProtocol *src);
00414
00417 void ProcessIaxCmdQuelch(IAX2FullFrameProtocol *src);
00418
00421 void ProcessIaxCmdUnquelch(IAX2FullFrameProtocol *src);
00422
00425 void ProcessIaxCmdPage(IAX2FullFrameProtocol *src);
00426
00429 void ProcessIaxCmdMwi(IAX2FullFrameProtocol *src);
00430
00433 void ProcessIaxCmdUnsupport(IAX2FullFrameProtocol *src);
00434
00437 void ProcessIaxCmdTransfer(IAX2FullFrameProtocol *src);
00438
00441 void ProcessIaxCmdProvision(IAX2FullFrameProtocol *src);
00442
00445 void ProcessIaxCmdFwDownl(IAX2FullFrameProtocol *src);
00446
00449 void ProcessIaxCmdFwData(IAX2FullFrameProtocol *src);
00450
00457 void ProcessIaxCmdCallToken(IAX2FullFrameProtocol *src);
00458
00464 IAX2FullFrameProtocol *BuildNewFrameForSending(IAX2FullFrameProtocol *inReplyTo = NULL);
00465
00467 PAtomicInteger audioFramesSent;
00468
00470 PAtomicInteger audioFramesRcvd;
00471
00473 PAtomicInteger videoFramesSent;
00474
00476 PAtomicInteger videoFramesRcvd;
00477
00479 SafeString remotePhoneNumber;
00480
00482 SafeStrings callList;
00483
00487 SafeString dtmfText;
00488
00491 SafeStrings textList;
00492
00494 SafeStrings dtmfNetworkList;
00495
00497 SafeStrings hangList;
00498
00500 PBoolean holdCall;
00501
00503 PBoolean holdReleaseCall;
00504
00507 IAX2SoundList soundWaitingForTransmission;
00508
00514 enum SoundBufferState {
00515 BufferToSmall,
00516 Normal,
00517 BufferToBig
00518 };
00519
00521 SoundBufferState soundBufferState;
00522
00525 PINDEX lastFullFrameTimeStamp;
00526
00528 PBoolean audioCanFlow;
00529
00532 unsigned int selectedCodec;
00533
00535 enum CallStatus {
00536 callNewed = 1 << 0,
00537 callSentRinging = 1 << 1,
00538 callRegistered = 1 << 2,
00539 callAuthorised = 1 << 3,
00540 callAccepted = 1 << 4,
00541 callRinging = 1 << 5,
00542 callAnswered = 1 << 6,
00543 callTerminating = 1 << 7
00544 };
00545
00547 unsigned short callStatus;
00548
00550 void SetCallSentRinging(PBoolean newValue = true)
00551 { if (newValue) callStatus |= callSentRinging; else callStatus &= ~callSentRinging; }
00552
00554 void SetCallNewed(PBoolean newValue = true)
00555 { if (newValue) callStatus |= callNewed; else callStatus &= ~callNewed; }
00556
00558 void SetCallRegistered(PBoolean newValue = true)
00559 { if (newValue) callStatus |= callRegistered; else callStatus &= ~callRegistered; }
00560
00562 void SetCallAuthorised(PBoolean newValue = true)
00563 { if (newValue) callStatus |= callAuthorised; else callStatus &= ~callAuthorised; }
00564
00566 void SetCallAccepted(PBoolean newValue = true)
00567 { if (newValue) callStatus |= callAccepted; else callStatus &= ~callAccepted; }
00568
00570 void SetCallRinging(PBoolean newValue = true)
00571 { if (newValue) callStatus |= callRinging; else callStatus &= ~callRinging; }
00572
00574 void SetCallAnswered(PBoolean newValue = true)
00575 { if (newValue) callStatus |= callAnswered; else callStatus &= ~callAnswered; }
00576
00578 void SetCallTerminating(PBoolean newValue = true)
00579 { if (newValue) callStatus |= callTerminating; else callStatus &= ~callTerminating; }
00580
00582 PBoolean IsCallHappening() { return callStatus > 0; }
00583
00586 PBoolean IsCallNewed() { return callStatus & callNewed; }
00587
00590 PBoolean IsCallSentRinging() { return callStatus & callSentRinging; }
00591
00593 PBoolean IsCallRegistered() { return callStatus & callRegistered; }
00594
00596 PBoolean IsCallAuthorised() { return callStatus & callAuthorised; }
00597
00599 PBoolean IsCallAccepted() { return callStatus & callAccepted; }
00600
00602 PBoolean IsCallRinging() { return callStatus & callRinging; }
00603
00605 PBoolean IsCallAnswered() { return callStatus & callAnswered; }
00606
00607 #ifdef DOC_PLUS_PLUS
00608
00614 void OnStatusCheck(PTimer &, INT);
00615 #else
00616 PDECLARE_NOTIFIER(PTimer, IAX2CallProcessor, OnStatusCheck);
00617 #endif
00618
00620 void DoStatusCheck();
00621
00624 void RemoteNodeIsRinging();
00625
00629 void RingingWasAcked();
00630
00635 void AnswerWasAcked();
00636
00640 PBoolean firstMediaFrame;
00641
00644 PBoolean answerCallNow;
00645
00650 PBoolean statusCheckOtherEnd;
00651
00653 PTimer statusCheckTimer;
00654
00657 PINDEX audioFrameDuration;
00658
00660 PINDEX audioCompressedBytes;
00661
00665 PBoolean audioFramesNotStarted;
00666
00669 void CheckForRemoteCapabilities(IAX2FullFrameProtocol *src);
00670
00673 virtual void OnNoResponseTimeout();
00674
00676 virtual void ProcessFullFrame(IAX2FullFrame & fullFrame);
00677
00680 PString callingName;
00681
00684 PString callingExtension;
00685
00687 PString callingDnid;
00688
00691 PString callingContext;
00692
00696 PString userName;
00697
00701 PString password;
00702
00704 PMutex transferMutex;
00705
00707 PBoolean doTransfer;
00708
00710 PString transferCalledNumber;
00711
00713 PString transferCalledContext;
00714
00719 PBoolean suppressHangupFrame;
00720 };
00721
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734 #endif // OPAL_IAX2
00735
00736 #endif // OPAL_IAX2_CALLPROCESSOR_H