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_SIPEP_H
00033 #define __OPAL_SIPEP_H
00034
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038
00039 #ifndef _PTLIB_H
00040 #include <ptlib.h>
00041 #endif
00042
00043 #include <opal/buildopts.h>
00044
00045 #include <ptclib/sockagg.h>
00046 #include <opal/rtpep.h>
00047 #include <sip/sipcon.h>
00048 #include <sip/sippdu.h>
00049 #include <sip/handlers.h>
00050
00051
00052 class SIPRegisterHandler;
00053
00054
00055
00056
00057
00058 #define OPAL_HAS_SIP_PRESENCE 1
00059
00061
00065 class SIPAuthInfo : public PObject
00066 {
00067 public:
00068 SIPAuthInfo()
00069 { }
00070
00071 SIPAuthInfo(const PString & u, const PString & p)
00072 { username = u; password = p; }
00073 PString username;
00074 PString password;
00075 };
00076
00078
00081 class SIPEndPoint : public OpalRTPEndPoint
00082 {
00083 PCLASSINFO(SIPEndPoint, OpalRTPEndPoint);
00084
00085 public:
00090 SIPEndPoint(
00091 OpalManager & manager
00092 );
00093
00096 ~SIPEndPoint();
00098
00105 virtual void ShutDown();
00106
00110 virtual PString GetDefaultTransport() const;
00111
00116 virtual PBoolean NewIncomingConnection(
00117 OpalTransport * transport
00118 );
00119
00149 virtual PBoolean MakeConnection(
00150 OpalCall & call,
00151 const PString & party,
00152 void * userData,
00153 unsigned int options,
00154 OpalConnection::StringOptions * stringOptions
00155 );
00156
00161 virtual PBoolean GarbageCollection();
00163
00169 virtual SIPConnection * CreateConnection(
00170 OpalCall & call,
00171 const PString & token,
00172 void * userData,
00173 const SIPURL & destination,
00174 OpalTransport * transport,
00175 SIP_PDU * invite,
00176 unsigned int options = 0,
00177 OpalConnection::StringOptions * stringOptions = NULL
00178
00179 );
00180
00183 virtual PBoolean SetupTransfer(
00184 const PString & token,
00185 const PString & callIdentity,
00186 const PString & remoteParty,
00187 void * userData = NULL
00188 );
00189
00193 virtual PBoolean ForwardConnection(
00194 SIPConnection & connection,
00195 const PString & forwardParty
00196 );
00197
00199
00202
00206 OpalTransport * CreateTransport(
00207 const OpalTransportAddress & remoteAddress,
00208 const OpalTransportAddress & localAddress = OpalTransportAddress()
00209 );
00210
00211 virtual void HandlePDU(
00212 OpalTransport & transport
00213 );
00214
00217 virtual PBoolean OnReceivedPDU(
00218 OpalTransport & transport,
00219 SIP_PDU * pdu
00220 );
00221
00224 virtual bool OnReceivedConnectionlessPDU(
00225 OpalTransport & transport,
00226 SIP_PDU * pdu
00227 );
00228
00231 virtual void OnReceivedResponse(
00232 SIPTransaction & transaction,
00233 SIP_PDU & response
00234 );
00235
00238 virtual PBoolean OnReceivedINVITE(
00239 OpalTransport & transport,
00240 SIP_PDU * pdu
00241 );
00242
00245 virtual void OnReceivedIntervalTooBrief(
00246 SIPTransaction & transaction,
00247 SIP_PDU & response)
00248 ;
00249
00252 virtual void OnReceivedAuthenticationRequired(
00253 SIPTransaction & transaction,
00254 SIP_PDU & response
00255 );
00256
00260 virtual void OnReceivedOK(
00261 SIPTransaction & transaction,
00262 SIP_PDU & response
00263 );
00264
00267 virtual PBoolean OnReceivedNOTIFY(
00268 OpalTransport & transport,
00269 SIP_PDU & response
00270 );
00271
00274 virtual PBoolean OnReceivedREGISTER(
00275 OpalTransport & transport,
00276 SIP_PDU & pdu
00277 );
00278
00281 virtual PBoolean OnReceivedSUBSCRIBE(
00282 OpalTransport & transport,
00283 SIP_PDU & pdu
00284 );
00285
00288 virtual bool OnReceivedMESSAGE(
00289 OpalTransport & transport,
00290 SIP_PDU & response
00291 );
00292
00295 virtual bool OnReceivedOPTIONS(
00296 OpalTransport & transport,
00297 SIP_PDU & response
00298 );
00299
00302 virtual void OnTransactionFailed(
00303 SIPTransaction & transaction
00304 );
00305
00313 virtual void OnRTPStatistics(
00314 const SIPConnection & connection,
00315 const RTP_Session & session
00316 ) const;
00318
00319
00324 PSafePtr<SIPConnection> GetSIPConnectionWithLock(
00325 const PString & token,
00326 PSafetyMode mode = PSafeReadWrite
00327 ) { return PSafePtrCast<OpalConnection, SIPConnection>(GetConnectionWithLock(token, mode)); }
00328
00329 virtual PBoolean IsAcceptedAddress(const SIPURL & toAddr);
00330
00331
00334 virtual void OnMessageReceived (const SIPURL & from,
00335 const PString & body);
00336
00337
00351 bool Register(
00352 const SIPRegister::Params & params
00353 );
00354
00356 bool Register(
00357 const PString & host,
00358 const PString & user = PString::Empty(),
00359 const PString & autName = PString::Empty(),
00360 const PString & password = PString::Empty(),
00361 const PString & authRealm = PString::Empty(),
00362 unsigned expire = 0,
00363 const PTimeInterval & minRetryTime = PMaxTimeInterval,
00364 const PTimeInterval & maxRetryTime = PMaxTimeInterval
00365 );
00366
00371 bool Unregister(const PString & aor);
00372
00375 bool UnregisterAll();
00376
00380 PBoolean IsRegistered(const PString & aor);
00381
00384 unsigned GetRegistrationsCount() const { return activeSIPHandlers.GetCount(SIP_PDU::Method_REGISTER); }
00385
00387 struct RegistrationStatus {
00388 PString m_addressofRecord;
00389 bool m_wasRegistering;
00390 bool m_reRegistering;
00391 SIP_PDU::StatusCodes m_reason;
00392 OpalProductInfo m_productInfo;
00393 };
00394
00397 virtual void OnRegistrationStatus(
00398 const RegistrationStatus & status
00399 );
00400
00401
00402 virtual void OnRegistrationStatus(
00403 const PString & aor,
00404 PBoolean wasRegistering,
00405 PBoolean reRegistering,
00406 SIP_PDU::StatusCodes reason
00407 );
00408
00412 virtual void OnRegistrationFailed(
00413 const PString & aor,
00414 SIP_PDU::StatusCodes reason,
00415 PBoolean wasRegistering
00416 );
00417
00421 virtual void OnRegistered(
00422 const PString & aor,
00423 PBoolean wasRegistering
00424 );
00425
00426
00430 bool Subscribe(
00431 SIPSubscribe::PredefinedPackages eventPackage,
00432 unsigned expire,
00433 const PString & to
00434 );
00435 bool Subscribe(
00436 const SIPSubscribe::Params & params
00437 );
00438
00439
00440 bool Unsubscribe(
00441 SIPSubscribe::PredefinedPackages eventPackage,
00442 const PString & to
00443 );
00444 bool Unsubscribe(
00445 const PString & eventPackage,
00446 const PString & to
00447 );
00448
00451 bool UnsubcribeAll(
00452 SIPSubscribe::PredefinedPackages eventPackage
00453 );
00454 bool UnsubcribeAll(
00455 const PString & eventPackage
00456 );
00457
00461 PBoolean IsSubscribed(
00462 const PString & eventPackage,
00463 const PString & to
00464 );
00465
00468 unsigned GetSubscriptionCount(const PString & eventPackage) { return activeSIPHandlers.GetCount(SIP_PDU::Method_SUBSCRIBE, eventPackage); }
00469
00472 virtual void OnSubscriptionStatus(
00473 const PString & eventPackage,
00474 const SIPURL & uri,
00475 bool wasSubscribing,
00476 bool reSubscribing,
00477 SIP_PDU::StatusCodes reason
00478 );
00479
00480
00483 PBoolean Message (
00484 const PString & to,
00485 const PString & body
00486 );
00487
00488
00492 PBoolean Publish(
00493 const PString & to,
00494 const PString & body,
00495 unsigned expire = 0
00496 );
00497
00498
00501 PBoolean Ping(
00502 const PString & to
00503 );
00504
00507 virtual void OnPresenceInfoReceived (
00508 const PString & user,
00509 const PString & basic,
00510 const PString & note
00511 );
00512
00517 virtual void OnMessageFailed(
00518 const SIPURL & messageUrl,
00519 SIP_PDU::StatusCodes reason);
00520
00521
00522 void SetMIMEForm(PBoolean v) { mimeForm = v; }
00523 PBoolean GetMIMEForm() const { return mimeForm; }
00524
00525 void SetMaxRetries(unsigned r) { maxRetries = r; }
00526 unsigned GetMaxRetries() const { return maxRetries; }
00527
00528 void SetRetryTimeouts(
00529 const PTimeInterval & t1,
00530 const PTimeInterval & t2
00531 ) { retryTimeoutMin = t1; retryTimeoutMax = t2; }
00532 const PTimeInterval & GetRetryTimeoutMin() const { return retryTimeoutMin; }
00533 const PTimeInterval & GetRetryTimeoutMax() const { return retryTimeoutMax; }
00534
00535 void SetNonInviteTimeout(
00536 const PTimeInterval & t
00537 ) { nonInviteTimeout = t; }
00538 const PTimeInterval & GetNonInviteTimeout() const { return nonInviteTimeout; }
00539
00540 void SetPduCleanUpTimeout(
00541 const PTimeInterval & t
00542 ) { pduCleanUpTimeout = t; }
00543 const PTimeInterval & GetPduCleanUpTimeout() const { return pduCleanUpTimeout; }
00544
00545 void SetInviteTimeout(
00546 const PTimeInterval & t
00547 ) { inviteTimeout = t; }
00548 const PTimeInterval & GetInviteTimeout() const { return inviteTimeout; }
00549
00550 void SetAckTimeout(
00551 const PTimeInterval & t
00552 ) { ackTimeout = t; }
00553 const PTimeInterval & GetAckTimeout() const { return ackTimeout; }
00554
00555 void SetRegistrarTimeToLive(
00556 const PTimeInterval & t
00557 ) { registrarTimeToLive = t; }
00558 const PTimeInterval & GetRegistrarTimeToLive() const { return registrarTimeToLive; }
00559
00560 void SetNotifierTimeToLive(
00561 const PTimeInterval & t
00562 ) { notifierTimeToLive = t; }
00563 const PTimeInterval & GetNotifierTimeToLive() const { return notifierTimeToLive; }
00564
00565 void SetNATBindingTimeout(
00566 const PTimeInterval & t
00567 ) { natBindingTimeout = t; natBindingTimer.RunContinuous (natBindingTimeout); }
00568 const PTimeInterval & GetNATBindingTimeout() const { return natBindingTimeout; }
00569
00570 void AddTransaction(
00571 SIPTransaction * transaction
00572 ) { transactions.SetAt(transaction->GetTransactionID(), transaction); }
00573
00574 PSafePtr<SIPTransaction> GetTransaction(const PString & transactionID, PSafetyMode mode = PSafeReadWrite)
00575 { return transactions.FindWithLock(transactionID, mode); }
00576
00579 unsigned GetNextCSeq() { return ++lastSentCSeq; }
00580
00581
00584 PBoolean GetAuthentication(const PString & authRealm, PString & realm, PString & user, PString & password);
00585
00591 virtual SIPURL GetRegisteredPartyName(const SIPURL &);
00592
00593
00596 virtual SIPURL GetDefaultRegisteredPartyName();
00597
00598
00610 SIPURL GetContactURL(const OpalTransport &transport, const PString & userName, const PString & host);
00611
00612
00622 virtual SIPURL GetLocalURL(
00623 const OpalTransport & transport,
00624 const PString & userName = PString::Empty()
00625 );
00626
00627
00630 const SIPURL & GetProxy() const { return proxy; }
00631
00632
00635 void SetProxy(const SIPURL & url);
00636
00637
00640 void SetProxy(
00641 const PString & hostname,
00642 const PString & username,
00643 const PString & password
00644 );
00645
00646
00653 virtual PString GetUserAgent() const;
00654
00657 void SetUserAgent(const PString & str) { userAgentString = str; }
00658
00659
00662 virtual unsigned GetAllowedMethods() const;
00663
00664 PBoolean SendResponse(
00665 SIP_PDU::StatusCodes code,
00666 OpalTransport & transport,
00667 SIP_PDU & pdu
00668 );
00669
00672 enum NATBindingRefreshMethod{
00673 None,
00674 Options,
00675 EmptyRequest,
00676 NumMethods
00677 };
00678
00679
00682 void SetNATBindingRefreshMethod(const NATBindingRefreshMethod m) { natMethod = m; }
00683
00684 virtual SIPRegisterHandler * CreateRegisterHandler(const SIPRegister::Params & params);
00685
00686 protected:
00687 PDECLARE_NOTIFIER(PThread, SIPEndPoint, TransportThreadMain);
00688 PDECLARE_NOTIFIER(PTimer, SIPEndPoint, NATBindingRefresh);
00689
00690 SIPURL proxy;
00691 PString userAgentString;
00692
00693 bool mimeForm;
00694 unsigned maxRetries;
00695 PTimeInterval retryTimeoutMin;
00696 PTimeInterval retryTimeoutMax;
00697 PTimeInterval nonInviteTimeout;
00698 PTimeInterval pduCleanUpTimeout;
00699 PTimeInterval inviteTimeout;
00700 PTimeInterval ackTimeout;
00701 PTimeInterval registrarTimeToLive;
00702 PTimeInterval notifierTimeToLive;
00703 PTimeInterval natBindingTimeout;
00704
00705 SIPHandlersList activeSIPHandlers;
00706
00707 PSafeDictionary<PString, SIPTransaction> transactions;
00708
00709 PTimer natBindingTimer;
00710 NATBindingRefreshMethod natMethod;
00711
00712 PAtomicInteger lastSentCSeq;
00713
00714 struct SIP_PDU_Work
00715 {
00716 SIP_PDU_Work()
00717 { ep = NULL; pdu = NULL; }
00718
00719 SIPEndPoint * ep;
00720 SIP_PDU * pdu;
00721 PString callID;
00722 };
00723
00724 typedef std::queue<SIP_PDU_Work *> SIP_PDUWorkQueue;
00725
00726 class SIP_PDU_Thread : public PThreadPoolWorkerBase
00727 {
00728 public:
00729 SIP_PDU_Thread(PThreadPoolBase & _pool);
00730 unsigned GetWorkSize() const;
00731 void OnAddWork(SIP_PDU_Work * work);
00732 void OnRemoveWork(SIP_PDU_Work *);
00733 void Shutdown();
00734 void Main();
00735
00736 protected:
00737 PMutex mutex;
00738 PSyncPoint sync;
00739 SIP_PDUWorkQueue pduQueue;
00740 };
00741
00742 typedef PThreadPool<SIP_PDU_Work, SIP_PDU_Thread> SIPMainThreadPool;
00743 SIPMainThreadPool threadPool;
00744
00745 class InterfaceMonitor : public PInterfaceMonitorClient
00746 {
00747 PCLASSINFO(InterfaceMonitor, PInterfaceMonitorClient);
00748 public:
00749 InterfaceMonitor(SIPEndPoint & manager);
00750
00751 virtual void OnAddInterface(const PIPSocket::InterfaceEntry & entry);
00752 virtual void OnRemoveInterface(const PIPSocket::InterfaceEntry & entry);
00753
00754 protected:
00755 SIPEndPoint & m_endpoint;
00756 } m_interfaceMonitor;
00757
00758 friend void InterfaceMonitor::OnAddInterface(const PIPSocket::InterfaceEntry & entry);
00759 friend void InterfaceMonitor::OnRemoveInterface(const PIPSocket::InterfaceEntry & entry);
00760 };
00761
00762 #endif // __OPAL_SIPEP_H
00763
00764
00765