00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef OPAL_H323_GKCLIENT_H
00035 #define OPAL_H323_GKCLIENT_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <opal/buildopts.h>
00042
00043 #if OPAL_H323
00044
00045 #include <h323/h225ras.h>
00046 #include <h323/h235auth.h>
00047
00048 #if OPAL_H460
00049 class H460_FeatureSet;
00050 #endif
00051
00052 class H323Connection;
00053 class H225_ArrayOf_AliasAddress;
00054 class H225_H323_UU_PDU;
00055 class H225_AlternateGK;
00056 class H225_ArrayOf_AlternateGK;
00057 class H225_ArrayOf_ServiceControlSession;
00058 class H225_FeatureSet;
00059
00060
00062
00065 class H323Gatekeeper : public H225_RAS
00066 {
00067 PCLASSINFO(H323Gatekeeper, H225_RAS);
00068 public:
00073 H323Gatekeeper(
00074 H323EndPoint & endpoint,
00075 H323Transport * transport
00076 );
00077
00080 ~H323Gatekeeper();
00082
00085 virtual PBoolean WriteTo(
00086 H323TransactionPDU & pdu,
00087 const H323TransportAddressArray & addresses,
00088 PBoolean callback = PTrue
00089 );
00091
00094 PBoolean OnReceiveGatekeeperConfirm(const H225_GatekeeperConfirm & gcf);
00095 PBoolean OnReceiveGatekeeperReject(const H225_GatekeeperReject & grj);
00096 PBoolean OnReceiveRegistrationConfirm(const H225_RegistrationConfirm & rcf);
00097 PBoolean OnReceiveRegistrationReject(const H225_RegistrationReject & rrj);
00098 PBoolean OnReceiveUnregistrationRequest(const H225_UnregistrationRequest & urq);
00099 PBoolean OnReceiveUnregistrationConfirm(const H225_UnregistrationConfirm & ucf);
00100 PBoolean OnReceiveUnregistrationReject(const H225_UnregistrationReject & urj);
00101 PBoolean OnReceiveAdmissionConfirm(const H225_AdmissionConfirm & acf);
00102 PBoolean OnReceiveAdmissionReject(const H225_AdmissionReject & arj);
00103 PBoolean OnReceiveDisengageRequest(const H225_DisengageRequest & drq);
00104 PBoolean OnReceiveBandwidthConfirm(const H225_BandwidthConfirm & bcf);
00105 PBoolean OnReceiveBandwidthRequest(const H225_BandwidthRequest & brq);
00106 PBoolean OnReceiveInfoRequest(const H225_InfoRequest & irq);
00107 PBoolean OnReceiveServiceControlIndication(const H225_ServiceControlIndication &);
00108 void OnSendGatekeeperRequest(H225_GatekeeperRequest & grq);
00109 void OnSendAdmissionRequest(H225_AdmissionRequest & arq);
00110 PBoolean OnSendFeatureSet(unsigned, H225_FeatureSet & features) const;
00111 void OnReceiveFeatureSet(unsigned, const H225_FeatureSet & features) const;
00113
00118 PBoolean DiscoverAny();
00119
00124 PBoolean DiscoverByName(
00125 const PString & identifier
00126 );
00127
00132 PBoolean DiscoverByAddress(
00133 const H323TransportAddress & address
00134 );
00135
00139 PBoolean DiscoverByNameAndAddress(
00140 const PString & identifier,
00141 const H323TransportAddress & address
00142 );
00143
00146 PBoolean RegistrationRequest(
00147 PBoolean autoReregister = PTrue,
00148 PBoolean didGkDiscovery = PFalse
00149 );
00150
00153 PBoolean UnregistrationRequest(
00154 int reason
00155 );
00156
00159 PBoolean LocationRequest(
00160 const PString & alias,
00161 H323TransportAddress & address
00162 );
00163
00166 PBoolean LocationRequest(
00167 const PStringList & aliases,
00168 H323TransportAddress & address
00169 );
00170
00171 struct AdmissionResponse {
00172 AdmissionResponse();
00173
00174 unsigned rejectReason;
00175
00176 PBoolean gatekeeperRouted;
00177 PINDEX endpointCount;
00178 H323TransportAddress * transportAddress;
00179 PBYTEArray * accessTokenData;
00180
00181 H225_ArrayOf_AliasAddress * aliasAddresses;
00182 H225_ArrayOf_AliasAddress * destExtraCallInfo;
00183 };
00184
00187 PBoolean AdmissionRequest(
00188 H323Connection & connection,
00189 AdmissionResponse & response,
00190 PBoolean ignorePreGrantedARQ = PFalse
00191 );
00192
00195 PBoolean DisengageRequest(
00196 const H323Connection & connection,
00197 unsigned reason
00198 );
00199
00202 PBoolean BandwidthRequest(
00203 H323Connection & connection,
00204 unsigned requestedBandwidth
00205 );
00206
00209 void InfoRequestResponse();
00210
00213 void InfoRequestResponse(
00214 const H323Connection & connection
00215 );
00216
00219 void InfoRequestResponse(
00220 const H323Connection & connection,
00221 const H225_H323_UU_PDU & pdu,
00222 PBoolean sent
00223 );
00224
00227 virtual void OnServiceControlSessions(
00228 const H225_ArrayOf_ServiceControlSession & serviceControl,
00229 H323Connection * connection
00230 );
00231
00234 virtual void OnTerminalAliasChanged();
00236
00241 PBoolean IsDiscoveryComplete() const { return discoveryComplete; }
00242
00245 PBoolean IsRegistered() const { return registrationFailReason == RegistrationSuccessful; }
00246
00247 enum RegistrationFailReasons {
00248 RegistrationSuccessful,
00249 UnregisteredLocally,
00250 UnregisteredByGatekeeper,
00251 GatekeeperLostRegistration,
00252 InvalidListener,
00253 DuplicateAlias,
00254 SecurityDenied,
00255 TransportError,
00256 NumRegistrationFailReasons,
00257 RegistrationRejectReasonMask = 0x8000
00258 };
00261 RegistrationFailReasons GetRegistrationFailReason() const { return registrationFailReason; }
00262
00271 PString GetName() const;
00272
00275 const PString & GetEndpointIdentifier() const { return endpointIdentifier; }
00276
00281 void SetPassword(
00282 const PString & password,
00283 const PString & username = PString()
00284 );
00285
00286
00287
00288
00289 H323TransportAddress GetGatekeeperRouteAddress() const
00290 { return gkRouteAddress; }
00292
00293
00294 protected:
00295 bool StartGatekeeper(const H323TransportAddress & address);
00296 virtual bool DiscoverGatekeeper();
00297 unsigned SetupGatekeeperRequest(H323RasPDU & request);
00298
00299 void Connect(const H323TransportAddress & address, const PString & gatekeeperIdentifier);
00300 PDECLARE_NOTIFIER(PThread, H323Gatekeeper, MonitorMain);
00301 PDECLARE_NOTIFIER(PTimer, H323Gatekeeper, TickleMonitor);
00302 void RegistrationTimeToLive();
00303
00304 void SetInfoRequestRate(
00305 const PTimeInterval & rate
00306 );
00307 void ClearInfoRequestRate();
00308 H225_InfoRequestResponse & BuildInfoRequestResponse(
00309 H323RasPDU & response,
00310 unsigned seqNum
00311 );
00312 PBoolean SendUnsolicitedIRR(
00313 H225_InfoRequestResponse & irr,
00314 H323RasPDU & response
00315 );
00316
00317 void SetAlternates(
00318 const H225_ArrayOf_AlternateGK & alts,
00319 PBoolean permanent
00320 );
00321
00322 virtual PBoolean MakeRequest(
00323 Request & request
00324 );
00325 PBoolean MakeRequestWithReregister(
00326 Request & request,
00327 unsigned unregisteredTag
00328 );
00329
00330 virtual H323Transport * CreateTransport(PIPSocket::Address bindng = PIPSocket::GetDefaultIpAny(), WORD port = 0, PBoolean reuseAddr = PFalse);
00331
00332
00333 void OnAddInterface(const PIPSocket::InterfaceEntry & entry, PINDEX priority);
00334 void OnRemoveInterface(const PIPSocket::InterfaceEntry & entry, PINDEX priority);
00335 void UpdateConnectionStatus();
00336
00337
00338
00339 PBoolean discoveryComplete;
00340 PString endpointIdentifier;
00341 RegistrationFailReasons registrationFailReason;
00342
00343 enum {
00344 HighPriority = 80,
00345 LowPriority = 40,
00346 };
00347 class InterfaceMonitor : public PInterfaceMonitorClient
00348 {
00349 PCLASSINFO(InterfaceMonitor, PInterfaceMonitorClient);
00350
00351 public:
00352 InterfaceMonitor(H323Gatekeeper & gk, PINDEX priority);
00353
00354 protected:
00355 virtual void OnAddInterface(const PIPSocket::InterfaceEntry & entry);
00356 virtual void OnRemoveInterface(const PIPSocket::InterfaceEntry & entry);
00357
00358 H323Gatekeeper & gk;
00359 };
00360 InterfaceMonitor highPriorityMonitor;
00361 InterfaceMonitor lowPriorityMonitor;
00362
00363 class AlternateInfo : public PObject {
00364 PCLASSINFO(AlternateInfo, PObject);
00365 public:
00366 AlternateInfo(H225_AlternateGK & alt);
00367 ~AlternateInfo();
00368 Comparison Compare(const PObject & obj);
00369 void PrintOn(ostream & strm) const;
00370
00371 H323TransportAddress rasAddress;
00372 PString gatekeeperIdentifier;
00373 unsigned priority;
00374 enum {
00375 NoRegistrationNeeded,
00376 NeedToRegister,
00377 Register,
00378 IsRegistered,
00379 RegistrationFailed
00380 } registrationState;
00381
00382 private:
00383
00384 AlternateInfo(const AlternateInfo &other): PObject(other) { }
00385 AlternateInfo & operator=(const AlternateInfo &) { return *this; }
00386 };
00387 PSortedList<AlternateInfo> alternates;
00388 PBoolean alternatePermanent;
00389 PSemaphore requestMutex;
00390 H235Authenticators authenticators;
00391
00392 enum {
00393 RequireARQ,
00394 PregrantARQ,
00395 PreGkRoutedARQ
00396 } pregrantMakeCall, pregrantAnswerCall;
00397 H323TransportAddress gkRouteAddress;
00398
00399
00400 PBoolean autoReregister;
00401 PBoolean reregisterNow;
00402 PTimer timeToLive;
00403 PBoolean requiresDiscovery;
00404 PTimer infoRequestRate;
00405 PBoolean willRespondToIRR;
00406 PThread * monitor;
00407 PBoolean monitorStop;
00408 PSyncPoint monitorTickle;
00409
00410 PDictionary<POrdinalKey, H323ServiceControlSession> serviceControlSessions;
00411
00412 #if OPAL_H460
00413 H460_FeatureSet * features;
00414 #endif
00415
00416 };
00417
00418
00419 PLIST(H323GatekeeperList, H323Gatekeeper);
00420
00421
00422 #endif // OPAL_H323
00423
00424 #endif // OPAL_H323_GKCLIENT_H
00425
00426