D:/Storage/CVS_Head/h323plus/include/peclient.h

00001 /*
00002  * peclient.h
00003  *
00004  * H.323 Annex G Peer Element client protocol handler
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 2003 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  * Contributor(s): ______________________________________.
00025  *
00026  * $Log: peclient.h,v $
00027  * Revision 1.1  2007/08/06 20:50:50  shorne
00028  * First commit of h323plus
00029  *
00030  * Revision 1.33  2005/11/30 13:05:01  csoutheren
00031  * Changed tags for Doxygen
00032  *
00033  * Revision 1.32  2004/04/01 07:09:07  csoutheren
00034  * Fixed sense of default H.501 priority
00035  *
00036  * Revision 1.31  2004/04/01 04:29:40  csoutheren
00037  * Added default priority to all outgoing descriptors unless set by application
00038  *
00039  * Revision 1.30  2004/03/29 08:13:15  csoutheren
00040  * Fixed problem with priorities
00041  *
00042  * Revision 1.29  2004/03/29 05:35:21  csoutheren
00043  * Changed to use default address for descriptor if blank
00044  *
00045  * Revision 1.28  2003/05/14 03:04:58  rjongbloed
00046  * Added another method for removing service relationships.
00047  * Added virtual for handling SR requests.
00048  *
00049  * Revision 1.27  2003/05/05 08:28:45  craigs
00050  * Fixed lastUpdate time in descriptors
00051  *
00052  * Revision 1.26  2003/04/30 04:56:57  craigs
00053  * Improved handling for nonexistent routes
00054  *
00055  * Revision 1.25  2003/04/10 12:37:54  craigs
00056  * Improved handling of wildcard entries
00057  *
00058  * Revision 1.24  2003/04/10 07:05:15  craigs
00059  * Allowed access to endpoint type in descriptors
00060  *
00061  * Revision 1.23  2003/04/10 03:42:16  craigs
00062  * Allow AccessRequest to return multiple transport addresses
00063  *
00064  * Revision 1.22  2003/04/09 10:47:25  craigs
00065  * Fixed problems
00066  *
00067  * Revision 1.21  2003/04/08 12:23:54  craigs
00068  * Fixed problem with descriptors not being removed when service relationships go away
00069  *
00070  * Revision 1.20  2003/04/07 05:11:13  craigs
00071  * Added changes to get access to descriptor creates/updates/deletes
00072  *
00073  * Revision 1.19  2003/04/02 06:05:10  robertj
00074  * Added versions of AddDescriptor that contain the GUID.
00075  *
00076  * Revision 1.18  2003/04/01 05:59:30  robertj
00077  * Fixed H.501 transaction code setting members for m_common PDU part.
00078  *
00079  * Revision 1.17  2003/04/01 04:47:48  robertj
00080  * Abstracted H.225 RAS transaction processing (RIP and secondary thread) in
00081  *   server environment for use by H.501 peer elements.
00082  *
00083  * Revision 1.16  2003/04/01 01:17:44  robertj
00084  * Minor changes to AccessEquest and AddDescriptor API to allow for
00085  *   string arrays of aliases.
00086  *
00087  * Revision 1.15  2003/03/28 00:30:23  craigs
00088  * Fixed problems with service relationship ordinals and better descriptor update access
00089  *
00090  * Revision 1.14  2003/03/27 09:24:06  craigs
00091  * Rewritten support for descriptors and multiple templates
00092  *
00093  * Revision 1.13  2003/03/26 07:08:46  robertj
00094  * Added default parameters to AddDescriptor() functions
00095  *
00096  * Revision 1.12  2003/03/25 07:50:11  craigs
00097  * Added support for mutiple transports per descriptor
00098  *
00099  * Revision 1.11  2003/03/25 05:13:13  craigs
00100  * More speed enhancements
00101  *
00102  * Revision 1.10  2003/03/25 01:58:46  robertj
00103  * Fixed GNU warnings
00104  *
00105  * Revision 1.9  2003/03/25 01:47:58  craigs
00106  * Changes for new OpenH323 H.501
00107  *
00108  * Revision 1.8  2003/03/20 01:51:07  robertj
00109  * More abstraction of H.225 RAS and H.501 protocols transaction handling.
00110  *
00111  * Revision 1.7  2003/03/18 13:58:16  craigs
00112  * More H.501 implementation
00113  *
00114  * Revision 1.6  2003/03/18 02:18:45  craigs
00115  * Changed incorrect include
00116  *
00117  * Revision 1.5  2003/03/17 13:19:49  craigs
00118  * More H501 implementation
00119  *
00120  * Revision 1.4  2003/03/14 06:00:42  craigs
00121  * More updates
00122  *
00123  * Revision 1.3  2003/03/01 00:23:51  craigs
00124  * New PeerElement implementation
00125  *
00126  * Revision 1.2  2003/02/21 07:23:18  robertj
00127  * Fixed up some comments
00128  *
00129  * Revision 1.1  2003/02/21 05:28:39  craigs
00130  * Factored out code for user with peer elements
00131  *
00132  */
00133 
00134 #ifndef __OPAL_PECLIENT_H
00135 #define __OPAL_PECLIENT_H
00136 
00137 #ifdef P_USE_PRAGMA
00138 #pragma interface
00139 #endif
00140 
00141 
00142 #include "h323annexg.h"
00143 #include "h323ep.h"
00144 #include "h501.h"
00145 
00146 #include <ptlib/safecoll.h>
00147 
00148 
00149 class H323PeerElement;
00150 
00151 
00153 
00154 class H501Transaction : public H323Transaction
00155 {
00156     PCLASSINFO(H501Transaction, H323Transaction);
00157   public:
00158     H501Transaction(
00159       H323PeerElement & pe,
00160       const H501PDU & pdu,
00161       BOOL hasReject
00162     );
00163 
00164     virtual H323TransactionPDU * CreateRIP(
00165       unsigned sequenceNumber,
00166       unsigned delay
00167     ) const;
00168 
00169     virtual H235Authenticator::ValidationResult ValidatePDU() const;
00170 
00171     H501_MessageCommonInfo & requestCommon;
00172     H501_MessageCommonInfo & confirmCommon;
00173 
00174   protected:
00175     H323PeerElement & peerElement;
00176 };
00177 
00178 
00180 
00181 class H501ServiceRequest : public H501Transaction
00182 {
00183     PCLASSINFO(H501ServiceRequest, H501Transaction);
00184   public:
00185     H501ServiceRequest(
00186       H323PeerElement & pe,
00187       const H501PDU & pdu
00188     );
00189 
00190 #if PTRACING
00191     virtual const char * GetName() const;
00192 #endif
00193     virtual void SetRejectReason(
00194       unsigned reasonCode
00195     );
00196 
00197     H501_ServiceRequest & srq;
00198     H501_ServiceConfirmation & scf;
00199     H501_ServiceRejection  & srj;
00200 
00201   protected:
00202     virtual Response OnHandlePDU();
00203 };
00204 
00205 
00207 
00208 class H501DescriptorUpdate : public H501Transaction
00209 {
00210     PCLASSINFO(H501DescriptorUpdate, H501Transaction);
00211   public:
00212     H501DescriptorUpdate(
00213       H323PeerElement & pe,
00214       const H501PDU & pdu
00215     );
00216 
00217 #if PTRACING
00218     virtual const char * GetName() const;
00219 #endif
00220     virtual void SetRejectReason(
00221       unsigned reasonCode
00222     );
00223 
00224     H501_DescriptorUpdate & du;
00225     H501_DescriptorUpdateAck & ack;
00226 
00227   protected:
00228     virtual Response OnHandlePDU();
00229 };
00230 
00231 
00233 
00234 class H501AccessRequest : public H501Transaction
00235 {
00236     PCLASSINFO(H501AccessRequest, H501Transaction);
00237   public:
00238     H501AccessRequest(
00239       H323PeerElement & pe,
00240       const H501PDU & pdu
00241     );
00242 
00243 #if PTRACING
00244     virtual const char * GetName() const;
00245 #endif
00246     virtual void SetRejectReason(
00247       unsigned reasonCode
00248     );
00249 
00250     H501_AccessRequest & arq;
00251     H501_AccessConfirmation & acf;
00252     H501_AccessRejection  & arj;
00253 
00254   protected:
00255     virtual Response OnHandlePDU();
00256 };
00257 
00258 
00260 
00261 class H323PeerElementDescriptor : public PSafeObject
00262 {
00263   PCLASSINFO(H323PeerElementDescriptor, PSafeObject);
00264   public:
00265     H323PeerElementDescriptor(const OpalGloballyUniqueID & _descriptorID)
00266       : descriptorID(_descriptorID), state(Dirty), creator(0)
00267     { }
00268 
00269     Comparison Compare(const PObject & obj) const;
00270 
00271     enum Options {
00272       Protocol_H323            = 0x0001,
00273       Protocol_Voice           = 0x0002,
00274       Protocol_Max             = 0x0002,
00275       Option_WildCard          = 0x0004,
00276       Option_SendAccessRequest = 0x0008,
00277       Option_NotAvailable      = 0x0010,
00278       Option_PrioritySet       = 0x0020,
00279       Option_PriorityMask      = 0x1fc0,
00280     };
00281 
00282     enum {
00283       HighestPriority          = 0,
00284       DefaultPriority          = 80,
00285       LowestPriority           = 127
00286     };
00287 
00288     static inline unsigned SetPriorityOption(unsigned pri)     { return Option_PrioritySet | ((pri & 0x7f) << 6); }
00289     static inline unsigned GetPriorityOption(unsigned options) { return (options & Option_PrioritySet) ? ((options >> 6) & 0x7f) : DefaultPriority; }
00290 
00291     void CopyTo(H501_Descriptor & descriptor);
00292     static BOOL CopyToAddressTemplate(H501_AddressTemplate & addressTemplates, 
00293                                    const H225_EndpointType & ep, 
00294                            const H225_ArrayOf_AliasAddress & aliases, 
00295                            const H225_ArrayOf_AliasAddress & transportAddress, 
00296                                                     unsigned options = H323PeerElementDescriptor::Protocol_H323);
00297 
00298     static void SetProtocolList(H501_ArrayOf_SupportedProtocols & h501Protocols, unsigned protocols);
00299     static unsigned GetProtocolList(const H501_ArrayOf_SupportedProtocols & h501Protocols);
00300 
00301     OpalGloballyUniqueID descriptorID;
00302 
00303     BOOL ContainsNonexistent();
00304 
00305     enum States {
00306       Clean,
00307       Dirty,
00308       Deleted
00309     } state;
00310 
00311     H501_ArrayOf_AddressTemplate addressTemplates;
00312     PString gatekeeperID;
00313     PTime lastChanged;
00314     POrdinalKey creator;
00315 };
00316 
00317 
00319 
00320 class H323PeerElementServiceRelationship : public PSafeObject
00321 {
00322     PCLASSINFO(H323PeerElementServiceRelationship, PSafeObject);
00323   public:
00324     H323PeerElementServiceRelationship()
00325       : ordinal(0)
00326       { }
00327 
00328     H323PeerElementServiceRelationship(const OpalGloballyUniqueID & _serviceID)
00329       : serviceID(_serviceID), ordinal(0)
00330       { }
00331 
00332     Comparison Compare(const PObject & obj) const
00333       { return serviceID.Compare(((H323PeerElementServiceRelationship&)obj).serviceID); }
00334 
00335     OpalGloballyUniqueID serviceID;
00336     POrdinalKey ordinal;
00337     H323TransportAddress peer;
00338     PString name;
00339     PTime createdTime;
00340     PTime lastUpdateTime;
00341     PTime expireTime;
00342 };
00343 
00344 
00346 
00349 class H323PeerElement : public H323_AnnexG
00350 {
00351     PCLASSINFO(H323PeerElement, H323_AnnexG);
00352   public:
00357     H323PeerElement(
00358       H323EndPoint & endpoint,  
00359       H323Transport * transport = NULL
00360     );
00361     H323PeerElement(
00362       H323EndPoint & endpoint,  
00363       const H323TransportAddress & addr
00364     );
00365 
00368     ~H323PeerElement();
00370 
00371     enum Error {
00372       Confirmed,
00373       Rejected,
00374       NoResponse,
00375       NoServiceRelationship,
00376       ServiceRelationshipReestablished
00377     };
00378 
00379     enum {
00380       LocalServiceRelationshipOrdinal  = 0,
00381       NoServiceRelationshipOrdinal     = 1,
00382       RemoteServiceRelationshipOrdinal = 2
00383     };
00384 
00389     void PrintOn(
00390       ostream & strm    
00391     ) const;
00393 
00394     PSafePtr<H323PeerElementDescriptor> GetFirstDescriptor(
00395       PSafetyMode mode = PSafeReference
00396     ) { return PSafePtr<H323PeerElementDescriptor>(descriptors, mode); }
00397 
00398     PSafePtr<H323PeerElementServiceRelationship> GetFirstLocalServiceRelationship(
00399       PSafetyMode mode = PSafeReference
00400     ) { return PSafePtr<H323PeerElementServiceRelationship>(localServiceRelationships, mode); }
00401 
00402     PSafePtr<H323PeerElementServiceRelationship> GetFirstRemoteServiceRelationship(
00403       PSafetyMode mode = PSafeReference
00404     ) { return PSafePtr<H323PeerElementServiceRelationship>(remoteServiceRelationships, mode); }
00405 
00406     void SetLocalName(const PString & name);
00407     PString GetLocalName() const;
00408 
00409     void SetDomainName(const PString & name);
00410     PString GetDomainName() const;
00411 
00412     /*********************************************************
00413       functions to establish and break service relationships
00414       */
00415 
00418     BOOL SetOnlyServiceRelationship(const PString & peer, BOOL keepTrying = TRUE);
00419     BOOL AddServiceRelationship(const H323TransportAddress & peer, BOOL keepTrying = TRUE);
00420     BOOL AddServiceRelationship(const H323TransportAddress & peer, OpalGloballyUniqueID & serviceID, BOOL keepTrying = TRUE);
00421     BOOL RemoveServiceRelationship(const OpalGloballyUniqueID & serviceID, int reason = H501_ServiceReleaseReason::e_terminated);
00422     BOOL RemoveServiceRelationship(const H323TransportAddress & peer, int reason = H501_ServiceReleaseReason::e_terminated);
00423     BOOL RemoveAllServiceRelationships();
00424 
00425     Error ServiceRequestByAddr(const H323TransportAddress & peer);
00426     Error ServiceRequestByAddr(const H323TransportAddress & peer, OpalGloballyUniqueID & serviceID);
00427     Error ServiceRequestByID(OpalGloballyUniqueID & serviceID);
00428 
00431     BOOL ServiceRelease(const OpalGloballyUniqueID & serviceID, unsigned reason);
00432 
00433     /*********************************************************
00434       functions to manipulate the local descriptor table
00435      */
00436 
00437     BOOL AddDescriptor(
00438       const OpalGloballyUniqueID & descriptorID,
00439       const PStringArray & aliases, 
00440       const H323TransportAddressArray & transportAddrs, 
00441       unsigned options = H323PeerElementDescriptor::Protocol_H323, 
00442       BOOL now = FALSE
00443     );
00444 
00445     BOOL AddDescriptor(
00446       const OpalGloballyUniqueID & descriptorID,
00447       const H225_ArrayOf_AliasAddress & aliases, 
00448       const H323TransportAddressArray & transportAddrs, 
00449       unsigned options = H323PeerElementDescriptor::Protocol_H323, 
00450       BOOL now = FALSE
00451     );
00452 
00453     BOOL AddDescriptor(
00454       const OpalGloballyUniqueID & descriptorID,
00455       const H225_ArrayOf_AliasAddress & aliases, 
00456       const H225_ArrayOf_AliasAddress & transportAddr, 
00457       unsigned options = H323PeerElementDescriptor::Protocol_H323, 
00458       BOOL now = FALSE
00459     );
00460 
00461     BOOL AddDescriptor(
00462       const OpalGloballyUniqueID & descriptorID,
00463       const POrdinalKey & creator,
00464       const H225_ArrayOf_AliasAddress & alias, 
00465       const H225_ArrayOf_AliasAddress & transportAddresses,
00466       unsigned options = H323PeerElementDescriptor::Protocol_H323,
00467       BOOL now = FALSE
00468     );
00469 
00470     BOOL AddDescriptor(
00471       const OpalGloballyUniqueID & descriptorID,
00472       const POrdinalKey & creator,
00473       const H501_ArrayOf_AddressTemplate & addressTemplates,
00474       const PTime & updateTime,
00475       BOOL now = FALSE
00476     );
00477 
00480     BOOL DeleteDescriptor(const PString & alias, BOOL now = FALSE);
00481     BOOL DeleteDescriptor(const H225_AliasAddress & alias, BOOL now = FALSE);
00482     BOOL DeleteDescriptor(const OpalGloballyUniqueID & descriptorID, BOOL now = FALSE);
00483 
00486     BOOL AccessRequest(
00487       const PString & searchAlias,
00488       PStringArray & destAliases, 
00489       H323TransportAddress & transportAddress,
00490       unsigned options = H323PeerElementDescriptor::Protocol_H323
00491     );
00492 
00493     BOOL AccessRequest(
00494       const PString & searchAlias,
00495       H225_ArrayOf_AliasAddress & destAliases,
00496       H323TransportAddress & transportAddress,
00497       unsigned options = H323PeerElementDescriptor::Protocol_H323
00498     );
00499 
00500     BOOL AccessRequest(
00501       const H225_AliasAddress & searchAlias,
00502       H225_ArrayOf_AliasAddress & destAliases,
00503       H323TransportAddress & transportAddress,
00504       unsigned options = H323PeerElementDescriptor::Protocol_H323
00505     );
00506 
00507     BOOL AccessRequest(
00508       const H225_AliasAddress & alias,
00509       H225_ArrayOf_AliasAddress & destAliases,
00510       H225_AliasAddress & transportAddress,
00511       unsigned options = H323PeerElementDescriptor::Protocol_H323
00512     );
00513 
00514     /*********************************************************
00515       functions to send send descriptors to another peer element
00516       */
00517     BOOL UpdateDescriptor(H323PeerElementDescriptor * descriptor);
00518     BOOL UpdateDescriptor(H323PeerElementDescriptor * descriptor, H501_UpdateInformation_updateType::Choices updateType);
00519 
00520 
00521     Error SendUpdateDescriptorByID(const OpalGloballyUniqueID & serviceID, 
00522                                     H323PeerElementDescriptor * descriptor, 
00523                      H501_UpdateInformation_updateType::Choices updateType);
00524 
00525     Error SendUpdateDescriptorByAddr(const H323TransportAddress & peer, 
00526                                       H323PeerElementDescriptor * descriptor, 
00527                        H501_UpdateInformation_updateType::Choices updateType);
00528 
00529     Error SendAccessRequestByID(const OpalGloballyUniqueID & peerID, 
00530                                                    H501PDU & request, 
00531                                                    H501PDU & confirmPDU);
00532 
00533     Error SendAccessRequestByAddr(const H323TransportAddress & peerAddr, 
00534                                                      H501PDU & request, 
00535                                                      H501PDU & confirmPDU);
00536 
00537 
00538     /*********************************************************
00539       low level request functions
00540       */
00541 
00542     BOOL MakeRequest(H323_AnnexG::Request & request);
00543 
00544     virtual void OnAddServiceRelationship(const H323TransportAddress &) { }
00545     virtual void OnRemoveServiceRelationship(const H323TransportAddress &) { }
00546 
00547     virtual void OnNewDescriptor(const H323PeerElementDescriptor &) { }
00548     virtual void OnUpdateDescriptor(const H323PeerElementDescriptor &) { }
00549     virtual void OnRemoveDescriptor(const H323PeerElementDescriptor &) { }
00550 
00551     virtual H323Transaction::Response OnServiceRequest(H501ServiceRequest & info);
00552     virtual H323Transaction::Response OnDescriptorUpdate(H501DescriptorUpdate & info);
00553     virtual H323Transaction::Response OnAccessRequest(H501AccessRequest & info);
00554 
00555     BOOL OnReceiveServiceRequest(const H501PDU & pdu, const H501_ServiceRequest & pduBody);
00556     BOOL OnReceiveServiceConfirmation(const H501PDU & pdu, const H501_ServiceConfirmation & pduBody);
00557 
00558     BOOL OnReceiveDescriptorUpdate(const H501PDU & pdu, const H501_DescriptorUpdate & pduBody);
00559     BOOL OnReceiveDescriptorUpdateACK(const H501PDU & pdu, const H501_DescriptorUpdateAck & pduBody);
00560 
00561     BOOL OnReceiveAccessRequest(const H501PDU & pdu, const H501_AccessRequest & pduBody);
00562     BOOL OnReceiveAccessConfirmation (const H501PDU & pdu, const H501_AccessConfirmation & pduBody);
00563     BOOL OnReceiveAccessRejection(const H501PDU & pdu,     const H501_AccessRejection & pduBody);
00564 
00565     class AliasKey : public H225_AliasAddress
00566     {
00567       public:
00568         AliasKey(const H225_AliasAddress & _alias, const OpalGloballyUniqueID & _id, PINDEX _pos, BOOL _wild = FALSE)
00569           : H225_AliasAddress(_alias), id(_id), pos(_pos), wild(_wild)
00570         { }
00571 
00572         OpalGloballyUniqueID id;
00573         PINDEX pos;
00574         BOOL wild;
00575     };
00576 
00577   protected:
00578     void Construct();
00579 
00580     Error SendUpdateDescriptor(              H501PDU & pdu,  
00581                           const H323TransportAddress & peer, 
00582                            H323PeerElementDescriptor * descriptor,
00583             H501_UpdateInformation_updateType::Choices updateType);
00584 
00585     BOOL OnRemoteServiceRelationshipDisappeared(OpalGloballyUniqueID & serviceID, const H323TransportAddress & peer);
00586     void InternalRemoveServiceRelationship(const H323TransportAddress & peer);
00587     H323Transaction::Response HandleServiceRequest(H501ServiceRequest & info);
00588 
00589     virtual H323PeerElementDescriptor          * CreateDescriptor(const OpalGloballyUniqueID & descriptorID);
00590     virtual H323PeerElementServiceRelationship * CreateServiceRelationship();
00591     virtual AliasKey                           * CreateAliasKey(const H225_AliasAddress & alias, const OpalGloballyUniqueID & id, PINDEX pos, BOOL wild = FALSE);
00592 
00593     void RemoveDescriptorInformation(const H501_ArrayOf_AddressTemplate & addressTemplates);
00594 
00595     PDECLARE_NOTIFIER(PThread, H323PeerElement, MonitorMain);
00596     PDECLARE_NOTIFIER(PThread, H323PeerElement, UpdateAllDescriptors);
00597     PDECLARE_NOTIFIER(PTimer, H323PeerElement, TickleMonitor);
00598 
00599     PMutex localNameMutex;
00600     PString localIdentifier;
00601     PString domainName;
00602 
00603     PSemaphore requestMutex;
00604     PThread  * monitor;
00605     BOOL       monitorStop;
00606     PSyncPoint monitorTickle;
00607 
00608     PMutex basePeerOrdinalMutex;
00609     PINDEX basePeerOrdinal;
00610 
00611     // structures needed to maintain local service relationships (for which we receive a ServiceRequest)
00612     PSafeSortedList<H323PeerElementServiceRelationship> localServiceRelationships;
00613     PMutex localPeerListMutex;
00614     POrdinalSet localServiceOrdinals;
00615 
00616     // structures needed to maintain remote service relationships (for which we send a ServiceRequest)
00617     PMutex remotePeerListMutex;
00618     PSafeSortedList<H323PeerElementServiceRelationship> remoteServiceRelationships;
00619     PStringToString remotePeerAddrToServiceID;
00620     PDICTIONARY(StringToOrdinalKey, PString, POrdinalKey);
00621     StringToOrdinalKey remotePeerAddrToOrdinalKey;
00622 
00623     PSafeSortedList<H323PeerElementDescriptor> descriptors;
00624 
00625     PSORTED_LIST(AliasKeyList, H225_AliasAddress);
00626 
00627     PMutex aliasMutex;
00628     AliasKeyList transportAddressToDescriptorID;
00629     AliasKeyList specificAliasToDescriptorID;
00630     AliasKeyList wildcardAliasToDescriptorID;
00631 };
00632 
00633 
00634 #endif // __OPAL_PECLIENT_H
00635 
00636 

Generated on Thu Oct 25 13:42:36 2007 for h323plus by  doxygen 1.5.2