Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

h450pdu.h

Go to the documentation of this file.
00001 /* 00002 * h450pdu.h 00003 * 00004 * H.450 Helper functions 00005 * 00006 * Open H323 Library 00007 * 00008 * Copyright (c) 2001 Norwood Systems Pty. Ltd. 00009 * 00010 * The contents of this file are subject to the Mozilla Public License 00011 * Version 1.0 (the "License"); you may not use this file except in 00012 * compliance with the License. You may obtain a copy of the License at 00013 * http://www.mozilla.org/MPL/ 00014 * 00015 * Software distributed under the License is distributed on an "AS IS" 00016 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 00017 * the License for the specific language governing rights and limitations 00018 * under the License. 00019 * 00020 * The Original Code is Open H323 Library. 00021 * 00022 * The Initial Developer of the Original Code is Equivalence Pty. Ltd. 00023 * 00024 * Contributor(s): ______________________________________. 00025 * 00026 * $Log: h450pdu.h,v $ 00027 * Revision 1.10 2002/11/21 22:37:24 robertj 00028 * Fixed problems with unrecognized invoke APDU, thanks Andrea Bondavalli 00029 * 00030 * Revision 1.9 2002/09/16 01:14:15 robertj 00031 * Added #define so can select if #pragma interface/implementation is used on 00032 * platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan. 00033 * 00034 * Revision 1.8 2002/09/03 06:19:37 robertj 00035 * Normalised the multi-include header prevention ifdef/define symbol. 00036 * 00037 * Revision 1.7 2002/08/05 10:03:47 robertj 00038 * Cosmetic changes to normalise the usage of pragma interface/implementation. 00039 * 00040 * Revision 1.6 2002/07/04 00:40:31 robertj 00041 * More H.450.11 call intrusion implementation, thanks Aleksandar Todorovic 00042 * 00043 * Revision 1.5 2002/06/22 05:48:38 robertj 00044 * Added partial implementation for H.450.11 Call Intrusion 00045 * 00046 * Revision 1.4 2002/02/04 07:17:52 robertj 00047 * Added H.450.2 Consultation Transfer, thanks Norwood Systems. 00048 * 00049 * Revision 1.3 2002/01/14 00:02:40 robertj 00050 * Added H.450.6 00051 * Added extra "failure mode" parts of H.250.2. 00052 * Various other bug fixes. 00053 * Thanks Ben Madsen of Norwood Systems 00054 * 00055 * Revision 1.2 2001/08/16 07:49:16 robertj 00056 * Changed the H.450 support to be more extensible. Protocol handlers 00057 * are now in separate classes instead of all in H323Connection. 00058 * 00059 * Revision 1.1 2001/04/11 03:01:27 robertj 00060 * Added H.450.2 (call transfer), thanks a LOT to Graeme Reid & Norwood Systems 00061 * 00062 */ 00063 00064 #ifndef __OPAL_H450PDU_H 00065 #define __OPAL_H450PDU_H 00066 00067 #ifdef P_USE_PRAGMA 00068 #pragma interface 00069 #endif 00070 00071 00072 #include "x880.h" 00073 00074 00075 class H323EndPoint; 00076 class H323Connection; 00077 class H323TransportAddress; 00078 class H323SignalPDU; 00079 00080 class H4501_EndpointAddress; 00081 class H4501_InterpretationApdu; 00082 00083 00085 00088 class H450ServiceAPDU : public X880_ROS 00089 { 00090 public: 00091 X880_Invoke& BuildInvoke(int invokeId, int operation); 00092 X880_ReturnResult& BuildReturnResult(int invokeId); 00093 X880_ReturnError& BuildReturnError(int invokeId, int error); 00094 X880_Reject& BuildReject(int invokeId); 00095 00096 void BuildCallTransferInitiate(int invokeId, 00097 const PString & callIdentity, 00098 const PString & alias, 00099 const H323TransportAddress & address); 00100 00101 void BuildCallTransferIdentify(int invokeId); 00102 void BuildCallTransferAbandon(int invokeId); 00103 void BuildCallTransferSetup(int invokeId, 00104 const PString & callIdentity); 00105 00106 void BuildCallWaiting(int invokeId, int numCallsWaiting); 00107 00108 void BuildCallIntrusionForcedRelease(int invokeId, int CICL); 00109 X880_ReturnResult& BuildCallIntrusionForcedReleaseResult(int invokeId); 00110 void BuildCallIntrusionForcedReleaseError(); 00111 void BuildCallIntrusionGetCIPL(int invokeId); 00112 void BuildCallIntrusionImpending(int invokeId); 00113 void BuildCallIntrusionForceRelesed(int invokeId); 00114 00115 void AttachSupplementaryServiceAPDU(H323SignalPDU & pdu); 00116 BOOL WriteFacilityPDU( 00117 H323Connection & connection 00118 ); 00119 00120 static void ParseEndpointAddress(H4501_EndpointAddress & address, 00121 PString & party); 00122 }; 00123 00124 00125 class H450xDispatcher; 00126 00127 class H450xHandler : public PObject 00128 { 00129 PCLASSINFO(H450xHandler, PObject); 00130 public: 00131 H450xHandler( 00132 H323Connection & connection, 00133 H450xDispatcher & dispatcher 00134 ); 00135 00136 virtual void AttachToSetup( 00137 H323SignalPDU & pdu 00138 ); 00139 00140 virtual void AttachToAlerting( 00141 H323SignalPDU & pdu 00142 ); 00143 00144 virtual void AttachToConnect( 00145 H323SignalPDU & pdu 00146 ); 00147 00148 virtual void AttachToReleaseComplete( 00149 H323SignalPDU & pdu 00150 ); 00151 00152 virtual BOOL OnReceivedInvoke( 00153 int opcode, 00154 int invokeId, 00155 int linkedId, 00156 PASN_OctetString * argument 00157 ) = 0; 00158 00159 virtual BOOL OnReceivedReturnResult( 00160 X880_ReturnResult & returnResult 00161 ); 00162 00163 virtual BOOL OnReceivedReturnError( 00164 int errorCode, 00165 X880_ReturnError & returnError 00166 ); 00167 00168 virtual BOOL OnReceivedReject( 00169 int problemType, 00170 int problemNumber 00171 ); 00172 00175 void SendReturnError(int returnError); 00176 00177 void SendGeneralReject(int problem); 00178 00179 void SendInvokeReject(int problem); 00180 00181 void SendReturnResultReject(int problem); 00182 00183 void SendReturnErrorReject(int problem); 00184 00185 BOOL DecodeArguments( 00186 PASN_OctetString * argString, 00187 PASN_Object & argObject, 00188 int absentErrorCode 00189 ); 00190 00191 unsigned GetInvokeId() const { return currentInvokeId; } 00192 00193 00194 protected: 00195 H323EndPoint & endpoint; 00196 H323Connection & connection; 00197 H450xDispatcher & dispatcher; 00198 unsigned currentInvokeId; 00199 }; 00200 00201 PLIST(H450xHandlerList, H450xHandler); 00202 PDICTIONARY(H450xHandlerDict, POrdinalKey, H450xHandler); 00203 00204 00205 class H450xDispatcher : public PObject 00206 { 00207 PCLASSINFO(H450xDispatcher, PObject); 00208 public: 00209 H450xDispatcher( 00210 H323Connection & connection 00211 ); 00212 00215 void AddOpCode( 00216 unsigned opcode, 00217 H450xHandler * handler 00218 ); 00219 00220 virtual void AttachToSetup( 00221 H323SignalPDU & pdu 00222 ); 00223 00224 virtual void AttachToAlerting( 00225 H323SignalPDU & pdu 00226 ); 00227 00228 virtual void AttachToConnect( 00229 H323SignalPDU & pdu 00230 ); 00231 00232 virtual void AttachToReleaseComplete( 00233 H323SignalPDU & pdu 00234 ); 00235 00238 virtual BOOL HandlePDU( 00239 const H323SignalPDU & pdu 00240 ); 00241 00246 virtual BOOL OnReceivedInvoke(X880_Invoke& invoke, H4501_InterpretationApdu& interpretation); 00247 00253 virtual BOOL OnReceivedReturnResult(X880_ReturnResult& returnResult); 00254 00260 virtual BOOL OnReceivedReturnError(X880_ReturnError& returnError); 00261 00267 virtual BOOL OnReceivedReject(X880_Reject& reject); 00268 00271 void SendReturnError(int invokeId, int returnError); 00272 00273 void SendGeneralReject(int invokeId, int problem); 00274 00275 void SendInvokeReject(int invokeId, int problem); 00276 00277 void SendReturnResultReject(int invokeId, int problem); 00278 00279 void SendReturnErrorReject(int invokeId, int problem); 00280 00283 unsigned GetNextInvokeId() const { return ++nextInvokeId; } 00284 00285 protected: 00286 H323Connection & connection; 00287 H450xHandlerList handlers; 00288 H450xHandlerDict opcodeHandler; 00289 mutable unsigned nextInvokeId; // Next available invoke ID for H450 operations 00290 }; 00291 00292 00293 class H4502Handler : public H450xHandler 00294 { 00295 PCLASSINFO(H4502Handler, H450xHandler); 00296 public: 00297 H4502Handler( 00298 H323Connection & connection, 00299 H450xDispatcher & dispatcher 00300 ); 00301 00302 virtual void AttachToSetup( 00303 H323SignalPDU & pdu 00304 ); 00305 00306 virtual void AttachToAlerting( 00307 H323SignalPDU & pdu 00308 ); 00309 00310 virtual void AttachToConnect( 00311 H323SignalPDU & pdu 00312 ); 00313 00314 virtual void AttachToReleaseComplete( 00315 H323SignalPDU & pdu 00316 ); 00317 00318 virtual BOOL OnReceivedInvoke( 00319 int opcode, 00320 int invokeId, 00321 int linkedId, 00322 PASN_OctetString * argument 00323 ); 00324 00327 virtual void OnReceivedCallTransferIdentify( 00328 int linkedId 00329 ); 00330 00333 virtual void OnReceivedCallTransferAbandon( 00334 int linkedId 00335 ); 00336 00339 virtual void OnReceivedCallTransferInitiate( 00340 int linkedId, 00341 PASN_OctetString * argument 00342 ); 00343 00346 virtual void OnReceivedCallTransferSetup( 00347 int linkedId, 00348 PASN_OctetString * argument 00349 ); 00350 00353 virtual void OnReceivedCallTransferUpdate( 00354 int linkedId, 00355 PASN_OctetString * argument 00356 ); 00357 00360 virtual void OnReceivedSubaddressTransfer( 00361 int linkedId, 00362 PASN_OctetString * argument 00363 ); 00364 00367 virtual void OnReceivedCallTransferComplete( 00368 int linkedId, 00369 PASN_OctetString * argument 00370 ); 00371 00374 virtual void OnReceivedCallTransferActive( 00375 int linkedId, 00376 PASN_OctetString * argument 00377 ); 00378 00379 virtual BOOL OnReceivedReturnResult( 00380 X880_ReturnResult & returnResult 00381 ); 00382 00387 void OnReceivedInitiateReturnResult(); 00388 00394 void OnReceivedSetupReturnResult(); 00395 00400 void OnReceivedIdentifyReturnResult(X880_ReturnResult &returnResult); 00401 00402 virtual BOOL OnReceivedReturnError( 00403 int errorCode, 00404 X880_ReturnError & returnError 00405 ); 00406 00411 void OnReceivedInitiateReturnError( 00412 const bool timerExpiry = false 00413 ); 00414 00421 void OnReceivedSetupReturnError( 00422 int errorCode, 00423 const bool timerExpiry = false 00424 ); 00425 00430 void OnReceivedIdentifyReturnError( 00431 const bool timerExpiry = false 00432 ); 00433 00438 void TransferCall( 00439 const PString & remoteParty, 00440 const PString & callIdentity 00441 ); 00442 00447 void ConsultationTransfer( 00448 const PString & primaryCallToken 00449 ); 00450 00453 void HandleConsultationTransfer( 00454 const PString & callIdentity, 00455 H323Connection& incoming 00456 ); 00457 00458 void AwaitSetupResponse( 00459 const PString & token, 00460 const PString & identity 00461 ); 00462 00465 enum State { 00466 e_ctIdle, 00467 e_ctAwaitIdentifyResponse, 00468 e_ctAwaitInitiateResponse, 00469 e_ctAwaitSetupResponse, 00470 e_ctAwaitSetup, 00471 e_ctAwaitConnect 00472 }; 00473 00476 State GetState() const { return ctState; } 00477 00487 virtual void onReceivedAdmissionReject(const int returnError); 00488 00491 void HandleCallTransferFailure( 00492 const int returnError 00493 ); 00494 00497 void StartctTimer(const PTimeInterval value) { ctTimer = value; } 00498 00501 void StopctTimer(); 00502 00505 BOOL IsctTimerRunning() { return ctTimer.IsRunning(); } 00506 00509 PDECLARE_NOTIFIER(PTimer, H4502Handler, OnCallTransferTimeOut); 00510 00513 const H323Connection& getAssociatedConnection() const { return connection; } 00514 00517 void SetAssociatedCallToken(const PString& token) { CallToken = token; } 00518 00521 const PString& getTransferringCallToken() const { return transferringCallToken; } 00522 00525 unsigned GetNextCallIdentityValue() const { return nextCallIdentity++; } 00526 00529 void SetConsultationTransferSuccess() { consultationTransfer = TRUE; } 00530 00533 BOOL isConsultationTransferSuccess() { return consultationTransfer; } 00534 00535 protected: 00536 PString transferringCallToken; // Stores the call token for the transferring connection (if there is one) 00537 PString transferringCallIdentity; // Stores the call identity for the transferring call (if there is one) 00538 State ctState; // Call Transfer state of the conneciton 00539 BOOL ctResponseSent; // Has a callTransferSetupReturnResult been sent? 00540 PTimer ctTimer; // Call Transfer Timer - Handles all four timers CT-T1, 00541 PString CallToken; // Call Token of the associated connection 00542 // (used during a consultation transfer). 00543 mutable unsigned nextCallIdentity;// Next available callIdentity for H450 Transfer operations 00544 // via consultation. 00545 BOOL consultationTransfer; // Flag used to indicate whether an incoming call is involved in 00546 // a transfer through consultation. 00547 }; 00548 00549 00550 class H4504Handler : public H450xHandler 00551 { 00552 PCLASSINFO(H4504Handler, H450xHandler); 00553 public: 00554 H4504Handler( 00555 H323Connection & connection, 00556 H450xDispatcher & dispatcher 00557 ); 00558 00559 virtual BOOL OnReceivedInvoke( 00560 int opcode, 00561 int invokeId, 00562 int linkedId, 00563 PASN_OctetString * argument 00564 ); 00565 00568 virtual void OnReceivedLocalCallHold( 00569 int linkedId 00570 ); 00571 00574 virtual void OnReceivedLocalCallRetrieve( 00575 int linkedId 00576 ); 00577 00581 virtual void OnReceivedRemoteCallHold( 00582 int linkedId 00583 ); 00584 00588 virtual void OnReceivedRemoteCallRetrieve( 00589 int linkedId 00590 ); 00591 00595 void HoldCall( 00596 BOOL localHold 00597 ); 00598 00602 void RetrieveCall(); 00603 00606 enum State { 00607 e_ch_Idle, 00608 e_ch_NE_Held, 00609 e_ch_RE_Requested, 00610 e_ch_RE_Held, 00611 e_ch_RE_Retrieve_Req 00612 }; 00613 00614 State GetState() const { return holdState; } 00615 00616 00617 protected: 00618 State holdState; // Call Hold state of this connection 00619 }; 00620 00621 00622 class H4506Handler : public H450xHandler 00623 { 00624 PCLASSINFO(H4506Handler, H450xHandler); 00625 public: 00626 H4506Handler( 00627 H323Connection & connection, 00628 H450xDispatcher & dispatcher 00629 ); 00630 00631 virtual BOOL OnReceivedInvoke( 00632 int opcode, 00633 int invokeId, 00634 int linkedId, 00635 PASN_OctetString * argument 00636 ); 00637 00640 virtual void OnReceivedCallWaitingIndication( 00641 int linkedId, 00642 PASN_OctetString *argument 00643 ); 00644 00650 virtual void AttachToAlerting( 00651 H323SignalPDU & pdu, 00652 unsigned numberOfCallsWaiting = 0 00653 ); 00654 00657 enum State { 00658 e_cw_Idle, 00659 e_cw_Invoked 00660 }; 00661 00662 State GetState() const { return cwState; } 00663 00664 00665 protected: 00666 State cwState; // Call Waiting state of this connection 00667 }; 00668 00669 00670 class H45011Handler : public H450xHandler 00671 { 00672 PCLASSINFO(H45011Handler, H450xHandler); 00673 public: 00674 H45011Handler( 00675 H323Connection & connection, 00676 H450xDispatcher & dispatcher 00677 ); 00678 00679 virtual void AttachToSetup( 00680 H323SignalPDU & pdu 00681 ); 00682 00683 virtual void AttachToAlerting( 00684 H323SignalPDU & pdu 00685 ); 00686 00687 virtual void AttachToConnect( 00688 H323SignalPDU & pdu 00689 ); 00690 00691 virtual void AttachToReleaseComplete( 00692 H323SignalPDU & pdu 00693 ); 00694 00695 virtual BOOL OnReceivedInvoke( 00696 int opcode, 00697 int invokeId, 00698 int linkedId, 00699 PASN_OctetString * argument 00700 ); 00701 00704 virtual void OnReceivedCallIntrusionRequest( 00705 int linkedId, 00706 PASN_OctetString *argument 00707 ); 00708 00711 virtual void OnReceivedCallIntrusionGetCIPL( 00712 int linkedId, 00713 PASN_OctetString *argument 00714 ); 00715 00718 virtual void OnReceivedCallIntrusionIsolate( 00719 int linkedId, 00720 PASN_OctetString *argument 00721 ); 00722 00725 virtual BOOL OnReceivedCallIntrusionForcedRelease( 00726 int linkedId, 00727 PASN_OctetString *argument 00728 ); 00729 00732 virtual void OnReceivedCallIntrusionWOBRequest( 00733 int linkedId, 00734 PASN_OctetString *argument 00735 ); 00736 00739 virtual void OnReceivedCallIntrusionSilentMonitor( 00740 int linkedId, 00741 PASN_OctetString *argument 00742 ); 00743 00746 virtual void OnReceivedCallIntrusionNotification( 00747 int linkedId, 00748 PASN_OctetString *argument 00749 ); 00750 00753 virtual void OnReceivedCfbOverride( 00754 int linkedId, 00755 PASN_OctetString *argument 00756 ); 00757 00760 virtual void OnReceivedRemoteUserAlerting( 00761 int linkedId, 00762 PASN_OctetString *argument 00763 ); 00764 00767 virtual void OnReceivedCallWaiting( 00768 int linkedId, 00769 PASN_OctetString *argument 00770 ); 00771 00772 virtual BOOL OnReceivedReturnResult( 00773 X880_ReturnResult & returnResult 00774 ); 00775 00776 void OnReceivedCIRequestResult(/*X880_ReturnResult & returnResult*/); 00777 00778 virtual BOOL OnReceivedReturnError( 00779 int errorCode, 00780 X880_ReturnError & returnError 00781 ); 00782 00783 BOOL OnReceivedInvokeReturnError ( 00784 int errorCode, 00785 const bool timerExpiry = false 00786 ); 00787 00788 void OnReceivedCIGetCIPLResult( 00789 X880_ReturnResult & returnResult 00790 ); 00791 00792 BOOL OnReceivedGetCIPLReturnError( 00793 int errorCode, 00794 const bool timerExpiry = false 00795 ); 00796 00797 void IntrudeCall(int CICL ); 00798 00799 void AwaitSetupResponse( 00800 const PString & token, 00801 const PString & identity 00802 ); 00803 00804 BOOL GetRemoteCallIntrusionProtectionLevel( 00805 const PString & intrusionCallToken, 00806 unsigned intrusionCICL 00807 ); 00808 00809 void SetIntrusionImpending(); 00810 00811 void SetForcedReleaseAccepted(); 00812 00813 void SetIntrusionNotAuthorized(); 00814 00815 virtual BOOL OnReceivedReject( 00816 int problemType, 00817 int problemNumber 00818 ); 00819 00822 enum State { 00823 e_ci_Idle, 00824 e_ci_WaitAck, 00825 e_ci_GetCIPL, 00826 e_ci_OrigInvoked, 00827 e_ci_OrigIsolated, 00828 e_ci_DestNotify, 00829 e_ci_DestInvoked, 00830 e_ci_DestIsolated, 00831 e_ci_DestWOB, 00832 e_ci_IsolationRequest, 00833 e_ci_ForcedReleaseRequest, 00834 e_ci_WOBRequest 00835 }; 00836 00838 enum Generate{ 00839 e_ci_gIdle, 00840 e_ci_gConferenceRequest, 00841 e_ci_gHeldRequest, 00842 e_ci_gSilentMonitorRequest, 00843 e_ci_gIsolationRequest, 00844 e_ci_gForcedReleaseRequest, 00845 e_ci_gWOBRequest 00846 }; 00847 00849 enum SendState{ 00850 e_ci_sIdle, 00851 e_ci_sAttachToSetup, 00852 e_ci_sAttachToAlerting, 00853 e_ci_sAttachToConnect, 00854 e_ci_sAttachToReleseComplete 00855 }; 00856 00858 enum ReturnState{ 00859 e_ci_rIdle, 00860 e_ci_rCallIntrusionImpending, 00861 e_ci_rCallIntruded, 00862 e_ci_rCallIsolated, 00863 e_ci_rCallForceReleased, 00864 e_ci_rCallForceReleaseResult, 00865 e_ci_rCallIntrusionComplete, 00866 e_ci_rCallIntrusionEnd, 00867 e_ci_rNotBusy, 00868 e_ci_rTempUnavailable, 00869 e_ci_rNotAuthorized 00870 }; 00871 00874 State GetState() const { return ciState; } 00875 00878 void StartciTimer(const PTimeInterval value) { ciTimer = value; } 00879 00882 void StopciTimer(); 00883 00886 BOOL IsctTimerRunning() { return ciTimer.IsRunning(); } 00887 00890 PDECLARE_NOTIFIER(PTimer, H45011Handler, OnCallIntrudeTimeOut); 00891 00892 protected: 00893 State ciState; // Call state of this connection 00894 PTimer ciTimer; // Call Intrusion Timer - Handles all six timers CI-T1 to CI-T6, 00895 PString intrudingCallToken; 00896 PString intrudingCallIdentity; 00897 PString activeCallToken; 00898 ReturnState ciReturnState; 00899 SendState ciSendState; 00900 Generate ciGenerateState; 00901 int ciCICL; 00902 unsigned intrudingCallCICL; 00903 }; 00904 00905 00906 #endif // __OPAL_H450PDU_H 00907 00908

Generated on Sat Jul 24 17:03:33 2004 for OpenH323 by doxygen 1.3.7