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
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215 #ifndef __OPAL_GKCLIENT_H
00216 #define __OPAL_GKCLIENT_H
00217
00218
00219 #include "h225ras.h"
00220 #include "h235auth.h"
00221
00222 #ifdef P_USE_PRAGMA
00223 #pragma interface
00224 #endif
00225
00226
00227 class H225_ArrayOf_AliasAddress;
00228 class H225_H323_UU_PDU;
00229 class H225_AlternateGK;
00230 class H225_ArrayOf_AlternateGK;
00231 class H225_ArrayOf_ServiceControlSession;
00232
00233
00235
00238 class H323Gatekeeper : public H225_RAS
00239 {
00240 PCLASSINFO(H323Gatekeeper, H225_RAS);
00241 public:
00246 H323Gatekeeper(
00247 H323EndPoint & endpoint,
00248 H323Transport * transport
00249 );
00250
00253 ~H323Gatekeeper();
00255
00258 BOOL OnReceiveGatekeeperConfirm(const H225_GatekeeperConfirm & gcf);
00259 BOOL OnReceiveGatekeeperReject(const H225_GatekeeperReject & grj);
00260 BOOL OnReceiveRegistrationConfirm(const H225_RegistrationConfirm & rcf);
00261 BOOL OnReceiveRegistrationReject(const H225_RegistrationReject & rrj);
00262 BOOL OnReceiveUnregistrationRequest(const H225_UnregistrationRequest & urq);
00263 BOOL OnReceiveUnregistrationConfirm(const H225_UnregistrationConfirm & ucf);
00264 BOOL OnReceiveUnregistrationReject(const H225_UnregistrationReject & urj);
00265 BOOL OnReceiveAdmissionConfirm(const H225_AdmissionConfirm & acf);
00266 BOOL OnReceiveAdmissionReject(const H225_AdmissionReject & arj);
00267 BOOL OnReceiveDisengageRequest(const H225_DisengageRequest & drq);
00268 BOOL OnReceiveBandwidthConfirm(const H225_BandwidthConfirm & bcf);
00269 BOOL OnReceiveBandwidthRequest(const H225_BandwidthRequest & brq);
00270 BOOL OnReceiveInfoRequest(const H225_InfoRequest & irq);
00271 BOOL OnReceiveServiceControlIndication(const H225_ServiceControlIndication &);
00272 void OnSendGatekeeperRequest(H225_GatekeeperRequest & grq);
00273 void OnSendAdmissionRequest(H225_AdmissionRequest & arq);
00274 BOOL OnSendFeatureSet(unsigned, H225_FeatureSet & features) const;
00275 void OnReceiveFeatureSet(unsigned, const H225_FeatureSet & features) const;
00277
00282 BOOL DiscoverAny();
00283
00288 BOOL DiscoverByName(
00289 const PString & identifier
00290 );
00291
00296 BOOL DiscoverByAddress(
00297 const H323TransportAddress & address
00298 );
00299
00303 BOOL DiscoverByNameAndAddress(
00304 const PString & identifier,
00305 const H323TransportAddress & address
00306 );
00307
00310 BOOL RegistrationRequest(
00311 BOOL autoReregister = TRUE
00312 );
00313
00316 BOOL UnregistrationRequest(
00317 int reason
00318 );
00319
00322 BOOL LocationRequest(
00323 const PString & alias,
00324 H323TransportAddress & address
00325 );
00326
00329 BOOL LocationRequest(
00330 const PStringList & aliases,
00331 H323TransportAddress & address
00332 );
00333
00334 struct AdmissionResponse {
00335 AdmissionResponse();
00336
00337 unsigned rejectReason;
00338
00339 BOOL gatekeeperRouted;
00340 PINDEX endpointCount;
00341 H323TransportAddress * transportAddress;
00342 PBYTEArray * accessTokenData;
00343
00344 H225_ArrayOf_AliasAddress * aliasAddresses;
00345 H225_ArrayOf_AliasAddress * destExtraCallInfo;
00346 };
00347
00350 BOOL AdmissionRequest(
00351 H323Connection & connection,
00352 AdmissionResponse & response,
00353 BOOL ignorePreGrantedARQ = FALSE
00354 );
00355
00358 BOOL DisengageRequest(
00359 const H323Connection & connection,
00360 unsigned reason
00361 );
00362
00365 BOOL BandwidthRequest(
00366 H323Connection & connection,
00367 unsigned requestedBandwidth
00368 );
00369
00372 void InfoRequestResponse();
00373
00376 void InfoRequestResponse(
00377 const H323Connection & connection
00378 );
00379
00382 void InfoRequestResponse(
00383 const H323Connection & connection,
00384 const H225_H323_UU_PDU & pdu,
00385 BOOL sent
00386 );
00387
00390 virtual void OnServiceControlSessions(
00391 const H225_ArrayOf_ServiceControlSession & serviceControl,
00392 H323Connection * connection
00393 );
00395
00400 BOOL IsDiscoveryComplete() const { return discoveryComplete; }
00401
00404 BOOL IsRegistered() const { return registrationFailReason == RegistrationSuccessful; }
00405
00406 enum RegistrationFailReasons {
00407 RegistrationSuccessful,
00408 UnregisteredLocally,
00409 UnregisteredByGatekeeper,
00410 GatekeeperLostRegistration,
00411 InvalidListener,
00412 DuplicateAlias,
00413 SecurityDenied,
00414 TransportError,
00415 NumRegistrationFailReasons,
00416 RegistrationRejectReasonMask = 0x8000
00417 };
00420 RegistrationFailReasons GetRegistrationFailReason() const { return registrationFailReason; }
00421
00430 PString GetName() const;
00431
00434 const PString & GetEndpointIdentifier() const { return endpointIdentifier; }
00435
00440 void SetPassword(
00441 const PString & password,
00442 const PString & username = PString()
00443 );
00444
00445
00446
00447
00448 H323TransportAddress GetGatekeeperRouteAddress() const
00449 { return gkRouteAddress; }
00451
00452
00453 protected:
00454 BOOL StartDiscovery(const H323TransportAddress & address);
00455 unsigned SetupGatekeeperRequest(H323RasPDU & request);
00456
00457 void Connect(const H323TransportAddress & address, const PString & gatekeeperIdentifier);
00458 PDECLARE_NOTIFIER(PThread, H323Gatekeeper, MonitorMain);
00459 PDECLARE_NOTIFIER(PTimer, H323Gatekeeper, TickleMonitor);
00460 void RegistrationTimeToLive();
00461
00462 void SetInfoRequestRate(
00463 const PTimeInterval & rate
00464 );
00465 void ClearInfoRequestRate();
00466 H225_InfoRequestResponse & BuildInfoRequestResponse(
00467 H323RasPDU & response,
00468 unsigned seqNum
00469 );
00470 BOOL SendUnsolicitedIRR(
00471 H225_InfoRequestResponse & irr,
00472 H323RasPDU & response
00473 );
00474
00475 void SetAlternates(
00476 const H225_ArrayOf_AlternateGK & alts,
00477 BOOL permanent
00478 );
00479
00480 virtual BOOL MakeRequest(
00481 Request & request
00482 );
00483 BOOL MakeRequestWithReregister(
00484 Request & request,
00485 unsigned unregisteredTag
00486 );
00487
00488
00489
00490 BOOL discoveryComplete;
00491 PString endpointIdentifier;
00492 RegistrationFailReasons registrationFailReason;
00493
00494 class AlternateInfo : public PObject {
00495 PCLASSINFO(AlternateInfo, PObject);
00496 public:
00497 AlternateInfo(H225_AlternateGK & alt);
00498 ~AlternateInfo();
00499 Comparison Compare(const PObject & obj);
00500 void PrintOn(ostream & strm) const;
00501
00502 H323TransportAddress rasAddress;
00503 PString gatekeeperIdentifier;
00504 unsigned priority;
00505 enum {
00506 NoRegistrationNeeded,
00507 NeedToRegister,
00508 Register,
00509 IsRegistered,
00510 RegistrationFailed
00511 } registrationState;
00512
00513 private:
00514
00515 AlternateInfo(const AlternateInfo &) { }
00516 AlternateInfo & operator=(const AlternateInfo &) { return *this; }
00517 };
00518 PSortedList<AlternateInfo> alternates;
00519 BOOL alternatePermanent;
00520 PSemaphore requestMutex;
00521 H235Authenticators authenticators;
00522
00523 enum {
00524 RequireARQ,
00525 PregrantARQ,
00526 PreGkRoutedARQ
00527 } pregrantMakeCall, pregrantAnswerCall;
00528 H323TransportAddress gkRouteAddress;
00529
00530
00531 BOOL autoReregister;
00532 BOOL reregisterNow;
00533 PTimer timeToLive;
00534 BOOL requiresDiscovery;
00535 PTimer infoRequestRate;
00536 BOOL willRespondToIRR;
00537 PThread * monitor;
00538 BOOL monitorStop;
00539 PSyncPoint monitorTickle;
00540
00541 PDictionary<POrdinalKey, H323ServiceControlSession> serviceControlSessions;
00542 };
00543
00544
00545 PLIST(H323GatekeeperList, H323Gatekeeper);
00546
00547
00548
00549 #endif // __OPAL_GKCLIENT_H
00550
00551