diff --git a/channels/chan_h323.c b/channels/chan_h323.c index a4a9459b173ee01a38f06a1ab16e87fc17016528..9998e49f1f20c78f316a351fbd8cdff415063e37 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -78,6 +78,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/cli.h" #include "asterisk/dsp.h" #include "asterisk/causes.h" +#include "asterisk/stringfields.h" #ifdef __cplusplus } #endif @@ -101,13 +102,14 @@ setcapabilities_cb on_setcapabilities; int h323debug; /** Variables required by Asterisk */ -static const char type[] = "H323"; static const char desc[] = "The NuFone Network's Open H.323 Channel Driver"; static const char tdesc[] = "The NuFone Network's Open H.323 Channel Driver"; static const char config[] = "h323.conf"; static char default_context[AST_MAX_CONTEXT] = "default"; static struct sockaddr_in bindaddr; +#define GLOBAL_CAPABILITY (AST_FORMAT_G723_1 | AST_FORMAT_GSM | AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_G729A | AST_FORMAT_H261) + /** H.323 configuration values */ static int h323_signalling_port = 1720; static char gatekeeper[100]; @@ -206,9 +208,9 @@ static int oh323_indicate(struct ast_channel *c, int condition); static int oh323_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static const struct ast_channel_tech oh323_tech = { - .type = type, + .type = "H323", .description = tdesc, - .capabilities = AST_FORMAT_ULAW, + .capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1), .properties = AST_CHAN_TP_WANTSJITTER, .requester = oh323_request, .send_digit = oh323_digit, @@ -496,7 +498,7 @@ static int oh323_hangup(struct ast_channel *c) if (c->hangupcause) { q931cause = c->hangupcause; } else { - char *cause = pbx_builtin_getvar_helper(c, "DIALSTATUS"); + const char *cause = pbx_builtin_getvar_helper(c, "DIALSTATUS"); if (cause) { if (!strcmp(cause, "CONGESTION")) { q931cause = AST_CAUSE_NORMAL_CIRCUIT_CONGESTION; @@ -735,14 +737,13 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c ast_mutex_lock(&pvt->lock); if (ch) { ch->tech = &oh323_tech; - snprintf(ch->name, sizeof(ch->name), "H323/%s", host); + ast_string_field_build(ch, name, "H323/%s", host); ch->nativeformats = pvt->options.capability; if (!ch->nativeformats) { ch->nativeformats = global_options.capability; } pvt->nativeformats = ch->nativeformats; fmt = ast_best_codec(ch->nativeformats); - ch->type = type; ch->fds[0] = ast_rtp_fd(pvt->rtp); if (state == AST_STATE_RING) { ch->rings = 1; @@ -765,7 +766,7 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c strncpy(ch->exten, pvt->exten, sizeof(ch->exten) - 1); ch->priority = 1; if (!ast_strlen_zero(pvt->accountcode)) { - strncpy(ch->accountcode, pvt->accountcode, sizeof(ch->accountcode) - 1); + ast_string_field_set(ch, accountcode, pvt->accountcode); } if (pvt->amaflags) { ch->amaflags = pvt->amaflags; @@ -1234,7 +1235,6 @@ void setup_rtp_connection(unsigned call_reference, const char *remoteIp, int rem */ void connection_made(unsigned call_reference, const char *token) { - struct ast_channel *c = NULL; struct oh323_pvt *pvt; if (h323debug) @@ -1436,7 +1436,6 @@ int setup_outgoing_call(call_details_t *cd) */ void chan_ringing(unsigned call_reference, const char *token) { - struct ast_channel *c = NULL; struct oh323_pvt *pvt; if (h323debug) @@ -1479,7 +1478,7 @@ static void cleanup_connection(unsigned call_reference, const char *call_token) break; #if 1 #ifdef DEBUG_THREADS - ast_log(LOG_NOTICE, "Avoiding H.323 destory deadlock on %s, locked at %ld/%d by %s (%s:%d)\n", call_token, pvt->owner->lock.thread, pvt->owner->lock.reentrancy, pvt->owner->lock.func, pvt->owner->lock.file, pvt->owner->lock.lineno); + ast_log(LOG_NOTICE, "Avoiding H.323 destory deadlock on %s, locked at %ld/%d by %s (%s:%d)\n", call_token, pvt->owner->lock.thread[0], pvt->owner->lock.reentrancy, pvt->owner->lock.func[0], pvt->owner->lock.file[0], pvt->owner->lock.lineno[0]); #else ast_log(LOG_NOTICE, "Avoiding H.323 destory deadlock on %s\n", call_token); #endif @@ -2026,7 +2025,7 @@ int reload_config(void) memset(&global_options, 0, sizeof(global_options)); global_options.dtmfcodec = 101; global_options.dtmfmode = H323_DTMF_RFC2833; - global_options.capability = ~0; /* All capabilities */ + global_options.capability = GLOBAL_CAPABILITY; global_options.bridge = 1; /* Do native bridging by default */ v = ast_variable_browse(cfg, "general"); while(v) { @@ -2282,7 +2281,7 @@ static char *convertcap(int cap) } } -static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs) +static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active) { /* XXX Deal with Video */ struct oh323_pvt *pvt; @@ -2308,7 +2307,7 @@ static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, str } static struct ast_rtp_protocol oh323_rtp = { - .type = type, + .type = "H323", .get_rtp_info = oh323_get_rtp_peer, .get_vrtp_info = oh323_get_vrtp_peer, .set_rtp_peer= oh323_set_rtp_peer, @@ -2334,7 +2333,7 @@ int load_module() } else { /* Make sure we can register our channel type */ if (ast_channel_register(&oh323_tech)) { - ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); + ast_log(LOG_ERROR, "Unable to register channel class 'H323'\n"); h323_end_process(); return -1; } diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp index bb41450886f47765fed107a316b991b3000e42cf..4a0db06f5505a53d507f7d6b712a3095286e175f 100644 --- a/channels/h323/ast_h323.cpp +++ b/channels/h323/ast_h323.cpp @@ -1,4 +1,6 @@ +#ifndef _GNU_SOURCE #define _GNU_SOURCE +#endif /* * ast_h323.cpp *