📄 pjsua_app.c
字号:
usage(); return PJ_EINVAL; case OPT_VERSION: /* version */ pj_dump_config(); return PJ_EINVAL; case OPT_NULL_AUDIO: cfg->null_audio = PJ_TRUE; break; case OPT_CLOCK_RATE: lval = pj_strtoul(pj_cstr(&tmp, pj_optarg)); if (lval < 8000 || lval > 48000) { PJ_LOG(1,(THIS_FILE, "Error: expecting value between " "8000-48000 for clock rate")); return PJ_EINVAL; } cfg->media_cfg.clock_rate = lval; break; case OPT_LOCAL_PORT: /* local-port */ lval = pj_strtoul(pj_cstr(&tmp, pj_optarg)); if (lval < 0 || lval > 65535) { PJ_LOG(1,(THIS_FILE, "Error: expecting integer value for " "--local-port")); return PJ_EINVAL; } cfg->udp_cfg.port = (pj_uint16_t)lval; break; case OPT_IP_ADDR: /* ip-addr */ cfg->udp_cfg.public_addr = pj_str(pj_optarg); cfg->rtp_cfg.public_addr = pj_str(pj_optarg); break; case OPT_NO_UDP: /* no-udp */ if (cfg->no_tcp) { PJ_LOG(1,(THIS_FILE,"Error: can not disable both TCP and UDP")); return PJ_EINVAL; } cfg->no_udp = PJ_TRUE; break; case OPT_NOREFERSUB: /* norefersub */ cfg->no_refersub = PJ_TRUE; break; case OPT_NO_TCP: /* no-tcp */ if (cfg->no_udp) { PJ_LOG(1,(THIS_FILE,"Error: can not disable both TCP and UDP")); return PJ_EINVAL; } cfg->no_tcp = PJ_TRUE; break; case OPT_PROXY: /* proxy */ if (pjsua_verify_sip_url(pj_optarg) != 0) { PJ_LOG(1,(THIS_FILE, "Error: invalid SIP URL '%s' " "in proxy argument", pj_optarg)); return PJ_EINVAL; } cur_acc->proxy[cur_acc->proxy_cnt++] = pj_str(pj_optarg); break; case OPT_OUTBOUND_PROXY: /* outbound proxy */ if (pjsua_verify_sip_url(pj_optarg) != 0) { PJ_LOG(1,(THIS_FILE, "Error: invalid SIP URL '%s' " "in outbound proxy argument", pj_optarg)); return PJ_EINVAL; } cfg->cfg.outbound_proxy[cfg->cfg.outbound_proxy_cnt++] = pj_str(pj_optarg); break; case OPT_REGISTRAR: /* registrar */ if (pjsua_verify_sip_url(pj_optarg) != 0) { PJ_LOG(1,(THIS_FILE, "Error: invalid SIP URL '%s' in " "registrar argument", pj_optarg)); return PJ_EINVAL; } cur_acc->reg_uri = pj_str(pj_optarg); break; case OPT_REG_TIMEOUT: /* reg-timeout */ cur_acc->reg_timeout = pj_strtoul(pj_cstr(&tmp,pj_optarg)); if (cur_acc->reg_timeout < 1 || cur_acc->reg_timeout > 3600) { PJ_LOG(1,(THIS_FILE, "Error: invalid value for --reg-timeout " "(expecting 1-3600)")); return PJ_EINVAL; } break; case OPT_PUBLISH: /* publish */ cur_acc->publish_enabled = PJ_TRUE; break; case OPT_ID: /* id */ if (pjsua_verify_sip_url(pj_optarg) != 0) { PJ_LOG(1,(THIS_FILE, "Error: invalid SIP URL '%s' " "in local id argument", pj_optarg)); return PJ_EINVAL; } cur_acc->id = pj_str(pj_optarg); break; case OPT_CONTACT: /* contact */ if (pjsua_verify_sip_url(pj_optarg) != 0) { PJ_LOG(1,(THIS_FILE, "Error: invalid SIP URL '%s' " "in contact argument", pj_optarg)); return PJ_EINVAL; } cur_acc->force_contact = pj_str(pj_optarg); break; case OPT_NEXT_ACCOUNT: /* Add more account. */ cfg->acc_cnt++; cur_acc = &cfg->acc_cfg[cfg->acc_cnt]; break; case OPT_USERNAME: /* Default authentication user */ cur_acc->cred_info[cur_acc->cred_count].username = pj_str(pj_optarg); cur_acc->cred_info[cur_acc->cred_count].scheme = pj_str("digest"); break; case OPT_REALM: /* Default authentication realm. */ cur_acc->cred_info[cur_acc->cred_count].realm = pj_str(pj_optarg); break; case OPT_PASSWORD: /* authentication password */ cur_acc->cred_info[cur_acc->cred_count].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; cur_acc->cred_info[cur_acc->cred_count].data = pj_str(pj_optarg); break; case OPT_NEXT_CRED: /* next credential */ cur_acc->cred_count++; break; case OPT_NAMESERVER: /* nameserver */ cfg->cfg.nameserver[cfg->cfg.nameserver_count++] = pj_str(pj_optarg); if (cfg->cfg.nameserver_count > PJ_ARRAY_SIZE(cfg->cfg.nameserver)) { PJ_LOG(1,(THIS_FILE, "Error: too many nameservers")); return PJ_ETOOMANY; } break; case OPT_USE_STUN1: /* STUN server 1 */ p = pj_ansi_strchr(pj_optarg, ':'); if (p) { *p = '\0'; cfg->udp_cfg.stun_config.stun_srv1 = pj_str(pj_optarg); cfg->udp_cfg.stun_config.stun_port1 = pj_strtoul(pj_cstr(&tmp, p+1)); if (cfg->udp_cfg.stun_config.stun_port1 < 1 || cfg->udp_cfg.stun_config.stun_port1 > 65535) { PJ_LOG(1,(THIS_FILE, "Error: expecting port number with " "option --use-stun1")); return PJ_EINVAL; } } else { cfg->udp_cfg.stun_config.stun_port1 = 3478; cfg->udp_cfg.stun_config.stun_srv1 = pj_str(pj_optarg); } cfg->udp_cfg.use_stun = PJ_TRUE; break; case OPT_USE_STUN2: /* STUN server 2 */ p = pj_ansi_strchr(pj_optarg, ':'); if (p) { *p = '\0'; cfg->udp_cfg.stun_config.stun_srv2 = pj_str(pj_optarg); cfg->udp_cfg.stun_config.stun_port2 = pj_strtoul(pj_cstr(&tmp,p+1)); if (cfg->udp_cfg.stun_config.stun_port2 < 1 || cfg->udp_cfg.stun_config.stun_port2 > 65535) { PJ_LOG(1,(THIS_FILE, "Error: expecting port number with " "option --use-stun2")); return PJ_EINVAL; } } else { cfg->udp_cfg.stun_config.stun_port2 = 3478; cfg->udp_cfg.stun_config.stun_srv2 = pj_str(pj_optarg); } break; case OPT_ADD_BUDDY: /* Add to buddy list. */ if (pjsua_verify_sip_url(pj_optarg) != 0) { PJ_LOG(1,(THIS_FILE, "Error: invalid URL '%s' in " "--add-buddy option", pj_optarg)); return -1; } if (cfg->buddy_cnt == PJ_ARRAY_SIZE(cfg->buddy_cfg)) { PJ_LOG(1,(THIS_FILE, "Error: too many buddies in buddy list.")); return -1; } cfg->buddy_cfg[cfg->buddy_cnt].uri = pj_str(pj_optarg); cfg->buddy_cnt++; break; case OPT_AUTO_PLAY: cfg->auto_play = 1; break; case OPT_AUTO_REC: cfg->auto_rec = 1; break; case OPT_AUTO_LOOP: cfg->auto_loop = 1; break; case OPT_AUTO_CONF: cfg->auto_conf = 1; break; case OPT_PLAY_FILE: cfg->wav_files[cfg->wav_count++] = pj_str(pj_optarg); break; case OPT_PLAY_TONE: { int f1, f2, on, off; int n; n = sscanf(pj_optarg, "%d,%d,%d,%d", &f1, &f2, &on, &off); if (n != 4) { puts("Expecting f1,f2,on,off in --play-tone"); return -1; } cfg->tones[cfg->tone_count].freq1 = (short)f1; cfg->tones[cfg->tone_count].freq2 = (short)f2; cfg->tones[cfg->tone_count].on_msec = (short)on; cfg->tones[cfg->tone_count].off_msec = (short)off; ++cfg->tone_count; } break; case OPT_REC_FILE: cfg->rec_file = pj_str(pj_optarg); break; case OPT_RTP_PORT: cfg->rtp_cfg.port = my_atoi(pj_optarg); if (cfg->rtp_cfg.port < 1 || cfg->rtp_cfg.port > 65535) { PJ_LOG(1,(THIS_FILE, "Error: rtp-port argument value " "(expecting 1-65535")); return -1; } break; case OPT_ADD_CODEC: cfg->codec_arg[cfg->codec_cnt++] = pj_str(pj_optarg); break; /* These options were no longer valid after new pjsua */ /* case OPT_COMPLEXITY: cfg->complexity = my_atoi(pj_optarg); if (cfg->complexity < 0 || cfg->complexity > 10) { PJ_LOG(1,(THIS_FILE, "Error: invalid --complexity (expecting 0-10")); return -1; } break; */ case OPT_DURATION: cfg->duration = my_atoi(pj_optarg); break; case OPT_THREAD_CNT: cfg->cfg.thread_cnt = my_atoi(pj_optarg); if (cfg->cfg.thread_cnt > 128) { PJ_LOG(1,(THIS_FILE, "Error: invalid --thread-cnt option")); return -1; } break; case OPT_PTIME: cfg->media_cfg.ptime = my_atoi(pj_optarg); if (cfg->media_cfg.ptime < 10 || cfg->media_cfg.ptime > 1000) { PJ_LOG(1,(THIS_FILE, "Error: invalid --ptime option")); return -1; } break; case OPT_NO_VAD: cfg->media_cfg.no_vad = PJ_TRUE; break; case OPT_EC_TAIL: cfg->media_cfg.ec_tail_len = my_atoi(pj_optarg); if (cfg->media_cfg.ec_tail_len > 1000) { PJ_LOG(1,(THIS_FILE, "I think the ec-tail length setting " "is too big")); return -1; } break; case OPT_QUALITY: cfg->media_cfg.quality = my_atoi(pj_optarg); if (cfg->media_cfg.quality < 0 || cfg->media_cfg.quality > 10) { PJ_LOG(1,(THIS_FILE, "Error: invalid --quality (expecting 0-10")); return -1; } break; case OPT_ILBC_MODE: cfg->media_cfg.ilbc_mode = my_atoi(pj_optarg); if (cfg->media_cfg.ilbc_mode!=20 && cfg->media_cfg.ilbc_mode!=30) { PJ_LOG(1,(THIS_FILE, "Error: invalid --ilbc-mode (expecting 20 or 30")); return -1; } break; case OPT_RX_DROP_PCT: cfg->media_cfg.rx_drop_pct = my_atoi(pj_optarg); if (cfg->media_cfg.rx_drop_pct > 100) { PJ_LOG(1,(THIS_FILE, "Error: invalid --rx-drop-pct (expecting <= 100")); return -1; } break; case OPT_TX_DROP_PCT: cfg->media_cfg.tx_drop_pct = my_atoi(pj_optarg); if (cfg->media_cfg.tx_drop_pct > 100) { PJ_LOG(1,(THIS_FILE, "Error: invalid --tx-drop-pct (expecting <= 100")); return -1; } break; case OPT_AUTO_ANSWER: cfg->auto_answer = my_atoi(pj_optarg); if (cfg->auto_answer < 100 || cfg->auto_answer > 699) { PJ_LOG(1,(THIS_FILE, "Error: invalid code in --auto-answer " "(expecting 100-699")); return -1; } break; case OPT_MAX_CALLS: cfg->cfg.max_calls = my_atoi(pj_optarg); if (cfg->cfg.max_calls < 1 || cfg->cfg.max_calls > PJSUA_MAX_CALLS) { PJ_LOG(1,(THIS_FILE,"Error: maximum call setting exceeds " "compile time limit (PJSUA_MAX_CALLS=%d)", PJSUA_MAX_CALLS)); return -1; } break; case OPT_USE_TLS: cfg->use_tls = PJ_TRUE;#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0 PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured")); return -1;#endif break; case OPT_TLS_CA_FILE: cfg->udp_cfg.tls_setting.ca_list_file = pj_str(pj_optarg);#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0 PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured")); return -1;#endif break; case OPT_TLS_CERT_FILE: cfg->udp_cfg.tls_setting.cert_file = pj_str(pj_optarg);#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0 PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured")); return -1;#endif break; case OPT_TLS_PRIV_FILE: cfg->udp_cfg.tls_setting.privkey_file = pj_str(pj_optarg); break; case OPT_TLS_PASSWORD: cfg->udp_cfg.tls_setting.password = pj_str(pj_optarg);#if !defined(PJSIP_HAS_TLS_TRANSPORT) || PJSIP_HAS_TLS_TRANSPORT==0 PJ_LOG(1,(THIS_FILE, "Error: TLS support is not configured")); return -1;#endif break; case OPT_TLS_VERIFY_SERVER: cfg->udp_cfg.tls_setting.verify_server = PJ_TRUE; break; case OPT_TLS_VERIFY_CLIENT: cfg->udp_cfg.tls_setting.verify_client = PJ_TRUE; break; case OPT_TLS_NEG_TIMEOUT: cfg->udp_cfg.tls_setting.timeout.sec = atoi(pj_optarg); break; case OPT_CAPTURE_DEV: cfg->capture_dev = atoi(pj_optarg); break; case OPT_PLAYBACK_DEV: cfg->playback_dev = atoi(pj_optarg); break; default: PJ_LOG(1,(THIS_FILE, "Argument \"%s\" is not valid. Use --help to see help", argv[pj_optind-1])); return -1; } } if (pj_optind != argc) { pj_str_t uri_arg; if (pjsua_verify_sip_url(argv[pj_optind]) != PJ_SUCCESS) { PJ_LOG(1,(THIS_FILE, "Invalid SIP URI %s", argv[pj_optind])); return -1; } uri_arg = pj_str(argv[pj_optind]); if (uri_to_call) *uri_to_call = uri_arg; pj_optind++; /* Add URI to call to buddy list if it's not already there */ for (i=0; i<cfg->buddy_cnt; ++i) { if (pj_stricmp(&cfg->buddy_cfg[i].uri, &uri_arg)==0) break; } if (i == cfg->buddy_cnt && cfg->buddy_cnt < PJSUA_MAX_BUDDIES) { cfg->buddy_cfg[cfg->buddy_cnt++].uri = uri_arg; } } else { if (uri_to_call) uri_to_call->slen = 0; } if (pj_optind != argc) { PJ_LOG(1,(THIS_FILE, "Error: unknown options %s", argv[pj_optind])); return PJ_EINVAL; } if (cfg->acc_cfg[cfg->acc_cnt].id.slen) cfg->acc_cnt++; for (i=0; i<cfg->acc_cnt; ++i) { if (cfg->acc_cfg[i].cred_info[cfg->acc_cfg[i].cred_count].username.slen) { cfg->acc_cfg[i].cred_count++; } } return PJ_SUCCESS;}/* * Save account settings */static void write_account_settings(int acc_index, pj_str_t *result)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -