diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 825f6091a..135de63d6 100755 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -232,6 +232,8 @@ static struct oh323_user *build_user(char *name, struct ast_variable *v) strncpy(user->context, v->value, sizeof(user->context)-1); } else if (!strcasecmp(v->name, "bridge")) { user->bridge = ast_true(v->value); + } else if (!strcasecmp(v->name, "nat")) { + user->nat = ast_true(v->value); } else if (!strcasecmp(v->name, "noFastStart")) { user->noFastStart = ast_true(v->value); } else if (!strcasecmp(v->name, "noH245Tunneling")) { @@ -497,6 +499,14 @@ static struct ast_frame *oh323_rtp_read(struct oh323_pvt *p) /* Retrieve audio/etc from channel. Assumes p->lock is already held. */ struct ast_frame *f; static struct ast_frame null_frame = { AST_FRAME_NULL, }; + + /* Only apply it for the first packet, we just need the correct ip/port */ + if(p->nat) + { + ast_rtp_setnat(p->rtp,p->nat); + p->nat = 0; + } + f = ast_rtp_read(p->rtp); /* Don't send RFC2833 if we're not supposed to */ if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & H323_DTMF_RFC2833)) @@ -1031,6 +1041,7 @@ int setup_incoming_call(call_details_t cd) } strncpy(p->context, user->context, sizeof(p->context)-1); p->bridge = user->bridge; + p->nat = user->nat; if (strlen(user->callerid)) strncpy(p->callerid, user->callerid, sizeof(p->callerid) - 1); @@ -1056,9 +1067,7 @@ int setup_incoming_call(call_details_t cd) /* I know this is horrid, don't kill me saddam */ exit: /* allocate a channel and tell asterisk about it */ - printf("exten b4: %s\n", p->exten); c = oh323_new(p, AST_STATE_RINGING, cd.call_token); - if (!c) { ast_log(LOG_ERROR, "Couldn't create channel. This is bad\n"); return 0; @@ -1089,61 +1098,6 @@ if (!p) { } #endif - -/* Call-back function that gets called on transfer - * - * Returns 1 on success - */ -int setup_transfer_call(unsigned call_reference, const char *extension) -{ - struct oh323_pvt *p; - struct ast_channel *c = NULL; - char exten[AST_MAX_EXTENSION]; - char *context; - - p = find_call(call_reference); - - if (!p) { - ast_log(LOG_WARNING, "No such call %d.\n", call_reference); - return -1; - } - - if (!p->owner) { - ast_log(LOG_WARNING, "Call %d has no owner.\n", call_reference); - return -1; - } - - memcpy(exten, extension, sizeof(exten)); - - c = p->owner; - if (c && c->bridge) { - strncpy(exten, extension, sizeof(exten) - 1); - context = strchr(exten, '@'); - if (context) { - *context = '\0'; - context++; - } else - context = c->context; - if (!strlen(context)) - context = c->bridge->context; - if (ast_exists_extension(c->bridge, context, exten, 1, c->bridge->callerid)) { - - ast_log(LOG_NOTICE, "Transfering call %s to %s@%s.\n", c->bridge->name, exten, context); - - if (!ast_async_goto(c->bridge, context, exten, 1, 1)) - return 1; - - ast_log(LOG_WARNING, "Failed to transfer.\n"); - } else { - ast_log(LOG_WARNING, "No such extension '%s' exists.\n", exten); - } - } else { - ast_log(LOG_WARNING, "There is no call to transfer\n"); - } - return 0; -} - - /** * Call-back function that gets called for each rtp channel opened * @@ -1768,8 +1722,7 @@ int load_module() /* Register our callback functions */ h323_callback_register(setup_incoming_call, - setup_outgoing_call, - setup_transfer_call, + setup_outgoing_call, create_connection, setup_rtp_connection, cleanup_connection, diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp index 6ee771a42..87d767c6c 100755 --- a/channels/h323/ast_h323.cpp +++ b/channels/h323/ast_h323.cpp @@ -407,49 +407,6 @@ H323Connection * MyH323EndPoint::CreateConnection(unsigned callReference, void * return new MyH323Connection(*this, callReference, options); } -H323Connection * MyH323EndPoint::SetupTransfer(const PString & token, - const PString & callIdentity, - const PString & remoteParty, - PString & newToken, - void * userData) -{ - PString alias; - H323TransportAddress address; - - H323Connection * connection; - - if (h323debug) { - cout << " -- Setup transfer of " << callIdentity << ":" << endl; - cout << " -- Call from " << token << endl; - cout << " -- Remote Party " << remoteParty << endl; - } - - connection = FindConnectionWithLock(token); - - if (connection != NULL) { - unsigned int old_call_reference = connection->GetCallReference(); - - if (h323debug) - cout << " -- Old call reference " << old_call_reference << endl; - connection->Unlock(); - - if (on_transfer_call(old_call_reference, remoteParty)) { - if (h323debug) - cout << " -- Transfer succeded " << endl; - if (connection->ClearCall(H323Connection::EndedByCallForwarded)) - return NULL; - return NULL; - } - } - if (h323debug) - cout << " -- Transfer failed " << endl; - - if (connection != NULL) { - return connection; - } - return NULL; -} - /* MyH323Connection */ MyH323Connection::MyH323Connection(MyH323EndPoint & ep, unsigned callReference, @@ -796,7 +753,6 @@ void h323_debug(int flag, unsigned level) /** Installs the callback functions on behalf of the PBX application */ void h323_callback_register(setup_incoming_cb ifunc, setup_outbound_cb sfunc, - setup_transfer_cb tfunc, on_connection_cb confunc, start_logchan_cb lfunc, clear_con_cb clfunc, @@ -805,7 +761,6 @@ void h323_callback_register(setup_incoming_cb ifunc, { on_incoming_call = ifunc; on_outgoing_call = sfunc; - on_transfer_call = tfunc; on_create_connection = confunc; on_start_logical_channel = lfunc; on_connection_cleared = clfunc; diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h index c1f5a90cf..78d7fd4ec 100755 --- a/channels/h323/chan_h323.h +++ b/channels/h323/chan_h323.h @@ -131,11 +131,6 @@ setup_incoming_cb on_incoming_call; typedef int (*setup_outbound_cb)(call_details_t); setup_outbound_cb on_outgoing_call; -/* This is a callback prototype function, called upon - a transfer. */ -typedef int (*setup_transfer_cb)(unsigned int, const char *); -setup_transfer_cb on_transfer_call; - /* This is a callback prototype function, called when the openh323 OnStartLogicalChannel is invoked. */ typedef void (*start_logchan_cb)(unsigned int, const char *, int); @@ -171,7 +166,6 @@ extern "C" { /* callback function handler*/ void h323_callback_register(setup_incoming_cb, setup_outbound_cb, - setup_transfer_cb, on_connection_cb, start_logchan_cb, clear_con_cb,