/* * sigmsg.h * * Structures to hold and process signaling messages * * Copyright (c) 2005, Michal Zygmuntowicz * * This work is published under the GNU Public License (GPL) * see file COPYING for details. * We also explicitely grant the right to link this code * with the OpenH323 library. */ #ifndef SIGMSG_H #define SIGMSG_H "@(#) $Id: sigmsg.h,v 1.3 2006/04/14 13:56:19 willamowius Exp $" #include "q931.h" class H225_H323_UserInformation; class H225_Setup_UUIE; class H225_SetupAck_UUIE; class H225_CallProceeding_UUIE; class H225_Alerting_UUIE; class H225_Connect_UUIE; class H225_Progress_UUIE; class H225_Facility_UUIE; class H225_ReleaseComplete_UUIE; class H225_Information_UUIE; class H225_Notify_UUIE; class H225_Status_UUIE; class H225_StatusInquiry_UUIE; /// Base class to hold generic information associated with a signaling message class SignalingMsg { public: virtual ~SignalingMsg(); /// @return a cloned object of this or a derived class virtual SignalingMsg* Clone(); /// @return signaling message type (#Q931::MsgTypes enum#) unsigned GetTag() const; /// @return signaling message type as a string PString GetTagName() const; /// @return CRV associated with the signaling message unsigned GetCallReference() const; /// @return a reference to the Q.931 message stored Q931& GetQ931() const { return *m_q931; } /// @return a pointer to the User-User IE, NULL if not present H225_H323_UserInformation* GetUUIE() const { return m_uuie; } /// Get an address the message has been received on void GetLocalAddr( PIPSocket::Address &addr, WORD &port ) const; void GetLocalAddr( PIPSocket::Address &addr ) const; /// Get an address the message has been received from void GetPeerAddr( PIPSocket::Address &addr, WORD &port ) const; void GetPeerAddr( PIPSocket::Address &addr ) const; /// Set a flag to indicate that the Q.931 message has been modified void SetChanged() { m_changed = true; } /** Set a flag to indicate that the decoded H.225 UserInformation element has been modified and the corresponding Q.931 IE should be recreated. */ void SetUUIEChanged() { m_changed = m_uuieChanged = true; } /// @return true if the Q.931 message has been modified bool IsChanged() const { return m_changed; } /// @return true if the H.225 User Information element has been modified bool IsUUIEChanged() const { return m_uuieChanged; } /** Encode the Q.931 message back into a binary form. @return True if the message has been encoded successfully. */ bool Encode( PBYTEArray &buffer /// buffer to hold the encoded message ); /// factory constructor for signaling messages static SignalingMsg* Create( Q931 *q931pdu, /// this pointer is not cloned and deleted by this class destructor H225_H323_UserInformation *uuie, /// decoded User-User IE const PIPSocket::Address &localAddr, /// an address the message has been received on WORD localPort, /// a port number the message has been received on const PIPSocket::Address &peerAddr, /// an address the message has been received from WORD peerPort /// a port number the message has been received from ); protected: SignalingMsg( Q931 *q931pdu, /// this pointer is not cloned and deleted by this class destructor H225_H323_UserInformation *uuie, /// decoded User-User IE const PIPSocket::Address &localAddr, /// an address the message has been received on WORD localPort, /// a port number the message has been received on const PIPSocket::Address &peerAddr, /// an address the message has been received from WORD peerPort /// a port number the message has been received from ); private: SignalingMsg(); SignalingMsg(const SignalingMsg&); public: SignalingMsg& operator=(const SignalingMsg&); protected: Q931 *m_q931; /// whole Q.931 message H225_H323_UserInformation *m_uuie; /// User-User IE element of the Q.931 msg PIPSocket::Address m_localAddr; /// local IP address the msg arrived to WORD m_localPort; /// local port number the msg arrived to PIPSocket::Address m_peerAddr; /// remote IP address the msg arrived from WORD m_peerPort; /// remote port number the msg arrived from bool m_changed; /// indicate changes to the Q.931 message bool m_uuieChanged; /// indicate changes to the H.225 User Information element }; /// Specialized template for a particular H.225.0 signaling message template class H225SignalingMsg : public SignalingMsg { public: /// Build a new SignalingMsg H225SignalingMsg( Q931 *q931pdu, /// this pointer is not cloned and deleted by this class destructor H225_H323_UserInformation *uuie, /// decoded User-User IE UUIE& uuieBody, /// decoded UUIE body const PIPSocket::Address &localAddr, /// an address the message has been received on WORD localPort, /// a port number the message has been received on const PIPSocket::Address &peerAddr, /// an address the message has been received from WORD peerPort /// a port number the message has been received from ) : SignalingMsg(q931pdu, uuie, localAddr, localPort, peerAddr, peerPort), m_uuieBody(uuie->m_h323_uu_pdu.m_h323_message_body) {} UUIE& GetUUIEBody() const { return m_uuieBody; } virtual SignalingMsg* Clone() { H225_H323_UserInformation *uuieClone = (H225_H323_UserInformation*)(m_uuie->Clone()); return new H225SignalingMsg(new Q931(*m_q931), uuieClone, (UUIE&)(uuieClone->m_h323_uu_pdu.m_h323_message_body), m_localAddr, m_localPort, m_peerAddr, m_peerPort ); } private: H225SignalingMsg(); H225SignalingMsg(const H225SignalingMsg&); H225SignalingMsg& operator=(const H225SignalingMsg&); protected: UUIE &m_uuieBody; /// H.225.0 UUIE structure associated with the message }; typedef H225SignalingMsg SetupMsg; typedef H225SignalingMsg AlertingMsg; typedef H225SignalingMsg CallProceedingMsg; typedef H225SignalingMsg ConnectMsg; typedef H225SignalingMsg ProgressMsg; typedef H225SignalingMsg ReleaseCompleteMsg; typedef H225SignalingMsg InformationMsg; typedef H225SignalingMsg FacilityMsg; //typedef H225SignalingMsg NotifyMsg; //typedef H225SignalingMsg StatusMsg; //typedef H225SignalingMsg StatusInquiryMsg; #endif // SIGMSG_H