summaryrefslogtreecommitdiff
path: root/pjsip-apps
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-07-18 14:39:40 +0000
committerBenny Prijono <bennylp@teluu.com>2006-07-18 14:39:40 +0000
commit490bd78f06ea0c101244760b2a5bbb1dae1b3041 (patch)
treee676089d77bd8ff0e0748e4666b3f6b21fb1e2b6 /pjsip-apps
parent65035358b4b7f51b4183a0937e9e93ff130d7525 (diff)
Small improvements: (1) pjsua now responds to incoming OPTIONS request, which means that some modules (evsub, invite) need to register their capabilities to the endpoint, (2) added command in pjsua to send arbitrary request
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@612 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip-apps')
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app.c87
1 files changed, 83 insertions, 4 deletions
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c
index e4fd5e85..999df2a5 100644
--- a/pjsip-apps/src/pjsua/pjsua_app.c
+++ b/pjsip-apps/src/pjsua/pjsua_app.c
@@ -137,7 +137,12 @@ static void usage(void)
/* Set default config. */
static void default_config(struct app_config *cfg)
{
+ char tmp[80];
+
pjsua_config_default(&cfg->cfg);
+ pj_ansi_sprintf(tmp, "PJSUA v%s/%s", PJ_VERSION, PJ_OS_NAME);
+ pj_strdup2_with_null(app_config.pool, &cfg->cfg.user_agent, tmp);
+
pjsua_logging_config_default(&cfg->log_cfg);
pjsua_media_config_default(&cfg->media_cfg);
pjsua_transport_config_default(&cfg->udp_cfg);
@@ -472,7 +477,7 @@ static pj_status_t parse_args(int argc, char *argv[],
case OPT_NEXT_ACCOUNT: /* Add more account. */
cfg->acc_cnt++;
- cur_acc = &cfg->acc_cfg[cfg->acc_cnt - 1];
+ cur_acc = &cfg->acc_cfg[cfg->acc_cnt];
break;
case OPT_USERNAME: /* Default authentication user */
@@ -664,8 +669,8 @@ static pj_status_t parse_args(int argc, char *argv[],
return PJ_EINVAL;
}
- if (cfg->acc_cfg[0].id.slen && cfg->acc_cnt==0)
- cfg->acc_cnt = 1;
+ 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)
@@ -1306,7 +1311,7 @@ static void keystroke_help(void)
puts("| dq Dump curr. call quality | cl List ports | d Dump status |");
puts("| | cc Connect port | dd Dump detailed |");
puts("| | cd Disconnect port | dc Dump config |");
- puts("| | | f Save config |");
+ puts("| S Send arbitrary REQUEST | | f Save config |");
puts("+------------------------------+--------------------------+-------------------+");
puts("| q QUIT |");
puts("+=============================================================================+");
@@ -1463,6 +1468,42 @@ static void conf_list(void)
/*
+ * Send arbitrary request to remote host
+ */
+static void send_request(char *cstr_method, const pj_str_t *dst_uri)
+{
+ pj_str_t str_method;
+ pjsip_method method;
+ pjsip_tx_data *tdata;
+ pjsua_acc_info acc_info;
+ pjsip_endpoint *endpt;
+ pj_status_t status;
+
+ endpt = pjsua_get_pjsip_endpt();
+
+ str_method = pj_str(cstr_method);
+ pjsip_method_init_np(&method, &str_method);
+
+ pjsua_acc_get_info(current_acc, &acc_info);
+
+ status = pjsip_endpt_create_request(endpt, &method, dst_uri,
+ &acc_info.acc_uri, dst_uri,
+ NULL, NULL, -1, NULL, &tdata);
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Unable to create request", status);
+ return;
+ }
+
+ status = pjsip_endpt_send_request(endpt, tdata, -1, NULL, NULL);
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Unable to send request", status);
+ pjsip_tx_data_dec_ref(tdata);
+ return;
+ }
+}
+
+
+/*
* Main "user interface" loop.
*/
void console_app_main(const pj_str_t *uri_to_call)
@@ -1893,6 +1934,44 @@ void console_app_main(const pj_str_t *uri_to_call)
}
break;
+ case 'S':
+ /*
+ * Send arbitrary request
+ */
+ if (pjsua_acc_get_count() == 0) {
+ puts("Sorry, need at least one account configured");
+ break;
+ }
+
+ puts("Send arbitrary request to remote host");
+
+ /* Input METHOD */
+ if (!simple_input("Request method:",text,sizeof(text)))
+ break;
+
+ /* Input destination URI */
+ uri = NULL;
+ ui_input_url("Destination URI", buf, sizeof(buf), &result);
+ if (result.nb_result != NO_NB) {
+
+ if (result.nb_result == -1 || result.nb_result == 0) {
+ puts("Sorry you can't do that!");
+ continue;
+ } else {
+ pjsua_buddy_info binfo;
+ pjsua_buddy_get_info(result.nb_result-1, &binfo);
+ uri = binfo.uri.ptr;
+ }
+
+ } else if (result.uri_result) {
+ uri = result.uri_result;
+ }
+
+ tmp = pj_str(uri);
+
+ send_request(text, &tmp);
+ break;
+
case 's':
case 'u':
/*