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 #ifndef OPAL_H323_H450PDU_H
00032 #define OPAL_H323_H450PDU_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038 #include <opal/buildopts.h>
00039
00040 #if OPAL_H450
00041
00042 #include <asn/x880.h>
00043 #include <asn/h4501.h>
00044 #include <asn/h4502.h>
00045
00046 #include <asn/h4507.h>
00047
00048 class H323EndPoint;
00049 class H323Connection;
00050 class H323TransportAddress;
00051 class H323SignalPDU;
00052
00053 class H4501_EndpointAddress;
00054 class H4501_InterpretationApdu;
00055
00056
00058
00061 class H450ServiceAPDU : public X880_ROS
00062 {
00063 public:
00064 X880_Invoke& BuildInvoke(int invokeId, int operation);
00065 X880_ReturnResult& BuildReturnResult(int invokeId);
00066 X880_ReturnError& BuildReturnError(int invokeId, int error);
00067 X880_Reject& BuildReject(int invokeId);
00068
00069 void BuildCallTransferInitiate(int invokeId,
00070 const PString & callIdentity,
00071 const PString & alias,
00072 const H323TransportAddress & address);
00073
00074 void BuildCallTransferIdentify(int invokeId);
00075 void BuildCallTransferAbandon(int invokeId);
00076 void BuildCallTransferSetup(int invokeId,
00077 const PString & callIdentity);
00078
00079 void BuildCallWaiting(int invokeId, int numCallsWaiting);
00080 void BuildMessageWaiting(int invokeId,
00081 H4507_H323_MWI_Operations &mwiOp,
00082 PASN_Sequence &argument);
00083 void BuildInterrogateResult(int invokeId,
00084 H4507_MWIInterrogateRes &interrogateResult);
00085
00086 void BuildCallIntrusionForcedRelease(int invokeId, int CICL);
00087 X880_ReturnResult& BuildCallIntrusionForcedReleaseResult(int invokeId);
00088 void BuildCallIntrusionForcedReleaseError();
00089 void BuildCallIntrusionGetCIPL(int invokeId);
00090 void BuildCallIntrusionImpending(int invokeId);
00091 void BuildCallIntrusionForceRelesed(int invokeId);
00092
00093 void AttachSupplementaryServiceAPDU(H323SignalPDU & pdu);
00094 PBoolean WriteFacilityPDU(
00095 H323Connection & connection
00096 );
00097
00098 static void ParseEndpointAddress(H4501_EndpointAddress & address,
00099 PString & party);
00100 };
00101
00102
00103 class H450xDispatcher;
00104
00105 class H450xHandler : public PObject
00106 {
00107 PCLASSINFO(H450xHandler, PObject);
00108 public:
00109 H450xHandler(
00110 H323Connection & connection,
00111 H450xDispatcher & dispatcher
00112 );
00113
00114 virtual void AttachToSetup(
00115 H323SignalPDU & pdu
00116 );
00117
00118 virtual void AttachToAlerting(
00119 H323SignalPDU & pdu
00120 );
00121
00122 virtual void AttachToConnect(
00123 H323SignalPDU & pdu
00124 );
00125
00126 virtual void AttachToReleaseComplete(
00127 H323SignalPDU & pdu
00128 );
00129
00130 virtual PBoolean OnReceivedInvoke(
00131 int opcode,
00132 int invokeId,
00133 int linkedId,
00134 PASN_OctetString * argument
00135 ) = 0;
00136
00137 virtual PBoolean OnReceivedReturnResult(
00138 X880_ReturnResult & returnResult
00139 );
00140
00141 virtual PBoolean OnReceivedReturnError(
00142 int errorCode,
00143 X880_ReturnError & returnError
00144 );
00145
00146 virtual PBoolean OnReceivedReject(
00147 int problemType,
00148 int problemNumber
00149 );
00150
00153 void SendReturnError(int returnError);
00154
00155 void SendGeneralReject(int problem);
00156
00157 void SendInvokeReject(int problem);
00158
00159 void SendReturnResultReject(int problem);
00160
00161 void SendReturnErrorReject(int problem);
00162
00163 PBoolean DecodeArguments(
00164 PASN_OctetString * argString,
00165 PASN_Object & argObject,
00166 int absentErrorCode
00167 );
00168
00169 unsigned GetInvokeId() const { return currentInvokeId; }
00170
00171
00172 protected:
00173 H323EndPoint & endpoint;
00174 H323Connection & connection;
00175 H450xDispatcher & dispatcher;
00176 unsigned currentInvokeId;
00177 };
00178
00179 PARRAY(H450xHandlerArray, H450xHandler);
00180 PDICTIONARY(H450xHandlerDict, POrdinalKey, H450xHandler);
00181
00182
00183 class H450xDispatcher : public PObject
00184 {
00185 PCLASSINFO(H450xDispatcher, PObject);
00186 public:
00187 H450xDispatcher(
00188 H323Connection & connection
00189 );
00190
00193 void AddOpCode(
00194 unsigned opcode,
00195 H450xHandler * handler
00196 );
00197
00198 virtual void AttachToSetup(
00199 H323SignalPDU & pdu
00200 );
00201
00202 virtual void AttachToAlerting(
00203 H323SignalPDU & pdu
00204 );
00205
00206 virtual void AttachToConnect(
00207 H323SignalPDU & pdu
00208 );
00209
00210 virtual void AttachToReleaseComplete(
00211 H323SignalPDU & pdu
00212 );
00213
00216 virtual PBoolean HandlePDU(
00217 const H323SignalPDU & pdu
00218 );
00219
00224 virtual PBoolean OnReceivedInvoke(X880_Invoke& invoke, H4501_InterpretationApdu& interpretation);
00225
00231 virtual PBoolean OnReceivedReturnResult(X880_ReturnResult& returnResult);
00232
00238 virtual PBoolean OnReceivedReturnError(X880_ReturnError& returnError);
00239
00245 virtual PBoolean OnReceivedReject(X880_Reject& reject);
00246
00249 void SendReturnError(int invokeId, int returnError);
00250
00251 void SendGeneralReject(int invokeId, int problem);
00252
00253 void SendInvokeReject(int invokeId, int problem);
00254
00255 void SendReturnResultReject(int invokeId, int problem);
00256
00257 void SendReturnErrorReject(int invokeId, int problem);
00258
00261 unsigned GetNextInvokeId() const { return ++nextInvokeId; }
00262
00263 protected:
00264 H323Connection & connection;
00265 H450xHandlerArray handlers;
00266 H450xHandlerDict opcodeHandler;
00267 mutable unsigned nextInvokeId;
00268 };
00269
00270
00271 class H4502Handler : public H450xHandler
00272 {
00273 PCLASSINFO(H4502Handler, H450xHandler);
00274 public:
00275 H4502Handler(
00276 H323Connection & connection,
00277 H450xDispatcher & dispatcher
00278 );
00279
00280 virtual void AttachToSetup(
00281 H323SignalPDU & pdu
00282 );
00283
00284 virtual void AttachToAlerting(
00285 H323SignalPDU & pdu
00286 );
00287
00288 virtual void AttachToConnect(
00289 H323SignalPDU & pdu
00290 );
00291
00292 virtual void AttachToReleaseComplete(
00293 H323SignalPDU & pdu
00294 );
00295
00296 virtual PBoolean OnReceivedInvoke(
00297 int opcode,
00298 int invokeId,
00299 int linkedId,
00300 PASN_OctetString * argument
00301 );
00302
00305 virtual void OnReceivedCallTransferIdentify(
00306 int linkedId
00307 );
00308
00311 virtual void OnReceivedCallTransferAbandon(
00312 int linkedId
00313 );
00314
00317 virtual void OnReceivedCallTransferInitiate(
00318 int linkedId,
00319 PASN_OctetString * argument
00320 );
00321
00324 virtual void OnReceivedCallTransferSetup(
00325 int linkedId,
00326 PASN_OctetString * argument
00327 );
00328
00331 virtual void OnReceivedCallTransferUpdate(
00332 int linkedId,
00333 PASN_OctetString * argument
00334 );
00335
00338 virtual void OnReceivedSubaddressTransfer(
00339 int linkedId,
00340 PASN_OctetString * argument
00341 );
00342
00345 virtual void OnReceivedCallTransferComplete(
00346 int linkedId,
00347 PASN_OctetString * argument
00348 );
00349
00352 virtual void OnReceivedCallTransferActive(
00353 int linkedId,
00354 PASN_OctetString * argument
00355 );
00356
00357 virtual PBoolean OnReceivedReturnResult(
00358 X880_ReturnResult & returnResult
00359 );
00360
00365 void OnReceivedInitiateReturnResult();
00366
00372 void OnReceivedSetupReturnResult();
00373
00378 void OnReceivedIdentifyReturnResult(X880_ReturnResult &returnResult);
00379
00380 virtual PBoolean OnReceivedReturnError(
00381 int errorCode,
00382 X880_ReturnError & returnError
00383 );
00384
00389 void OnReceivedInitiateReturnError(
00390 const bool timerExpiry = false
00391 );
00392
00399 void OnReceivedSetupReturnError(
00400 int errorCode,
00401 const bool timerExpiry = false
00402 );
00403
00408 void OnReceivedIdentifyReturnError(
00409 const bool timerExpiry = false
00410 );
00411
00416 bool TransferCall(
00417 const PString & remoteParty,
00418 const PString & callIdentity
00419 );
00420
00425 void ConsultationTransfer(
00426 const PString & primaryCallToken
00427 );
00428
00431 void HandleConsultationTransfer(
00432 const PString & callIdentity,
00433 H323Connection& incoming
00434 );
00435
00436 void AwaitSetupResponse(
00437 const PString & token,
00438 const PString & identity
00439 );
00440
00443 enum State {
00444 e_ctIdle,
00445 e_ctAwaitIdentifyResponse,
00446 e_ctAwaitInitiateResponse,
00447 e_ctAwaitSetupResponse,
00448 e_ctAwaitSetup,
00449 e_ctAwaitConnect
00450 };
00451
00454 State GetState() const { return ctState; }
00455
00465 virtual void onReceivedAdmissionReject(const int returnError);
00466
00469 void HandleCallTransferFailure(
00470 const int returnError
00471 );
00472
00475 void StartctTimer(const PTimeInterval value) { ctTimer = value; }
00476
00479 void StopctTimer();
00480
00483 PBoolean IsctTimerRunning() { return ctTimer.IsRunning(); }
00484
00487 PDECLARE_NOTIFIER(PTimer, H4502Handler, OnCallTransferTimeOut);
00488
00491 const H323Connection& getAssociatedConnection() const { return connection; }
00492
00495 void SetAssociatedCallToken(const PString& token) { CallToken = token; }
00496
00499 const PString& getTransferringCallToken() const { return transferringCallToken; }
00500
00503 void SetConsultationTransferSuccess() { consultationTransfer = PTrue; }
00504
00507 PBoolean isConsultationTransferSuccess() { return consultationTransfer; }
00508
00509 protected:
00510 PString transferringCallToken;
00511 PString transferringCallIdentity;
00512 State ctState;
00513 PBoolean ctResponseSent;
00514 PTimer ctTimer;
00515 PString CallToken;
00516
00517 PBoolean consultationTransfer;
00518
00519 };
00520
00521
00522 class H4504Handler : public H450xHandler
00523 {
00524 PCLASSINFO(H4504Handler, H450xHandler);
00525 public:
00526 H4504Handler(
00527 H323Connection & connection,
00528 H450xDispatcher & dispatcher
00529 );
00530
00531 virtual PBoolean OnReceivedInvoke(
00532 int opcode,
00533 int invokeId,
00534 int linkedId,
00535 PASN_OctetString * argument
00536 );
00537
00540 virtual void OnReceivedLocalCallHold(
00541 int linkedId
00542 );
00543
00546 virtual void OnReceivedLocalCallRetrieve(
00547 int linkedId
00548 );
00549
00553 virtual void OnReceivedRemoteCallHold(
00554 int linkedId
00555 );
00556
00560 virtual void OnReceivedRemoteCallRetrieve(
00561 int linkedId
00562 );
00563
00567 bool HoldCall(
00568 PBoolean localHold
00569 );
00570
00574 bool RetrieveCall();
00575
00578 enum State {
00579 e_ch_Idle,
00580 e_ch_NE_Held,
00581 e_ch_RE_Requested,
00582 e_ch_RE_Held,
00583 e_ch_RE_Retrieve_Req
00584 };
00585
00586 State GetState() const { return holdState; }
00587
00588
00589 protected:
00590 State holdState;
00591 };
00592
00593
00594 class H4506Handler : public H450xHandler
00595 {
00596 PCLASSINFO(H4506Handler, H450xHandler);
00597 public:
00598 H4506Handler(
00599 H323Connection & connection,
00600 H450xDispatcher & dispatcher
00601 );
00602
00603 virtual PBoolean OnReceivedInvoke(
00604 int opcode,
00605 int invokeId,
00606 int linkedId,
00607 PASN_OctetString * argument
00608 );
00609
00612 virtual void OnReceivedCallWaitingIndication(
00613 int linkedId,
00614 PASN_OctetString *argument
00615 );
00616
00622 virtual void AttachToAlerting(
00623 H323SignalPDU & pdu,
00624 unsigned numberOfCallsWaiting = 0
00625 );
00626
00629 enum State {
00630 e_cw_Idle,
00631 e_cw_Invoked
00632 };
00633
00634 State GetState() const { return cwState; }
00635
00636
00637 protected:
00638 State cwState;
00639 };
00640
00644 class H4507Handler : public H450xHandler
00645 {
00646 PCLASSINFO(H4507Handler, H450xHandler);
00647 public:
00648 H4507Handler(
00649 H323Connection & connection,
00650 H450xDispatcher & dispatcher
00651 );
00652
00653 virtual PBoolean OnReceivedInvoke(
00654 int opcode,
00655 int invokeId,
00656 int linkedId,
00657 PASN_OctetString * argument
00658 );
00659
00660
00664 virtual void AttachToSetup(H323SignalPDU & setupPDU,
00665 H4507_H323_MWI_Operations &mwiOp,
00666 PASN_Sequence &argument);
00667
00670 virtual void AttachInterrogateResultToPdu(H323SignalPDU & pdu,
00671 H4507_MWIInterrogateRes &interrogateResult);
00672 virtual void AttachErrorToPdu(H323SignalPDU & pdu,
00673 H4507_MessageWaitingIndicationErrors error);
00676 enum State {
00677 e_mwi_Idle,
00678 e_mwi_Invoked
00679 };
00680
00681 State GetState() const { return mwiState; }
00682
00683
00684 protected:
00685 State mwiState;
00686 };
00687
00688
00689 class H45011Handler : public H450xHandler
00690 {
00691 PCLASSINFO(H45011Handler, H450xHandler);
00692 public:
00693 H45011Handler(
00694 H323Connection & connection,
00695 H450xDispatcher & dispatcher
00696 );
00697
00698 virtual void AttachToSetup(
00699 H323SignalPDU & pdu
00700 );
00701
00702 virtual void AttachToAlerting(
00703 H323SignalPDU & pdu
00704 );
00705
00706 virtual void AttachToConnect(
00707 H323SignalPDU & pdu
00708 );
00709
00710 virtual void AttachToReleaseComplete(
00711 H323SignalPDU & pdu
00712 );
00713
00714 virtual PBoolean OnReceivedInvoke(
00715 int opcode,
00716 int invokeId,
00717 int linkedId,
00718 PASN_OctetString * argument
00719 );
00720
00723 virtual void OnReceivedCallIntrusionRequest(
00724 int linkedId,
00725 PASN_OctetString *argument
00726 );
00727
00730 virtual void OnReceivedCallIntrusionGetCIPL(
00731 int linkedId,
00732 PASN_OctetString *argument
00733 );
00734
00737 virtual void OnReceivedCallIntrusionIsolate(
00738 int linkedId,
00739 PASN_OctetString *argument
00740 );
00741
00744 virtual PBoolean OnReceivedCallIntrusionForcedRelease(
00745 int linkedId,
00746 PASN_OctetString *argument
00747 );
00748
00751 virtual void OnReceivedCallIntrusionWOBRequest(
00752 int linkedId,
00753 PASN_OctetString *argument
00754 );
00755
00758 virtual void OnReceivedCallIntrusionSilentMonitor(
00759 int linkedId,
00760 PASN_OctetString *argument
00761 );
00762
00765 virtual void OnReceivedCallIntrusionNotification(
00766 int linkedId,
00767 PASN_OctetString *argument
00768 );
00769
00772 virtual void OnReceivedCfbOverride(
00773 int linkedId,
00774 PASN_OctetString *argument
00775 );
00776
00779 virtual void OnReceivedRemoteUserAlerting(
00780 int linkedId,
00781 PASN_OctetString *argument
00782 );
00783
00786 virtual void OnReceivedCallWaiting(
00787 int linkedId,
00788 PASN_OctetString *argument
00789 );
00790
00791 virtual PBoolean OnReceivedReturnResult(
00792 X880_ReturnResult & returnResult
00793 );
00794
00795 void OnReceivedCIRequestResult();
00796
00797 virtual PBoolean OnReceivedReturnError(
00798 int errorCode,
00799 X880_ReturnError & returnError
00800 );
00801
00802 PBoolean OnReceivedInvokeReturnError (
00803 int errorCode,
00804 const bool timerExpiry = false
00805 );
00806
00807 void OnReceivedCIGetCIPLResult(
00808 X880_ReturnResult & returnResult
00809 );
00810
00811 PBoolean OnReceivedGetCIPLReturnError(
00812 int errorCode,
00813 const bool timerExpiry = false
00814 );
00815
00816 void IntrudeCall(int CICL );
00817
00818 void AwaitSetupResponse(
00819 const PString & token,
00820 const PString & identity
00821 );
00822
00823 PBoolean GetRemoteCallIntrusionProtectionLevel(
00824 const PString & intrusionCallToken,
00825 unsigned intrusionCICL
00826 );
00827
00828 void SetIntrusionImpending();
00829
00830 void SetForcedReleaseAccepted();
00831
00832 void SetIntrusionNotAuthorized();
00833
00834 virtual PBoolean OnReceivedReject(
00835 int problemType,
00836 int problemNumber
00837 );
00838
00841 enum State {
00842 e_ci_Idle,
00843 e_ci_WaitAck,
00844 e_ci_GetCIPL,
00845 e_ci_OrigInvoked,
00846 e_ci_OrigIsolated,
00847 e_ci_DestNotify,
00848 e_ci_DestInvoked,
00849 e_ci_DestIsolated,
00850 e_ci_DestWOB,
00851 e_ci_IsolationRequest,
00852 e_ci_ForcedReleaseRequest,
00853 e_ci_WOBRequest
00854 };
00855
00857 enum Generate{
00858 e_ci_gIdle,
00859 e_ci_gConferenceRequest,
00860 e_ci_gHeldRequest,
00861 e_ci_gSilentMonitorRequest,
00862 e_ci_gIsolationRequest,
00863 e_ci_gForcedReleaseRequest,
00864 e_ci_gWOBRequest
00865 };
00866
00868 enum SendState{
00869 e_ci_sIdle,
00870 e_ci_sAttachToSetup,
00871 e_ci_sAttachToAlerting,
00872 e_ci_sAttachToConnect,
00873 e_ci_sAttachToReleseComplete
00874 };
00875
00877 enum ReturnState{
00878 e_ci_rIdle,
00879 e_ci_rCallIntrusionImpending,
00880 e_ci_rCallIntruded,
00881 e_ci_rCallIsolated,
00882 e_ci_rCallForceReleased,
00883 e_ci_rCallForceReleaseResult,
00884 e_ci_rCallIntrusionComplete,
00885 e_ci_rCallIntrusionEnd,
00886 e_ci_rNotBusy,
00887 e_ci_rTempUnavailable,
00888 e_ci_rNotAuthorized
00889 };
00890
00893 State GetState() const { return ciState; }
00894
00897 void StartciTimer(const PTimeInterval value) { ciTimer = value; }
00898
00901 void StopciTimer();
00902
00905 PBoolean IsctTimerRunning() { return ciTimer.IsRunning(); }
00906
00909 PDECLARE_NOTIFIER(PTimer, H45011Handler, OnCallIntrudeTimeOut);
00910
00911 protected:
00912 State ciState;
00913 PTimer ciTimer;
00914 PString intrudingCallToken;
00915 PString intrudingCallIdentity;
00916 PString activeCallToken;
00917 ReturnState ciReturnState;
00918 SendState ciSendState;
00919 Generate ciGenerateState;
00920 int ciCICL;
00921 unsigned intrudingCallCICL;
00922 };
00923
00924
00925 #endif // OPAL_H450
00926
00927 #endif // OPAL_H323_H450PDU_H
00928
00929