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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 #ifndef IAX_CONNECTION_H
00110 #define IAX_CONNECTION_H
00111
00112 #ifndef _PTLIB_H
00113 #include <ptlib.h>
00114 #endif
00115
00116 #include <opal/connection.h>
00117
00118 #include <iax2/frame.h>
00119 #include <iax2/iax2jitter.h>
00120 #include <iax2/iedata.h>
00121 #include <iax2/processor.h>
00122 #include <iax2/callprocessor.h>
00123 #include <iax2/safestrings.h>
00124 #include <iax2/sound.h>
00125
00126 class IAX2EndPoint;
00127
00128
00130
00136 class IAX2Connection : public OpalConnection
00137 {
00138 PCLASSINFO(IAX2Connection, OpalConnection);
00139
00140 public:
00143
00146 IAX2Connection(
00147 OpalCall & call,
00148 IAX2EndPoint & endpoint,
00149 const PString & token,
00150 void *userData,
00151 const PString & remoteParty,
00152 const PString & remotePartyName = PString::Empty()
00153 );
00154
00158 ~IAX2Connection();
00160
00163
00167 void IncomingEthernetFrame (IAX2Frame *frame);
00168
00171
00172
00174 IAX2EndPoint & GetEndPoint() { return endpoint; }
00175
00178 void ReportStatistics();
00179
00192 void Release( CallEndReason reason = EndedByLocalUser
00193 );
00194
00199 void ClearCall(
00200 CallEndReason reason = EndedByLocalUser
00201 );
00202
00204 void EndCallNow(
00205 CallEndReason reason = EndedByLocalUser
00206 );
00207
00208 OpalConnection::SendUserInputModes GetRealSendUserInputMode() const;
00209
00211 void SendDtmf(const PString & dtmf);
00212
00214 virtual BOOL SendUserInputString(const PString & value );
00215
00217 virtual BOOL SendUserInputTone(char tone, unsigned duration );
00218
00219
00222 void AcceptIncomingCall();
00223
00224
00231 virtual void AnsweringCall(AnswerCallResponse response);
00232
00233
00235 BOOL IsCallTerminating() { return iax2Processor.IsCallTerminating(); }
00236
00247 BOOL SetAlerting(
00248 const PString & calleeName,
00249 BOOL withMedia
00250 );
00251
00256 BOOL SetConnected();
00257
00264 OpalMediaFormatList GetMediaFormats() const { return remoteMediaFormats; }
00265
00266
00278 OpalMediaStream * CreateMediaStream(
00279 const OpalMediaFormat & mediaFormat,
00280 unsigned sessionID,
00281 BOOL isSource
00282 );
00283
00294 void SetCallToken(PString newToken);
00295
00297 PString GetCallToken() { return iax2Processor.GetCallToken(); }
00298
00301 void TransmitFrameToRemoteEndpoint(IAX2Frame *src);
00302
00306 void PutSoundPacketToNetwork(PBYTEArray *sund);
00307
00310 void ReceivedSoundPacketFromNetwork(IAX2Frame *soundFrame);
00311
00316 BOOL ReadSoundPacket(DWORD timestamp, RTP_DataFrame & packet);
00317
00319 IAX2Remote & GetRemoteInfo() { return iax2Processor.GetRemoteInfo(); }
00320
00322 IAX2SequenceNumbers & GetSequenceInfo() { return iax2Processor.GetSequenceInfo(); }
00323
00325 const PTimeInterval & GetCallStartTick() { return iax2Processor.GetCallStartTick(); }
00326
00331 virtual void OnSetUp();
00332
00348 virtual void OnAlerting();
00349
00350 virtual BOOL OnIncomingCall(
00351 unsigned int options,
00352 OpalConnection::StringOptions * stringOptions
00353 );
00354
00364 virtual void OnConnected();
00365
00377 virtual void OnEstablished();
00378
00379
00380
00399 void OnReleased();
00400
00401
00402
00409 BOOL SetUpConnection();
00410
00411
00415 PINDEX GetSupportedCodecs();
00416
00420 PINDEX GetPreferredCodec();
00421
00424 void BuildRemoteCapabilityTable(unsigned int remoteCapability, unsigned int format);
00425
00426
00434 unsigned int ChooseCodec();
00435
00437 virtual BOOL IsConnectionOnHold();
00438
00440 virtual void RetrieveConnection();
00441
00443 virtual void HoldConnection();
00444
00446 void RemoteHoldConnection();
00447
00449 void RemoteRetrieveConnection();
00450
00457 void SetUserName(PString & inUserName) { userName = inUserName; };
00458
00460 PString GetUserName() const { return userName; };
00461
00468 void SetPassword(PString & inPassword) { password = inPassword; };
00469
00471 PString GetPassword() const { return password; };
00472
00476 virtual void TransferConnection(
00477 const PString & remoteParty,
00478 const PString & callIdentity = PString::Empty()
00479 );
00480
00490 virtual BOOL ForwardCall(
00491 const PString & forwardParty
00492 );
00493
00494 protected:
00495
00497 PString userName;
00498
00500 PString password;
00501
00505
00507 IAX2EndPoint &endpoint;
00508
00511 OpalMediaFormatList remoteMediaFormats;
00512
00515 OpalMediaFormatList localMediaFormats;
00516
00518 IAX2CallProcessor & iax2Processor;
00519
00521 BOOL local_hold;
00522
00524 BOOL remote_hold;
00525
00527
00530 IAX2JitterBuffer jitterBuffer;
00531
00539 RTP_DataFrame::PayloadTypes opalPayloadType;
00540 };
00541
00542
00544
00545
00546
00547 #endif // IAX_CONNECTION_H
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560