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
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 #ifndef __OPAL_SIPEP_H
00286 #define __OPAL_SIPEP_H
00287
00288 #ifdef P_USE_PRAGMA
00289 #pragma interface
00290 #endif
00291
00292
00293 #include <opal/endpoint.h>
00294 #include <sip/sippdu.h>
00295
00296
00297 class SIPConnection;
00298
00300
00301
00302
00303
00304
00305 class SIPInfo : public PSafeObject
00306 {
00307 PCLASSINFO(SIPInfo, PSafeObject);
00308 public:
00309 SIPInfo(
00310 SIPEndPoint & ep,
00311 const PString & name,
00312 const PTimeInterval & retryMin = PMaxTimeInterval,
00313 const PTimeInterval & retryMax = PMaxTimeInterval
00314 );
00315
00316 ~SIPInfo();
00317
00318 virtual BOOL CreateTransport(OpalTransportAddress & addr);
00319
00320 virtual OpalTransport *GetTransport()
00321 { PWaitAndSignal m(transportMutex); return registrarTransport; }
00322
00323 virtual SIPAuthentication & GetAuthentication()
00324 { return authentication; }
00325
00326 virtual const OpalTransportAddress & GetRegistrarAddress()
00327 { return registrarAddress; }
00328
00329 virtual const SIPURL & GetRegistrationAddress()
00330 { return registrationAddress; }
00331
00332 virtual void AppendTransaction(SIPTransaction * transaction)
00333 { PWaitAndSignal m(registrationsMutex); registrations.Append (transaction); }
00334
00335 virtual void RemoveTransactions()
00336 { PWaitAndSignal m(registrationsMutex); registrations.RemoveAll (); }
00337
00338 virtual BOOL IsRegistered()
00339 { return registered; }
00340
00341 virtual void SetRegistered(BOOL r)
00342 { registered = r; if (r) registrationTime = PTime ();}
00343
00344
00345
00346 virtual void SetExpire(int e)
00347 { expire = e; }
00348
00349 virtual int GetExpire()
00350 { return expire; }
00351
00352 virtual PString GetRegistrationID()
00353 { return registrationID; }
00354
00355 virtual BOOL HasExpired()
00356 { return (registered && (PTime () - registrationTime) >= PTimeInterval (0, expire)); }
00357
00358 virtual void SetAuthUser(const PString & u)
00359 { authUser = u;}
00360
00361 virtual PString GetAuthUser() const
00362 { return authUser;}
00363
00364 virtual void SetPassword(const PString & p)
00365 { password = p;}
00366
00367 virtual void SetAuthRealm(const PString & r)
00368 { authRealm = r;}
00369
00370 virtual void SetBody(const PString & b)
00371 { body = b;}
00372
00373 virtual SIPTransaction * CreateTransaction(
00374 OpalTransport & t,
00375 BOOL unregister
00376 ) = 0;
00377
00378 virtual SIP_PDU::Methods GetMethod() = 0;
00379
00380 virtual void OnSuccess() = 0;
00381
00382 virtual void OnFailed(
00383 SIP_PDU::StatusCodes
00384 ) = 0;
00385
00386 int GetAuthenticationAttempts() { return authenticationAttempts; };
00387 void SetAuthenticationAttempts(unsigned attempts) { authenticationAttempts = attempts; };
00388
00389 protected:
00390 SIPEndPoint & ep;
00391 SIPAuthentication authentication;
00392 OpalTransport * registrarTransport;
00393 OpalTransportAddress registrarAddress;
00394 SIPURL registrationAddress;
00395 PString registrationID;
00396 SIPTransactionList registrations;
00397 PMutex registrationsMutex;
00398 PTime registrationTime;
00399 BOOL registered;
00400 int expire;
00401 PString authRealm;
00402 PString authUser;
00403 PString password;
00404 PString body;
00405 PMutex transportMutex;
00406 unsigned authenticationAttempts;
00407
00408 PTimeInterval retryTimeoutMin;
00409 PTimeInterval retryTimeoutMax;
00410
00411 private:
00412 };
00413
00414 class SIPRegisterInfo : public SIPInfo
00415 {
00416 PCLASSINFO(SIPRegisterInfo, SIPInfo);
00417
00418 public:
00419 SIPRegisterInfo(
00420 SIPEndPoint & ep,
00421 const PString & originalHost,
00422 const PString & adjustedUsername,
00423 const PString & authName,
00424 const PString & password,
00425 int expire,
00426 const PTimeInterval & minRetryTime,
00427 const PTimeInterval & maxRetryTime
00428 );
00429 ~SIPRegisterInfo();
00430 virtual SIPTransaction * CreateTransaction(OpalTransport &, BOOL);
00431 virtual SIP_PDU::Methods GetMethod()
00432 { return SIP_PDU::Method_REGISTER; }
00433
00434 virtual void OnSuccess();
00435 virtual void OnFailed(SIP_PDU::StatusCodes r);
00436
00437 PString originalHost;
00438 };
00439
00440 class SIPMWISubscribeInfo : public SIPInfo
00441 {
00442 PCLASSINFO(SIPMWISubscribeInfo, SIPInfo);
00443 public:
00444 SIPMWISubscribeInfo (SIPEndPoint & ep, const PString & adjustedUsername, int expire);
00445 virtual SIPTransaction * CreateTransaction (OpalTransport &, BOOL);
00446 virtual SIP_PDU::Methods GetMethod ()
00447 { return SIP_PDU::Method_SUBSCRIBE; }
00448 virtual void OnSuccess ();
00449 virtual void OnFailed (SIP_PDU::StatusCodes);
00450 };
00451
00452 class SIPMessageInfo : public SIPInfo
00453 {
00454 PCLASSINFO(SIPMessageInfo, SIPInfo);
00455 public:
00456 SIPMessageInfo (SIPEndPoint & ep, const PString & adjustedUsername, const PString & body);
00457 virtual SIPTransaction * CreateTransaction (OpalTransport &, BOOL);
00458 virtual SIP_PDU::Methods GetMethod ()
00459 { return SIP_PDU::Method_MESSAGE; }
00460 virtual void OnSuccess ();
00461 virtual void OnFailed (SIP_PDU::StatusCodes);
00462 };
00463
00464
00466
00470 class SIPAuthInfo : public PObject
00471 {
00472 public:
00473 SIPAuthInfo()
00474 { }
00475
00476 SIPAuthInfo(const PString & u, const PString & p)
00477 { username = u; password = p; }
00478 PString username;
00479 PString password;
00480 };
00481
00483
00486 class SIPEndPoint : public OpalEndPoint
00487 {
00488 PCLASSINFO(SIPEndPoint, OpalEndPoint);
00489
00490 public:
00495 SIPEndPoint(
00496 OpalManager & manager
00497 );
00498
00501 ~SIPEndPoint();
00503
00509 virtual PStringArray GetDefaultListeners() const;
00510
00515 virtual BOOL NewIncomingConnection(
00516 OpalTransport * transport
00517 );
00518
00548 virtual BOOL MakeConnection(
00549 OpalCall & call,
00550 const PString & party,
00551 void * userData = NULL
00552 );
00553
00563 virtual OpalMediaFormatList GetMediaFormats() const;
00565
00571 virtual SIPConnection * CreateConnection(
00572 OpalCall & call,
00573 const PString & token,
00574 void * userData,
00575 const SIPURL & destination,
00576 OpalTransport * transport,
00577 SIP_PDU * invite
00578 );
00579
00582 virtual BOOL SetupTransfer(
00583 const PString & token,
00584 const PString & callIdentity,
00585 const PString & remoteParty,
00586 void * userData = NULL
00587 );
00588
00592 virtual BOOL ForwardConnection(
00593 SIPConnection & connection,
00594 const PString & forwardParty
00595 );
00596
00598
00601
00612 OpalTransport * CreateTransport(
00613 const OpalTransportAddress & address,
00614 BOOL isLocalAddress = FALSE
00615 );
00616
00617 virtual void HandlePDU(
00618 OpalTransport & transport
00619 );
00620
00623 virtual BOOL OnReceivedPDU(
00624 OpalTransport & transport,
00625 SIP_PDU * pdu
00626 );
00627
00630 virtual void OnReceivedResponse(
00631 SIPTransaction & transaction,
00632 SIP_PDU & response
00633 );
00634
00637 virtual BOOL OnReceivedINVITE(
00638 OpalTransport & transport,
00639 SIP_PDU * pdu
00640 );
00641
00644 virtual void OnReceivedAuthenticationRequired(
00645 SIPTransaction & transaction,
00646 SIP_PDU & response
00647 );
00648
00652 virtual void OnReceivedOK(
00653 SIPTransaction & transaction,
00654 SIP_PDU & response
00655 );
00656
00659 virtual BOOL OnReceivedNOTIFY(
00660 OpalTransport & transport,
00661 SIP_PDU & response
00662 );
00663
00666 virtual void OnReceivedMESSAGE(
00667 OpalTransport & transport,
00668 SIP_PDU & response
00669 );
00670
00678 virtual void OnRTPStatistics(
00679 const SIPConnection & connection,
00680 const RTP_Session & session
00681 ) const;
00683
00684
00689 PSafePtr<SIPConnection> GetSIPConnectionWithLock(
00690 const PString & token,
00691 PSafetyMode mode = PSafeReadWrite
00692 ) { return PSafePtrCast<OpalConnection, SIPConnection>(GetConnectionWithLock(token, mode)); }
00693
00694 virtual BOOL IsAcceptedAddress(const SIPURL & toAddr);
00695
00696
00699 virtual void OnMessageReceived (const SIPURL & from,
00700 const PString & body);
00701
00702
00715 BOOL Register(
00716 const PString & host,
00717 const PString & username = PString::Empty(),
00718 const PString & autName = PString::Empty(),
00719 const PString & password = PString::Empty(),
00720 const PString & authRealm = PString::Empty(),
00721 int timeout = 0,
00722 const PTimeInterval & minRetryTime = PMaxTimeInterval,
00723 const PTimeInterval & maxRetryTime = PMaxTimeInterval
00724 );
00725
00728 virtual void OnMWIReceived (
00729 const PString & host,
00730 const PString & user,
00731 SIPMWISubscribe::MWIType type,
00732 const PString & msgs);
00733
00734
00738 BOOL MWISubscribe(
00739 const PString & host,
00740 const PString & username,
00741 int timeout = 0
00742 );
00743
00744
00749 virtual void OnRegistrationFailed(
00750 const PString & host,
00751 const PString & userName,
00752 SIP_PDU::StatusCodes reason,
00753 BOOL wasRegistering);
00754
00755
00760 virtual void OnRegistered(
00761 const PString & host,
00762 const PString & userName,
00763 BOOL wasRegistering);
00764
00765
00769 BOOL IsRegistered(const PString & host);
00770
00771
00774 unsigned GetRegistrationsCount () { return activeSIPInfo.GetRegistrationsCount (); }
00775
00776
00779 BOOL IsSubscribed(
00780 const PString & host,
00781 const PString & user);
00782
00783
00787 BOOL Unregister(const PString & host,
00788 const PString & user);
00789
00790
00794 BOOL MWIUnsubscribe(
00795 const PString & host,
00796 const PString & user);
00797
00798
00803 virtual void OnMessageFailed(
00804 const SIPURL & messageUrl,
00805 SIP_PDU::StatusCodes reason);
00806
00807
00808 void SetMIMEForm(BOOL v) { mimeForm = v; }
00809 BOOL GetMIMEForm() const { return mimeForm; }
00810
00811 void SetMaxRetries(unsigned r) { maxRetries = r; }
00812 unsigned GetMaxRetries() const { return maxRetries; }
00813
00814 void SetRetryTimeouts(
00815 const PTimeInterval & t1,
00816 const PTimeInterval & t2
00817 ) { retryTimeoutMin = t1; retryTimeoutMax = t2; }
00818 const PTimeInterval & GetRetryTimeoutMin() const { return retryTimeoutMin; }
00819 const PTimeInterval & GetRetryTimeoutMax() const { return retryTimeoutMax; }
00820
00821 void SetNonInviteTimeout(
00822 const PTimeInterval & t
00823 ) { nonInviteTimeout = t; }
00824 const PTimeInterval & GetNonInviteTimeout() const { return nonInviteTimeout; }
00825
00826 void SetPduCleanUpTimeout(
00827 const PTimeInterval & t
00828 ) { pduCleanUpTimeout = t; }
00829 const PTimeInterval & GetPduCleanUpTimeout() const { return pduCleanUpTimeout; }
00830
00831 void SetInviteTimeout(
00832 const PTimeInterval & t
00833 ) { inviteTimeout = t; }
00834 const PTimeInterval & GetInviteTimeout() const { return inviteTimeout; }
00835
00836 void SetAckTimeout(
00837 const PTimeInterval & t
00838 ) { ackTimeout = t; }
00839 const PTimeInterval & GetAckTimeout() const { return ackTimeout; }
00840
00841 void SetRegistrarTimeToLive(
00842 const PTimeInterval & t
00843 ) { registrarTimeToLive = t; }
00844 const PTimeInterval & GetRegistrarTimeToLive() const { return registrarTimeToLive; }
00845
00846 void SetNotifierTimeToLive(
00847 const PTimeInterval & t
00848 ) { notifierTimeToLive = t; }
00849 const PTimeInterval & GetNotifierTimeToLive() const { return notifierTimeToLive; }
00850
00851 void SetNATBindingTimeout(
00852 const PTimeInterval & t
00853 ) { natBindingTimeout = t; natBindingTimer.RunContinuous (natBindingTimeout); }
00854 const PTimeInterval & GetNATBindingTimeout() const { return natBindingTimeout; }
00855
00856 void AddTransaction(
00857 SIPTransaction * transaction
00858 ) { PWaitAndSignal m(transactionsMutex); transactions.SetAt(transaction->GetTransactionID(), transaction); }
00859
00860 void RemoveTransaction(
00861 SIPTransaction * transaction
00862 ) { PWaitAndSignal m(transactionsMutex); transactions.SetAt(transaction->GetTransactionID(), NULL); }
00863
00864
00867 unsigned GetNextCSeq() { PWaitAndSignal m(transactionsMutex); return ++lastSentCSeq; }
00868
00869
00872 BOOL GetAuthentication(const PString & authRealm, SIPAuthentication &);
00873
00874
00880 virtual SIPURL GetRegisteredPartyName(const PString &);
00881
00882
00885 virtual SIPURL GetDefaultRegisteredPartyName();
00886
00887
00899 SIPURL GetContactURL(const OpalTransport &transport, const PString & userName, const PString & host);
00900
00901
00911 SIPURL GetLocalURL(
00912 const OpalTransport & transport,
00913 const PString & userName = PString::Empty()
00914 );
00915
00916
00919 const SIPURL & GetProxy() const { return proxy; }
00920
00921
00924 void SetProxy(const SIPURL & url);
00925
00926
00929 void SetProxy(
00930 const PString & hostname,
00931 const PString & username,
00932 const PString & password
00933 );
00934
00935
00938 virtual PString GetUserAgent() const;
00939
00940
00943 void SetUserAgent(const PString & str) { userAgentString = str; }
00944
00945
00948 BOOL SendMessage (const SIPURL & url, const PString & body);
00949
00950
00953 enum NATBindingRefreshMethod{
00954 None,
00955 Options,
00956 EmptyRequest,
00957 NumMethods
00958 };
00959
00960
00963 void SetNATBindingRefreshMethod(const NATBindingRefreshMethod m) { natMethod = m; }
00964
00965
00970 class RegistrationList : public PSafeList<SIPInfo>
00971 {
00972 public:
00973
00977 unsigned GetRegistrationsCount ()
00978 {
00979 unsigned count = 0;
00980 for (PSafePtr<SIPInfo> info(*this, PSafeReference); info != NULL; ++info)
00981 if (info->IsRegistered() && info->GetMethod() == SIP_PDU::Method_REGISTER)
00982 count++;
00983 return count;
00984 }
00985
00989 PSafePtr<SIPInfo> FindSIPInfoByCallID (const PString & callID, PSafetyMode m)
00990 {
00991 for (PSafePtr<SIPInfo> info(*this, m); info != NULL; ++info)
00992 if (callID == info->GetRegistrationID())
00993 return info;
00994 return NULL;
00995 }
00996
01000 PSafePtr<SIPInfo> FindSIPInfoByAuthRealm (const PString & authRealm, const PString & userName, PSafetyMode m)
01001 {
01002 PIPSocket::Address realmAddress;
01003
01004 for (PSafePtr<SIPInfo> info(*this, m); info != NULL; ++info)
01005 if (authRealm == info->GetAuthentication().GetAuthRealm() && (userName.IsEmpty() || userName == info->GetAuthentication().GetUsername()))
01006 return info;
01007 for (PSafePtr<SIPInfo> info(*this, m); info != NULL; ++info) {
01008 if (PIPSocket::GetHostAddress(info->GetAuthentication().GetAuthRealm(), realmAddress))
01009 if (realmAddress == PIPSocket::Address(authRealm) && (userName.IsEmpty() || userName == info->GetAuthentication().GetUsername()))
01010 return info;
01011 }
01012 return NULL;
01013 }
01014
01022 PSafePtr<SIPInfo> FindSIPInfoByUrl (const PString & url, SIP_PDU::Methods meth, PSafetyMode m)
01023 {
01024 for (PSafePtr<SIPInfo> info(*this, m); info != NULL; ++info) {
01025 if (SIPURL(url) == info->GetRegistrationAddress() && meth == info->GetMethod())
01026 return info;
01027 }
01028 return NULL;
01029 }
01030
01036 PSafePtr <SIPInfo> FindSIPInfoByDomain (const PString & name, SIP_PDU::Methods meth, PSafetyMode m)
01037 {
01038 for (PSafePtr<SIPInfo> info(*this, m); info != NULL; ++info) {
01039
01040 if (name == info->GetRegistrationAddress().GetHostName())
01041 return info;
01042
01043 OpalTransportAddress addr;
01044 PIPSocket::Address infoIP;
01045 PIPSocket::Address nameIP;
01046 WORD port = 5060;
01047 addr = name;
01048
01049 if (addr.GetIpAndPort (nameIP, port)) {
01050 addr = info->GetRegistrationAddress().GetHostName();
01051 if (addr.GetIpAndPort (infoIP, port)) {
01052 if (infoIP == nameIP) {
01053 return info;
01054 }
01055 }
01056 }
01057 }
01058 return NULL;
01059 }
01060 };
01061
01062 RegistrationList & GetActiveSIPInfo()
01063 { return activeSIPInfo; }
01064
01067 virtual SIPRegisterInfo * CreateRegisterInfo(
01068 const PString & originalHost,
01069 const PString & adjustedUsername,
01070 const PString & authName,
01071 const PString & password,
01072 int expire,
01073 const PTimeInterval & minRetryTime,
01074 const PTimeInterval & maxRetryTime
01075 );
01076 virtual SIPMWISubscribeInfo * CreateMWISubscribeInfo(const PString & adjustedUsername, int expire);
01077 virtual SIPMessageInfo * CreateMessageInfo(const PString & adjustedUsername, const PString & body);
01078
01079 protected:
01080 PDECLARE_NOTIFIER(PThread, SIPEndPoint, TransportThreadMain);
01081 PDECLARE_NOTIFIER(PTimer, SIPEndPoint, NATBindingRefresh);
01082 PDECLARE_NOTIFIER(PTimer, SIPEndPoint, GarbageCollect);
01083 PDECLARE_NOTIFIER(PTimer, SIPEndPoint, RegistrationRefresh);
01084
01085 static BOOL WriteSIPInfo(
01086 OpalTransport & transport,
01087 void * info
01088 );
01089
01090 BOOL TransmitSIPInfo (
01091 SIP_PDU::Methods method,
01092 const PString & host,
01093 const PString & username,
01094 const PString & authName = PString::Empty(),
01095 const PString & password = PString::Empty(),
01096 const PString & authRealm = PString::Empty(),
01097 const PString & body = PString::Empty(),
01098 int timeout = 0,
01099 const PTimeInterval & minRetryTime = PMaxTimeInterval,
01100 const PTimeInterval & maxRetryTime = PMaxTimeInterval
01101 );
01102
01103 BOOL TransmitSIPUnregistrationInfo (
01104 const PString & host,
01105 const PString & username,
01106 SIP_PDU::Methods method
01107 );
01108
01109 void ParsePartyName(
01110 const PString & remoteParty,
01111 PString & party);
01112
01113 SIPURL proxy;
01114 PString userAgentString;
01115
01116 BOOL mimeForm;
01117 unsigned maxRetries;
01118 PTimeInterval retryTimeoutMin;
01119 PTimeInterval retryTimeoutMax;
01120 PTimeInterval nonInviteTimeout;
01121 PTimeInterval pduCleanUpTimeout;
01122 PTimeInterval inviteTimeout;
01123 PTimeInterval ackTimeout;
01124 PTimeInterval registrarTimeToLive;
01125 PTimeInterval notifierTimeToLive;
01126 PTimeInterval natBindingTimeout;
01127
01128 RegistrationList activeSIPInfo;
01129
01130 PTimer registrationTimer;
01131 PTimer garbageTimer;
01132 SIPTransactionList messages;
01133 SIPTransactionDict transactions;
01134
01135 PTimer natBindingTimer;
01136 NATBindingRefreshMethod natMethod;
01137
01138 PMutex transactionsMutex;
01139 PMutex connectionsActiveInUse;
01140
01141 unsigned lastSentCSeq;
01142 };
01143
01144 #endif // __OPAL_SIPEP_H
01145
01146
01147