home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / openh323.tar.gz / openh323.tar / openh323 / include / peclient.h < prev    next >
C/C++ Source or Header  |  2003-05-13  |  20KB  |  609 lines

  1. /*
  2.  * peclient.h
  3.  *
  4.  * H.323 Annex G Peer Element client protocol handler
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 2003 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Open H323 Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Contributor(s): ______________________________________.
  25.  *
  26.  * $Log: peclient.h,v $
  27.  * Revision 1.28  2003/05/14 03:04:58  rjongbloed
  28.  * Added another method for removing service relationships.
  29.  * Added virtual for handling SR requests.
  30.  *
  31.  * Revision 1.27  2003/05/05 08:28:45  craigs
  32.  * Fixed lastUpdate time in descriptors
  33.  *
  34.  * Revision 1.26  2003/04/30 04:56:57  craigs
  35.  * Improved handling for nonexistent routes
  36.  *
  37.  * Revision 1.25  2003/04/10 12:37:54  craigs
  38.  * Improved handling of wildcard entries
  39.  *
  40.  * Revision 1.24  2003/04/10 07:05:15  craigs
  41.  * Allowed access to endpoint type in descriptors
  42.  *
  43.  * Revision 1.23  2003/04/10 03:42:16  craigs
  44.  * Allow AccessRequest to return multiple transport addresses
  45.  *
  46.  * Revision 1.22  2003/04/09 10:47:25  craigs
  47.  * Fixed problems
  48.  *
  49.  * Revision 1.21  2003/04/08 12:23:54  craigs
  50.  * Fixed problem with descriptors not being removed when service relationships go away
  51.  *
  52.  * Revision 1.20  2003/04/07 05:11:13  craigs
  53.  * Added changes to get access to descriptor creates/updates/deletes
  54.  *
  55.  * Revision 1.19  2003/04/02 06:05:10  robertj
  56.  * Added versions of AddDescriptor that contain the GUID.
  57.  *
  58.  * Revision 1.18  2003/04/01 05:59:30  robertj
  59.  * Fixed H.501 transaction code setting members for m_common PDU part.
  60.  *
  61.  * Revision 1.17  2003/04/01 04:47:48  robertj
  62.  * Abstracted H.225 RAS transaction processing (RIP and secondary thread) in
  63.  *   server environment for use by H.501 peer elements.
  64.  *
  65.  * Revision 1.16  2003/04/01 01:17:44  robertj
  66.  * Minor changes to AccessEquest and AddDescriptor API to allow for
  67.  *   string arrays of aliases.
  68.  *
  69.  * Revision 1.15  2003/03/28 00:30:23  craigs
  70.  * Fixed problems with service relationship ordinals and better descriptor update access
  71.  *
  72.  * Revision 1.14  2003/03/27 09:24:06  craigs
  73.  * Rewritten support for descriptors and multiple templates
  74.  *
  75.  * Revision 1.13  2003/03/26 07:08:46  robertj
  76.  * Added default parameters to AddDescriptor() functions
  77.  *
  78.  * Revision 1.12  2003/03/25 07:50:11  craigs
  79.  * Added support for mutiple transports per descriptor
  80.  *
  81.  * Revision 1.11  2003/03/25 05:13:13  craigs
  82.  * More speed enhancements
  83.  *
  84.  * Revision 1.10  2003/03/25 01:58:46  robertj
  85.  * Fixed GNU warnings
  86.  *
  87.  * Revision 1.9  2003/03/25 01:47:58  craigs
  88.  * Changes for new OpenH323 H.501
  89.  *
  90.  * Revision 1.8  2003/03/20 01:51:07  robertj
  91.  * More abstraction of H.225 RAS and H.501 protocols transaction handling.
  92.  *
  93.  * Revision 1.7  2003/03/18 13:58:16  craigs
  94.  * More H.501 implementation
  95.  *
  96.  * Revision 1.6  2003/03/18 02:18:45  craigs
  97.  * Changed incorrect include
  98.  *
  99.  * Revision 1.5  2003/03/17 13:19:49  craigs
  100.  * More H501 implementation
  101.  *
  102.  * Revision 1.4  2003/03/14 06:00:42  craigs
  103.  * More updates
  104.  *
  105.  * Revision 1.3  2003/03/01 00:23:51  craigs
  106.  * New PeerElement implementation
  107.  *
  108.  * Revision 1.2  2003/02/21 07:23:18  robertj
  109.  * Fixed up some comments
  110.  *
  111.  * Revision 1.1  2003/02/21 05:28:39  craigs
  112.  * Factored out code for user with peer elements
  113.  *
  114.  */
  115.  
  116. #ifndef __OPAL_PECLIENT_H
  117. #define __OPAL_PECLIENT_H
  118.  
  119. #ifdef P_USE_PRAGMA
  120. #pragma interface
  121. #endif
  122.  
  123.  
  124. #include "h323annexg.h"
  125. #include "h323ep.h"
  126. #include "h501.h"
  127.  
  128. #include <ptlib/safecoll.h>
  129.  
  130.  
  131. class H323PeerElement;
  132.  
  133.  
  134. ////////////////////////////////////////////////////////////////
  135.  
  136. class H501Transaction : public H323Transaction
  137. {
  138.     PCLASSINFO(H501Transaction, H323Transaction);
  139.   public:
  140.     H501Transaction(
  141.       H323PeerElement & pe,
  142.       const H501PDU & pdu,
  143.       BOOL hasReject
  144.     );
  145.  
  146.     virtual H323TransactionPDU * CreateRIP(
  147.       unsigned sequenceNumber,
  148.       unsigned delay
  149.     ) const;
  150.  
  151.     virtual H235Authenticator::ValidationResult ValidatePDU() const;
  152.  
  153.     H501_MessageCommonInfo & requestCommon;
  154.     H501_MessageCommonInfo & confirmCommon;
  155.  
  156.   protected:
  157.     H323PeerElement & peerElement;
  158. };
  159.  
  160.  
  161. ////////////////////////////////////////////////////////////////
  162.  
  163. class H501ServiceRequest : public H501Transaction
  164. {
  165.     PCLASSINFO(H501ServiceRequest, H501Transaction);
  166.   public:
  167.     H501ServiceRequest(
  168.       H323PeerElement & pe,
  169.       const H501PDU & pdu
  170.     );
  171.  
  172. #if PTRACING
  173.     virtual const char * GetName() const;
  174. #endif
  175.     virtual void SetRejectReason(
  176.       unsigned reasonCode
  177.     );
  178.  
  179.     H501_ServiceRequest & srq;
  180.     H501_ServiceConfirmation & scf;
  181.     H501_ServiceRejection  & srj;
  182.  
  183.   protected:
  184.     virtual Response OnHandlePDU();
  185. };
  186.  
  187.  
  188. ////////////////////////////////////////////////////////////////
  189.  
  190. class H501DescriptorUpdate : public H501Transaction
  191. {
  192.     PCLASSINFO(H501DescriptorUpdate, H501Transaction);
  193.   public:
  194.     H501DescriptorUpdate(
  195.       H323PeerElement & pe,
  196.       const H501PDU & pdu
  197.     );
  198.  
  199. #if PTRACING
  200.     virtual const char * GetName() const;
  201. #endif
  202.     virtual void SetRejectReason(
  203.       unsigned reasonCode
  204.     );
  205.  
  206.     H501_DescriptorUpdate & du;
  207.     H501_DescriptorUpdateAck & ack;
  208.  
  209.   protected:
  210.     virtual Response OnHandlePDU();
  211. };
  212.  
  213.  
  214. ////////////////////////////////////////////////////////////////
  215.  
  216. class H501AccessRequest : public H501Transaction
  217. {
  218.     PCLASSINFO(H501AccessRequest, H501Transaction);
  219.   public:
  220.     H501AccessRequest(
  221.       H323PeerElement & pe,
  222.       const H501PDU & pdu
  223.     );
  224.  
  225. #if PTRACING
  226.     virtual const char * GetName() const;
  227. #endif
  228.     virtual void SetRejectReason(
  229.       unsigned reasonCode
  230.     );
  231.  
  232.     H501_AccessRequest & arq;
  233.     H501_AccessConfirmation & acf;
  234.     H501_AccessRejection  & arj;
  235.  
  236.   protected:
  237.     virtual Response OnHandlePDU();
  238. };
  239.  
  240.  
  241. ////////////////////////////////////////////////////////////////
  242.  
  243. class H323PeerElementDescriptor : public PSafeObject
  244. {
  245.   PCLASSINFO(H323PeerElementDescriptor, PSafeObject);
  246.   public:
  247.     H323PeerElementDescriptor(const OpalGloballyUniqueID & _descriptorID)
  248.       : descriptorID(_descriptorID), state(Dirty), creator(0)
  249.     { }
  250.  
  251.     Comparison Compare(const PObject & obj) const;
  252.  
  253.     enum Options {
  254.       Protocol_H323            = 0x0001,
  255.       Protocol_Voice           = 0x0002,
  256.       Protocol_Max             = 0x0002,
  257.       Option_WildCard          = 0x0004,
  258.       Option_SendAccessRequest = 0x0008,
  259.       Option_NotAvailable      = 0x0010,
  260.     };
  261.  
  262.     void CopyTo(H501_Descriptor & descriptor);
  263.     static BOOL CopyToAddressTemplate(H501_AddressTemplate & addressTemplates, 
  264.                                    const H225_EndpointType & ep, 
  265.                            const H225_ArrayOf_AliasAddress & aliases, 
  266.                            const H225_ArrayOf_AliasAddress & transportAddress, 
  267.                                                     unsigned options = H323PeerElementDescriptor::Protocol_H323);
  268.  
  269.     static void SetProtocolList(H501_ArrayOf_SupportedProtocols & h501Protocols, unsigned protocols);
  270.     static unsigned GetProtocolList(const H501_ArrayOf_SupportedProtocols & h501Protocols);
  271.  
  272.     OpalGloballyUniqueID descriptorID;
  273.  
  274.     BOOL ContainsNonexistent();
  275.  
  276.     enum States {
  277.       Clean,
  278.       Dirty,
  279.       Deleted
  280.     } state;
  281.  
  282.     H501_ArrayOf_AddressTemplate addressTemplates;
  283.     PString gatekeeperID;
  284.     PTime lastChanged;
  285.     POrdinalKey creator;
  286. };
  287.  
  288.  
  289. ////////////////////////////////////////////////////////////////
  290.  
  291. class H323PeerElementServiceRelationship : public PSafeObject
  292. {
  293.     PCLASSINFO(H323PeerElementServiceRelationship, PSafeObject);
  294.   public:
  295.     H323PeerElementServiceRelationship()
  296.       : ordinal(0)
  297.       { }
  298.  
  299.     H323PeerElementServiceRelationship(const OpalGloballyUniqueID & _serviceID)
  300.       : serviceID(_serviceID), ordinal(0)
  301.       { }
  302.  
  303.     Comparison Compare(const PObject & obj) const
  304.       { return serviceID.Compare(((H323PeerElementServiceRelationship&)obj).serviceID); }
  305.  
  306.     OpalGloballyUniqueID serviceID;
  307.     POrdinalKey ordinal;
  308.     H323TransportAddress peer;
  309.     PString name;
  310.     PTime createdTime;
  311.     PTime lastUpdateTime;
  312.     PTime expireTime;
  313. };
  314.  
  315.  
  316. ////////////////////////////////////////////////////////////////
  317.  
  318. /**This class embodies the an H.323 AnnexG server/client
  319.   */
  320. class H323PeerElement : public H323_AnnexG
  321. {
  322.     PCLASSINFO(H323PeerElement, H323_AnnexG);
  323.   public:
  324.   /**@name Construction */
  325.   //@{
  326.     /**Create a new client.
  327.      */
  328.     H323PeerElement(
  329.       H323EndPoint & endpoint,  /// Endpoint gatekeeper is associated with.
  330.       H323Transport * transport = NULL
  331.     );
  332.     H323PeerElement(
  333.       H323EndPoint & endpoint,  /// Endpoint gatekeeper is associated with.
  334.       const H323TransportAddress & addr
  335.     );
  336.  
  337.     /**Destroy client.
  338.      */
  339.     ~H323PeerElement();
  340.   //@}
  341.  
  342.     enum Error {
  343.       Confirmed,
  344.       Rejected,
  345.       NoResponse,
  346.       NoServiceRelationship,
  347.       ServiceRelationshipReestablished
  348.     };
  349.  
  350.     enum {
  351.       LocalServiceRelationshipOrdinal  = 0,
  352.       NoServiceRelationshipOrdinal     = 1,
  353.       RemoteServiceRelationshipOrdinal = 2
  354.     };
  355.  
  356.   /**@name Overrides from PObject */
  357.   //@{
  358.     /**Print the name of the peer element.
  359.       */
  360.     void PrintOn(
  361.       ostream & strm    /// Stream to print to.
  362.     ) const;
  363.   //@}
  364.  
  365.     PSafePtr<H323PeerElementDescriptor> GetFirstDescriptor(
  366.       PSafetyMode mode = PSafeReference
  367.     ) { return PSafePtr<H323PeerElementDescriptor>(descriptors, mode); }
  368.  
  369.     PSafePtr<H323PeerElementServiceRelationship> GetFirstLocalServiceRelationship(
  370.       PSafetyMode mode = PSafeReference
  371.     ) { return PSafePtr<H323PeerElementServiceRelationship>(localServiceRelationships, mode); }
  372.  
  373.     PSafePtr<H323PeerElementServiceRelationship> GetFirstRemoteServiceRelationship(
  374.       PSafetyMode mode = PSafeReference
  375.     ) { return PSafePtr<H323PeerElementServiceRelationship>(remoteServiceRelationships, mode); }
  376.  
  377.     void SetLocalName(const PString & name);
  378.     PString GetLocalName() const;
  379.  
  380.     void SetDomainName(const PString & name);
  381.     PString GetDomainName() const;
  382.  
  383.     /*********************************************************
  384.       functions to establish and break service relationships
  385.       */
  386.  
  387.     /**Send a service request
  388.      */
  389.     BOOL SetOnlyServiceRelationship(const PString & peer, BOOL keepTrying = TRUE);
  390.     BOOL AddServiceRelationship(const H323TransportAddress & peer, BOOL keepTrying = TRUE);
  391.     BOOL AddServiceRelationship(const H323TransportAddress & peer, OpalGloballyUniqueID & serviceID, BOOL keepTrying = TRUE);
  392.     BOOL RemoveServiceRelationship(const OpalGloballyUniqueID & serviceID, int reason = H501_ServiceReleaseReason::e_terminated);
  393.     BOOL RemoveServiceRelationship(const H323TransportAddress & peer, int reason = H501_ServiceReleaseReason::e_terminated);
  394.     BOOL RemoveAllServiceRelationships();
  395.  
  396.     Error ServiceRequestByAddr(const H323TransportAddress & peer);
  397.     Error ServiceRequestByAddr(const H323TransportAddress & peer, OpalGloballyUniqueID & serviceID);
  398.     Error ServiceRequestByID(OpalGloballyUniqueID & serviceID);
  399.  
  400.     /**Send a service release
  401.      */
  402.     BOOL ServiceRelease(const OpalGloballyUniqueID & serviceID, unsigned reason);
  403.  
  404.     /*********************************************************
  405.       functions to manipulate the local descriptor table
  406.      */
  407.  
  408.     BOOL AddDescriptor(
  409.       const OpalGloballyUniqueID & descriptorID,
  410.       const PStringArray & aliases, 
  411.       const H323TransportAddressArray & transportAddrs, 
  412.       unsigned options = H323PeerElementDescriptor::Protocol_H323, 
  413.       BOOL now = FALSE
  414.     );
  415.  
  416.     BOOL AddDescriptor(
  417.       const OpalGloballyUniqueID & descriptorID,
  418.       const H225_ArrayOf_AliasAddress & aliases, 
  419.       const H323TransportAddressArray & transportAddrs, 
  420.       unsigned options = H323PeerElementDescriptor::Protocol_H323, 
  421.       BOOL now = FALSE
  422.     );
  423.  
  424.     BOOL AddDescriptor(
  425.       const OpalGloballyUniqueID & descriptorID,
  426.       const H225_ArrayOf_AliasAddress & aliases, 
  427.       const H225_ArrayOf_AliasAddress & transportAddr, 
  428.       unsigned options = H323PeerElementDescriptor::Protocol_H323, 
  429.       BOOL now = FALSE
  430.     );
  431.  
  432.     BOOL AddDescriptor(
  433.       const OpalGloballyUniqueID & descriptorID,
  434.       const POrdinalKey & creator,
  435.       const H225_ArrayOf_AliasAddress & alias, 
  436.       const H225_ArrayOf_AliasAddress & transportAddresses,
  437.       unsigned options = H323PeerElementDescriptor::Protocol_H323,
  438.       BOOL now = FALSE
  439.     );
  440.  
  441.     BOOL AddDescriptor(
  442.       const OpalGloballyUniqueID & descriptorID,
  443.       const POrdinalKey & creator,
  444.       const H501_ArrayOf_AddressTemplate & addressTemplates,
  445.       const PTime & updateTime,
  446.       BOOL now = FALSE
  447.     );
  448.  
  449.     /**Remove a descriptor from the local table
  450.      */
  451.     BOOL DeleteDescriptor(const PString & alias, BOOL now = FALSE);
  452.     BOOL DeleteDescriptor(const H225_AliasAddress & alias, BOOL now = FALSE);
  453.     BOOL DeleteDescriptor(const OpalGloballyUniqueID & descriptorID, BOOL now = FALSE);
  454.  
  455.     /** Request access to an alias
  456.     */
  457.     BOOL AccessRequest(
  458.       const PString & searchAlias,
  459.       PStringArray & destAliases, 
  460.       H323TransportAddress & transportAddress,
  461.       unsigned options = H323PeerElementDescriptor::Protocol_H323
  462.     );
  463.  
  464.     BOOL AccessRequest(
  465.       const PString & searchAlias,
  466.       H225_ArrayOf_AliasAddress & destAliases,
  467.       H323TransportAddress & transportAddress,
  468.       unsigned options = H323PeerElementDescriptor::Protocol_H323
  469.     );
  470.  
  471.     BOOL AccessRequest(
  472.       const H225_AliasAddress & searchAlias,
  473.       H225_ArrayOf_AliasAddress & destAliases,
  474.       H323TransportAddress & transportAddress,
  475.       unsigned options = H323PeerElementDescriptor::Protocol_H323
  476.     );
  477.  
  478.     BOOL AccessRequest(
  479.       const H225_AliasAddress & alias,
  480.       H225_ArrayOf_AliasAddress & destAliases,
  481.       H225_AliasAddress & transportAddress,
  482.       unsigned options = H323PeerElementDescriptor::Protocol_H323
  483.     );
  484.  
  485.     /*********************************************************
  486.       functions to send send descriptors to another peer element
  487.       */
  488.     BOOL UpdateDescriptor(H323PeerElementDescriptor * descriptor);
  489.     BOOL UpdateDescriptor(H323PeerElementDescriptor * descriptor, H501_UpdateInformation_updateType::Choices updateType);
  490.  
  491.  
  492.     Error SendUpdateDescriptorByID(const OpalGloballyUniqueID & serviceID, 
  493.                                     H323PeerElementDescriptor * descriptor, 
  494.                      H501_UpdateInformation_updateType::Choices updateType);
  495.  
  496.     Error SendUpdateDescriptorByAddr(const H323TransportAddress & peer, 
  497.                                       H323PeerElementDescriptor * descriptor, 
  498.                        H501_UpdateInformation_updateType::Choices updateType);
  499.  
  500.     Error SendAccessRequestByID(const OpalGloballyUniqueID & peerID, 
  501.                                                    H501PDU & request, 
  502.                                                    H501PDU & confirmPDU);
  503.  
  504.     Error SendAccessRequestByAddr(const H323TransportAddress & peerAddr, 
  505.                                                      H501PDU & request, 
  506.                                                      H501PDU & confirmPDU);
  507.  
  508.  
  509.     /*********************************************************
  510.       low level request functions
  511.       */
  512.  
  513.     BOOL MakeRequest(H323_AnnexG::Request & request);
  514.  
  515.     virtual void OnAddServiceRelationship(const H323TransportAddress &) { }
  516.     virtual void OnRemoveServiceRelationship(const H323TransportAddress &) { }
  517.  
  518.     virtual void OnNewDescriptor(const H323PeerElementDescriptor &) { }
  519.     virtual void OnUpdateDescriptor(const H323PeerElementDescriptor &) { }
  520.     virtual void OnRemoveDescriptor(const H323PeerElementDescriptor &) { }
  521.  
  522.     virtual H323Transaction::Response OnServiceRequest(H501ServiceRequest & info);
  523.     virtual H323Transaction::Response OnDescriptorUpdate(H501DescriptorUpdate & info);
  524.     virtual H323Transaction::Response OnAccessRequest(H501AccessRequest & info);
  525.  
  526.     BOOL OnReceiveServiceRequest(const H501PDU & pdu, const H501_ServiceRequest & pduBody);
  527.     BOOL OnReceiveServiceConfirmation(const H501PDU & pdu, const H501_ServiceConfirmation & pduBody);
  528.  
  529.     BOOL OnReceiveDescriptorUpdate(const H501PDU & pdu, const H501_DescriptorUpdate & pduBody);
  530.     BOOL OnReceiveDescriptorUpdateACK(const H501PDU & pdu, const H501_DescriptorUpdateAck & pduBody);
  531.  
  532.     BOOL OnReceiveAccessRequest(const H501PDU & pdu, const H501_AccessRequest & pduBody);
  533.     BOOL OnReceiveAccessConfirmation (const H501PDU & pdu, const H501_AccessConfirmation & pduBody);
  534.     BOOL OnReceiveAccessRejection(const H501PDU & pdu,     const H501_AccessRejection & pduBody);
  535.  
  536.     class AliasKey : public H225_AliasAddress
  537.     {
  538.       public:
  539.         AliasKey(const H225_AliasAddress & _alias, const OpalGloballyUniqueID & _id, PINDEX _pos, BOOL _wild = FALSE)
  540.           : H225_AliasAddress(_alias), id(_id), pos(_pos), wild(_wild)
  541.         { }
  542.  
  543.         OpalGloballyUniqueID id;
  544.         PINDEX pos;
  545.         BOOL wild;
  546.     };
  547.  
  548.   protected:
  549.     void Construct();
  550.  
  551.     Error SendUpdateDescriptor(              H501PDU & pdu,  
  552.                           const H323TransportAddress & peer, 
  553.                            H323PeerElementDescriptor * descriptor,
  554.             H501_UpdateInformation_updateType::Choices updateType);
  555.  
  556.     BOOL OnRemoteServiceRelationshipDisappeared(OpalGloballyUniqueID & serviceID, const H323TransportAddress & peer);
  557.     void InternalRemoveServiceRelationship(const H323TransportAddress & peer);
  558.     H323Transaction::Response HandleServiceRequest(H501ServiceRequest & info);
  559.  
  560.     virtual H323PeerElementDescriptor          * CreateDescriptor(const OpalGloballyUniqueID & descriptorID);
  561.     virtual H323PeerElementServiceRelationship * CreateServiceRelationship();
  562.     virtual AliasKey                           * CreateAliasKey(const H225_AliasAddress & alias, const OpalGloballyUniqueID & id, PINDEX pos, BOOL wild = FALSE);
  563.  
  564.     void RemoveDescriptorInformation(const H501_ArrayOf_AddressTemplate & addressTemplates);
  565.  
  566.     PDECLARE_NOTIFIER(PThread, H323PeerElement, MonitorMain);
  567.     PDECLARE_NOTIFIER(PThread, H323PeerElement, UpdateAllDescriptors);
  568.     PDECLARE_NOTIFIER(PTimer, H323PeerElement, TickleMonitor);
  569.  
  570.     PMutex localNameMutex;
  571.     PString localIdentifier;
  572.     PString domainName;
  573.  
  574.     PSemaphore requestMutex;
  575.     PThread  * monitor;
  576.     BOOL       monitorStop;
  577.     PSyncPoint monitorTickle;
  578.  
  579.     PMutex basePeerOrdinalMutex;
  580.     PINDEX basePeerOrdinal;
  581.  
  582.     // structures needed to maintain local service relationships (for which we receive a ServiceRequest)
  583.     PSafeSortedList<H323PeerElementServiceRelationship> localServiceRelationships;
  584.     PMutex localPeerListMutex;
  585.     POrdinalSet localServiceOrdinals;
  586.  
  587.     // structures needed to maintain remote service relationships (for which we send a ServiceRequest)
  588.     PMutex remotePeerListMutex;
  589.     PSafeSortedList<H323PeerElementServiceRelationship> remoteServiceRelationships;
  590.     PStringToString remotePeerAddrToServiceID;
  591.     PDICTIONARY(StringToOrdinalKey, PString, POrdinalKey);
  592.     StringToOrdinalKey remotePeerAddrToOrdinalKey;
  593.  
  594.     PSafeSortedList<H323PeerElementDescriptor> descriptors;
  595.  
  596.     PSORTED_LIST(AliasKeyList, H225_AliasAddress);
  597.  
  598.     PMutex aliasMutex;
  599.     AliasKeyList transportAddressToDescriptorID;
  600.     AliasKeyList specificAliasToDescriptorID;
  601.     AliasKeyList wildcardAliasToDescriptorID;
  602. };
  603.  
  604.  
  605. #endif // __OPAL_PECLIENT_H
  606.  
  607.  
  608. /////////////////////////////////////////////////////////////////////////////
  609.