manager.h

Go to the documentation of this file.
00001 /*
00002  * manager.h
00003  *
00004  * OPAL system manager.
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: 29734 $
00028  * $Author: rjongbloed $
00029  * $Date: 2013-05-17 01:20:36 -0500 (Fri, 17 May 2013) $
00030  */
00031 
00032 #ifndef OPAL_OPAL_MANAGER_H
00033 #define OPAL_OPAL_MANAGER_H
00034 
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038 
00039 #include <opal/buildopts.h>
00040 
00041 #include <opal/pres_ent.h>
00042 #include <opal/call.h>
00043 #include <opal/connection.h> //OpalConnection::AnswerCallResponse
00044 #include <opal/guid.h>
00045 #include <codec/silencedetect.h>
00046 #include <codec/echocancel.h>
00047 #include <im/im.h>
00048 
00049 #include <ptclib/pstun.h>
00050 #include <ptclib/url.h>
00051 #include <ptclib/pxml.h>
00052 #include <ptclib/threadpool.h>
00053 
00054 #if OPAL_VIDEO
00055 // Inside #if so does not force loading of factories when statically linked.
00056 #include <ptlib/videoio.h>
00057 #endif
00058 
00059 
00060 class OpalEndPoint;
00061 class OpalMediaPatch;
00062 class PSSLCertificate;
00063 class PSSLPrivateKey;
00064 
00065 
00066 #define OPAL_SCRIPT_CALL_TABLE_NAME "OpalCall"
00067 
00068 
00069 class OpalConferenceState : public PObject
00070 {
00071   PCLASSINFO(OpalConferenceState, PObject);
00072 public:
00073   OpalConferenceState()
00074     : m_active(true)
00075     , m_locked(false)
00076     , m_maxUsers(0)
00077   { }
00078 
00079   enum ChangeType {
00080     Created,
00081     Destroyed,
00082     UserAdded,
00083     UserRemoved,
00084     NumChangeTypes
00085   };
00086   friend ostream & operator<<(ostream & strm, ChangeType type);
00087 
00088   PString  m_internalURI;         
00089 
00090   PString  m_displayText;         
00091   PString  m_subject;             
00092   PString  m_notes;               
00093   PString  m_keywords;            
00094   bool     m_active;              
00095   bool     m_locked;              
00096 
00097   struct URI
00098   {
00099     PString m_uri;                
00100     PString m_displayText;        
00101     PString m_purpose;            
00104   };
00105   typedef std::vector<URI> URIs;
00106 
00107   URIs m_accessURI;               
00108   URIs m_serviceURI;              
00112   unsigned m_maxUsers;            
00113 
00114   struct User
00115   {
00116     PString    m_uri;             
00117     PString    m_displayText;     
00118     PStringSet m_roles;           
00119   };
00120   typedef std::vector<User> Users;
00121   Users m_users;
00122 
00123 #if P_EXPAT
00124 
00130   PXML m_xml;
00131 #endif
00132 };
00133 
00134 typedef std::list<OpalConferenceState> OpalConferenceStates;
00135 
00136 
00153 class OpalManager : public PObject
00154 {
00155     PCLASSINFO(OpalManager, PObject);
00156   public:
00161     OpalManager();
00162 
00167     ~OpalManager();
00169 
00179     void AttachEndPoint(
00180       OpalEndPoint * endpoint,    
00181       const PString & prefix = PString::Empty()  
00182     );
00183 
00187     void DetachEndPoint(
00188       const PString & prefix
00189     );
00190     void DetachEndPoint(
00191       OpalEndPoint * endpoint
00192     );
00193 
00196     OpalEndPoint * FindEndPoint(
00197       const PString & prefix  
00198     );
00199 
00202     template <class T> T * FindEndPointAs(
00203       const PString & prefix  
00204     ) { return dynamic_cast<T *>(FindEndPoint(prefix)); }
00205 
00208     PList<OpalEndPoint> GetEndPoints() const;
00209 
00212     PStringList GetPrefixNames(
00213       const OpalEndPoint * endpoint = NULL  
00214     ) const;
00215 
00220     virtual PStringList GetNetworkURIs(
00221       const PString & name
00222     ) const;
00223 
00229     void ShutDownEndpoints();
00231 
00232 
00233 #if OPAL_HAS_PRESENCE
00234 
00242     virtual PSafePtr<OpalPresentity> AddPresentity(
00243       const PString & presentity  
00244     );
00245 
00248     virtual PSafePtr<OpalPresentity> GetPresentity(
00249       const PString & presentity,         
00250       PSafetyMode mode = PSafeReference   
00251     );
00252 
00255     virtual PStringList GetPresentities() const;
00256 
00259     virtual bool RemovePresentity(
00260       const PString & presentity  
00261     );
00263 #endif // OPAL_HAS_PRESENCE
00264 
00265 
00284     virtual PSafePtr<OpalCall> SetUpCall(
00285       const PString & partyA,       
00286       const PString & partyB,       
00287       void * userData = NULL,       
00288       unsigned options = 0,         
00289       OpalConnection::StringOptions * stringOptions = NULL 
00290     );
00291     virtual PBoolean SetUpCall(
00292       const PString & partyA,       
00293       const PString & partyB,       
00294       PString & token,              
00295       void * userData = NULL,       
00296       unsigned options = 0,         
00297       OpalConnection::StringOptions * stringOptions = NULL 
00298     );
00299 
00305     virtual PBoolean HasCall(
00306       const PString & token  
00307     ) { return activeCalls.FindWithLock(token, PSafeReference) != NULL; }
00308 
00311     PINDEX GetCallCount() const { return activeCalls.GetSize(); }
00312 
00315      PArray<PString> GetAllCalls() const { return activeCalls.GetKeys(); }
00316 
00325     PSafePtr<OpalCall> FindCallWithLock(
00326       const PString & token,  
00327       PSafetyMode mode = PSafeReadWrite 
00328     ) const { return activeCalls.FindWithLock(token, mode); }
00329 
00338     virtual void OnEstablishedCall(
00339       OpalCall & call   
00340     );
00341 
00348     virtual PBoolean IsCallEstablished(
00349       const PString & token  
00350     );
00351 
00361     virtual PBoolean ClearCall(
00362       const PString & token,    
00363       OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser, 
00364       PSyncPoint * sync = NULL  
00365     );
00366 
00374     virtual PBoolean ClearCallSynchronous(
00375       const PString & token,    
00376       OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser 
00377     );
00378 
00384     virtual void ClearAllCalls(
00385       OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser, 
00386       PBoolean wait = true   
00387     );
00388 
00402     virtual void OnClearedCall(
00403       OpalCall & call   
00404     );
00405 
00414     virtual OpalCall * CreateCall(
00415       void * userData            
00416     );
00417     OpalCall * InternalCreateCall();
00418 
00427     virtual void DestroyCall(
00428       OpalCall * call
00429     );
00430 
00435     virtual PString GetNextToken(char prefix);
00437 
00438 
00444     class RouteEntry : public PObject
00445     {
00446         PCLASSINFO(RouteEntry, PObject);
00447       public:
00448         RouteEntry(const PString & partyA, const PString & partyB, const PString & dest);
00449         RouteEntry(const PString & spec);
00450 
00451         PObject * Clone() const { return new RouteEntry(*this); }
00452         void PrintOn(ostream & strm) const;
00453 
00454         bool IsValid() const;
00455         bool IsMatch(const PString & search) const;
00456 
00457         const PString & GetPartyA() const { return m_partyA; }
00458         const PString & GetPartyB() const { return m_partyB; }
00459         const PString & GetDestination() const { return m_destination; }
00460 
00461       protected:
00462         PString            m_partyA;      
00463         PString            m_partyB;      
00464         PString            m_destination; 
00465         PRegularExpression m_regex;       
00466 
00467         void CompileRegEx();
00468     };
00469     PARRAY(RouteTable, RouteEntry);
00470 
00581     virtual PBoolean AddRouteEntry(
00582       const PString & spec  
00583     );
00584 
00591     PBoolean SetRouteTable(
00592       const PStringArray & specs  
00593     );
00594 
00599     void SetRouteTable(
00600       const RouteTable & table  
00601     );
00602 
00605     const RouteTable & GetRouteTable() const { return m_routeTable; }
00606 
00614     virtual PString ApplyRouteTable(
00615       const PString & source,      
00616       const PString & destination, 
00617       PINDEX & entry               
00618     );
00619 
00626     virtual bool OnRouteConnection(
00627       PStringSet & routesTried,     
00628       const PString & a_party,      
00629       const PString & b_party,      
00630       OpalCall & call,              
00631       unsigned options,             
00632       OpalConnection::StringOptions * stringOptions 
00633     );
00635 
00636 
00673     virtual PSafePtr<OpalConnection> MakeConnection(
00674       OpalCall & call,                   
00675       const PString & party,             
00676       void * userData = NULL,            
00677       unsigned int options = 0,          
00678       OpalConnection::StringOptions * stringOptions = NULL 
00679     );
00680 
00686     virtual void OnNewConnection(
00687       OpalConnection & connection   
00688     );
00689 
00716     virtual PBoolean OnIncomingConnection(
00717       OpalConnection & connection,   
00718       unsigned options,              
00719       OpalConnection::StringOptions * stringOptions 
00720     );
00721 
00727     virtual void OnApplyStringOptions(
00728       OpalConnection & connection,                  
00729       OpalConnection::StringOptions & stringOptions 
00730     );
00731 
00747     virtual void OnProceeding(
00748       OpalConnection & connection   
00749     );
00750 
00767     virtual void OnAlerting(
00768       OpalConnection & connection   
00769     );
00770 
00787     virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00788       OpalConnection & connection,    
00789        const PString & caller         
00790     );
00791 
00803     virtual void OnConnected(
00804       OpalConnection & connection   
00805     );
00806 
00820     virtual void OnEstablished(
00821       OpalConnection & connection   
00822     );
00823 
00839     virtual void OnReleased(
00840       OpalConnection & connection   
00841     );
00842     
00849     virtual void OnHold(
00850       OpalConnection & connection,   
00851       bool fromRemote,               
00852       bool onHold                    
00853     );
00854     virtual void OnHold(OpalConnection & connection); // For backward compatibility
00855 
00860     virtual PBoolean OnForwarded(
00861       OpalConnection & connection,  
00862       const PString & remoteParty         
00863     );
00864 
00910     virtual bool OnTransferNotify(
00911       OpalConnection & connection,  
00912       const PStringToString & info  
00913     );
00915 
00916 
00926     virtual OpalMediaFormatList GetCommonMediaFormats(
00927       bool transportable,  
00928       bool pcmAudio        
00929     ) const;
00930 
00940     virtual void AdjustMediaFormats(
00941       bool local,                         
00942       const OpalConnection & connection,  
00943       OpalMediaFormatList & mediaFormats  
00944     ) const;
00945 
00947     enum MediaTransferMode {
00948       MediaTransferBypass,   
00951       MediaTransferForward,  
00954       MediaTransferTranscode 
00957     };
00958 
00971     virtual MediaTransferMode GetMediaTransferMode(
00972       const OpalConnection & source,      
00973       const OpalConnection & destination, 
00974       const OpalMediaType & mediaType     
00975     ) const;
00976 
00992     virtual PBoolean OnOpenMediaStream(
00993       OpalConnection & connection,  
00994       OpalMediaStream & stream    
00995     );
00996 
01013     virtual bool OnLocalRTP(
01014       OpalConnection & connection1, 
01015       OpalConnection & connection2, 
01016       unsigned sessionID,           
01017       bool opened                   
01018     ) const;
01019 
01045     bool SetMediaPassThrough(
01046       const PString & token1, 
01047       const PString & token2, 
01048       bool bypass,            
01049       unsigned sessionID = 0, 
01050       bool network  = true    
01051     );
01052     static bool SetMediaPassThrough(
01053       OpalConnection & connection1, 
01054       OpalConnection & connection2, 
01055       bool bypass,                  
01056       unsigned sessionID = 0        
01057     );
01058 
01063     virtual void OnClosedMediaStream(
01064       const OpalMediaStream & stream     
01065     );
01066 
01067 #if OPAL_VIDEO
01068 
01070     virtual PBoolean CreateVideoInputDevice(
01071       const OpalConnection & connection,    
01072       const OpalMediaFormat & mediaFormat,  
01073       PVideoInputDevice * & device,         
01074       PBoolean & autoDelete                     
01075     );
01076 
01080     virtual PBoolean CreateVideoOutputDevice(
01081       const OpalConnection & connection,    
01082       const OpalMediaFormat & mediaFormat,  
01083       PBoolean preview,                         
01084       PVideoOutputDevice * & device,        
01085       PBoolean & autoDelete                     
01086     );
01087 #endif
01088 
01096     virtual OpalMediaPatch * CreateMediaPatch(
01097       OpalMediaStream & source,         
01098       PBoolean requiresPatchThread = true  
01099     );
01100 
01107     virtual void OnStartMediaPatch(
01108       OpalConnection & connection,  
01109       OpalMediaPatch & patch        
01110     );
01111 
01114     virtual void OnStopMediaPatch(
01115       OpalConnection & connection,  
01116       OpalMediaPatch & patch        
01117     );
01118 
01134     virtual bool OnMediaFailed(
01135       OpalConnection & connection,  
01136       unsigned sessionId,           
01137       bool source                   
01138     );
01140 
01141 
01149     virtual void OnUserInputString(
01150       OpalConnection & connection,  
01151       const PString & value         
01152     );
01153 
01160     virtual void OnUserInputTone(
01161       OpalConnection & connection,  
01162       char tone,                    
01163       int duration                  
01164     );
01165 
01168     virtual PString ReadUserInput(
01169       OpalConnection & connection,        
01170       const char * terminators = "YX#\r\n", 
01171       unsigned lastDigitTimeout = 4,      
01172       unsigned firstDigitTimeout = 30     
01173     );
01175 
01176 
01177 #if OPAL_HAS_MIXER
01178 
01188     virtual PBoolean StartRecording(
01189       const PString & callToken,  
01190       const PFilePath & filename, 
01191       const OpalRecordManager::Options & options = false 
01192     );
01193 
01196     virtual bool IsRecording(
01197       const PString & callToken   
01198     );
01199 
01204     virtual bool StopRecording(
01205       const PString & callToken   
01206     );
01207 
01209 #endif
01210 
01211 
01212 #if OPAL_HAS_IM
01213 
01218     virtual void OnConversation(
01219       const OpalIMContext::ConversationInfo & info 
01220     );
01221 
01231     virtual PBoolean Message(
01232       OpalIM & message
01233     );
01234 
01236     virtual PBoolean Message(
01237       const PString & to, 
01238       const PString & body
01239     );
01240 
01242     virtual PBoolean Message(
01243       const PURL & to, 
01244       const PString & type,
01245       const PString & body,
01246       PURL & from, 
01247       PString & conversationId
01248     );
01249 
01255     virtual void OnMessageReceived(
01256       const OpalIM & message    
01257     );
01258 
01263     virtual void OnMessageDisposition(
01264       const OpalIMContext::DispositionInfo & info    
01265     );
01266 
01271     virtual void OnCompositionIndication(
01272       const OpalIMContext::CompositionInfo & info     
01273     );
01275 #endif
01276 
01277 
01280 
01281     enum MessageWaitingType { 
01282       NoMessageWaiting,
01283       VoiceMessageWaiting, 
01284       FaxMessageWaiting,
01285       PagerMessageWaiting,
01286       MultimediaMessageWaiting,
01287       TextMessageWaiting,
01288       NumMessageWaitingTypes
01289     };
01290 
01301     virtual void OnMWIReceived(
01302       const PString & party,    
01303       MessageWaitingType type,  
01304       const PString & extraInfo 
01305     );
01306 
01321     virtual bool GetConferenceStates(
01322       OpalConferenceStates & states,           
01323       const PString & name = PString::Empty() 
01324     ) const;
01325 
01335     virtual void OnConferenceStatusChanged(
01336       OpalEndPoint & endpoint,  
01337       const PString & uri,      
01338       OpalConferenceState::ChangeType change 
01339     );
01340 
01348     virtual bool OnChangedPresentationRole(
01349       OpalConnection & connection,   
01350       const PString & newChairURI,   
01351       bool request                   
01352     );
01354 
01355 
01358 #if OPAL_PTLIB_SSL
01359 
01371     virtual bool ApplySSLCredentials(
01372       const OpalEndPoint & ep,  
01373       PSSLContext & context,    
01374       bool create               
01375     ) const;
01376 
01379     const PString & GetSSLCertificateAuthorityFiles() const { return m_caFiles; }
01380 
01383     void SetSSLCertificateAuthorityFiles(const PString & files) { m_caFiles = files; }
01384 
01387     const PString & GetSSLCertificateFile() const { return m_certificateFile; }
01388 
01391     void SetSSLCertificateFile(const PString & file) { m_certificateFile = file; }
01392 
01395     const PString & GetSSLPrivateKeyFile() const { return m_privateKeyFile; }
01396 
01399     void SetSSLPrivateKeyFile(const PString & file) { m_privateKeyFile = file; }
01400 
01403     void SetSSLAutoCreateCertificate(bool yes) { m_autoCreateCertificate = yes; }
01404 #endif
01405 
01412     virtual PBoolean IsLocalAddress(
01413       const PIPSocket::Address & remoteAddress
01414     ) const;
01415 
01433     virtual PBoolean IsRTPNATEnabled(
01434       OpalConnection & connection,            
01435       const PIPSocket::Address & localAddr,   
01436       const PIPSocket::Address & peerAddr,    
01437       const PIPSocket::Address & signalAddr,  
01438       PBoolean incoming                       
01439     );
01440 
01447     virtual PBoolean TranslateIPAddress(
01448       PIPSocket::Address & localAddress,
01449       const PIPSocket::Address & remoteAddress
01450     );
01451 
01452 #if P_NAT
01453 
01455     PNatStrategy & GetNatMethods() const { return *m_natMethods; }
01456 
01462     virtual PNatMethod * GetNatMethod(
01463       const PIPSocket::Address & remoteAddress = PIPSocket::GetDefaultIpAny()
01464     ) const;
01465 
01468     bool SetNATServer(
01469       const PString & method,
01470       const PString & server
01471     );
01472 
01475     PString GetNATServer() const 
01476     { 
01477       return (m_natMethod == NULL) ? PString::Empty() : m_natMethod->GetServer();
01478     }
01479 
01482     P_DEPRECATED PString GetTranslationHost() const;
01483 
01486     P_DEPRECATED bool SetTranslationHost(
01487       const PString & host
01488     );
01489 
01492     P_DEPRECATED PIPSocket::Address GetTranslationAddress() const;
01493 
01496     P_DEPRECATED void SetTranslationAddress(
01497       const PIPSocket::Address & address
01498     );
01499 
01502     P_DEPRECATED bool HasTranslationAddress() const;
01503 
01504 #ifdef P_STUN
01505 
01509     P_DEPRECATED PSTUNClient::NatTypes SetSTUNServer(
01510       const PString & server
01511     ) {
01512       return SetNATServer(PSTUNClient::GetNatMethodName(), server) ? m_natMethod->GetNatType() : PSTUNClient::UnknownNat;
01513     }
01514 
01517     P_DEPRECATED PString GetSTUNServer() const 
01518     { 
01519       return (dynamic_cast<PSTUNClient *>(m_natMethod) == NULL) ? PString::Empty() : m_natMethod->GetServer(); 
01520     }
01521 
01524     P_DEPRECATED PSTUNClient * GetSTUNClient() const { return dynamic_cast<PSTUNClient *>(m_natMethod); }
01525 #endif // P_STUN
01526 #endif // P_NAT
01527 
01530     WORD GetTCPPortBase() const { return tcpPorts.base; }
01531 
01534     WORD GetTCPPortMax() const { return tcpPorts.max; }
01535 
01538     void SetTCPPorts(unsigned tcpBase, unsigned tcpMax);
01539 
01542     WORD GetNextTCPPort();
01543 
01546     WORD GetUDPPortBase() const { return udpPorts.base; }
01547 
01550     WORD GetUDPPortMax() const { return udpPorts.max; }
01551 
01554     void SetUDPPorts(unsigned udpBase, unsigned udpMax);
01555 
01558     WORD GetNextUDPPort();
01559 
01562     WORD GetRtpIpPortBase() const { return rtpIpPorts.base; }
01563 
01566     WORD GetRtpIpPortMax() const { return rtpIpPorts.max; }
01567 
01570     void SetRtpIpPorts(unsigned udpBase, unsigned udpMax);
01571 
01574     WORD GetRtpIpPortPair();
01575 
01578     BYTE GetMediaTypeOfService() const;
01579 
01582     void SetMediaTypeOfService(unsigned tos);
01583 
01586     BYTE GetMediaTypeOfService(const OpalMediaType & type) const;
01587 
01590     void SetMediaTypeOfService(const OpalMediaType & type, unsigned tos);
01591 
01594     const PIPSocket::QoS & GetMediaQoS(const OpalMediaType & type) const;
01595 
01598     void SetMediaQoS(const OpalMediaType & type, const PIPSocket::QoS & qos);
01599 
01604     PINDEX GetMaxRtpPayloadSize() const { return rtpPayloadSizeMax; }
01605 
01610     void SetMaxRtpPayloadSize(
01611       PINDEX size,
01612       bool mtu = false
01613     ) { rtpPayloadSizeMax = size - (mtu ? (20+16+12) : 0); }
01614 
01618     PINDEX GetMaxRtpPacketSize() const { return rtpPacketSizeMax; }
01619 
01623     void SetMaxRtpPacketSize(
01624       PINDEX size
01625     ) { rtpPacketSizeMax = size; }
01627 
01628 
01633     const OpalProductInfo & GetProductInfo() const { return productInfo; }
01634 
01637     void SetProductInfo(
01638       const OpalProductInfo & info, 
01639       bool updateAll = true         
01640     );
01641 
01644     const PString & GetDefaultUserName() const { return defaultUserName; }
01645 
01648     void SetDefaultUserName(
01649       const PString & name,   
01650       bool updateAll = true   
01651     );
01652 
01655     const PString & GetDefaultDisplayName() const { return defaultDisplayName; }
01656 
01659     void SetDefaultDisplayName(
01660       const PString & name,   
01661       bool updateAll = true   
01662     );
01663 
01668     void SetDefaultConnectionOptions(
01669       const OpalConnection::StringOptions & stringOptions
01670     ) { m_defaultConnectionOptions = stringOptions; }
01671 
01672 #if OPAL_VIDEO
01673 
01674     //
01675     // these functions are deprecated and used only for backwards compatibility
01676     // applications should use OpalConnection::GetAutoStart() to check whether
01677     // a specific media type can be auto-started
01678     //
01679 
01682     bool CanAutoStartReceiveVideo() const { return (OpalMediaType::Video().GetAutoStart()&OpalMediaType::Receive) != 0; }
01683 
01686     void SetAutoStartReceiveVideo(bool can) { OpalMediaType::Video()->SetAutoStart(OpalMediaType::Receive, can); }
01687 
01690     bool CanAutoStartTransmitVideo() const { return (OpalMediaType::Video().GetAutoStart()&OpalMediaType::Transmit) != 0; }
01691 
01694     void SetAutoStartTransmitVideo(bool can) { OpalMediaType::Video()->SetAutoStart(OpalMediaType::Transmit, can); }
01695 
01696 #endif
01697 
01701     unsigned GetMinAudioJitterDelay() const { return minAudioJitterDelay; }
01702 
01706     unsigned GetMaxAudioJitterDelay() const { return maxAudioJitterDelay; }
01707 
01717     void SetAudioJitterDelay(
01718       unsigned minDelay,   
01719       unsigned maxDelay    
01720     );
01721 
01724     const PStringArray & GetMediaFormatOrder() const { return mediaFormatOrder; }
01725 
01728     void SetMediaFormatOrder(
01729       const PStringArray & order   
01730     );
01731 
01737     const PStringArray & GetMediaFormatMask() const { return mediaFormatMask; }
01738 
01744     void SetMediaFormatMask(
01745       const PStringArray & mask   //< New mask
01746     );
01747 
01750     virtual void SetSilenceDetectParams(
01751       const OpalSilenceDetector::Params & params
01752     ) { silenceDetectParams = params; }
01753 
01756     const OpalSilenceDetector::Params & GetSilenceDetectParams() const { return silenceDetectParams; }
01757     
01758 #if OPAL_AEC
01759 
01761     virtual void SetEchoCancelParams(
01762       const OpalEchoCanceler::Params & params
01763     ) { echoCancelParams = params; }
01764 
01767     const OpalEchoCanceler::Params & GetEchoCancelParams() const { return echoCancelParams; }
01768 #endif
01769 
01770 #if OPAL_VIDEO
01771 
01779     virtual PBoolean SetVideoInputDevice(
01780       const PVideoDevice::OpenArgs & deviceArgs 
01781     );
01782 
01786     const PVideoDevice::OpenArgs & GetVideoInputDevice() const { return videoInputDevice; }
01787 
01795     virtual PBoolean SetVideoPreviewDevice(
01796       const PVideoDevice::OpenArgs & deviceArgs 
01797     );
01798 
01802     const PVideoDevice::OpenArgs & GetVideoPreviewDevice() const { return videoPreviewDevice; }
01803 
01811     virtual PBoolean SetVideoOutputDevice(
01812       const PVideoDevice::OpenArgs & deviceArgs 
01813     );
01814 
01818     const PVideoDevice::OpenArgs & GetVideoOutputDevice() const { return videoOutputDevice; }
01819 
01820 #endif
01821 
01822     PBoolean DetectInBandDTMFDisabled() const
01823       { return disableDetectInBandDTMF; }
01824 
01827     void DisableDetectInBandDTMF(
01828       PBoolean mode 
01829     ) { disableDetectInBandDTMF = mode; } 
01830 
01833     const PTimeInterval & GetNoMediaTimeout() const { return m_noMediaTimeout; }
01834 
01837     void SetNoMediaTimeout(
01838       const PTimeInterval & newInterval  
01839     ) { m_noMediaTimeout = newInterval; }
01840 
01843     const PTimeInterval & GetSignalingTimeout() const { return m_signalingTimeout; }
01844 
01847     void SetSignalingTimeout(
01848       const PTimeInterval & newInterval  
01849     ) { m_signalingTimeout = newInterval; }
01850 
01853     const PString & GetDefaultILSServer() const { return ilsServer; }
01854 
01857     void SetDefaultILSServer(
01858       const PString & server
01859     ) { ilsServer = server; }
01860 
01861 #if OPAL_SCRIPT
01862 
01907     PScriptLanguage * GetScript() const { return m_script; }
01908 
01911     bool RunScript(
01912       const PString & script,
01913       const char * language = "Lua"
01914     );
01915 #endif // OPAL_SCRIPT
01916 
01917 
01918     // needs to be public for gcc 3.4
01919     void GarbageCollection();
01920 
01921     // Decoupled event to avoid deadlocks, especially from patch threads
01922     void QueueDecoupledEvent(PSafeWork * work) { m_decoupledEventPool.AddWork(work); }
01923 
01924   protected:
01925     // Configuration variables
01926     OpalProductInfo productInfo;
01927 
01928     PString       defaultUserName;
01929     PString       defaultDisplayName;
01930 
01931     typedef std::map<OpalMediaType, PIPSocket::QoS> MediaQoSMap;
01932     mutable MediaQoSMap m_mediaQoS;
01933 
01934     OpalConnection::StringOptions m_defaultConnectionOptions;
01935 
01936     PINDEX        rtpPayloadSizeMax;
01937     PINDEX        rtpPacketSizeMax;
01938     unsigned      minAudioJitterDelay;
01939     unsigned      maxAudioJitterDelay;
01940     PStringArray  mediaFormatOrder;
01941     PStringArray  mediaFormatMask;
01942     bool          disableDetectInBandDTMF;
01943     PTimeInterval m_noMediaTimeout;
01944     PTimeInterval m_signalingTimeout;
01945     PString       ilsServer;
01946 
01947     OpalSilenceDetector::Params silenceDetectParams;
01948 #if OPAL_AEC
01949     OpalEchoCanceler::Params echoCancelParams;
01950 #endif
01951 
01952 #if OPAL_VIDEO
01953     PVideoDevice::OpenArgs videoInputDevice;
01954     PVideoDevice::OpenArgs videoPreviewDevice;
01955     PVideoDevice::OpenArgs videoOutputDevice;
01956 #endif
01957 
01958     struct PortInfo {
01959       void Set(
01960         unsigned base,
01961         unsigned max,
01962         unsigned range,
01963         unsigned dflt
01964       );
01965       WORD GetNext(
01966         unsigned increment
01967       );
01968 
01969       PMutex mutex;
01970       WORD   base;
01971       WORD   max;
01972       WORD   current;
01973     } tcpPorts, udpPorts, rtpIpPorts;
01974     
01975 #if OPAL_PTLIB_SSL
01976     PString   m_caFiles;
01977     PFilePath m_certificateFile;
01978     PFilePath m_privateKeyFile;
01979     bool      m_autoCreateCertificate;
01980 #endif
01981 
01982 #if P_NAT
01983     PNatStrategy     * m_natMethods;
01984     PNatMethod       * m_natMethod;
01985     PDECLARE_InterfaceNotifier(OpalManager, OnInterfaceChange);
01986 #endif
01987 
01988     RouteTable m_routeTable;
01989     PMutex     m_routeMutex;
01990 
01991     // Dynamic variables
01992     PReadWriteMutex     endpointsMutex;
01993     PList<OpalEndPoint> endpointList;
01994     std::map<PString, OpalEndPoint *> endpointMap;
01995 
01996     PAtomicInteger lastCallTokenID;
01997 
01998     class CallDict : public PSafeDictionary<PString, OpalCall>
01999     {
02000       public:
02001         CallDict(OpalManager & mgr) : manager(mgr) { }
02002         virtual void DeleteObject(PObject * object) const;
02003         OpalManager & manager;
02004     } activeCalls;
02005 
02006 #if OPAL_HAS_PRESENCE
02007     PSafeDictionary<PString, OpalPresentity> m_presentities;
02008 #endif // OPAL_HAS_PRESENCE
02009 
02010     PAtomicInteger m_clearingAllCallsCount;
02011     PMutex         m_clearingAllCallsMutex;
02012     PSyncPoint     m_allCallsCleared;
02013     void InternalClearAllCalls(OpalConnection::CallEndReason reason, bool wait, bool first);
02014 
02015     PThread    * m_garbageCollector;
02016     PSyncPoint   m_garbageCollectExit;
02017     bool         m_garbageCollectSkip;
02018     PDECLARE_NOTIFIER(PThread, OpalManager, GarbageMain);
02019 
02020     friend OpalCall::OpalCall(OpalManager & mgr);
02021     friend void OpalCall::InternalOnClear();
02022 
02023     PSafeThreadPool m_decoupledEventPool;
02024 
02025 #if OPAL_SCRIPT
02026     PScriptLanguage * m_script;
02027 #endif
02028 
02029   private:
02030     P_REMOVE_VIRTUAL(OpalCall *,CreateCall(), 0);
02031     P_REMOVE_VIRTUAL(PBoolean, OnIncomingConnection(OpalConnection &, unsigned), false);
02032     P_REMOVE_VIRTUAL(PBoolean, OnIncomingConnection(OpalConnection &), false);
02033     P_REMOVE_VIRTUAL(PBoolean, OnStartMediaPatch(const OpalMediaPatch &), false);
02034     P_REMOVE_VIRTUAL_VOID(AdjustMediaFormats(const OpalConnection &, OpalMediaFormatList &) const);
02035     P_REMOVE_VIRTUAL_VOID(OnMessageReceived(const PURL&,const PString&,const PURL&,const PString&,const PString&,const PString&));
02036     P_REMOVE_VIRTUAL_VOID(OnRTPStatistics(const OpalConnection &, const OpalRTPSession &));
02037     P_REMOVE_VIRTUAL(PBoolean, IsMediaBypassPossible(const OpalConnection &,const OpalConnection &,unsigned) const, false);
02038 };
02039 
02040 
02041 PString  OpalGetVersion();
02042 unsigned OpalGetMajorVersion();
02043 unsigned OpalGetMinorVersion();
02044 unsigned OpalGetBuildNumber();
02045 
02046 
02047 #endif // OPAL_OPAL_MANAGER_H
02048 
02049 
02050 // End of File ///////////////////////////////////////////////////////////////

Generated on 21 Jun 2013 for OPAL by  doxygen 1.4.7