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  * $Revision: 21293 $
00027  * $Author: rjongbloed $
00028  * $Date: 2008-10-12 23:24:41 +0000 (Sun, 12 Oct 2008) $
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;             // Next available invoke ID for H450 operations
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;    // Stores the call token for the transferring connection (if there is one)
00511     PString transferringCallIdentity; // Stores the call identity for the transferring call (if there is one)
00512     State   ctState;                  // Call Transfer state of the conneciton
00513     PBoolean    ctResponseSent;           // Has a callTransferSetupReturnResult been sent?
00514     PTimer  ctTimer;                  // Call Transfer Timer - Handles all four timers CT-T1,
00515     PString CallToken;                // Call Token of the associated connection 
00516                                       // (used during a consultation transfer).
00517     PBoolean consultationTransfer;        // Flag used to indicate whether an incoming call is involved in
00518                                       // a transfer through consultation.
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;  // Call Hold state of this connection
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;  // Call Waiting state of this connection
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;  // Message waiting state of this connection
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(/*X880_ReturnResult & returnResult*/);
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;               // Call state of this connection
00913     PTimer      ciTimer;               // Call Intrusion Timer - Handles all six timers CI-T1 to CI-T6,
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 

Generated on Mon Feb 1 00:25:47 2010 for OPAL by  doxygen 1.5.1