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_GenericMessage & BuildGenericRequest(
00388 const PString & identifier,
00389 unsigned subMsgId
00390 );
00391 H245_GenericMessage & BuildGenericResponse(
00392 const PString & identifier,
00393 unsigned subMsgId
00394 );
00395 H245_GenericMessage & BuildGenericCommand(
00396 const PString & identifier,
00397 unsigned subMsgId
00398 );
00399 H245_GenericMessage & BuildGenericIndication(
00400 const PString & identifier,
00401 unsigned subMsgId
00402 );
00403
00404 H245_FunctionNotUnderstood & BuildFunctionNotUnderstood(
00405 const H323ControlPDU & pdu
00406 );
00407
00408 H245_EndSessionCommand & BuildEndSessionCommand(
00409 unsigned reason
00410 );
00411 };
00412
00413
00415
00418 class H323RasPDU : public H225_RasMessage, public H323TransactionPDU
00419 {
00420 PCLASSINFO(H323RasPDU, H225_RasMessage);
00421
00422 public:
00423 H323RasPDU();
00424 H323RasPDU(
00425 const H235Authenticators & authenticators
00426 );
00427
00428
00429 virtual PObject * Clone() const;
00430
00431
00432 virtual PASN_Object & GetPDU();
00433 virtual PASN_Choice & GetChoice();
00434 virtual const PASN_Object & GetPDU() const;
00435 virtual const PASN_Choice & GetChoice() const;
00436 virtual unsigned GetSequenceNumber() const;
00437 virtual unsigned GetRequestInProgressDelay() const;
00438 #if PTRACING
00439 virtual const char * GetProtocolName() const;
00440 #endif
00441 virtual H323TransactionPDU * ClonePDU() const;
00442 virtual void DeletePDU();
00443
00444
00445 H225_GatekeeperRequest & BuildGatekeeperRequest(unsigned seqNum);
00446 H225_GatekeeperConfirm & BuildGatekeeperConfirm(unsigned seqNum);
00447 H225_GatekeeperReject & BuildGatekeeperReject(unsigned seqNum, unsigned reason = H225_GatekeeperRejectReason::e_undefinedReason);
00448 H225_RegistrationRequest & BuildRegistrationRequest(unsigned seqNum);
00449 H225_RegistrationConfirm & BuildRegistrationConfirm(unsigned seqNum);
00450 H225_RegistrationReject & BuildRegistrationReject(unsigned seqNum, unsigned reason = H225_RegistrationRejectReason::e_undefinedReason);
00451 H225_UnregistrationRequest & BuildUnregistrationRequest(unsigned seqNum);
00452 H225_UnregistrationConfirm & BuildUnregistrationConfirm(unsigned seqNum);
00453 H225_UnregistrationReject & BuildUnregistrationReject(unsigned seqNum, unsigned reason = H225_UnregRejectReason::e_undefinedReason);
00454 H225_LocationRequest & BuildLocationRequest(unsigned seqNum);
00455 H225_LocationConfirm & BuildLocationConfirm(unsigned seqNum);
00456 H225_LocationReject & BuildLocationReject(unsigned seqNum, unsigned reason = H225_LocationRejectReason::e_undefinedReason);
00457 H225_AdmissionRequest & BuildAdmissionRequest(unsigned seqNum);
00458 H225_AdmissionConfirm & BuildAdmissionConfirm(unsigned seqNum);
00459 H225_AdmissionReject & BuildAdmissionReject(unsigned seqNum, unsigned reason = H225_AdmissionRejectReason::e_undefinedReason);
00460 H225_DisengageRequest & BuildDisengageRequest(unsigned seqNum);
00461 H225_DisengageConfirm & BuildDisengageConfirm(unsigned seqNum);
00462 H225_DisengageReject & BuildDisengageReject(unsigned seqNum, unsigned reason = H225_DisengageRejectReason::e_securityDenial);
00463 H225_BandwidthRequest & BuildBandwidthRequest(unsigned seqNum);
00464 H225_BandwidthConfirm & BuildBandwidthConfirm(unsigned seqNum, unsigned bandwidth = 0);
00465 H225_BandwidthReject & BuildBandwidthReject(unsigned seqNum, unsigned reason = H225_BandRejectReason::e_undefinedReason);
00466 H225_InfoRequest & BuildInfoRequest(unsigned seqNum, unsigned callRef = 0, const OpalGloballyUniqueID * id = NULL);
00467 H225_InfoRequestResponse & BuildInfoRequestResponse(unsigned seqNum);
00468 H225_InfoRequestAck & BuildInfoRequestAck(unsigned seqNum);
00469 H225_InfoRequestNak & BuildInfoRequestNak(unsigned seqNum, unsigned reason = H225_InfoRequestNakReason::e_undefinedReason);
00470 H225_ServiceControlIndication& BuildServiceControlIndication(unsigned seqNum, const OpalGloballyUniqueID * id = NULL);
00471 H225_ServiceControlResponse & BuildServiceControlResponse(unsigned seqNum);
00472 H225_UnknownMessageResponse & BuildUnknownMessageResponse(unsigned seqNum);
00473 H225_RequestInProgress & BuildRequestInProgress(unsigned seqNum, unsigned delay);
00474 };
00475
00476
00478
00479 void H323SetAliasAddresses(const H323TransportAddressArray & addresses, H225_ArrayOf_AliasAddress & aliases);
00480 void H323SetAliasAddresses(const PStringArray & names, H225_ArrayOf_AliasAddress & aliases, int tag = -1);
00481 void H323SetAliasAddresses(const PStringList & names, H225_ArrayOf_AliasAddress & aliases, int tag = -1);
00482 void H323SetAliasAddress(const H323TransportAddress & address, H225_AliasAddress & alias);
00483 void H323SetAliasAddress(const PString & name, H225_AliasAddress & alias, int tag = -1);
00484 PStringArray H323GetAliasAddressStrings(const H225_ArrayOf_AliasAddress & aliases);
00485 PString H323GetAliasAddressString(const H225_AliasAddress & alias);
00486 PString H323GetAliasAddressE164(const H225_AliasAddress & alias);
00487 PString H323GetAliasAddressE164(const H225_ArrayOf_AliasAddress & aliases);
00488
00489 H323Connection::CallEndReason H323TranslateToCallEndReason(
00490 Q931::CauseValues cause,
00491 unsigned reason
00492 );
00493 Q931::CauseValues H323TranslateFromCallEndReason(
00494 H323Connection::CallEndReason callEndReason,
00495 H225_ReleaseCompleteReason & releaseCompleteReason
00496 );
00497
00498 void H323GetApplicationInfo(OpalProductInfo & info, const H225_VendorIdentifier & vendor);
00499
00500 void H323SetRTPPacketization(
00501 H245_ArrayOf_RTPPayloadType & rtpPacketizations,
00502 PINDEX & packetizationsCount,
00503 const OpalMediaFormat & mediaFormat,
00504 RTP_DataFrame::PayloadTypes payloadType
00505 );
00506 bool H323SetRTPPacketization(
00507 H245_RTPPayloadType & rtpPacketization,
00508 const OpalMediaFormat & mediaFormat,
00509 RTP_DataFrame::PayloadTypes payloadType
00510 );
00511 bool H323SetRTPPacketization(
00512 H245_RTPPayloadType & rtpPacketization,
00513 const PString & mediaPacketizationString,
00514 const OpalMediaFormat & mediaFormat,
00515 RTP_DataFrame::PayloadTypes payloadType
00516 );
00517 PString H323GetRTPPacketization(
00518 const H245_RTPPayloadType & rtpPacketization
00519 );
00520 bool H323GetRTPPacketization(
00521 OpalMediaFormat & mediaFormat,
00522 const H245_RTPPayloadType & rtpPacketization
00523 );
00524
00525 PString H323GetCapabilityIdentifier(
00526 const H245_CapabilityIdentifier & capId
00527 );
00528 bool H323SetCapabilityIdentifier(
00529 const PString & str,
00530 H245_CapabilityIdentifier & capId
00531 );
00532
00533 const H245_ParameterValue * H323GetGenericParameter(
00534 const H245_ArrayOf_GenericParameter & params,
00535 unsigned ordinal
00536 );
00537 bool H323GetGenericParameterBoolean(
00538 const H245_ArrayOf_GenericParameter & params,
00539 unsigned ordinal
00540 );
00541 unsigned H323GetGenericParameterInteger(
00542 const H245_ArrayOf_GenericParameter & params,
00543 unsigned ordinal,
00544 unsigned defValue = 0,
00545 H245_ParameterValue::Choices subType = H245_ParameterValue::e_unsignedMin
00546 );
00547 H245_ParameterValue * H323AddGenericParameter(
00548 H245_ArrayOf_GenericParameter & params,
00549 unsigned ordinal
00550 );
00551 void H323AddGenericParameterBoolean(
00552 H245_ArrayOf_GenericParameter & params,
00553 unsigned ordinal,
00554 bool value = true
00555 );
00556 void H323AddGenericParameterInteger(
00557 H245_ArrayOf_GenericParameter & params,
00558 unsigned ordinal,
00559 unsigned value,
00560 H245_ParameterValue::Choices subType = H245_ParameterValue::e_unsignedMin
00561 );
00562 void H323AddGenericParameterString(
00563 H245_ArrayOf_GenericParameter & params,
00564 unsigned ordinal,
00565 const PString & value
00566 );
00567 void H323AddGenericParameterOctets(
00568 H245_ArrayOf_GenericParameter & params,
00569 unsigned ordinal,
00570 const PBYTEArray & value
00571 );
00572
00573 #if PTRACING
00574 void H323TraceDumpPDU(
00575 const char * proto,
00576 PBoolean writing,
00577 const PBYTEArray & rawData,
00578 const PASN_Object & pdu,
00579 const PASN_Choice & tag1,
00580 unsigned seqNum
00581 );
00582 #else
00583 #define H323TraceDumpPDU(proto, writing, rawData, pdu, tag1, seqNum)
00584 #endif
00585
00586
00587 #endif // OPAL_H323
00588
00589 #endif // OPAL_H323_H323PDU_H
00590
00591