aboutsummaryrefslogtreecommitdiffstats
path: root/channels/h323
diff options
context:
space:
mode:
Diffstat (limited to 'channels/h323')
-rwxr-xr-xchannels/h323/ast_h323.cpp114
-rwxr-xr-xchannels/h323/ast_h323.h68
-rwxr-xr-xchannels/h323/chan_h323.h38
3 files changed, 157 insertions, 63 deletions
diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp
index 867ccd9e6..9bb122fc6 100755
--- a/channels/h323/ast_h323.cpp
+++ b/channels/h323/ast_h323.cpp
@@ -218,8 +218,7 @@ H323Codec * AST_G729ACapability::CreateCodec(H323Codec::Direction direction) con
* transport = ip.
* port = 1720.
*/
-int MyH323EndPoint::MakeCall(const PString & dest, PString & token,
- unsigned int *callReference, unsigned int port, char *callerid)
+int MyH323EndPoint::MakeCall(const PString & dest, PString & token, unsigned int *callReference, unsigned int port, char *callerid, char *callername)
{
PString fullAddress;
MyH323Connection * connection;
@@ -245,6 +244,15 @@ int MyH323EndPoint::MakeCall(const PString & dest, PString & token,
if (callerid)
connection->SetLocalPartyName(PString(callerid));
+ if (callername) {
+ localAliasNames.RemoveAll();
+ connection->SetLocalPartyName(PString(callername));
+ if (callerid)
+ localAliasNames.AppendString(PString(callerid));
+ } else if (callerid) {
+ localAliasNames.RemoveAll();
+ connection->SetLocalPartyName(PString(callerid));
+ }
connection->Unlock();
@@ -486,7 +494,7 @@ H323Connection::AnswerCallResponse MyH323Connection::OnAnswerCall(const PString
{
/* The call will be answered later with "AnsweringCall()" function.
*/
- return H323Connection::AnswerCallAlertWithMedia;
+ return H323Connection::AnswerCallDeferred;
}
BOOL MyH323Connection::OnAlerting(const H323SignalPDU & /*alertingPDU*/, const PString & username)
@@ -495,6 +503,7 @@ BOOL MyH323Connection::OnAlerting(const H323SignalPDU & /*alertingPDU*/, const
if (h323debug) {
cout << " -- Ringing phone for \"" << username << "\"" << endl;
}
+ on_chan_ringing(GetCallReference());
return TRUE;
}
@@ -508,6 +517,7 @@ BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU)
call_details_t cd;
PString sourceE164;
PString destE164;
+ PString sourceName;
PString sourceAliases;
PString destAliases;
PIPSocket::Address Ip;
@@ -519,6 +529,8 @@ BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU)
sourceE164 = "";
setupPDU.GetSourceE164(sourceE164);
+ sourceName = "";
+ sourceName=setupPDU.GetQ931().GetDisplayName();
destE164 = "";
setupPDU.GetDestinationE164(destE164);
@@ -540,6 +552,7 @@ BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU)
cd.call_dest_alias = (const char *)destAliases;
cd.call_source_e164 = (const char *)sourceE164;
cd.call_dest_e164 = (const char *)destE164;
+ cd.call_source_name = (const char *)sourceName;
GetSignallingChannel()->GetRemoteAddress().GetIpAndPort(Ip, sourcePort);
cd.sourceIp = (const char *)Ip.AsString();
@@ -727,11 +740,11 @@ BOOL MyH323Connection::OnStartLogicalChannel(H323Channel & channel)
/* MyH323_ExternalRTPChannel */
MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connection,
- const H323Capability & capability,
- Directions direction,
- unsigned sessionID,
- const PIPSocket::Address & ip,
- WORD dataPort)
+ const H323Capability & capability,
+ Directions direction,
+ unsigned sessionID,
+ const PIPSocket::Address & ip,
+ WORD dataPort)
: H323_ExternalRTPChannel(connection, capability, direction, sessionID, ip, dataPort)
{
if (h323debug) {
@@ -740,6 +753,24 @@ MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connecti
return;
}
+MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connection,
+ const H323Capability & capability,
+ Directions direction,
+ unsigned id)
+ : H323_ExternalRTPChannel::H323_ExternalRTPChannel(connection, capability, direction, id)
+{
+}
+
+MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connection,
+ const H323Capability & capability,
+ Directions direction,
+ unsigned id,
+ const H323TransportAddress & data,
+ const H323TransportAddress & control)
+ : H323_ExternalRTPChannel::H323_ExternalRTPChannel(connection, capability, direction, id, data, control)
+{
+}
+
MyH323_ExternalRTPChannel::~MyH323_ExternalRTPChannel()
{
if (h323debug) {
@@ -748,29 +779,17 @@ MyH323_ExternalRTPChannel::~MyH323_ExternalRTPChannel()
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)
+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)
+ PIPSocket::Address remoteIpAddress;
+ WORD remotePort;
if (h323debug) {
cout << " MyH323_ExternalRTPChannel::OnReceivedAckPDU " << endl;
}
- if (H323_ExternalRTPChannel::OnReceivedAckPDU( param )) {
- GetRemoteAddress(remoteIpAddress, remotePort);
+ if (H323_ExternalRTPChannel::OnReceivedAckPDU(param)) {
+ H323_ExternalRTPChannel::GetRemoteAddress(remoteIpAddress, remotePort);
if (h323debug) {
cout << " -- remoteIpAddress: " << remoteIpAddress << endl;
cout << " -- remotePort: " << remotePort << endl;
@@ -838,7 +857,8 @@ void h323_callback_register(setup_incoming_cb ifunc,
on_connection_cb confunc,
start_logchan_cb lfunc,
clear_con_cb clfunc,
- con_established_cb efunc,
+ chan_ringing_cb rfunc,
+ con_established_cb efunc,
send_digit_cb dfunc)
{
on_incoming_call = ifunc;
@@ -846,6 +866,7 @@ void h323_callback_register(setup_incoming_cb ifunc,
on_create_connection = confunc;
on_start_logical_channel = lfunc;
on_connection_cleared = clfunc;
+ on_chan_ringing = rfunc;
on_connection_established = efunc;
on_send_digit = dfunc;
}
@@ -1085,7 +1106,7 @@ int h323_make_call(char *host, call_details_t *cd, call_options_t call_options)
PString dest(host);
- res = endPoint->MakeCall(dest, token, &cd->call_reference, call_options.port, call_options.callerid);
+ res = endPoint->MakeCall(dest, token, &cd->call_reference, call_options.port, call_options.callerid, call_options.callername);
memcpy((char *)(cd->call_token), (const unsigned char *)token, token.GetLength());
return res;
@@ -1101,6 +1122,45 @@ int h323_clear_call(const char *call_token)
return 0;
};
+/* Send Alerting PDU to H.323 caller */
+int h323_send_alerting(const char *token)
+{
+ const PString currentToken(token);
+ H323Connection * connection;
+
+ connection = endPoint->FindConnectionWithLock(currentToken);
+
+ if (!connection) {
+ cout << "No connection found for " << token << endl;
+ return -1;
+ }
+
+ connection->AnsweringCall(H323Connection::AnswerCallPending);
+ connection->Unlock();
+
+ return 0;
+
+}
+
+/* Send Progress PDU to H.323 caller */
+int h323_send_progress(const char *token)
+{
+ const PString currentToken(token);
+ H323Connection * connection;
+
+ connection = endPoint->FindConnectionWithLock(currentToken);
+
+ if (!connection) {
+ cout << "No connection found for " << token << endl;
+ return -1;
+ }
+
+ connection->AnsweringCall(H323Connection::AnswerCallDeferredWithMedia);
+ connection->Unlock();
+
+ return 0;
+}
+
/** This function tells the h.323 stack to either
answer or deny an incoming call */
int h323_answering_call(const char *token, int busy)
diff --git a/channels/h323/ast_h323.h b/channels/h323/ast_h323.h
index 91ebab0ae..966edabe8 100755
--- a/channels/h323/ast_h323.h
+++ b/channels/h323/ast_h323.h
@@ -198,7 +198,7 @@ class MyH323EndPoint : public H323EndPoint {
public:
- int MakeCall(const PString &, PString &, unsigned int *, unsigned int, char *);
+ int MakeCall(const PString &, PString &, unsigned int *, unsigned int, char *, char *s);
BOOL ClearCall(const PString &);
void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
@@ -225,8 +225,10 @@ class MyH323Connection : public H323Connection {
MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
~MyH323Connection();
- H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, H323Channel::Directions, unsigned,
- const H245_H2250LogicalChannelParameters *);
+ H323Channel * CreateRealTimeLogicalChannel(const H323Capability &,
+ H323Channel::Directions,
+ unsigned,
+ const H245_H2250LogicalChannelParameters *);
H323Connection::AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
void OnReceivedReleaseComplete(const H323SignalPDU &);
BOOL OnAlerting(const H323SignalPDU &, const PString &);
@@ -245,33 +247,53 @@ class MyH323Connection : public H323Connection {
PString sourceE164;
PString destE164;
- PIPSocket::Address externalIpAddress; // IP address of media server
- PIPSocket::Address remoteIpAddress; // IP Address of remote endpoint
- WORD externalPort; // local media server Data port (control is dataPort+1)
- WORD remotePort; // remote endpoint Data port (control is dataPort+1)
- WORD sessionId;
- BOOL bridging; // Used to help determine which IP to use
+ PIPSocket::Address externalIpAddress;
+ PIPSocket::Address remoteIpAddress;
+ WORD externalPort;
+ WORD remotePort;
+ WORD sessionId;
+ BOOL bridging;
};
class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel {
- PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
-
- public:
-
- MyH323_ExternalRTPChannel(MyH323Connection &, const H323Capability &, Directions,
- unsigned, const PIPSocket::Address &, WORD);
-
+ PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
+
+ public:
+ MyH323_ExternalRTPChannel(
+ MyH323Connection & connection,
+ const H323Capability & capability,
+ Directions direction,
+ unsigned sessionID);
+
+ MyH323_ExternalRTPChannel(
+ MyH323Connection & connection,
+ const H323Capability & capability,
+ Directions direction,
+ unsigned sessionID,
+ const H323TransportAddress & data,
+ const H323TransportAddress & control);
+
+ /* Create a new channel. */
+ MyH323_ExternalRTPChannel(
+ MyH323Connection & connection,
+ const H323Capability & capability,
+ Directions direction,
+ unsigned sessionID,
+ const PIPSocket::Address & ip,
+ WORD dataPort);
+
+ /* Destructor */
~MyH323_ExternalRTPChannel();
- BOOL OnReceivedPDU(
- const H245_H2250LogicalChannelParameters & param, /// Acknowledgement PDU
- unsigned & errorCode /// Error on failure
- );
-
- BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
+
+ BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
-};
+ PIPSocket::Address externalIpAddress;
+ PIPSocket::Address remoteIpAddress;
+ WORD externalPort;
+ WORD remotePort;
+};
/**
* The MyProcess is a necessary descendant PProcess class so that the H323EndPoint
diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h
index 959d79d76..198247cc0 100755
--- a/channels/h323/chan_h323.h
+++ b/channels/h323/chan_h323.h
@@ -85,10 +85,11 @@ struct oh323_alias {
PBX application and passed through make_call
function*/
typedef struct call_options {
- char *callerid;
- int noFastStart;
- int noH245Tunnelling;
- int noSilenceSuppression;
+ char *callerid;
+ char *callername;
+ int noFastStart;
+ int noH245Tunnelling;
+ int noSilenceSuppression;
unsigned int port;
} call_options_t;
@@ -101,6 +102,7 @@ typedef struct call_details {
const char *call_token;
const char *call_source_aliases;
const char *call_dest_alias;
+ const char *call_source_name;
const char *call_source_e164;
const char *call_dest_e164;
const char *sourceIp;
@@ -136,6 +138,11 @@ setup_outbound_cb on_outgoing_call;
typedef void (*start_logchan_cb)(unsigned int, const char *, int);
start_logchan_cb on_start_logical_channel;
+/* This is a callback prototype function, called when openh323
+ OnAlerting is invoked */
+typedef void (*chan_ringing_cb)(unsigned);
+chan_ringing_cb on_chan_ringing;
+
/* This is a callback protoype function, called when the openh323
OnConnectionEstablished is inovked */
typedef void (*con_established_cb)(unsigned);
@@ -164,13 +171,14 @@ extern "C" {
void h323_debug(int, unsigned);
/* callback function handler*/
- void h323_callback_register(setup_incoming_cb,
- setup_outbound_cb,
- on_connection_cb,
- start_logchan_cb,
- clear_con_cb,
- con_established_cb,
- send_digit_cb);
+ void h323_callback_register(setup_incoming_cb,
+ setup_outbound_cb,
+ on_connection_cb,
+ start_logchan_cb,
+ clear_con_cb,
+ chan_ringing_cb,
+ con_established_cb,
+ send_digit_cb);
int h323_set_capability(int, int);
@@ -191,9 +199,13 @@ extern "C" {
/* H323 create and destroy sessions */
int h323_make_call(char *host, call_details_t *cd, call_options_t);
int h323_clear_call(const char *);
+
+ /* H.323 alerting and progress */
+ int h323_send_alerting(const char *token);
+ int h323_send_progress(const char *token);
+
int h323_answering_call(const char *token, int);
- int h323_soft_hangup(const char *data);
-
+ int h323_soft_hangup(const char *data);
int h323_show_codec(int fd, int argc, char *argv[]);