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_H323PDU_H
00035 #define OPAL_H323_H323PDU_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 <ptlib/sockets.h>
00046 #include <h323/h323con.h>
00047 #include <h323/transaddr.h>
00048 #include <h323/q931.h>
00049 #include <h323/h235auth.h>
00050 #include <h323/h323trans.h>
00051 #include <rtp/rtp.h>
00052 #include <asn/h225.h>
00053 #include <asn/h245.h>
00054
00055
00056 class H323Connection;
00057 class H323TransportAddress;
00058 class H225_RAS;
00059 class OpalGloballyUniqueID;
00060
00061
00062 #define H225_PROTOCOL_VERSION 6
00063 #define H245_PROTOCOL_VERSION 13
00064
00065
00067
00070 class H323SignalPDU : public H225_H323_UserInformation
00071 {
00072 PCLASSINFO(H323SignalPDU, H225_H323_UserInformation);
00073
00074 public:
00079 H323SignalPDU();
00080
00083 H225_Setup_UUIE & BuildSetup(
00084 const H323Connection & connection,
00085 const H323TransportAddress & destAddr
00086 );
00087
00090 H225_CallProceeding_UUIE & BuildCallProceeding(
00091 const H323Connection & connection
00092 );
00093
00096 H225_Connect_UUIE & BuildConnect(
00097 const H323Connection & connection
00098 );
00099
00102 H225_Connect_UUIE & BuildConnect(
00103 const H323Connection & connection,
00104 const PIPSocket::Address & h245Address,
00105 WORD port
00106 );
00107
00110 H225_Alerting_UUIE & BuildAlerting(
00111 const H323Connection & connection
00112 );
00113
00116 H225_Information_UUIE & BuildInformation(
00117 const H323Connection & connection
00118 );
00119
00122 H225_ReleaseComplete_UUIE & BuildReleaseComplete(
00123 const H323Connection & connection
00124 );
00125
00128 H225_Facility_UUIE * BuildFacility(
00129 const H323Connection & connection,
00130 bool empty,
00131 unsigned reason = H225_FacilityReason::e_undefinedReason
00132 );
00133
00136 H225_Progress_UUIE & BuildProgress(
00137 const H323Connection & connection
00138 );
00139
00142 H225_Status_UUIE & BuildStatus(
00143 const H323Connection & connection
00144 );
00145
00148 H225_StatusInquiry_UUIE & BuildStatusInquiry(
00149 const H323Connection & connection
00150 );
00151
00154 H225_SetupAcknowledge_UUIE & BuildSetupAcknowledge(
00155 const H323Connection & connection
00156 );
00157
00160 H225_Notify_UUIE & BuildNotify(
00161 const H323Connection & connection
00162 );
00164
00165
00170 void PrintOn(
00171 ostream & strm
00172 ) const;
00173
00176 PBoolean Read(
00177 H323Transport & transport
00178 );
00179
00182 PBoolean Write(
00183 H323Transport & transport
00184 );
00185
00188 const Q931 & GetQ931() const { return q931pdu; }
00189
00192 Q931 & GetQ931() { return q931pdu; }
00193
00196 void SetQ931(const Q931 & _q931pdu) { q931pdu = _q931pdu; }
00197
00202 void BuildQ931();
00203
00208 PString GetSourceAliases(
00209 const H323Transport * transport = NULL
00210 ) const;
00211
00216 PString GetDestinationAlias(
00217 PBoolean firstAliasOnly = PFalse
00218 ) const;
00219
00224 PBoolean GetSourceE164(
00225 PString & number
00226 ) const;
00227
00232 PBoolean GetDestinationE164(
00233 PString & number
00234 ) const;
00235
00239 unsigned GetDistinctiveRing() const;
00240
00245 void SetQ931Fields(
00246 const H323Connection & connection,
00247 PBoolean insertPartyNumbers = PFalse,
00248 unsigned plan = 1,
00249 unsigned type = 0,
00250 int presentation = -1,
00251 int screening = -1
00252 );
00253
00254 #ifdef OPAL_H460
00255
00259 void InsertH460Setup(
00260 const H323Connection & connection,
00261 H225_Setup_UUIE & setup
00262 );
00263 #endif
00264
00265 protected:
00266
00267
00268 Q931 q931pdu;
00269 };
00270
00271
00273
00276 class H323ControlPDU : public H245_MultimediaSystemControlMessage
00277 {
00278 PCLASSINFO(H323ControlPDU, H245_MultimediaSystemControlMessage);
00279
00280 public:
00281 H245_RequestMessage & Build(H245_RequestMessage ::Choices request);
00282 H245_ResponseMessage & Build(H245_ResponseMessage ::Choices response);
00283 H245_CommandMessage & Build(H245_CommandMessage ::Choices command);
00284 H245_IndicationMessage & Build(H245_IndicationMessage::Choices indication);
00285
00286 H245_MasterSlaveDetermination & BuildMasterSlaveDetermination(
00287 unsigned terminalType,
00288 unsigned statusDeterminationNumber
00289 );
00290 H245_MasterSlaveDeterminationAck & BuildMasterSlaveDeterminationAck(
00291 PBoolean isMaster
00292 );
00293 H245_MasterSlaveDeterminationReject & BuildMasterSlaveDeterminationReject(
00294 unsigned cause
00295 );
00296
00297 H245_TerminalCapabilitySet & BuildTerminalCapabilitySet(
00298 const H323Connection & connection,
00299 unsigned sequenceNumber,
00300 PBoolean empty
00301 );
00302 H245_TerminalCapabilitySetAck & BuildTerminalCapabilitySetAck(
00303 unsigned sequenceNumber
00304 );
00305 H245_TerminalCapabilitySetReject & BuildTerminalCapabilitySetReject(
00306 unsigned sequenceNumber,
00307 unsigned cause
00308 );
00309
00310 H245_OpenLogicalChannel & BuildOpenLogicalChannel(
00311 unsigned forwardLogicalChannelNumber
00312 );
00313 H245_RequestChannelClose & BuildRequestChannelClose(
00314 unsigned channelNumber,
00315 unsigned reason
00316 );
00317 H245_CloseLogicalChannel & BuildCloseLogicalChannel(
00318 unsigned channelNumber
00319 );
00320 H245_OpenLogicalChannelAck & BuildOpenLogicalChannelAck(
00321 unsigned channelNumber
00322 );
00323 H245_OpenLogicalChannelReject & BuildOpenLogicalChannelReject(
00324 unsigned channelNumber,
00325 unsigned cause
00326 );
00327 H245_OpenLogicalChannelConfirm & BuildOpenLogicalChannelConfirm(
00328 unsigned channelNumber
00329 );
00330 H245_CloseLogicalChannelAck & BuildCloseLogicalChannelAck(
00331 unsigned channelNumber
00332 );
00333 H245_RequestChannelCloseAck & BuildRequestChannelCloseAck(
00334 unsigned channelNumber
00335 );
00336 H245_RequestChannelCloseReject & BuildRequestChannelCloseReject(
00337 unsigned channelNumber
00338 );
00339 H245_RequestChannelCloseRelease & BuildRequestChannelCloseRelease(
00340 unsigned channelNumber
00341 );
00342
00343 H245_RequestMode & BuildRequestMode(
00344 unsigned sequenceNumber
00345 );
00346 H245_RequestModeAck & BuildRequestModeAck(
00347 unsigned sequenceNumber,
00348 unsigned response
00349 );
00350 H245_RequestModeReject & BuildRequestModeReject(
00351 unsigned sequenceNumber,
00352 unsigned cause
00353 );
00354
00355 H245_RoundTripDelayRequest & BuildRoundTripDelayRequest(
00356 unsigned sequenceNumber
00357 );
00358 H245_RoundTripDelayResponse & BuildRoundTripDelayResponse(
00359 unsigned sequenceNumber
00360 );
00361
00362 H245_UserInputIndication & BuildUserInputIndication(
00363 const PString & value
00364 );
00365 H245_UserInputIndication & BuildUserInputIndication(
00366 char tone,
00367 unsigned duration,
00368 unsigned logicalChannel,
00369 unsigned rtpTimestamp
00370 );
00371
00372 H245_MiscellaneousCommand & BuildMiscellaneousCommand(
00373 unsigned channelNumber,
00374 unsigned type
00375 );
00376
00377 H245_FlowControlCommand & BuildFlowControlCommand(
00378 unsigned channelNumber,
00379 unsigned maxBitRate
00380 );
00381
00382 H245_MiscellaneousIndication & BuildMiscellaneousIndication(
00383 unsigned channelNumber,
00384 unsigned type
00385 );
00386
00387 H245_FunctionNotUnderstood & BuildFunctionNotUnderstood(
00388 const H323ControlPDU & pdu
00389 );
00390
00391 H245_EndSessionCommand & BuildEndSessionCommand(
00392 unsigned reason
00393 );
00394 };
00395
00396
00398
00401 class H323RasPDU : public H225_RasMessage, public H323TransactionPDU
00402 {
00403 PCLASSINFO(H323RasPDU, H225_RasMessage);
00404
00405 public:
00406 H323RasPDU();
00407 H323RasPDU(
00408 const H235Authenticators & authenticators
00409 );
00410
00411
00412 virtual PObject * Clone() const;
00413
00414
00415 virtual PASN_Object & GetPDU();
00416 virtual PASN_Choice & GetChoice();
00417 virtual const PASN_Object & GetPDU() const;
00418 virtual const PASN_Choice & GetChoice() const;
00419 virtual unsigned GetSequenceNumber() const;
00420 virtual unsigned GetRequestInProgressDelay() const;
00421 #if PTRACING
00422 virtual const char * GetProtocolName() const;
00423 #endif
00424 virtual H323TransactionPDU * ClonePDU() const;
00425 virtual void DeletePDU();
00426
00427
00428 H225_GatekeeperRequest & BuildGatekeeperRequest(unsigned seqNum);
00429 H225_GatekeeperConfirm & BuildGatekeeperConfirm(unsigned seqNum);
00430 H225_GatekeeperReject & BuildGatekeeperReject(unsigned seqNum, unsigned reason = H225_GatekeeperRejectReason::e_undefinedReason);
00431 H225_RegistrationRequest & BuildRegistrationRequest(unsigned seqNum);
00432 H225_RegistrationConfirm & BuildRegistrationConfirm(unsigned seqNum);
00433 H225_RegistrationReject & BuildRegistrationReject(unsigned seqNum, unsigned reason = H225_RegistrationRejectReason::e_undefinedReason);
00434 H225_UnregistrationRequest & BuildUnregistrationRequest(unsigned seqNum);
00435 H225_UnregistrationConfirm & BuildUnregistrationConfirm(unsigned seqNum);
00436 H225_UnregistrationReject & BuildUnregistrationReject(unsigned seqNum, unsigned reason = H225_UnregRejectReason::e_undefinedReason);
00437 H225_LocationRequest & BuildLocationRequest(unsigned seqNum);
00438 H225_LocationConfirm & BuildLocationConfirm(unsigned seqNum);
00439 H225_LocationReject & BuildLocationReject(unsigned seqNum, unsigned reason = H225_LocationRejectReason::e_undefinedReason);
00440 H225_AdmissionRequest & BuildAdmissionRequest(unsigned seqNum);
00441 H225_AdmissionConfirm & BuildAdmissionConfirm(unsigned seqNum);
00442 H225_AdmissionReject & BuildAdmissionReject(unsigned seqNum, unsigned reason = H225_AdmissionRejectReason::e_undefinedReason);
00443 H225_DisengageRequest & BuildDisengageRequest(unsigned seqNum);
00444 H225_DisengageConfirm & BuildDisengageConfirm(unsigned seqNum);
00445 H225_DisengageReject & BuildDisengageReject(unsigned seqNum, unsigned reason = H225_DisengageRejectReason::e_securityDenial);
00446 H225_BandwidthRequest & BuildBandwidthRequest(unsigned seqNum);
00447 H225_BandwidthConfirm & BuildBandwidthConfirm(unsigned seqNum, unsigned bandwidth = 0);
00448 H225_BandwidthReject & BuildBandwidthReject(unsigned seqNum, unsigned reason = H225_BandRejectReason::e_undefinedReason);
00449 H225_InfoRequest & BuildInfoRequest(unsigned seqNum, unsigned callRef = 0, const OpalGloballyUniqueID * id = NULL);
00450 H225_InfoRequestResponse & BuildInfoRequestResponse(unsigned seqNum);
00451 H225_InfoRequestAck & BuildInfoRequestAck(unsigned seqNum);
00452 H225_InfoRequestNak & BuildInfoRequestNak(unsigned seqNum, unsigned reason = H225_InfoRequestNakReason::e_undefinedReason);
00453 H225_ServiceControlIndication& BuildServiceControlIndication(unsigned seqNum, const OpalGloballyUniqueID * id = NULL);
00454 H225_ServiceControlResponse & BuildServiceControlResponse(unsigned seqNum);
00455 H225_UnknownMessageResponse & BuildUnknownMessageResponse(unsigned seqNum);
00456 H225_RequestInProgress & BuildRequestInProgress(unsigned seqNum, unsigned delay);
00457 };
00458
00459
00461
00462 void H323SetAliasAddresses(const H323TransportAddressArray & addresses, H225_ArrayOf_AliasAddress & aliases);
00463 void H323SetAliasAddresses(const PStringArray & names, H225_ArrayOf_AliasAddress & aliases, int tag = -1);
00464 void H323SetAliasAddresses(const PStringList & names, H225_ArrayOf_AliasAddress & aliases, int tag = -1);
00465 void H323SetAliasAddress(const H323TransportAddress & address, H225_AliasAddress & alias);
00466 void H323SetAliasAddress(const PString & name, H225_AliasAddress & alias, int tag = -1);
00467 PStringArray H323GetAliasAddressStrings(const H225_ArrayOf_AliasAddress & aliases);
00468 PString H323GetAliasAddressString(const H225_AliasAddress & alias);
00469 PString H323GetAliasAddressE164(const H225_AliasAddress & alias);
00470 PString H323GetAliasAddressE164(const H225_ArrayOf_AliasAddress & aliases);
00471
00472 H323Connection::CallEndReason H323TranslateToCallEndReason(
00473 Q931::CauseValues cause,
00474 unsigned reason
00475 );
00476 Q931::CauseValues H323TranslateFromCallEndReason(
00477 H323Connection::CallEndReason callEndReason,
00478 H225_ReleaseCompleteReason & releaseCompleteReason
00479 );
00480
00481 void H323GetApplicationInfo(OpalProductInfo & info, const H225_VendorIdentifier & vendor);
00482
00483 void H323SetRTPPacketization(
00484 H245_ArrayOf_RTPPayloadType & rtpPacketizations,
00485 PINDEX & packetizationsCount,
00486 const OpalMediaFormat & mediaFormat,
00487 RTP_DataFrame::PayloadTypes payloadType
00488 );
00489 bool H323SetRTPPacketization(
00490 H245_RTPPayloadType & rtpPacketization,
00491 const OpalMediaFormat & mediaFormat,
00492 RTP_DataFrame::PayloadTypes payloadType
00493 );
00494 bool H323SetRTPPacketization(
00495 H245_RTPPayloadType & rtpPacketization,
00496 const PString & mediaPacketizationString,
00497 const OpalMediaFormat & mediaFormat,
00498 RTP_DataFrame::PayloadTypes payloadType
00499 );
00500 PString H323GetRTPPacketization(
00501 const H245_RTPPayloadType & rtpPacketization
00502 );
00503 bool H323GetRTPPacketization(
00504 OpalMediaFormat & mediaFormat,
00505 const H245_RTPPayloadType & rtpPacketization
00506 );
00507
00508 #if PTRACING
00509 void H323TraceDumpPDU(
00510 const char * proto,
00511 PBoolean writing,
00512 const PBYTEArray & rawData,
00513 const PASN_Object & pdu,
00514 const PASN_Choice & tag1,
00515 unsigned seqNum
00516 );
00517 #else
00518 #define H323TraceDumpPDU(proto, writing, rawData, pdu, tag1, seqNum)
00519 #endif
00520
00521
00522 #endif // OPAL_H323
00523
00524 #endif // OPAL_H323_H323PDU_H
00525
00526