connection.h

Go to the documentation of this file.
00001 /*
00002  * connection.h
00003  *
00004  * Telephony connection 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  * $Log: connection.h,v $
00028  * Revision 2.49.2.2  2006/03/20 10:48:34  csoutheren
00029  * Backport from CVS head
00030  *
00031  * Revision 2.49.2.1  2006/02/06 04:38:37  csoutheren
00032  * Backported RTP payload mapping fixes from CVS head
00033  * Revision 2.52  2006/03/20 10:37:47  csoutheren
00034  * Applied patch #1453753 - added locking on media stream manipulation
00035  * Thanks to Dinis Rosario
00036  *
00037  * Revision 2.50  2006/02/02 07:02:56  csoutheren
00038  * Added RTP payload map to transcoders and connections to allow remote SIP endpoints
00039  * to change the payload type used for outgoing RTP.
00040  *
00041  * Revision 2.49  2006/01/09 12:19:06  csoutheren
00042  * Added member variables to capture incoming destination addresses
00043  *
00044  * Revision 2.48  2005/12/06 21:32:24  dsandras
00045  * Applied patch from Frederic Heem <frederic.heem _Atttt_ telsey.it> to fix
00046  * assert in PSyncPoint when OnReleased is called twice from different threads.
00047  * Thanks! (Patch #1374240)
00048  *
00049  * Revision 2.47  2005/11/30 13:35:26  csoutheren
00050  * Changed tags for Doxygen
00051  *
00052  * Revision 2.46  2005/11/24 20:31:54  dsandras
00053  * Added support for echo cancelation using Speex.
00054  * Added possibility to add a filter to an OpalMediaPatch for all patches of a connection.
00055  *
00056  * Revision 2.45  2005/10/04 12:57:18  rjongbloed
00057  * Removed CanOpenSourceMediaStream/CanOpenSinkMediaStream functions and
00058  *   now use overides on OpenSourceMediaStream/OpenSinkMediaStream
00059  *
00060  * Revision 2.44  2005/09/15 17:02:40  dsandras
00061  * Added the possibility for a connection to prevent the opening of a sink/source media stream.
00062  *
00063  * Revision 2.43  2005/08/24 10:43:51  rjongbloed
00064  * Changed create video functions yet again so can return pointers that are not to be deleted.
00065  *
00066  * Revision 2.42  2005/08/23 12:45:09  rjongbloed
00067  * Fixed creation of video preview window and setting video grab/display initial frame size.
00068  *
00069  * Revision 2.41  2005/08/04 17:21:01  dsandras
00070  * Added functions to close/remove the media streams of a connection.
00071  *
00072  * Revision 2.40  2005/07/14 08:51:17  csoutheren
00073  * Removed CreateExternalRTPAddress - it's not needed because you can override GetMediaAddress
00074  * to do the same thing
00075  * Fixed problems with logic associated with media bypass
00076  *
00077  * Revision 2.39  2005/07/11 06:52:15  csoutheren
00078  * Added support for outgoing calls using external RTP
00079  *
00080  * Revision 2.38  2005/07/11 01:52:23  csoutheren
00081  * Extended AnsweringCall to work for SIP as well as H.323
00082  * Fixed problems with external RTP connection in H.323
00083  * Added call to OnClosedMediaStream
00084  *
00085  * Revision 2.37  2005/04/11 11:12:00  dsandras
00086  * Fixed previous commit.
00087  *
00088  * Revision 2.36  2005/04/11 10:42:35  dsandras
00089  * Fixed previous commit.
00090  *
00091  * Revision 2.35  2005/04/10 20:43:39  dsandras
00092  * Added support for function allowing to put the OpalMediaStreams on pause.
00093  *
00094  * Revision 2.34  2005/04/10 20:42:33  dsandras
00095  * Added support for a function that returns the "best guess" callback URL.
00096  *
00097  * Revision 2.33  2005/04/10 20:41:29  dsandras
00098  * Added support for call hold.
00099  *
00100  * Revision 2.32  2005/04/10 20:40:20  dsandras
00101  * Added support for Blind Transfert.
00102  *
00103  * Revision 2.31  2005/01/16 11:28:05  csoutheren
00104  * Added GetIdentifier virtual function to OpalConnection, and changed H323
00105  * and SIP descendants to use this function. This allows an application to
00106  * obtain a GUID for any connection regardless of the protocol used
00107  *
00108  * Revision 2.30  2004/12/12 12:29:02  dsandras
00109  * Moved GetRemoteApplication () to OpalConnection so that it is usable for all types of connection.
00110  *
00111  * Revision 2.29  2004/08/14 07:56:29  rjongbloed
00112  * Major revision to utilise the PSafeCollection classes for the connections and calls.
00113  *
00114  * Revision 2.28  2004/05/17 13:24:18  rjongbloed
00115  * Added silence suppression.
00116  *
00117  * Revision 2.27  2004/05/01 10:00:51  rjongbloed
00118  * Fixed ClearCallSynchronous so now is actually signalled when call is destroyed.
00119  *
00120  * Revision 2.26  2004/04/26 04:33:05  rjongbloed
00121  * Move various call progress times from H.323 specific to general conenction.
00122  *
00123  * Revision 2.25  2004/04/18 13:31:28  rjongbloed
00124  * Added new end call value from OpenH323.
00125  *
00126  * Revision 2.24  2004/03/13 06:25:50  rjongbloed
00127  * Slight rearrangement of local party name and alias list to beter match common
00128  *   behaviour in ancestor.
00129  * Abstracted local party name for endpoint into ancestor from H.,323.
00130  *
00131  * Revision 2.23  2004/03/11 06:54:27  csoutheren
00132  * Added ability to disable SIP or H.323 stacks
00133  *
00134  * Revision 2.22  2004/02/24 11:28:45  rjongbloed
00135  * Normalised RTP session management across protocols
00136  *
00137  * Revision 2.21  2003/03/17 10:26:59  robertj
00138  * Added video support.
00139  *
00140  * Revision 2.20  2003/03/06 03:57:47  robertj
00141  * IVR support (work in progress) requiring large changes everywhere.
00142  *
00143  * Revision 2.19  2003/01/07 04:39:53  robertj
00144  * Updated to OpenH323 v1.11.2
00145  *
00146  * Revision 2.18  2002/11/10 11:33:17  robertj
00147  * Updated to OpenH323 v1.10.3
00148  *
00149  * Revision 2.17  2002/09/16 02:52:35  robertj
00150  * Added #define so can select if #pragma interface/implementation is used on
00151  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00152  *
00153  * Revision 2.16  2002/09/12 06:54:06  robertj
00154  * Added missing virtual to Release() function so can be overridden.
00155  *
00156  * Revision 2.15  2002/07/01 04:56:30  robertj
00157  * Updated to OpenH323 v1.9.1
00158  *
00159  * Revision 2.14  2002/04/10 03:08:42  robertj
00160  * Moved code for handling media bypass address resolution into ancestor as
00161  *   now done ths same way in both SIP and H.323.
00162  *
00163  * Revision 2.13  2002/04/09 00:16:46  robertj
00164  * Changed "callAnswered" to better description of "originating".
00165  *
00166  * Revision 2.12  2002/02/19 07:42:07  robertj
00167  * Added OpalRFC2833 as a OpalMediaFormat variable.
00168  * Restructured media bypass functions to fix problems with RFC2833.
00169  *
00170  * Revision 2.11  2002/02/11 09:32:12  robertj
00171  * Updated to openH323 v1.8.0
00172  *
00173  * Revision 2.10  2002/02/11 07:38:35  robertj
00174  * Added media bypass for streams between compatible protocols.
00175  *
00176  * Revision 2.9  2002/01/22 05:04:21  robertj
00177  * Revamp of user input API triggered by RFC2833 support
00178  *
00179  * Revision 2.8  2001/11/14 01:31:55  robertj
00180  * Corrected placement of adjusting media format list.
00181  *
00182  * Revision 2.7  2001/11/02 10:45:19  robertj
00183  * Updated to OpenH323 v1.7.3
00184  *
00185  * Revision 2.6  2001/10/15 04:29:14  robertj
00186  * Added delayed start of media patch threads.
00187  * Removed answerCall signal and replaced with state based functions.
00188  *
00189  * Revision 2.5  2001/10/03 05:56:15  robertj
00190  * Changes abndwidth management API.
00191  *
00192  * Revision 2.4  2001/08/22 10:20:09  robertj
00193  * Changed connection locking to use double mutex to guarantee that
00194  *   no threads can ever deadlock or access deleted connection.
00195  *
00196  * Revision 2.3  2001/08/17 08:22:23  robertj
00197  * Moved call end reasons enum from OpalConnection to global.
00198  *
00199  * Revision 2.2  2001/08/13 05:10:39  robertj
00200  * Updates from OpenH323 v1.6.0 release.
00201  *
00202  * Revision 2.1  2001/08/01 05:26:35  robertj
00203  * Moved media formats list from endpoint to connection.
00204  *
00205  * Revision 2.0  2001/07/27 15:48:24  robertj
00206  * Conversion of OpenH323 to Open Phone Abstraction Library (OPAL)
00207  *
00208  */
00209 
00210 #ifndef __OPAL_CONNECTION_H
00211 #define __OPAL_CONNECTION_H
00212 
00213 #ifdef P_USE_PRAGMA
00214 #pragma interface
00215 #endif
00216 
00217 #include <opal/buildopts.h>
00218 
00219 #include <opal/mediafmt.h>
00220 #include <opal/mediastrm.h>
00221 #include <opal/guid.h>
00222 #include <opal/transports.h>
00223 #include <ptclib/dtmf.h>
00224 #include <ptlib/safecoll.h>
00225 #include <rtp/rtp.h>
00226 
00227 class OpalEndPoint;
00228 class OpalCall;
00229 class OpalSilenceDetector;
00230 class OpalEchoCanceler;
00231 class OpalRFC2833Proto;
00232 class OpalRFC2833Info;
00233 class OpalT120Protocol;
00234 class OpalT38Protocol;
00235 
00236 
00254 class OpalConnection : public PSafeObject
00255 {
00256     PCLASSINFO(OpalConnection, PSafeObject);
00257   public:
00262     enum CallEndReason {
00263       EndedByLocalUser,         
00264       EndedByNoAccept,          
00265       EndedByAnswerDenied,      
00266       EndedByRemoteUser,        
00267       EndedByRefusal,           
00268       EndedByNoAnswer,          
00269       EndedByCallerAbort,       
00270       EndedByTransportFail,     
00271       EndedByConnectFail,       
00272       EndedByGatekeeper,        
00273       EndedByNoUser,            
00274       EndedByNoBandwidth,       
00275       EndedByCapabilityExchange,
00276       EndedByCallForwarded,     
00277       EndedBySecurityDenial,    
00278       EndedByLocalBusy,         
00279       EndedByLocalCongestion,   
00280       EndedByRemoteBusy,        
00281       EndedByRemoteCongestion,  
00282       EndedByUnreachable,       
00283       EndedByNoEndPoint,        
00284       EndedByHostOffline,       
00285       EndedByTemporaryFailure,  
00286       EndedByQ931Cause,         
00287       EndedByDurationLimit,     
00288       EndedByInvalidConferenceID, 
00289       NumCallEndReasons
00290     };
00291 
00292 #if PTRACING
00293     friend ostream & operator<<(ostream & o, CallEndReason reason);
00294 #endif
00295 
00296     enum AnswerCallResponse {
00297       AnswerCallNow,               
00298       AnswerCallDenied,            
00299       AnswerCallPending,           
00300       AnswerCallDeferred,          
00301       AnswerCallAlertWithMedia,    
00302       AnswerCallDeferredWithMedia, 
00303       NumAnswerCallResponses
00304     };
00305 #if PTRACING
00306     friend ostream & operator<<(ostream & o, AnswerCallResponse s);
00307 #endif
00308 
00309 
00314     OpalConnection(
00315       OpalCall & call,          
00316       OpalEndPoint & endpoint,  
00317       const PString & token     
00318     );
00319 
00322     ~OpalConnection();
00324 
00331     void PrintOn(
00332       ostream & strm    
00333     ) const;
00335 
00338     enum Phases {
00339       UninitialisedPhase,
00340       SetUpPhase,
00341       AlertingPhase,
00342       ConnectedPhase,
00343       EstablishedPhase,
00344       ReleasingPhase, // Note these must be the last two phases.
00345       ReleasedPhase,
00346       NumPhases
00347     };
00348 
00353     inline Phases GetPhase() const { return phase; }
00354 
00363     CallEndReason GetCallEndReason() const { return callEndReason; }
00364 
00369     virtual void SetCallEndReason(
00370       CallEndReason reason        
00371     );
00372 
00380     void ClearCall(
00381       CallEndReason reason = EndedByLocalUser 
00382     );
00383 
00386     virtual void ClearCallSynchronous(
00387       PSyncPoint * sync,
00388       CallEndReason reason = EndedByLocalUser  
00389     );
00390 
00394     virtual void TransferConnection(
00395       const PString & remoteParty,   
00396       const PString & callIdentity = PString::Empty()
00398     );
00399     
00402     virtual void HoldConnection();
00403 
00407     virtual void RetrieveConnection();
00408 
00411     virtual BOOL IsConnectionOnHold();
00413 
00437     virtual BOOL OnIncomingConnection();
00438 
00445     virtual BOOL SetUpConnection() = 0;
00446 
00462     virtual void OnAlerting();
00463 
00474     virtual BOOL SetAlerting(
00475       const PString & calleeName,   
00476       BOOL withMedia                
00477     ) = 0;
00478 
00495     virtual AnswerCallResponse OnAnswerCall(
00496       const PString & callerName        
00497     );
00498 
00509     virtual void AnsweringCall(
00510       AnswerCallResponse response 
00511     );
00512 
00523     virtual void OnConnected();
00524 
00529     virtual BOOL SetConnected() = 0;
00530 
00541     virtual void OnEstablished();
00542 
00551     virtual void Release(
00552       CallEndReason reason = EndedByLocalUser 
00553     );
00554 
00572     virtual void OnReleased();
00574 
00584     virtual PString GetDestinationAddress();
00585 
00595     virtual BOOL ForwardCall(
00596       const PString & forwardParty   
00597     );
00599 
00608     virtual OpalMediaFormatList GetMediaFormats() const = 0;
00609 
00618     virtual void AdjustMediaFormats(
00619       OpalMediaFormatList & mediaFormats  
00620     ) const;
00621     
00624     virtual BOOL OpenSourceMediaStream(
00625       const OpalMediaFormatList & mediaFormats, 
00626       unsigned sessionID                   
00627     );
00628 
00631     virtual OpalMediaStream * OpenSinkMediaStream(
00632       OpalMediaStream & source    
00633     );
00634 
00637     virtual void StartMediaStreams();
00638     
00641     virtual void CloseMediaStreams();
00642     
00645     virtual void RemoveMediaStreams();
00646     
00649     virtual void PauseMediaStreams(BOOL paused);
00650 
00665     virtual OpalMediaStream * CreateMediaStream(
00666       const OpalMediaFormat & mediaFormat, 
00667       unsigned sessionID,                  
00668       BOOL isSource                        
00669     );
00670 
00682     virtual BOOL OnOpenMediaStream(
00683       OpalMediaStream & stream    
00684     );
00685 
00690     virtual void OnClosedMediaStream(
00691       const OpalMediaStream & stream     
00692     );
00693     
00698     virtual void OnPatchMediaStream(
00699       BOOL isSource,
00700       OpalMediaPatch & patch    
00701     );
00702 
00708     OpalMediaStream * GetMediaStream(
00709       unsigned sessionId,  
00710       BOOL source          
00711     ) const;
00712 
00718     virtual BOOL IsMediaBypassPossible(
00719       unsigned sessionID                  
00720     ) const;
00721 
00724     struct MediaInformation {
00725       MediaInformation() { rfc2833 = RTP_DataFrame::IllegalPayloadType; }
00726 
00727       OpalTransportAddress data;           
00728       OpalTransportAddress control;        
00729       RTP_DataFrame::PayloadTypes rfc2833; 
00730     };
00731 
00740     virtual BOOL GetMediaInformation(
00741       unsigned sessionID,     
00742       MediaInformation & info 
00743     ) const;
00744 
00749     virtual void AddVideoMediaFormats(
00750       OpalMediaFormatList & mediaFormats  
00751     ) const;
00752 
00755     virtual BOOL CreateVideoInputDevice(
00756       const OpalMediaFormat & mediaFormat,  
00757       PVideoInputDevice * & device,         
00758       BOOL & autoDelete                     
00759     );
00760 
00764     virtual BOOL CreateVideoOutputDevice(
00765       const OpalMediaFormat & mediaFormat,  
00766       BOOL preview,                         
00767       PVideoOutputDevice * & device,        
00768       BOOL & autoDelete                     
00769     );
00771 
00777     virtual RTP_Session * GetSession(
00778       unsigned sessionID    
00779     ) const;
00780 
00795     virtual RTP_Session * UseSession(
00796       const OpalTransport & transport,  
00797       unsigned sessionID,               
00798       RTP_QOS * rtpqos = NULL           
00799     );
00800 
00805     virtual void ReleaseSession(
00806       unsigned sessionID    
00807     );
00808 
00813     virtual RTP_Session * CreateSession(
00814       const OpalTransport & transport,
00815       unsigned sessionID,
00816       RTP_QOS * rtpqos
00817     );
00819 
00824     unsigned GetBandwidthAvailable() const { return bandwidthAvailable; }
00825 
00830     virtual BOOL SetBandwidthAvailable(
00831       unsigned newBandwidth,    
00832       BOOL force = FALSE        
00833     );
00834 
00839     virtual unsigned GetBandwidthUsed() const;
00840 
00849     virtual BOOL SetBandwidthUsed(
00850       unsigned releasedBandwidth,   
00851       unsigned requiredBandwidth    
00852     );
00854 
00863     virtual BOOL SendUserInputString(
00864       const PString & value                   
00865     );
00866 
00883     virtual BOOL SendUserInputTone(
00884       char tone,        
00885       unsigned duration = 0  
00886     );
00887 
00894     virtual void OnUserInputString(
00895       const PString & value   
00896     );
00897 
00904     virtual void OnUserInputTone(
00905       char tone,
00906       unsigned duration
00907     );
00908 
00912     void SendUserInputHookFlash(
00913       unsigned duration = 500  
00914     ) { SendUserInputTone('!', duration); }
00915 
00918     virtual PString GetUserInput(
00919       unsigned timeout = 30   
00920     );
00921 
00926     virtual void SetUserInput(
00927       const PString & input     
00928     );
00929 
00932     virtual PString ReadUserInput(
00933       const char * terminators = "#\r\n", 
00934       unsigned lastDigitTimeout = 4,      
00935       unsigned firstDigitTimeout = 30     
00936     );
00937 
00944     virtual BOOL PromptUserInput(
00945       BOOL play   
00946     );
00948 
00963     virtual OpalT120Protocol * CreateT120ProtocolHandler();
00964 
00977     virtual OpalT38Protocol * CreateT38ProtocolHandler();
00978 
00980 
00985     OpalEndPoint & GetEndPoint() const { return endpoint; }
00986     
00989     OpalCall & GetCall() const { return ownerCall; }
00990 
00993     const PString & GetToken() const { return callToken; }
00994 
00997     BOOL IsOriginating() const { return originating; }
00998 
01001     PTime GetSetupUpTime() const { return setupTime; }
01002 
01005     PTime GetAlertingTime() const { return alertingTime; }
01006 
01009     PTime GetConnectionStartTime() const { return connectedTime; }
01010 
01013     PTime GetConnectionEndTime() const { return callEndTime; }
01014 
01017     const PString & GetLocalPartyName() const { return localPartyName; }
01018 
01021     virtual void SetLocalPartyName(const PString & name);
01022 
01025     const PString & GetDisplayName() const { return displayName; }
01026 
01029     void SetDisplayName(const PString & name) { displayName = name; }
01030 
01033     const PString & GetRemotePartyName() const { return remotePartyName; }
01034 
01037     const PString & GetRemoteApplication() const { return remoteApplication; }
01038     
01043     const PString & GetRemotePartyNumber() const { return remotePartyNumber; }
01044 
01047     const PString & GetRemotePartyAddress() const { return remotePartyAddress; }
01048 
01053     virtual const PString GetRemotePartyCallbackURL() const { return remotePartyAddress; }
01054 
01055 
01059     virtual const PString & GetCalledDestinationNumber() const { return calledDestinationNumber; }
01060 
01064     virtual const PString & GetCalledDestinationName() const { return calledDestinationName; }
01065 
01069     unsigned GetMinAudioJitterDelay() const { return minAudioJitterDelay; }
01070 
01074     unsigned GetMaxAudioJitterDelay() const { return maxAudioJitterDelay; }
01075 
01078     void SetAudioJitterDelay(
01079       unsigned minDelay,   
01080       unsigned maxDelay    
01081     );
01082 
01085     OpalSilenceDetector * GetSilenceDetector() const { return silenceDetector; }
01086     
01089     OpalEchoCanceler * GetEchoCanceler() const { return echoCanceler; }
01090 
01093     virtual const OpalGloballyUniqueID & GetIdentifier() const
01094     { return callIdentifier; }
01095 
01096     virtual OpalTransport & GetTransport() const
01097     { return *(OpalTransport *)NULL; }
01098 
01099     PDICTIONARY(MediaAddressesDict, POrdinalKey, OpalTransportAddress);
01100     MediaAddressesDict & GetMediaTransportAddresses()
01101     { return mediaTransportAddresses; }
01102 
01104 
01105     const RTP_DataFrame::PayloadMapType & GetRTPPayloadMap() const
01106     { return rtpPayloadMap; }
01107 
01108     PMutex & GetMediaStreamMutex() { return mediaStreamMutex; }
01109 
01110   protected:
01111     PDECLARE_NOTIFIER(OpalRFC2833Info, OpalConnection, OnUserInputInlineRFC2833);
01112     PDECLARE_NOTIFIER(RTP_DataFrame, OpalConnection, OnUserInputInBandDTMF);
01113     PDECLARE_NOTIFIER(PThread, OpalConnection, OnReleaseThreadMain);
01114 
01115   // Member variables
01116     OpalCall             & ownerCall;
01117     OpalEndPoint         & endpoint;
01118 
01119     Phases               phase;
01120     PString              callToken;
01121     OpalGloballyUniqueID callIdentifier;
01122     BOOL                 originating;
01123     PTime                setupTime;
01124     PTime                alertingTime;
01125     PTime                connectedTime;
01126     PTime                callEndTime;
01127     PString              localPartyName;
01128     PString              displayName;
01129     PString              remotePartyName;
01130     PString              remoteApplication;
01131     PString              remotePartyNumber;
01132     PString              remotePartyAddress;
01133     CallEndReason        callEndReason;
01134     PString              calledDestinationNumber;
01135     PString              calledDestinationName;
01136 
01137     PString               userInputString;
01138     PMutex                userInputMutex;
01139     PSyncPoint            userInputAvailable;
01140     BOOL                  detectInBandDTMF;
01141     OpalSilenceDetector * silenceDetector;
01142     OpalEchoCanceler  * echoCanceler;
01143     OpalRFC2833Proto    * rfc2833Handler;
01144     OpalT120Protocol    * t120handler;
01145     OpalT38Protocol     * t38handler;
01146 
01147 
01148     MediaAddressesDict  mediaTransportAddresses;
01149     PMutex              mediaStreamMutex;
01150     OpalMediaStreamList mediaStreams;
01151     RTP_SessionManager  rtpSessions;
01152     unsigned            minAudioJitterDelay;
01153     unsigned            maxAudioJitterDelay;
01154     unsigned            bandwidthAvailable;
01155 
01156     RTP_DataFrame::PayloadMapType rtpPayloadMap;
01157 
01158     // The In-Band DTMF detector. This is used inside an audio filter which is
01159     // added to the audio channel.
01160     PDTMFDecoder        dtmfDecoder;
01161 
01165     void SetPhase(Phases phaseToSet);
01166 
01167 #if PTRACING
01168     friend ostream & operator<<(ostream & o, Phases p);
01169 #endif
01170 };
01171 
01172 
01173 #endif // __OPAL_CONNECTION_H
01174 
01175 
01176 // End of File ///////////////////////////////////////////////////////////////

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