chan_h323.c
来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 2,305 行 · 第 1/5 页
C
2,305 行
{ strncpy(gAccountcode, v->value, sizeof(gAccountcode)-1); }else if (!strcasecmp(v->name, "disallow")) { ast_parse_allow_disallow(&gPrefs, &gCapability, v->value, 0); }else if (!strcasecmp(v->name, "allow")) { ast_parse_allow_disallow(&gPrefs, &gCapability, v->value, 1); } else if (!strcasecmp(v->name, "dtmfmode")) { if (!strcasecmp(v->value, "inband")) gDTMFMode=H323_DTMF_INBAND; else if (!strcasecmp(v->value, "rfc2833")) gDTMFMode = H323_DTMF_RFC2833; else if (!strcasecmp(v->value, "q931keypad")) gDTMFMode = H323_DTMF_Q931; else if (!strcasecmp(v->value, "h245alphanumeric")) gDTMFMode = H323_DTMF_H245ALPHANUMERIC; else if (!strcasecmp(v->value, "h245signal")) gDTMFMode = H323_DTMF_H245SIGNAL; else { ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n", v->value); gDTMFMode = H323_DTMF_RFC2833; } } v = v->next; } cat = ast_category_browse(cfg, NULL); while(cat) { if(strcasecmp(cat, "general")) { utype = ast_variable_retrieve(cfg, cat, "type"); if(utype) { if(!strcmp(utype, "user") || !strcasecmp(utype, "friend")) { user = build_user(cat, ast_variable_browse(cfg, cat)); if (user) { ast_mutex_lock(&userl.lock); user->next = userl.users; userl.users = user; ast_mutex_unlock(&userl.lock); }else { ast_log(LOG_WARNING, "Failed to build user %s\n", cat); } } if(!strcasecmp(utype, "peer") || !strcasecmp(utype, "friend")) { peer = build_peer(cat, ast_variable_browse(cfg, cat)); if(peer) { ast_mutex_lock(&userl.lock); peer->next = peerl.peers; peerl.peers = peer; ast_mutex_unlock(&userl.lock); }else { ast_log(LOG_WARNING, "Failed to build peer %s\n", cat); } } } } cat = ast_category_browse(cfg, cat); } ast_config_destroy(cfg); /* Determine ip address if neccessary */ if(!strlen(gIP)) { ooGetLocalIPAddress(gIP); if(!strcmp(gIP, "127.0.0.1")) { ast_log(LOG_NOTICE, "Failed to determine local ip address. Please " "specify it in ooh323.conf. OOH323 Disabled\n"); return 1; } } if(gH323Debug) ast_verbose("+++ reload_config\n"); return 0;}static int ooh323_show_peer(int fd, int argc, char *argv[]){ struct ooh323_peer *prev=NULL, *peer=NULL; char formats[512]; char ip_port[30]; if(argc != 4) return RESULT_SHOWUSAGE; ast_mutex_lock(&peerl.lock); peer = peerl.peers; while(peer) { ast_mutex_lock(&peer->lock); if(!strcmp(peer->name, argv[3])) break; else{ prev = peer; peer = peer->next; ast_mutex_unlock(&prev->lock); } } if(peer) { sprintf(ip_port, "%s:%d", peer->ip, peer->port); ast_cli(fd, "%-15.15s%s\n", "Name: ", peer->name); ast_codec_pref_string(&peer->prefs, formats, 512); ast_cli(fd, "%-15.15s%s\n", "Format Prefs: ", formats); ast_cli(fd, "%-15.15s", "DTMF Mode: "); if(peer->dtmfmode & H323_DTMF_RFC2833) ast_cli(fd, "%s\n", "rfc2833"); else if(peer->dtmfmode & H323_DTMF_Q931) ast_cli(fd, "%s\n", "q931keypad"); else if(peer->dtmfmode & H323_DTMF_H245ALPHANUMERIC) ast_cli(fd, "%s\n", "h245alphanumeric"); else if(peer->dtmfmode & H323_DTMF_H245SIGNAL) ast_cli(fd, "%s\n", "h245signal"); else ast_cli(fd, "%s\n", "unknown"); ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode); ast_cli(fd, "%-15.15s%s\n", "AMA flags: ", ast_cdr_flags2str(peer->amaflags)); ast_cli(fd, "%-15.15s%s\n", "Ip:Port: ", ip_port); ast_cli(fd, "%-15.15s%d\n", "OutgoingLimit: ", peer->outgoinglimit); ast_cli(fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout); ast_mutex_unlock(&peer->lock); } else{ ast_cli(fd, "Peer %s not found\n", argv[3]); ast_cli(fd, "\n"); } ast_mutex_unlock(&peerl.lock); return RESULT_SUCCESS;}static int ooh323_show_peers(int fd, int argc, char *argv[]){ struct ooh323_peer *prev = NULL, *peer=NULL; char formats[512]; char ip_port[30];#define FORMAT "%-15.15s %-15.15s %-23.23s %-s\n" if (argc != 3) return RESULT_SHOWUSAGE; ast_cli(fd, FORMAT, "Name", "Accountcode", "ip:port", "Formats"); ast_mutex_lock(&peerl.lock); peer = peerl.peers; while(peer) { ast_mutex_lock(&peer->lock); sprintf(ip_port, "%s:%d", peer->ip, peer->port); ast_cli(fd, FORMAT, peer->name, peer->accountcode, ip_port, ast_getformatname_multiple(formats,512,peer->capability)); prev = peer; peer = peer->next; ast_mutex_unlock(&prev->lock); } ast_mutex_unlock(&peerl.lock);#undef FORMAT return RESULT_SUCCESS;}static int ooh323_show_user(int fd, int argc, char *argv[]){ struct ooh323_user *prev=NULL, *user=NULL; char formats[512]; if(argc != 4) return RESULT_SHOWUSAGE; ast_mutex_lock(&userl.lock); user = userl.users; while(user) { ast_mutex_lock(&user->lock); if(!strcmp(user->name, argv[3])) break; else{ prev = user; user = user->next; ast_mutex_unlock(&prev->lock); } } if(user) { ast_cli(fd, "%-15.15s%s\n", "Name: ", user->name); ast_codec_pref_string(&user->prefs, formats, 512); ast_cli(fd, "%-15.15s%s\n", "Format Prefs: ",formats); ast_cli(fd, "%-15.15s", "DTMF Mode: "); if(user->dtmfmode & H323_DTMF_RFC2833) ast_cli(fd, "%s\n", "rfc2833"); else if(user->dtmfmode & H323_DTMF_Q931) ast_cli(fd, "%s\n", "q931keypad"); else if(user->dtmfmode & H323_DTMF_H245ALPHANUMERIC) ast_cli(fd, "%s\n", "h245alphanumeric"); else if(user->dtmfmode & H323_DTMF_H245SIGNAL) ast_cli(fd, "%s\n", "h245signal"); else ast_cli(fd, "%s\n", "unknown"); ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode); ast_cli(fd, "%-15.15s%s\n", "AMA flags: ", ast_cdr_flags2str(user->amaflags)); ast_cli(fd, "%-15.15s%s\n", "Context: ", user->context); ast_cli(fd, "%-15.15s%d\n", "IncomingLimit: ", user->incominglimit); ast_cli(fd, "%-15.15s%d\n", "rtptimeout: ", user->rtptimeout); ast_mutex_unlock(&user->lock); } else{ ast_cli(fd, "User %s not found\n", argv[3]); ast_cli(fd, "\n"); } ast_mutex_unlock(&userl.lock); return RESULT_SUCCESS;}static int ooh323_show_users(int fd, int argc, char *argv[]){ struct ooh323_user *prev = NULL, *user=NULL; char formats[512];#define FORMAT1 "%-15.15s %-15.15s %-15.15s %-s\n" if (argc != 3) return RESULT_SHOWUSAGE; ast_cli(fd, FORMAT1, "Username", "Accountcode", "Context", "Formats"); ast_mutex_lock(&userl.lock); user = userl.users; while(user) { ast_mutex_lock(&user->lock); ast_cli(fd, FORMAT1, user->name, user->accountcode, user->context, ast_getformatname_multiple(formats,512,user->capability)); prev = user; user = user->next; ast_mutex_unlock(&prev->lock); } ast_mutex_unlock(&userl.lock);#undef FORMAT1 return RESULT_SUCCESS;}static int ooh323_do_debug(int fd, int argc, char *argv[]){ if (argc != 2) return RESULT_SHOWUSAGE; gH323Debug = TRUE; ast_cli(fd, "OOH323 Debugging Enabled\n"); return RESULT_SUCCESS;}static int ooh323_no_debug(int fd, int argc, char *argv[]){ if (argc != 3) return RESULT_SHOWUSAGE; gH323Debug = FALSE; ast_cli(fd, "OOH323 Debugging Disabled\n"); return RESULT_SUCCESS;}static int ooh323_show_channels(int fd, int argc, char *argv[]){ return RESULT_SUCCESS;}static int ooh323_show_config(int fd, int argc, char *argv[]){ char value[512]; ooAliases *pAlias = NULL, *pAliasNext=NULL;; ast_cli(fd, "\nObjective Open H.323 Channel Driver's Config:\n"); sprintf(value, "%s:%d", gIP, gPort); ast_cli(fd, "%-15s%s\n", "IP:Port: ", value); ast_cli(fd, "%-15s%s\n", "FastStart", gFastStart?"yes":"no"); ast_cli(fd, "%-15s%s\n", "Tunneling", gTunneling?"yes":"no"); ast_cli(fd, "%-15s%s\n", "CallerId", gCallerID); if(gRasGkMode == RasNoGatekeeper) sprintf(value, "%s", "No Gatekeeper"); else if(gRasGkMode == RasDiscoverGatekeeper) sprintf(value, "%s", "Discover"); else sprintf(value, "%s", gGatekeeper); ast_cli(fd, "%-15s%s\n", "Gatekeeper:", value); ast_cli(fd, "%-15s%s\n", "H.323 LogFile:", gLogFile); ast_cli(fd, "%-15s%s\n", "Context:", gContext); ast_cli(fd, "%-15s%s\n", "Capability:", ast_getformatname_multiple(value,512,gCapability)); ast_cli(fd, "%-15s", "DTMF Mode: "); if(gDTMFMode & H323_DTMF_RFC2833) ast_cli(fd, "%s\n", "rfc2833"); else if (gDTMFMode & H323_DTMF_Q931) ast_cli(fd, "%s\n", "q931keypad"); else if(gDTMFMode & H323_DTMF_H245ALPHANUMERIC) ast_cli(fd, "%s\n", "h245alphanumeric"); else if(gDTMFMode & H323_DTMF_H245SIGNAL) ast_cli(fd, "%s\n", "h245signal"); else ast_cli(fd, "%s\n", "unknown"); ast_cli(fd, "%-15s%s\n", "AccountCode: ", gAccountcode); ast_cli(fd, "%-15s%s\n", "AMA flags: ", ast_cdr_flags2str(gAMAFLAGS)); pAlias = gAliasList; if(pAlias) { ast_cli(fd, "%-15s\n", "Aliases: "); } while(pAlias) { pAliasNext = pAlias->next; if(pAliasNext) { ast_cli(fd,"\t%-30s\t%-30s\n",pAlias->value, pAliasNext->value); pAlias = pAliasNext->next; }else{ ast_cli(fd,"\t%-30s\n",pAlias->value); pAlias = pAlias->next; } } return RESULT_SUCCESS;}static char show_config_usage[]="Usage: ooh323 show config\n"" Shows global configuration of H.323 channel driver\n";static char debug_usage[] = "Usage: ooh323 debug\n"" Enables debugging of OOH323 channel driver\n";static struct ast_cli_entry cli_debug = { { "ooh323", "debug", NULL }, ooh323_do_debug, "Enable OOH323 debugging", debug_usage };static char no_debug_usage[] = "Usage: ooh323 no debug\n"" Disables debugging of OOH323 channel driver\n";static struct ast_cli_entry cli_no_debug = { { "ooh323", "no", "debug", NULL }, ooh323_no_debug, "Disable OOH323 debugging", no_debug_usage };static char show_users_usage[] = "Usage: ooh323 show users \n"" Lists all known OOH323 users.\n";static struct ast_cli_entry cli_show_users = { { "ooh323", "show", "users", NULL }, ooh323_show_users, "Show defined OOH323 users", show_users_usage };static char show_user_usage[] = "Usage: ooh323 show user <name> \n"" List details of specific OOH323 user.\n";static struct ast_cli_entry cli_show_user = { { "ooh323", "show", "user", NULL }, ooh323_show_user, "Show details on specific OOH323 user", show_user_usage };static char show_peers_usage[] = "Usage: ooh323 show peers \n"" Lists all known OOH323 peers.\n";static struct ast_cli_entry cli_show_peers = { { "ooh323", "show", "peers", NULL }, ooh323_show_peers, "Show defined OOH323 peers", show_peers_usage };static char show_peer_usage[] = "Usage: ooh323 show peer <name> \n"" List details of specific OOH323 peer.\n";static struct ast_cli_entry cli_show_peer = { { "ooh323", "show", "peer", NULL }, ooh323_show_peer, "Show details on specific OOH323 peer", show_peer_usage };static struct ast_cli_entry cli_show_config = { { "ooh323", "show", "config", NULL }, ooh323_show_config, "Show details on global configuration of H.323 channel driver", show_config_usage }; int load_module(void){ int res; struct ooAliases * pNewAlias=NULL; struct ooh323_peer *peer=NULL; OOH225MsgCallbacks h225Callbacks = {0, 0, 0, 0}; OOH323CALLBACKS h323Callbacks ={ .onNewCallCreated = onNewCallCreated, .onAlerting = onAlerting, .onIncomingCall = NULL, .onOutgoingCall = NULL, .onCallEstablished = onCallEstablished, .onCallCleared = onCallCleared, .openLogicalChannels=NULL, .onReceivedDTMF = &ooh323_onReceivedDigit }; h225Callbacks.onReceivedSetup = &ooh323_onReceivedSetup; userl.users = NULL; ast_mutex_init(&userl.lock); peerl.peers = NULL; ast_mutex_init(&peerl.lock); sched = sched_context_create(); if (!sched) { ast_log(LOG_WARNING, "Unable to create schedule context\n"); } io = io_context_create(); if (!io) { ast_log(LOG_WARNING, "Unable to create I/O context\n"); } res = reload_config(); if (!res) { /* Make sure we can register our OOH323 channel type */ if (ast_channel_register(&ooh323_tech)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); return 0; } ast_rtp_proto_register(&ooh323_rtp); ast_cli_register(&cli_show_users); ast_cli_register(&cli_show_user); ast_cli_register(&cli_show_peers); ast_cli_register(&cli_show_peer); ast_cli_register(&cli_show_config); ast_cli_register(&cli_debug); ast_cli_register(&cli_no_debug); /* fire up the H.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?