⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pjsua_app.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	    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 + -