Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | 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 Tue Mar 15 11:17:04 2005 for OpenH323 by  doxygen 1.4.0