endpoint.h

Go to the documentation of this file.
00001 /*
00002  * endpoint.h
00003  *
00004  * Telephony endpoint abstraction
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  * Formally known as the Open H323 project.
00008  *
00009  * Copyright (c) 2001 Equivalence Pty. Ltd.
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Open Phone Abstraction Library.
00022  *
00023  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00024  *
00025  * Contributor(s): ______________________________________.
00026  *
00027  * $Revision: 27984 $
00028  * $Author: rjongbloed $
00029  * $Date: 2012-07-10 03:24:24 -0500 (Tue, 10 Jul 2012) $
00030  */
00031 
00032 #ifndef OPAL_OPAL_ENDPOINT_H
00033 #define OPAL_OPAL_ENDPOINT_H
00034 
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038 
00039 #include <opal/buildopts.h>
00040 
00041 #include <opal/manager.h>
00042 #include <opal/mediafmt.h>
00043 #include <opal/transports.h>
00044 
00045 class OpalCall;
00046 class OpalMediaStream;
00047 
00067 class OpalEndPoint : public PObject
00068 {
00069     PCLASSINFO(OpalEndPoint, PObject);
00070   public:
00071     enum Attributes {
00072       CanTerminateCall = 1,
00073       SupportsE164 = 2
00074     };
00075 
00080     OpalEndPoint(
00081       OpalManager & manager,          
00082       const PCaselessString & prefix, 
00083       unsigned attributes             
00084     );
00085 
00088     ~OpalEndPoint();
00089 
00094     virtual void ShutDown();
00096 
00103     void PrintOn(
00104       ostream & strm    
00105     ) const;
00107 
00120     PBoolean StartListeners(
00121       const PStringArray & interfaces 
00122     );
00123 
00131     PBoolean StartListener(
00132       const OpalTransportAddress & iface 
00133     );
00134 
00140     PBoolean StartListener(
00141       OpalListener * listener 
00142     );
00143 
00148     virtual PStringArray GetDefaultListeners() const;
00149 
00153     virtual PString GetDefaultTransport() const;
00154 
00157     OpalListener * FindListener(
00158         const OpalTransportAddress & iface 
00159     );
00160 
00163     bool FindListenerForProtocol(
00164       const char * proto,         
00165       OpalTransportAddress & addr 
00166     );
00167 
00171     PBoolean StopListener(
00172         const OpalTransportAddress & iface 
00173     );
00174 
00178     PBoolean RemoveListener(
00179       OpalListener * listener 
00180     );
00181 
00184     OpalTransportAddressArray GetInterfaceAddresses(
00185       PBoolean excludeLocalHost = true,       
00186       const OpalTransport * associatedTransport = NULL
00188     );
00189 
00194     PDECLARE_NOTIFIER(PThread, OpalEndPoint, ListenerCallback);
00195 
00204     virtual PBoolean NewIncomingConnection(
00205       OpalTransport * transport  
00206     );
00207 
00213     virtual void OnNewConnection(
00214       OpalCall & call,              
00215       OpalConnection & connection   
00216     );
00218 
00250     virtual PSafePtr<OpalConnection> MakeConnection(
00251       OpalCall & call,          
00252       const PString & party,    
00253       void * userData = NULL,          
00254       unsigned int options = 0,     
00255       OpalConnection::StringOptions * stringOptions = NULL 
00256     ) = 0;
00257 
00261     virtual PBoolean OnSetUpConnection(OpalConnection &connection);
00262     
00284     virtual PBoolean OnIncomingConnection(
00285       OpalConnection & connection,  
00286       unsigned options,             
00287       OpalConnection::StringOptions * stringOptions  
00288     );
00289 
00304     virtual void OnProceeding(
00305       OpalConnection & connection   
00306     );
00307 
00323     virtual void OnAlerting(
00324       OpalConnection & connection   
00325     );
00326 
00343     virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00344       OpalConnection & connection,    
00345        const PString & caller         
00346     );
00347 
00358     virtual void OnConnected(
00359       OpalConnection & connection   
00360     );
00361 
00373     virtual void OnEstablished(
00374       OpalConnection & connection   
00375     );
00376 
00395     virtual void OnReleased(
00396       OpalConnection & connection   
00397     );
00398 
00405     virtual void OnHold(
00406       OpalConnection & connection,   
00407       bool fromRemote,               
00408       bool onHold                    
00409     );
00410     virtual void OnHold(OpalConnection & connection); // For backward compatibility
00411 
00416     virtual PBoolean OnForwarded(
00417       OpalConnection & connection,  
00418       const PString & remoteParty         
00419     );
00420 
00468     virtual bool OnTransferNotify(
00469       OpalConnection & connection,  
00470       const PStringToString & info  
00471     );
00472 
00482     virtual PBoolean ClearCall(
00483       const PString & token,    
00484       OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser, 
00485       PSyncPoint * sync = NULL  
00486     );
00487 
00492     virtual PBoolean ClearCallSynchronous(
00493       const PString & token,    
00494       OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser, 
00495       PSyncPoint * sync = NULL  
00496     );
00497 
00504     virtual void ClearAllCalls(
00505       OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser, 
00506       PBoolean wait = true   
00507     );
00508 
00513     PSafePtr<OpalConnection> GetConnectionWithLock(
00514       const PString & token,     
00515       PSafetyMode mode = PSafeReadWrite 
00516     ) { return connectionsActive.FindWithLock(token, mode); }
00517 
00524     template <class ConnClass>
00525     PSafePtr<ConnClass> GetConnectionWithLockAs(
00526       const PString & token,     
00527       PSafetyMode mode = PSafeReadWrite 
00528     )
00529     {
00530       PSafePtr<ConnClass> connection = PSafePtrCast<OpalConnection, ConnClass>(GetConnectionWithLock(token, mode));
00531       if (connection == NULL) {
00532         PSafePtr<OpalCall> call = manager.FindCallWithLock(token, PSafeReadOnly);
00533         if (call != NULL) {
00534           connection = PSafePtrCast<OpalConnection, ConnClass>(call->GetConnection(0, mode));
00535           if (connection == NULL)
00536             connection = PSafePtrCast<OpalConnection, ConnClass>(call->GetConnection(1, mode));
00537         }
00538       }
00539       return connection;
00540     }
00541 
00544     PStringList GetAllConnections();
00545     
00548     PINDEX GetConnectionCount() const { return connectionsActive.GetSize(); }
00549 
00552     virtual PBoolean HasConnection(
00553       const PString & token   
00554     );
00555 
00558     virtual void DestroyConnection(
00559       OpalConnection * connection  
00560     );
00562 
00574     virtual OpalMediaFormatList GetMediaFormats() const = 0;
00575 
00584     virtual void AdjustMediaFormats(
00585       bool local,                         
00586       const OpalConnection & connection,  
00587       OpalMediaFormatList & mediaFormats  
00588     ) const;
00589 
00601     virtual PBoolean OnOpenMediaStream(
00602       OpalConnection & connection,  
00603       OpalMediaStream & stream      
00604     );
00605 
00610     virtual void OnClosedMediaStream(
00611       const OpalMediaStream & stream     
00612     );
00613 
00614 #if OPAL_VIDEO
00615 
00617     virtual PBoolean CreateVideoInputDevice(
00618       const OpalConnection & connection,    
00619       const OpalMediaFormat & mediaFormat,  
00620       PVideoInputDevice * & device,         
00621       PBoolean & autoDelete                     
00622     );
00623 
00627     virtual PBoolean CreateVideoOutputDevice(
00628       const OpalConnection & connection,    
00629       const OpalMediaFormat & mediaFormat,  
00630       PBoolean preview,                         
00631       PVideoOutputDevice * & device,        
00632       PBoolean & autoDelete                     
00633     );
00634 #endif
00635 
00636 
00643     virtual void OnUserInputString(
00644       OpalConnection & connection,  
00645       const PString & value   
00646     );
00647 
00654     virtual void OnUserInputTone(
00655       OpalConnection & connection,  
00656       char tone,                    
00657       int duration                  
00658     );
00659 
00662     virtual PString ReadUserInput(
00663       OpalConnection & connection,        
00664       const char * terminators = "#\r\n", 
00665       unsigned lastDigitTimeout = 4,      
00666       unsigned firstDigitTimeout = 30     
00667     );
00669 
00674     virtual PBoolean Message(
00675       const PString & to, 
00676       const PString & body
00677     );
00678     virtual PBoolean Message(
00679       const PURL & to, 
00680       const PString & type,
00681       const PString & body,
00682       PURL & from, 
00683       PString & conversationId
00684     );
00685     virtual PBoolean Message(
00686       OpalIM & Message
00687     );
00688 
00691     virtual void OnMessageReceived(
00692       const OpalIM & message
00693     );
00695 
00708     virtual void OnMWIReceived (
00709       const PString & party,                
00710       OpalManager::MessageWaitingType type, 
00711       const PString & extraInfo             
00712     );
00713 
00718     virtual PBoolean GarbageCollection();
00720 
00725     OpalManager & GetManager() const { return manager; }
00726 
00729     const PString & GetPrefixName() const { return prefixName; }
00730 
00733     PBoolean HasAttribute(Attributes opt) const { return (attributeBits&opt) != 0; }
00734 
00737     WORD GetDefaultSignalPort() const { return defaultSignalPort; }
00738 
00741     const OpalProductInfo & GetProductInfo() const { return productInfo; }
00742 
00745     void SetProductInfo(
00746       const OpalProductInfo & info
00747     ) { productInfo = info; }
00748 
00751     const PString & GetDefaultLocalPartyName() const { return defaultLocalPartyName; }
00752 
00755     virtual void SetDefaultLocalPartyName(
00756       const PString & name  
00757     ) { defaultLocalPartyName = name; }
00758 
00761     const PString & GetDefaultDisplayName() const { return defaultDisplayName; }
00762 
00765     void SetDefaultDisplayName(const PString & name) { defaultDisplayName = name; }
00766 
00769     unsigned GetInitialBandwidth() const { return initialBandwidth; }
00770 
00773     void SetInitialBandwidth(unsigned bandwidth) { initialBandwidth = bandwidth; }
00774 
00777     const OpalListenerList & GetListeners() const { return listeners; }
00778 
00781     const OpalConnection::StringOptions & GetDefaultStringOptions() const { return m_defaultStringOptions; }
00782 
00785     void SetDefaultStringOptions(const OpalConnection::StringOptions & opts) { m_defaultStringOptions = opts; }
00786 
00789     void SetDefaultStringOption(const PCaselessString & key, const PString & data) { m_defaultStringOptions.SetAt(key, data); }
00790 
00793     OpalConnection::SendUserInputModes GetSendUserInputMode() const { return defaultSendUserInputMode; }
00794 
00797     void SetSendUserInputMode(OpalConnection::SendUserInputModes mode) { defaultSendUserInputMode = mode; }
00799 
00800 #if OPAL_PTLIB_SSL
00801 
00803     PString GetSSLCertificate() const;
00804 #endif
00805 
00806   protected:
00807     OpalManager   & manager;
00808     PCaselessString prefixName;
00809     unsigned        attributeBits;
00810     WORD            defaultSignalPort;
00811     PINDEX          m_maxSizeUDP;
00812     OpalProductInfo productInfo;
00813     PString         defaultLocalPartyName;
00814     PString         defaultDisplayName;
00815 
00816     unsigned initialBandwidth;  // in 100s of bits/sev
00817     OpalConnection::StringOptions      m_defaultStringOptions;
00818     OpalConnection::SendUserInputModes defaultSendUserInputMode;
00819 
00820     OpalListenerList   listeners;
00821 
00822     class ConnectionDict : public PSafeDictionary<PString, OpalConnection>
00823     {
00824         virtual void DeleteObject(PObject * object) const;
00825     } connectionsActive;
00826     OpalConnection * AddConnection(OpalConnection * connection);
00827 
00828     PMutex inUseFlag;
00829 
00830     friend void OpalManager::GarbageCollection();
00831     friend void OpalConnection::Release(CallEndReason,bool);
00832 
00833   private:
00834     P_REMOVE_VIRTUAL(PBoolean, OnIncomingConnection(OpalConnection &, unsigned), false);
00835     P_REMOVE_VIRTUAL(PBoolean, OnIncomingConnection(OpalConnection &), false);
00836     P_REMOVE_VIRTUAL_VOID(AdjustMediaFormats(const OpalConnection &, OpalMediaFormatList &) const);
00837     P_REMOVE_VIRTUAL_VOID(OnMessageReceived(const PURL&,const PString&,const PURL&,const PString&,const PString&,const PString&));
00838 };
00839 
00840 
00842 bool OpalIsE164(
00843   const PString & number,   
00844   bool strict = false     
00845 );
00846 
00847 
00848 #endif // OPAL_OPAL_ENDPOINT_H
00849 
00850 
00851 // End of File ///////////////////////////////////////////////////////////////

Generated on 14 Aug 2013 for OPAL by  doxygen 1.4.7