h323con.h

Go to the documentation of this file.
00001 /*
00002  * h323con.h
00003  *
00004  * H.323 protocol handler
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open H323 Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Portions of this code were written with the assisance of funding from
00025  * Vovida Networks, Inc. http://www.vovida.com.
00026  *
00027  * Contributor(s): ______________________________________.
00028  *
00029  * $Log: h323con.h,v $
00030  * Revision 2.44  2006/01/02 15:52:38  dsandras
00031  * Added what was required to merge changes from OpenH323 Altas_devel_2 in gkclient.cxx, gkserver.cxx and channels.cxx.
00032  *
00033  * Revision 2.43  2005/12/09 05:41:10  csoutheren
00034  * Added ability to set explicit Q.931 cause code on call end
00035  *
00036  * Revision 2.42  2005/11/30 13:35:26  csoutheren
00037  * Changed tags for Doxygen
00038  *
00039  * Revision 2.41  2005/11/24 04:46:41  dereksmithies
00040  * Remove detectInBandDTMF, as it is already declared in the OpalConnection
00041  * class. Thanks to valgrind on suse 10 for finding this one.
00042  *
00043  * Revision 2.40  2005/10/04 13:01:51  rjongbloed
00044  * Moved addition of a media stream to list in OpalConnection to OnOpenMediaStream
00045  *   so is consistent across protocols.
00046  *
00047  * Revision 2.39  2005/09/29 20:20:36  dsandras
00048  * Added call to OnOpenMediaStream so that the stream can be added to the mediaStreams.
00049  *
00050  * Revision 2.38  2005/09/04 06:23:38  rjongbloed
00051  * Added OpalMediaCommand mechanism (via PNotifier) for media streams
00052  *   and media transcoders to send commands back to remote.
00053  *
00054  * Revision 2.37  2005/08/05 19:21:04  csoutheren
00055  * Ensure H323Connection calls OnAlerting even if no ALERT is received
00056  *
00057  * Revision 2.36  2005/07/11 01:52:15  csoutheren
00058  * Extended AnsweringCall to work for SIP as well as H.323
00059  * Fixed problems with external RTP connection in H.323
00060  * Added call to OnClosedMediaStream
00061  *
00062  * Revision 2.35  2005/04/10 20:35:20  dsandras
00063  * Added support for blind transfert.
00064  *
00065  * Revision 2.34  2005/04/10 20:33:53  dsandras
00066  * Added support to hold and retrieve a connection. Basically a rename of the old
00067  * functions while keeping backward compatibility.
00068  *
00069  * Revision 2.33  2005/04/10 20:31:17  dsandras
00070  * Added support to return the "best guess" callback h323 url.
00071  *
00072  * Revision 2.32  2005/03/01 17:51:02  dsandras
00073  * Removed erroneous definition of RTP_SessionManager preventing the get the RTP_Session from the connection when called on an OpalConnection object. The RTP_SessionManager is now part of OpalConnection.
00074  *
00075  * Revision 2.31  2005/01/16 11:28:04  csoutheren
00076  * Added GetIdentifier virtual function to OpalConnection, and changed H323
00077  * and SIP descendants to use this function. This allows an application to
00078  * obtain a GUID for any connection regardless of the protocol used
00079  *
00080  * Revision 2.30  2004/12/12 12:29:02  dsandras
00081  * Moved GetRemoteApplication () to OpalConnection so that it is usable for all types of connection.
00082  *
00083  * Revision 2.29  2004/08/14 07:56:28  rjongbloed
00084  * Major revision to utilise the PSafeCollection classes for the connections and calls.
00085  *
00086  * Revision 2.28  2004/06/04 06:54:17  csoutheren
00087  * Migrated updates from OpenH323 1.14.1
00088  *
00089  * Revision 2.27  2004/05/09 13:12:37  rjongbloed
00090  * Fixed issues with non fast start and non-tunnelled connections
00091  *
00092  * Revision 2.26  2004/05/01 10:00:41  rjongbloed
00093  * Fixed ClearCallSynchronous so now is actually signalled when call is destroyed.
00094  *
00095  * Revision 2.25  2004/04/26 04:33:03  rjongbloed
00096  * Move various call progress times from H.323 specific to general conenction.
00097  *
00098  * Revision 2.24  2004/03/13 06:25:49  rjongbloed
00099  * Slight rearrangement of local party name and alias list to beter match common
00100  *   behaviour in ancestor.
00101  * Abstracted local party name for endpoint into ancestor from H.,323.
00102  *
00103  * Revision 2.23  2004/02/24 11:28:45  rjongbloed
00104  * Normalised RTP session management across protocols
00105  *
00106  * Revision 2.22  2004/02/19 10:46:43  rjongbloed
00107  * Merged OpenH323 version 1.13.1 changes.
00108  *
00109  * Revision 2.21  2003/03/17 10:26:59  robertj
00110  * Added video support.
00111  *
00112  * Revision 2.20  2003/03/06 03:57:46  robertj
00113  * IVR support (work in progress) requiring large changes everywhere.
00114  *
00115  * Revision 2.19  2003/01/07 04:39:52  robertj
00116  * Updated to OpenH323 v1.11.2
00117  *
00118  * Revision 2.18  2002/11/10 22:59:20  robertj
00119  * Fixed override of SetCallEndReason to have same parameters as base virtual.
00120  *
00121  * Revision 2.17  2002/11/10 11:33:16  robertj
00122  * Updated to OpenH323 v1.10.3
00123  *
00124  * Revision 2.16  2002/09/16 02:52:33  robertj
00125  * Added #define so can select if #pragma interface/implementation is used on
00126  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00127  *
00128  * Revision 2.15  2002/09/04 06:01:46  robertj
00129  * Updated to OpenH323 v1.9.6
00130  *
00131  * Revision 2.14  2002/07/01 04:56:29  robertj
00132  * Updated to OpenH323 v1.9.1
00133  *
00134  * Revision 2.13  2002/04/09 00:17:08  robertj
00135  * Changed "callAnswered" to better description of "originating".
00136  *
00137  * Revision 2.12  2002/02/19 07:43:40  robertj
00138  * Restructured media bypass functions to fix problems with RFC2833.
00139  *
00140  * Revision 2.11  2002/02/11 09:32:11  robertj
00141  * Updated to openH323 v1.8.0
00142  *
00143  * Revision 2.10  2002/02/11 07:37:43  robertj
00144  * Added media bypass for streams between compatible protocols.
00145  *
00146  * Revision 2.9  2002/01/22 04:59:04  robertj
00147  * Update from OpenH323, RFC2833 support
00148  *
00149  * Revision 2.8  2002/01/14 06:35:56  robertj
00150  * Updated to OpenH323 v1.7.9
00151  *
00152  * Revision 2.7  2001/11/02 10:45:19  robertj
00153  * Updated to OpenH323 v1.7.3
00154  *
00155  * Revision 2.6  2001/10/15 04:31:14  robertj
00156  * Removed answerCall signal and replaced with state based functions.
00157  * Maintained H.323 answerCall API for backward compatibility.
00158  *
00159  * Revision 2.5  2001/10/05 00:22:13  robertj
00160  * Updated to PWLib 1.2.0 and OpenH323 1.7.0
00161  *
00162  * Revision 2.4  2001/10/03 05:56:15  robertj
00163  * Changes abndwidth management API.
00164  *
00165  * Revision 2.3  2001/08/22 09:42:14  robertj
00166  * Removed duplicate member variables moved to ancestor.
00167  *
00168  * Revision 2.2  2001/08/17 08:21:15  robertj
00169  * Update from OpenH323
00170  * Moved call end reasons enum from OpalConnection to global.
00171  *
00172  * Revision 2.1  2001/08/01 05:11:04  robertj
00173  * Moved media formats list from endpoint to connection.
00174  *
00175  * Revision 2.0  2001/07/27 15:48:24  robertj
00176  * Conversion of OpenH323 to Open Phone Abstraction Library (OPAL)
00177  *
00178  * Revision 1.64  2003/12/28 02:38:14  csoutheren
00179  * Added H323EndPoint::OnOutgoingCall
00180  *
00181  * Revision 1.63  2003/12/14 10:42:29  rjongbloed
00182  * Changes for compilability without video support.
00183  *
00184  * Revision 1.62  2003/10/27 06:03:38  csoutheren
00185  * Added support for QoS
00186  *   Thanks to Henry Harrison of AliceStreet
00187  *
00188  * Revision 1.61  2003/10/09 09:47:45  csoutheren
00189  * Fixed problem with re-opening RTP half-channels under unusual
00190  * circumstances. Thanks to Damien Sandras
00191  *
00192  * Revision 1.60  2003/04/30 00:28:50  robertj
00193  * Redesigned the alternate credentials in ARQ system as old implementation
00194  *   was fraught with concurrency issues, most importantly it can cause false
00195  *   detection of replay attacks taking out an endpoint completely.
00196  *
00197  * Revision 1.59  2003/02/12 23:59:22  robertj
00198  * Fixed adding missing endpoint identifer in SETUP packet when gatekeeper
00199  * routed, pointed out by Stefan Klein
00200  * Also fixed correct rutrn of gk routing in IRR packet.
00201  *
00202  * Revision 1.58  2002/11/27 06:54:52  robertj
00203  * Added Service Control Session management as per Annex K/H.323 via RAS
00204  *   only at this stage.
00205  * Added H.248 ASN and very primitive infrastructure for linking into the
00206  *   Service Control Session management system.
00207  * Added basic infrastructure for Annex K/H.323 HTTP transport system.
00208  * Added Call Credit Service Control to display account balances.
00209  *
00210  * Revision 1.57  2002/11/15 05:17:22  robertj
00211  * Added facility redirect support without changing the call token for access
00212  *   to the call. If it gets redirected a new H323Connection object is
00213  *   created but it looks like the same thing to an application.
00214  *
00215  * Revision 1.56  2002/11/13 04:37:23  robertj
00216  * Added ability to get (and set) Q.931 release complete cause codes.
00217  *
00218  * Revision 1.55  2002/11/10 06:17:26  robertj
00219  * Fixed minor documentation errors.
00220  *
00221  * Revision 1.54  2002/11/05 00:24:09  robertj
00222  * Added function to determine if Q.931 CONNECT sent/received.
00223  *
00224  * Revision 1.53  2002/10/31 00:31:47  robertj
00225  * Enhanced jitter buffer system so operates dynamically between minimum and
00226  *   maximum values. Altered API to assure app writers note the change!
00227  *
00228  * Revision 1.52  2002/09/16 01:14:15  robertj
00229  * Added #define so can select if #pragma interface/implementation is used on
00230  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00231  *
00232  * Revision 1.51  2002/09/03 06:19:36  robertj
00233  * Normalised the multi-include header prevention ifdef/define symbol.
00234  *
00235  * Revision 1.50  2002/08/05 10:03:47  robertj
00236  * Cosmetic changes to normalise the usage of pragma interface/implementation.
00237  *
00238  * Revision 1.49  2002/08/05 05:17:37  robertj
00239  * Fairly major modifications to support different authentication credentials
00240  *   in ARQ to the logged in ones on RRQ. For both client and server.
00241  * Various other H.235 authentication bugs and anomalies fixed on the way.
00242  *
00243  * Revision 1.48  2002/07/05 02:22:56  robertj
00244  * Added support for standard and non-standard T.38 mode change.
00245  *
00246  * Revision 1.47  2002/07/04 00:40:31  robertj
00247  * More H.450.11 call intrusion implementation, thanks Aleksandar Todorovic
00248  *
00249  * Revision 1.46  2002/06/22 06:11:30  robertj
00250  * Fixed bug on sometimes missing received endSession causing 10 second
00251  *   timeout in connection clean up.
00252  *
00253  * Revision 1.45  2002/06/22 05:48:38  robertj
00254  * Added partial implementation for H.450.11 Call Intrusion
00255  *
00256  * Revision 1.44  2002/06/13 06:15:19  robertj
00257  * Allowed TransferCall() to be used on H323Connection as well as H323EndPoint.
00258  *
00259  * Revision 1.43  2002/06/05 08:58:58  robertj
00260  * Fixed documentation of remote application name string.
00261  * Added missing virtual keywards on some protocol handler functions.
00262  *
00263  * Revision 1.42  2002/05/29 06:40:29  robertj
00264  * Changed sending of endSession/ReleaseComplete PDU's to occur immediately
00265  *   on call clearance and not wait for background thread to do it.
00266  * Stricter compliance by waiting for reply endSession before closing down.
00267  *
00268  * Revision 1.41  2002/05/29 03:55:17  robertj
00269  * Added protocol version number checking infrastructure, primarily to improve
00270  *   interoperability with stacks that are unforgiving of new features.
00271  *
00272  * Revision 1.40  2002/05/21 09:32:49  robertj
00273  * Added ability to set multiple alias names ona  connection by connection
00274  *   basis, defaults to endpoint list, thanks Artis Kugevics
00275  *
00276  * Revision 1.39  2002/05/15 23:59:33  robertj
00277  * Added memory management of created T.38 and T.120 handlers.
00278  * Improved documentation for use of T.38 and T.120 functions.
00279  * Added ability to initiate a mode change for non-standard T.38
00280  *
00281  * Revision 1.38  2002/05/07 01:31:51  dereks
00282  * Fix typo in documentation.
00283  *
00284  * Revision 1.37  2002/05/03 05:38:15  robertj
00285  * Added Q.931 Keypad IE mechanism for user indications (DTMF).
00286  *
00287  * Revision 1.36  2002/05/02 07:56:24  robertj
00288  * Added automatic clearing of call if no media (RTP data) is transferred in a
00289  *   configurable (default 5 minutes) amount of time.
00290  *
00291  * Revision 1.35  2002/04/25 20:55:25  dereks
00292  * Fix documentation. Thanks Olaf Schulz.
00293  *
00294  * Revision 1.34  2002/04/17 00:50:34  robertj
00295  * Added ability to disable the in band DTMF detection.
00296  *
00297  * Revision 1.33  2002/03/27 06:04:42  robertj
00298  * Added Temporary Failure end code for connection, an application may
00299  *   immediately retry the call if this occurs.
00300  *
00301  * Revision 1.32  2002/02/11 04:20:48  robertj
00302  * Fixed documentation errors, thanks Horacio J. Peņa
00303  *
00304  * Revision 1.31  2002/02/11 04:16:37  robertj
00305  * Fixed bug where could send DRQ if never received an ACF.
00306  *
00307  * Revision 1.30  2002/02/06 06:30:47  craigs
00308  * Fixed problem whereby MSD/TCS was stalled if H245 was included in
00309  * SETUP, but other end did not respond
00310  *
00311  * Revision 1.29  2002/02/04 07:17:52  robertj
00312  * Added H.450.2 Consultation Transfer, thanks Norwood Systems.
00313  *
00314  * Revision 1.28  2002/01/25 05:20:05  robertj
00315  * Moved static strings for enum printing to inside of function, could crash with DLL's
00316  *
00317  * Revision 1.27  2002/01/24 06:29:02  robertj
00318  * Added option to disable H.245 negotiation in SETUP pdu, this required
00319  *   API change so have a bit mask instead of a series of booleans.
00320  *
00321  * Revision 1.26  2002/01/23 12:45:37  rogerh
00322  * Add the DTMF decoder. This identifies DTMF tones in an audio stream.
00323  *
00324  * Revision 1.25  2002/01/23 07:12:48  robertj
00325  * Added hooks for in band DTMF detection. Now need the detector!
00326  *
00327  * Revision 1.24  2002/01/22 22:48:21  robertj
00328  * Fixed RFC2833 support (transmitter) requiring large rewrite
00329  *
00330  * Revision 1.23  2002/01/18 06:02:08  robertj
00331  * Added some H323v4 functions (fastConnectRefused & TCS in SETUP)
00332  *
00333  * Revision 1.22  2002/01/17 07:04:58  robertj
00334  * Added support for RFC2833 embedded DTMF in the RTP stream.
00335  *
00336  * Revision 1.21  2002/01/14 00:05:24  robertj
00337  * Added H.450.6, better H.450.2 error handling and  and Music On Hold.
00338  * Added destExtraCallInfo field for ARQ.
00339  *   Thanks Ben Madsen of Norwood Systems
00340  *
00341  * Revision 1.20  2002/01/10 05:13:50  robertj
00342  * Added support for external RTP stacks, thanks NuMind Software Systems.
00343  *
00344  * Revision 1.19  2002/01/09 00:21:36  robertj
00345  * Changes to support outgoing H.245 RequstModeChange.
00346  *
00347  * Revision 1.18  2001/12/22 03:20:31  robertj
00348  * Added create protocol function to H323Connection.
00349  *
00350  * Revision 1.17  2001/12/22 03:09:36  robertj
00351  * Changed OnRequstModeChange to return ack, then actually do the change.
00352  *
00353  * Revision 1.16  2001/12/22 01:52:54  robertj
00354  * Added more support for H.245 RequestMode operation.
00355  *
00356  * Revision 1.15  2001/12/15 08:09:54  robertj
00357  * Added alerting, connect and end of call times to be sent to RAS server.
00358  *
00359  * Revision 1.14  2001/12/13 10:54:23  robertj
00360  * Added ability to automatically add ACF access token to SETUP pdu.
00361  *
00362  * Revision 1.13  2001/11/01 06:11:54  robertj
00363  * Plugged very small mutex hole that could cause crashes.
00364  *
00365  * Revision 1.12  2001/11/01 00:27:33  robertj
00366  * Added default Fast Start disabled and H.245 tunneling disable flags
00367  *   to the endpoint instance.
00368  *
00369  * Revision 1.11  2001/10/24 00:54:13  robertj
00370  * Made cosmetic changes to H.245 miscellaneous command function.
00371  *
00372  * Revision 1.10  2001/10/23 02:18:06  dereks
00373  * Initial release of CU30 video codec.
00374  *
00375  * Revision 1.9  2001/09/26 06:20:56  robertj
00376  * Fixed properly nesting connection locking and unlocking requiring a quite
00377  *   large change to teh implementation of how calls are answered.
00378  *
00379  * Revision 1.8  2001/09/19 03:30:53  robertj
00380  * Added some support for overlapped dialing, thanks Chris Purvis & Nick Hoath.
00381  *
00382  * Revision 1.7  2001/09/13 06:48:13  robertj
00383  * Added call back functions for remaining Q.931/H.225 messages.
00384  * Added call back to allow modification of Release Complete,thanks Nick Hoath
00385  *
00386  * Revision 1.6  2001/09/12 06:57:58  robertj
00387  * Added support for iNow Access Token from gk, thanks Nick Hoath
00388  *
00389  * Revision 1.5  2001/09/12 06:04:36  robertj
00390  * Added support for sending UUIE's to gk on request, thanks Nick Hoath
00391  *
00392  * Revision 1.4  2001/09/11 01:24:36  robertj
00393  * Added conditional compilation to remove video and/or audio codecs.
00394  *
00395  * Revision 1.3  2001/08/22 06:54:50  robertj
00396  * Changed connection locking to use double mutex to guarantee that
00397  *   no threads can ever deadlock or access deleted connection.
00398  *
00399  * Revision 1.2  2001/08/16 07:49:16  robertj
00400  * Changed the H.450 support to be more extensible. Protocol handlers
00401  *   are now in separate classes instead of all in H323Connection.
00402  *
00403  * Revision 1.1  2001/08/06 03:08:11  robertj
00404  * Fission of h323.h to h323ep.h & h323con.h, h323.h now just includes files.
00405  */
00406 
00407 #ifndef __OPAL_H323CON_H
00408 #define __OPAL_H323CON_H
00409 
00410 #ifdef P_USE_PRAGMA
00411 #pragma interface
00412 #endif
00413 
00414 
00415 #include <opal/connection.h>
00416 #include <opal/guid.h>
00417 #include <opal/buildopts.h>
00418 #include <h323/h323caps.h>
00419 #include <ptclib/dtmf.h>
00420 
00421 
00422 /* The following classes have forward references to avoid including the VERY
00423    large header files for H225 and H245. If an application requires access
00424    to the protocol classes they can include them, but for simple usage their
00425    inclusion can be avoided.
00426  */
00427 class PPER_Stream;
00428 class PASN_OctetString;
00429 
00430 class H225_EndpointType;
00431 class H225_TransportAddress;
00432 class H225_ArrayOf_PASN_OctetString;
00433 class H225_ProtocolIdentifier;
00434 class H225_AdmissionRequest;
00435 
00436 class H245_TerminalCapabilitySet;
00437 class H245_TerminalCapabilitySetReject;
00438 class H245_OpenLogicalChannel;
00439 class H245_OpenLogicalChannelAck;
00440 class H245_TransportAddress;
00441 class H245_UserInputIndication;
00442 class H245_RequestMode;
00443 class H245_RequestModeAck;
00444 class H245_RequestModeReject;
00445 class H245_ModeDescription;
00446 class H245_ArrayOf_ModeDescription;
00447 class H245_SendTerminalCapabilitySet;
00448 class H245_MultiplexCapability;
00449 class H245_FlowControlCommand;
00450 class H245_MiscellaneousCommand;
00451 class H245_MiscellaneousIndication;
00452 class H245_JitterIndication;
00453 
00454 class H323SignalPDU;
00455 class H323ControlPDU;
00456 class H323EndPoint;
00457 class H323TransportAddress;
00458 
00459 class H235Authenticators;
00460 
00461 class H245NegMasterSlaveDetermination;
00462 class H245NegTerminalCapabilitySet;
00463 class H245NegLogicalChannels;
00464 class H245NegRequestMode;
00465 class H245NegRoundTripDelay;
00466 
00467 class H450xDispatcher;
00468 class H4502Handler;
00469 class H4504Handler;
00470 class H4506Handler;
00471 class H45011Handler;
00472 
00473 class OpalCall;
00474 
00475 
00477 
00484 class H323Connection : public OpalConnection
00485 {
00486   PCLASSINFO(H323Connection, OpalConnection);
00487 
00488   public:
00491     enum Options {
00492       FastStartOptionDisable       = 0x0001,
00493       FastStartOptionEnable        = 0x0002,
00494       FastStartOptionMask          = 0x0003,
00495 
00496       H245TunnelingOptionDisable   = 0x0004,
00497       H245TunnelingOptionEnable    = 0x0008,
00498       H245TunnelingOptionMask      = 0x000c,
00499 
00500       H245inSetupOptionDisable     = 0x0010,
00501       H245inSetupOptionEnable      = 0x0020,
00502       H245inSetupOptionMask        = 0x0030,
00503 
00504       DetectInBandDTMFOptionDisable= 0x0040,
00505       DetectInBandDTMFOptionEnable = 0x0080,
00506       DetectInBandDTMFOptionMask   = 0x00c0,
00507     };
00508 
00511     H323Connection(
00512       OpalCall & call,            
00513       H323EndPoint & endpoint,    
00514       const PString & token,      
00515       const PString & alias,     
00516       const H323TransportAddress & address,   
00517       unsigned options = 0        
00518     );
00519 
00522     ~H323Connection();
00524 
00533     virtual BOOL SetUpConnection();
00534 
00544     virtual BOOL SetAlerting(
00545       const PString & calleeName,   
00546       BOOL withMedia                
00547     );
00548 
00553     virtual BOOL SetConnected();
00554 
00561     virtual void OnSendARQ(
00562       H225_AdmissionRequest & arq
00563     );
00564 
00568     virtual void OnEstablished();
00569 
00587     virtual void OnReleased();
00588 
00593     virtual PString GetDestinationAddress();
00594 
00602     virtual OpalMediaFormatList GetMediaFormats() const;
00603 
00606     virtual BOOL OpenSourceMediaStream(
00607       const OpalMediaFormatList & mediaFormats, 
00608       unsigned sessionID                   
00609     );
00610     
00625     virtual OpalMediaStream * CreateMediaStream(
00626       const OpalMediaFormat & mediaFormat, 
00627       unsigned sessionID,                  
00628       BOOL isSource                        
00629     );
00630 
00635     virtual BOOL IsMediaBypassPossible(
00636       unsigned sessionID                  
00637     ) const;
00638 
00643     virtual BOOL GetMediaInformation(
00644       unsigned sessionID,     
00645       MediaInformation & info 
00646     ) const;
00648 
00654     virtual void OnCleared();
00655 
00661     BOOL IsEstablished() const { return connectionState == EstablishedConnection; }
00662 
00671     virtual void CleanUpOnCallEnd();
00673 
00674 
00679     void AttachSignalChannel(
00680       const PString & token,    
00681       H323Transport * channel,  
00682       BOOL answeringCall        
00683     );
00684 
00687     BOOL WriteSignalPDU(
00688       H323SignalPDU & pdu       
00689     );
00690 
00694     virtual void HandleSignallingChannel();
00695 
00699     virtual BOOL HandleSignalPDU(
00700       H323SignalPDU & pdu       
00701     );
00702 
00706     virtual void HandleTunnelPDU(
00707       H323SignalPDU * txPDU       
00708     );
00709 
00717     virtual BOOL OnReceivedSignalSetup(
00718       const H323SignalPDU & pdu   
00719     );
00720 
00727     virtual BOOL OnReceivedSignalSetupAck(
00728       const H323SignalPDU & pdu   
00729     );
00730 
00737     virtual BOOL OnReceivedSignalInformation(
00738       const H323SignalPDU & pdu   
00739     );
00740 
00749     virtual BOOL OnReceivedCallProceeding(
00750       const H323SignalPDU & pdu   
00751     );
00752 
00761     virtual BOOL OnReceivedProgress(
00762       const H323SignalPDU & pdu   
00763     );
00764 
00771     virtual BOOL OnReceivedAlerting(
00772       const H323SignalPDU & pdu   
00773     );
00774 
00783     virtual BOOL OnReceivedSignalConnect(
00784       const H323SignalPDU & pdu   
00785     );
00786 
00795     virtual BOOL OnReceivedFacility(
00796       const H323SignalPDU & pdu   
00797     );
00798 
00805     virtual BOOL OnReceivedSignalNotify(
00806       const H323SignalPDU & pdu   
00807     );
00808 
00815     virtual BOOL OnReceivedSignalStatus(
00816       const H323SignalPDU & pdu   
00817     );
00818 
00825     virtual BOOL OnReceivedStatusEnquiry(
00826       const H323SignalPDU & pdu   
00827     );
00828 
00833     virtual void OnReceivedReleaseComplete(
00834       const H323SignalPDU & pdu   
00835     );
00836 
00843     virtual BOOL OnUnknownSignalPDU(
00844       const H323SignalPDU & pdu  
00845     );
00846 
00858     virtual BOOL OnIncomingCall(
00859       const H323SignalPDU & setupPDU,   
00860       H323SignalPDU & alertingPDU       
00861     );
00862 
00872     virtual BOOL ForwardCall(
00873       const PString & forwardParty   
00874     );
00875 
00880     void TransferCall(
00881       const PString & remoteParty,   
00882       const PString & callIdentity = PString::Empty()
00884     );
00885 
00890     void ConsultationTransfer(
00891       const PString & primaryCallToken  
00892     );
00893 
00900     virtual void HandleConsultationTransfer(
00901       const PString & callIdentity, 
00903       H323Connection & incoming     
00904     );
00905 
00908     BOOL IsTransferringCall() const;
00909 
00912     BOOL IsTransferredCall() const;
00913 
00918     virtual void HandleTransferCall(
00919       const PString & token,
00920       const PString & identity
00921     );
00922 
00927     int GetCallTransferInvokeId();
00928 
00936     virtual void HandleCallTransferFailure(
00937       const int returnError    
00938     );
00939 
00944     void SetAssociatedCallToken(
00945       const PString & token  
00946     );
00947 
00952     virtual void OnConsultationTransferSuccess(
00953       H323Connection & secondaryCall  
00954     );
00955 
00959     virtual void TransferConnection(
00960       const PString & remoteParty,
00961       const PString & callIdentity = PString::Empty()
00962     );
00963 
00967     virtual void HoldConnection();
00968 
00973     virtual void RetrieveConnection();
00974 
00978     virtual BOOL IsConnectionOnHold();
00979 
00984     void HoldCall(
00985       BOOL localHold   
00986     );
00987 
00993     void RetrieveCall();
00994 
01001     void SetHoldMedia(
01002       PChannel * audioChannel
01003     );
01004 
01007     BOOL IsMediaOnHold() const;
01008 
01011     BOOL IsLocalHold() const;
01012 
01015     BOOL IsRemoteHold() const;
01016 
01019     BOOL IsCallOnHold() const;
01020 
01025     virtual void IntrudeCall(
01026       unsigned capabilityLevel
01027     );
01028 
01033     virtual void HandleIntrudeCall(
01034       const PString & token,
01035       const PString & identity
01036     );
01037 
01043     void SetCallIntrusion() { isCallIntrusion = TRUE; }
01044 
01045     BOOL IsCallIntrusion() { return isCallIntrusion; }
01046 
01049     unsigned GetLocalCallIntrusionProtectionLevel() { return callIntrusionProtectionLevel; }
01050 
01054     virtual BOOL GetRemoteCallIntrusionProtectionLevel(
01055       const PString & callToken,
01056       unsigned callIntrusionProtectionLevel
01057     );
01058 
01059     virtual void SetIntrusionImpending();
01060 
01061     virtual void SetForcedReleaseAccepted();
01062 
01063     virtual void SetIntrusionNotAuthorized();
01064 
01071     void SendCallWaitingIndication(
01072       const unsigned nbOfAddWaitingCalls = 0   
01073     );
01074 
01101     virtual AnswerCallResponse OnAnswerCall(
01102       const PString & callerName,       
01103       const H323SignalPDU & setupPDU,   
01104       H323SignalPDU & connectPDU        
01105     );
01106     virtual AnswerCallResponse OnAnswerCall(
01107       const PString & callerName        
01108     );
01109 
01120     void AnsweringCall(
01121       AnswerCallResponse response 
01122     );
01123 
01134     virtual CallEndReason SendSignalSetup(
01135       const PString & alias,                
01136       const H323TransportAddress & address  
01137     );
01138 
01150     virtual BOOL OnSendSignalSetup(
01151       H323SignalPDU & setupPDU   
01152     );
01153 
01162     virtual BOOL OnSendCallProceeding(
01163       H323SignalPDU & callProceedingPDU   
01164     );
01165 
01177     virtual BOOL OnSendReleaseComplete(
01178       H323SignalPDU & releaseCompletePDU 
01179     );
01180 
01191     virtual BOOL OnAlerting(
01192       const H323SignalPDU & alertingPDU,  
01193       const PString & user                
01194     );
01195 
01210     virtual BOOL OnInsufficientDigits();
01211 
01224     virtual void SendMoreDigits(
01225       const PString & digits    
01226     );
01227 
01237     virtual BOOL OnOutgoingCall(
01238       const H323SignalPDU & connectPDU   
01239     );
01240 
01252     virtual BOOL SendFastStartAcknowledge(
01253       H225_ArrayOf_PASN_OctetString & array   
01254     );
01255 
01267     virtual BOOL HandleFastStartAcknowledge(
01268       const H225_ArrayOf_PASN_OctetString & array   
01269     );
01271 
01285     virtual BOOL CreateOutgoingControlChannel(
01286       const H225_TransportAddress & h245Address   
01287     );
01288 
01301     virtual BOOL CreateIncomingControlChannel(
01302       H225_TransportAddress & h245Address  
01303     );
01304 
01309     BOOL WriteControlPDU(
01310       const H323ControlPDU & pdu
01311     );
01312 
01315     BOOL StartControlNegotiations();
01316 
01319     virtual void HandleControlChannel();
01320 
01327     virtual BOOL HandleControlData(
01328       PPER_Stream & strm
01329     );
01330 
01337     virtual BOOL HandleControlPDU(
01338       const H323ControlPDU & pdu
01339     );
01340 
01350     virtual BOOL OnUnknownControlPDU(
01351       const H323ControlPDU & pdu  
01352     );
01353 
01357     virtual BOOL OnH245Request(
01358       const H323ControlPDU & pdu  
01359     );
01360 
01364     virtual BOOL OnH245Response(
01365       const H323ControlPDU & pdu  
01366     );
01367 
01371     virtual BOOL OnH245Command(
01372       const H323ControlPDU & pdu  
01373     );
01374 
01378     virtual BOOL OnH245Indication(
01379       const H323ControlPDU & pdu  
01380     );
01381 
01384     virtual BOOL OnH245_SendTerminalCapabilitySet(
01385       const H245_SendTerminalCapabilitySet & pdu  
01386     );
01387 
01392     virtual BOOL OnH245_FlowControlCommand(
01393       const H245_FlowControlCommand & pdu  
01394     );
01395 
01400     virtual BOOL OnH245_MiscellaneousCommand(
01401       const H245_MiscellaneousCommand & pdu  
01402     );
01403 
01408     virtual BOOL OnH245_MiscellaneousIndication(
01409       const H245_MiscellaneousIndication & pdu  
01410     );
01411 
01416     virtual BOOL OnH245_JitterIndication(
01417       const H245_JitterIndication & pdu  
01418     );
01419 
01422     enum ControlProtocolErrors {
01423       e_MasterSlaveDetermination,
01424       e_CapabilityExchange,
01425       e_LogicalChannel,
01426       e_ModeRequest,
01427       e_RoundTripDelay
01428     };
01429 
01441     virtual BOOL OnControlProtocolError(
01442       ControlProtocolErrors errorSource,  
01443       const void * errorData = NULL       
01444     );
01445 
01453     virtual void OnSendCapabilitySet(
01454       H245_TerminalCapabilitySet & pdu  
01455     );
01456 
01468     virtual BOOL OnReceivedCapabilitySet(
01469       const H323Capabilities & remoteCaps,      
01470       const H245_MultiplexCapability * muxCap,  
01471       H245_TerminalCapabilitySetReject & reject 
01472     );
01473 
01476     virtual void SendCapabilitySet(
01477       BOOL empty  
01478     );
01479 
01488     virtual void OnSetLocalCapabilities();
01489 
01492     BOOL IsH245Master() const;
01493 
01496     void StartRoundTripDelay();
01497 
01500     PTimeInterval GetRoundTripDelay() const;
01502 
01542     virtual void OnSelectLogicalChannels();
01543 
01546     virtual void SelectDefaultLogicalChannel(
01547       unsigned sessionID    
01548     );
01549 
01553     virtual void SelectFastStartChannels(
01554       unsigned sessionID,   
01555       BOOL transmitter,     
01556       BOOL receiver         
01557     );
01558 
01562     virtual void StartFastStartChannel(
01563       unsigned sessionID,               
01564       H323Channel::Directions direction 
01565     );
01566 
01581     virtual BOOL OpenLogicalChannel(
01582       const H323Capability & capability,  
01583       unsigned sessionID,                 
01584       H323Channel::Directions dir         
01585     );
01586 
01596     virtual BOOL OnOpenLogicalChannel(
01597       const H245_OpenLogicalChannel & openPDU,  
01598       H245_OpenLogicalChannelAck & ackPDU,      
01599       unsigned & errorCode                      
01600     );
01601 
01609     virtual BOOL OnConflictingLogicalChannel(
01610       H323Channel & channel    
01611     );
01612 
01617     virtual H323Channel * CreateLogicalChannel(
01618       const H245_OpenLogicalChannel & open, 
01619       BOOL startingFast,                    
01620       unsigned & errorCode                  
01621     );
01622 
01657     virtual H323Channel * CreateRealTimeLogicalChannel(
01658       const H323Capability & capability, 
01659       H323Channel::Directions dir,       
01660       unsigned sessionID,                
01661       const H245_H2250LogicalChannelParameters * param,
01663       RTP_QOS * rtpqos = NULL            
01664     );
01665 
01676     virtual BOOL OnCreateLogicalChannel(
01677       const H323Capability & capability,  
01678       H323Channel::Directions dir,        
01679       unsigned & errorCode                
01680     );
01681 
01686     virtual BOOL OnStartLogicalChannel(
01687       H323Channel & channel    
01688     );
01689 
01692     virtual void CloseLogicalChannel(
01693       unsigned number,    
01694       BOOL fromRemote     
01695     );
01696 
01699     virtual void CloseLogicalChannelNumber(
01700       const H323ChannelNumber & number    
01701     );
01702 
01705     virtual void CloseAllLogicalChannels(
01706       BOOL fromRemote     
01707     );
01708 
01714     virtual void OnClosedLogicalChannel(
01715       const H323Channel & channel   
01716     );
01717 
01726     virtual BOOL OnClosingLogicalChannel(
01727       H323Channel & channel   
01728     );
01729 
01738     virtual void OnLogicalChannelFlowControl(
01739       H323Channel * channel,   
01740       long bitRateRestriction  
01741     );
01742 
01751     virtual void OnLogicalChannelJitter(
01752       H323Channel * channel,   
01753       DWORD jitter,            
01754       int skippedFrameCount,   
01755       int additionalBuffer     
01756     );
01757 
01761     H323Channel * GetLogicalChannel(
01762       unsigned number,    
01763       BOOL fromRemote     
01764     ) const;
01765 
01771     H323Channel * FindChannel(
01772       unsigned sessionId,   
01773       BOOL fromRemote       
01774     ) const;
01776 
01783     virtual BOOL SetBandwidthAvailable(
01784       unsigned newBandwidth,    
01785       BOOL force = FALSE        
01786     );
01787 
01792     virtual unsigned GetBandwidthUsed() const;
01794 
01797     enum SendUserInputModes {
01798       SendUserInputAsQ931,
01799       SendUserInputAsString,
01800       SendUserInputAsTone,
01801       SendUserInputAsInlineRFC2833,
01802       SendUserInputAsSeparateRFC2833,  // Not implemented
01803       NumSendUserInputModes
01804     };
01805 #if PTRACING
01806     friend ostream & operator<<(ostream & o, SendUserInputModes m);
01807 #endif
01808 
01811     void SetSendUserInputMode(SendUserInputModes mode);
01812 
01815     SendUserInputModes GetSendUserInputMode() const { return sendUserInputMode; }
01816 
01822     SendUserInputModes GetRealSendUserInputMode() const;
01823 
01837     virtual BOOL SendUserInputString(
01838       const PString & value                   
01839     );
01840 
01865     virtual BOOL SendUserInputTone(
01866       char tone,             
01867       unsigned duration = 0  
01868     );
01869 
01876     virtual BOOL SendUserInputIndicationQ931(
01877       const PString & value                   
01878     );
01879 
01886     virtual BOOL SendUserInputIndicationString(
01887       const PString & value                   
01888     );
01889 
01894     virtual BOOL SendUserInputIndicationTone(
01895       char tone,                   
01896       unsigned duration = 0,       
01897       unsigned logicalChannel = 0, 
01898       unsigned rtpTimestamp = 0    
01899     );
01900 
01909     virtual BOOL SendUserInputIndication(
01910       const H245_UserInputIndication & pdu    
01911     );
01912 
01917     virtual void OnUserInputIndication(
01918       const H245_UserInputIndication & pdu  
01919     );
01921 
01927     virtual RTP_Session * GetSession(
01928       unsigned sessionID
01929     ) const;
01930 
01934     virtual H323_RTP_Session * GetSessionCallbacks(
01935       unsigned sessionID
01936     ) const;
01937 
01947     virtual RTP_Session * UseSession(
01948       const OpalTransport & transport,
01949       unsigned sessionID,
01950       RTP_QOS * rtpqos = NULL
01951     );
01952 
01956     virtual void ReleaseSession(
01957       unsigned sessionID
01958     );
01959 
01967     virtual void OnRTPStatistics(
01968       const RTP_Session & session   
01969     ) const;
01970 
01974     virtual PString GetSessionCodecNames(
01975       unsigned sessionID
01976     ) const;
01977 
01980     BOOL IsBehindNAT() const
01981     { return remoteIsNAT; }
01983 
02001     virtual BOOL RequestModeChange(
02002       const PString & newModes  
02003     );
02004 
02012     virtual BOOL RequestModeChange(
02013       const H245_ArrayOf_ModeDescription & newModes  
02014     );
02015 
02018     virtual BOOL OnRequestModeChange(
02019       const H245_RequestMode & pdu,     
02020       H245_RequestModeAck & ack,        
02021       H245_RequestModeReject & reject,  
02022       PINDEX & selectedMode           
02023     );
02024 
02031     virtual void OnModeChanged(
02032       const H245_ModeDescription & newMode
02033     );
02034 
02039     virtual void OnAcceptModeChange(
02040       const H245_RequestModeAck & pdu  
02041     );
02042 
02047     virtual void OnRefusedModeChange(
02048       const H245_RequestModeReject * pdu  
02049     );
02051 
02056     virtual BOOL RequestModeChangeT38(
02057       const char * capabilityNames = "T.38\nT38FaxUDP"
02058     );
02059 
02069     virtual BOOL GetAdmissionRequestAuthentication(
02070       const H225_AdmissionRequest & arq,  
02071       H235Authenticators & authenticators 
02072     );
02074 
02079     H323EndPoint & GetEndPoint() const { return endpoint; }
02080 
02083     BOOL HadAnsweredCall() const { return !originating; }
02084 
02087     BOOL IsGatekeeperRouted() const { return gatekeeperRouted; }
02088 
02092     unsigned GetQ931Cause() const { return q931Cause; }
02093 
02097     void SetQ931Cause(unsigned v) { q931Cause = v; }
02098 
02103     unsigned GetDistinctiveRing() const { return distinctiveRing; }
02104 
02111     void SetDistinctiveRing(unsigned pattern) { distinctiveRing = pattern&7; }
02112 
02116     const PString & GetCallToken() const { return GetToken(); }
02117 
02120     unsigned GetCallReference() const { return callReference; }
02121 
02125     inline const OpalGloballyUniqueID & GetCallIdentifier() const 
02126     { return GetIdentifier(); }
02127 
02130     const OpalGloballyUniqueID & GetConferenceIdentifier() const { return conferenceIdentifier; }
02131 
02134     void SetLocalPartyName(const PString & name);
02135 
02138     const PStringList & GetLocalAliasNames() const { return localAliasNames; }
02139 
02142     void SetRemotePartyInfo(
02143       const H323SignalPDU & pdu 
02144     );
02145 
02148     void SetRemoteApplication(
02149       const H225_EndpointType & pdu 
02150     );
02151     
02156     const PString GetRemotePartyCallbackURL() const;
02157     
02160     const H323Capabilities & GetLocalCapabilities() const { return localCapabilities; }
02161 
02164     const H323Capabilities & GetRemoteCapabilities() const { return remoteCapabilities; }
02165 
02168     unsigned GetRemoteMaxAudioDelayJitter() const { return remoteMaxAudioDelayJitter; }
02169 
02172     const H323Transport * GetSignallingChannel() const { return signallingChannel; }
02173 
02176     unsigned GetSignallingVersion() const { return h225version; }
02177 
02180     const H323Transport & GetControlChannel() const;
02181 
02184     OpalTransport & GetTransport() const;
02185 
02188     unsigned GetControlVersion() const { return h245version; }
02189 
02192     unsigned GetUUIEsRequested() const { return uuiesRequested; }
02193 
02196     void SetUUIEsRequested(unsigned mask) { uuiesRequested = mask; }
02197 
02200     const PString GetGkAccessTokenOID() const { return gkAccessTokenOID; }
02201 
02204     void SetGkAccessTokenOID(const PString & oid) { gkAccessTokenOID = oid; }
02205 
02208     const PBYTEArray & GetGkAccessTokenData() const { return gkAccessTokenData; }
02209 
02212     void SetDestExtraCallInfo(
02213       const PString & info
02214     ) { destExtraCallInfo = info; }
02215 
02218     void SetRemotCallWaiting(const unsigned value) { remoteCallWaiting = value; }
02219 
02225     const int GetRemoteCallWaiting() const { return remoteCallWaiting; }
02226 
02231     void SetEnforcedDurationLimit(
02232       unsigned seconds  
02233     );
02235 
02236 
02237   protected:
02243     virtual void InternalEstablishedConnectionCheck();
02244     BOOL InternalEndSessionCheck(PPER_Stream & strm);
02245     void SetRemoteVersions(const H225_ProtocolIdentifier & id);
02246     void MonitorCallStatus();
02247     PDECLARE_NOTIFIER(PThread, H323Connection, StartOutgoing);
02248     PDECLARE_NOTIFIER(PThread, H323Connection, NewOutgoingControlChannel);
02249     PDECLARE_NOTIFIER(PThread, H323Connection, NewIncomingControlChannel);
02250 
02251 
02252     H323EndPoint & endpoint;
02253 
02254     int                  remoteCallWaiting; // Number of call's waiting at the remote endpoint
02255     BOOL                 gatekeeperRouted;
02256     unsigned             distinctiveRing;
02257     unsigned             callReference;
02258     OpalGloballyUniqueID conferenceIdentifier;
02259 
02260     PString            localDestinationAddress;
02261     PStringList        localAliasNames;
02262     H323Capabilities   localCapabilities; // Capabilities local system supports
02263     PString            destExtraCallInfo;
02264     H323Capabilities   remoteCapabilities; // Capabilities remote system supports
02265     unsigned           remoteMaxAudioDelayJitter;
02266     PTimer             roundTripDelayTimer;
02267     WORD               maxAudioDelayJitter;
02268     unsigned           uuiesRequested;
02269     PString            gkAccessTokenOID;
02270     PBYTEArray         gkAccessTokenData;
02271     BOOL               addAccessTokenToSetup;
02272     SendUserInputModes sendUserInputMode;
02273         BOOL               alertDone;
02274 
02275     H323Transport * signallingChannel;
02276     H323Transport * controlChannel;
02277     OpalListener  * controlListener;
02278     BOOL            h245Tunneling;
02279     H323SignalPDU * h245TunnelRxPDU;
02280     H323SignalPDU * h245TunnelTxPDU;
02281     H323SignalPDU * alertingPDU;
02282     H323SignalPDU * connectPDU;
02283 
02284     enum ConnectionStates {
02285       NoConnectionActive,
02286       AwaitingGatekeeperAdmission,
02287       AwaitingTransportConnect,
02288       AwaitingSignalConnect,
02289       AwaitingLocalAnswer,
02290       HasExecutedSignalConnect,
02291       EstablishedConnection,
02292       ShuttingDownConnection,
02293       NumConnectionStates
02294     } connectionState;
02295 
02296     unsigned      q931Cause;
02297 
02298     unsigned   h225version;
02299     unsigned   h245version;
02300     BOOL       h245versionSet;
02301     BOOL doH245inSETUP;
02302     BOOL lastPDUWasH245inSETUP;
02303 
02304     BOOL mustSendDRQ;
02305     BOOL mediaWaitForConnect;
02306     BOOL transmitterSidePaused;
02307     BOOL earlyStart;
02308     BOOL startT120;
02309     PString    t38ModeChangeCapabilities;
02310     PSyncPoint digitsWaitFlag;
02311     BOOL       endSessionNeeded;
02312     PSyncPoint endSessionReceived;
02313     PTimer     enforcedDurationLimit;
02314 
02315     // Used as part of a local call hold operation involving MOH
02316     PChannel * holdMediaChannel;
02317     BOOL       isConsultationTransfer;
02318 
02320     BOOL     isCallIntrusion;
02321     unsigned callIntrusionProtectionLevel;
02322 
02323     enum FastStartStates {
02324       FastStartDisabled,
02325       FastStartInitiate,
02326       FastStartResponse,
02327       FastStartAcknowledged,
02328       NumFastStartStates
02329     };
02330     FastStartStates        fastStartState;
02331     H323LogicalChannelList fastStartChannels;
02332     OpalMediaStream      * transmitterMediaStream;
02333 
02334 #if PTRACING
02335     static const char * const ConnectionStatesNames[NumConnectionStates];
02336     friend ostream & operator<<(ostream & o, ConnectionStates s) { return o << ConnectionStatesNames[s]; }
02337     static const char * const FastStartStateNames[NumFastStartStates];
02338     friend ostream & operator<<(ostream & o, FastStartStates s) { return o << FastStartStateNames[s]; }
02339 #endif
02340 
02341 
02342     // The following pointers are to protocol procedures, they are pointers to
02343     // hide their complexity from the H323Connection classes users.
02344     H245NegMasterSlaveDetermination  * masterSlaveDeterminationProcedure;
02345     H245NegTerminalCapabilitySet     * capabilityExchangeProcedure;
02346     H245NegLogicalChannels           * logicalChannels;
02347     H245NegRequestMode               * requestModeProcedure;
02348     H245NegRoundTripDelay            * roundTripDelayProcedure;
02349 
02350     H450xDispatcher                  * h450dispatcher;
02351     H4502Handler                     * h4502handler;
02352     H4504Handler                     * h4504handler;
02353     H4506Handler                     * h4506handler;
02354     H45011Handler                    * h45011handler;
02355 
02356     // used to detect remote NAT endpoints
02357     BOOL remoteIsNAT;
02358 
02359   private:
02360     PChannel * SwapHoldMediaChannels(PChannel * newChannel);
02361 };
02362 
02363 
02364 PDICTIONARY(H323CallIdentityDict, PString, H323Connection);
02365 
02366 
02367 #endif // __OPAL_H323CON_H
02368 
02369 

Generated on Mon Sep 25 16:19:59 2006 for OPAL by  doxygen 1.4.7