From 19471f4a8f35654870492dae2a376595b7b1f1ec Mon Sep 17 00:00:00 2001 From: jeremy Date: Sat, 20 Mar 2004 14:14:00 +0000 Subject: [PATCH] try to work around CCM interop, UNTESTED! Someone with a CCM needs to test this git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2497 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/h323/ast_h323.cpp | 61 ++++++++++++++++++++++++++++++++-- channels/h323/ast_h323.h | 21 +++++++++++- channels/h323/h323.conf.sample | 12 ++----- 3 files changed, 80 insertions(+), 14 deletions(-) diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp index e55b93825..9dbc1aa6f 100755 --- a/channels/h323/ast_h323.cpp +++ b/channels/h323/ast_h323.cpp @@ -687,7 +687,7 @@ H323Channel * MyH323Connection::CreateRealTimeLogicalChannel(const H323Capabilit cout << " -- SessionID: " << sessionID << endl; cout << " -- Direction: " << dir << endl; } - return new H323_ExternalRTPChannel(*this, capability, dir, sessionID, externalIpAddress, externalPort); + return new MyH323_ExternalRTPChannel(*this, capability, dir, sessionID, externalIpAddress, externalPort); } /** This callback function is invoked once upon creation of each @@ -720,6 +720,63 @@ BOOL MyH323Connection::OnStartLogicalChannel(H323Channel & channel) return TRUE; } +/* MyH323_ExternalRTPChannel */ +MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connection, + const H323Capability & capability, + Directions direction, + unsigned sessionID, + const PIPSocket::Address & ip, + WORD dataPort) + : H323_ExternalRTPChannel(connection, capability, direction, sessionID, ip, dataPort) +{ + if (h323debug) { + cout << " == New H.323 ExternalRTPChannel created." << endl; + } + return; +} + +MyH323_ExternalRTPChannel::~MyH323_ExternalRTPChannel() +{ + if (h323debug) { + cout << " == H.323 ExternalRTPChannel deleted." << endl; + } + return; +} + +BOOL MyH323_ExternalRTPChannel::OnReceivedPDU( + const H245_H2250LogicalChannelParameters & param, + unsigned & errorCode) +{ + if (h323debug) { + cout << " MyH323_ExternalRTPChannel::OnReceivedPDU " << endl; + } + return H323_ExternalRTPChannel::OnReceivedPDU( param, errorCode ); +} + +BOOL MyH323_ExternalRTPChannel::OnReceivedAckPDU( + const H245_H2250LogicalChannelAckParameters & param) +{ + + PIPSocket::Address remoteIpAddress; // IP Address of remote endpoint + WORD remotePort; // remote endpoint Data port (control is dataPort+1) + + if (h323debug) { + cout << " MyH323_ExternalRTPChannel::OnReceivedAckPDU " << endl; + } + + if (H323_ExternalRTPChannel::OnReceivedAckPDU( param )) { + GetRemoteAddress(remoteIpAddress, remotePort); + if (h323debug) { + cout << " -- remoteIpAddress: " << remoteIpAddress << endl; + cout << " -- remotePort: " << remotePort << endl; + } + /* Notify Asterisk of remote RTP information */ + on_start_logical_channel(connection.GetCallReference(), (const char *)remoteIpAddress.AsString(), remotePort); + return TRUE; + } + return FALSE; +} + /** IMPLEMENTATION OF C FUNCTIONS */ @@ -1102,5 +1159,3 @@ void h323_native_bridge(const char *token, char *them, char *capability) } /* extern "C" */ - - diff --git a/channels/h323/ast_h323.h b/channels/h323/ast_h323.h index e079d960e..91ebab0ae 100755 --- a/channels/h323/ast_h323.h +++ b/channels/h323/ast_h323.h @@ -253,6 +253,26 @@ class MyH323Connection : public H323Connection { BOOL bridging; // Used to help determine which IP to use }; +class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel { + + PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel); + + public: + + MyH323_ExternalRTPChannel(MyH323Connection &, const H323Capability &, Directions, + unsigned, const PIPSocket::Address &, WORD); + + ~MyH323_ExternalRTPChannel(); + + BOOL OnReceivedPDU( + const H245_H2250LogicalChannelParameters & param, /// Acknowledgement PDU + unsigned & errorCode /// Error on failure + ); + + BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param); + +}; + /** * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint * objected to be created from within that class. (Who owns main() problem). @@ -269,4 +289,3 @@ class MyProcess : public PProcess { }; - diff --git a/channels/h323/h323.conf.sample b/channels/h323/h323.conf.sample index 8d1e6559b..811647a08 100755 --- a/channels/h323/h323.conf.sample +++ b/channels/h323/h323.conf.sample @@ -49,17 +49,14 @@ allow=gsm ; Always allow GSM, it's cool :) ; Default context gets used in siutations where you are using ; the GK routed model or no type=user was found. This gives you ; the ability to either play an invalid message or to simply not -; use user authentication at all. Also, if a call is accepted for -; a prefix or e164 number that cannot be matched to any of the -; following sections, it will be sent here. +; use user authentication at all. ; ;context=default ; ; H.323 Alias definitions ; ; Type 'h323' will register aliases to the endpoint -; and Gatekeeper, if there is one. It will also offer -; itself as a gateway for prefixes. +; and Gatekeeper, if there is one. ; ; Example: if someone calls time@your.asterisk.box.com ; Asterisk will send the call to the extension 'time' @@ -72,11 +69,6 @@ allow=gsm ; Always allow GSM, it's cool :) ; Keyword's 'prefix' and 'e164' are only make sense when ; used with a gatekeeper. You can specify either a prefix ; or E.164 this endpoint is responsible for terminating. -; In the case of a prefix or e164, the context specified -; in that section will receive the called extension. E164 -; numbers are matched before prefixes, so you can have -; a prefix covering a general case, and a specific E164 in -; another context. ; ; Example: The H.323 alias 'det-gw' will tell the gatekeeper ; to route any call with the prefix 1248 to this alias. Keyword