diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-02-19 15:37:19 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-02-19 15:37:19 +0000 |
commit | 51f0bc5a46378786d98caf84df2cf31bb169e45b (patch) | |
tree | e17a65e4ebdf98d4f46857f51d26afe7f1fb2aa7 /pjsip | |
parent | c1fa8a21eda0357a8c25a63b634615f6785e4d48 (diff) |
SIMPLE test with FWD, and added more info in UI
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@201 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/include/pjsip-ua/sip_regc.h | 31 | ||||
-rw-r--r-- | pjsip/src/pjsip-simple/evsub.c | 14 | ||||
-rw-r--r-- | pjsip/src/pjsip-simple/xpidf.c | 14 | ||||
-rw-r--r-- | pjsip/src/pjsip-ua/sip_reg.c | 86 | ||||
-rw-r--r-- | pjsip/src/pjsua/main.c | 57 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua.h | 4 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua_core.c | 60 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua_inv.c | 25 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua_pres.c | 31 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua_reg.c | 44 |
10 files changed, 279 insertions, 87 deletions
diff --git a/pjsip/include/pjsip-ua/sip_regc.h b/pjsip/include/pjsip-ua/sip_regc.h index 12959916..d86c330e 100644 --- a/pjsip/include/pjsip-ua/sip_regc.h +++ b/pjsip/include/pjsip-ua/sip_regc.h @@ -59,6 +59,7 @@ struct pjsip_regc_cbparam pjsip_regc *regc; void *token; int code; + pj_status_t status; pj_str_t reason; pjsip_rx_data *rdata; int contact_cnt; @@ -70,6 +71,24 @@ struct pjsip_regc_cbparam /** Type declaration for callback to receive registration result. */ typedef void pjsip_regc_cb(struct pjsip_regc_cbparam *param); +/** + * Client registration information. + */ +struct pjsip_regc_info +{ + pj_str_t server_uri; /**< Server URI, */ + pj_str_t client_uri; /**< Client URI (From header). */ + pj_bool_t is_busy; /**< Have pending transaction? */ + pj_bool_t auto_reg; /**< Will register automatically? */ + int interval; /**< Registration interval (seconds). */ + int next_reg; /**< Time until next registration (seconds). */ +}; + +/** + * @see pjsip_regc_info + */ +typedef struct pjsip_regc_info pjsip_regc_info; + /** * Get the module instance for client registration module. @@ -106,6 +125,18 @@ PJ_DECL(pj_status_t) pjsip_regc_create( pjsip_endpoint *endpt, void *token, PJ_DECL(pj_status_t) pjsip_regc_destroy(pjsip_regc *regc); /** + * Get registration info. + * + * @param regc The client registration structure. + * @param info Client registration info. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjsip_regc_get_info( pjsip_regc *regc, + pjsip_regc_info *info ); + + +/** * Get the memory pool associated with a registration client handle. * * @param regc The client registration structure. diff --git a/pjsip/src/pjsip-simple/evsub.c b/pjsip/src/pjsip-simple/evsub.c index c1b8db83..be27db39 100644 --- a/pjsip/src/pjsip-simple/evsub.c +++ b/pjsip/src/pjsip-simple/evsub.c @@ -127,6 +127,8 @@ enum timer_id */ TIMER_TYPE_UAC_WAIT_NOTIFY, + /* Max nb of timer types. */ + TIMER_TYPE_MAX }; static const char *timer_names[] = @@ -136,6 +138,7 @@ static const char *timer_names[] = "UAS_TIMEOUT" "UAC_TERMINATE", "UAC_WAIT_NOTIFY", + "INVALID_TIMER" }; /* @@ -249,6 +252,10 @@ static pj_status_t mod_evsub_unload(void) PJ_DEF(pj_status_t) pjsip_evsub_init_module(pjsip_endpoint *endpt) { pj_status_t status; + pj_str_t method_tags[] = { + { "SUBSCRIBE", 9}, + { "NOTIFY", 6} + }; PJ_ASSERT_RETURN(endpt != NULL, PJ_EINVAL); PJ_ASSERT_RETURN(mod_evsub.mod.id == -1, PJ_EINVALIDOP); @@ -275,6 +282,11 @@ PJ_DEF(pj_status_t) pjsip_evsub_init_module(pjsip_endpoint *endpt) /* Register SIP-event specific headers parser: */ pjsip_evsub_init_parser(); + /* Register new methods SUBSCRIBE and NOTIFY in Allow-ed header */ + pjsip_endpt_add_capability(endpt, &mod_evsub.mod, PJSIP_H_ALLOW, NULL, + 2, method_tags); + + /* Done. */ return PJ_SUCCESS; on_error: @@ -436,6 +448,8 @@ static void set_timer( pjsip_evsub *sub, int timer_id, pj_time_val timeout; PJ_ASSERT_ON_FAIL(seconds > 0, return); + PJ_ASSERT_ON_FAIL(timer_id>TIMER_TYPE_NONE && timer_id<TIMER_TYPE_MAX, + return); timeout.sec = seconds; timeout.msec = 0; diff --git a/pjsip/src/pjsip-simple/xpidf.c b/pjsip/src/pjsip-simple/xpidf.c index 12024827..1bd719c4 100644 --- a/pjsip/src/pjsip-simple/xpidf.c +++ b/pjsip/src/pjsip-simple/xpidf.c @@ -29,6 +29,7 @@ static pj_str_t CLOSED = { "closed", 6 }; static pj_str_t URI = { "uri", 3 }; static pj_str_t ATOM = { "atom", 4 }; static pj_str_t ATOMID = { "atomid", 6 }; +static pj_str_t ID = { "id", 2 }; static pj_str_t ADDRESS = { "address", 7 }; static pj_str_t SUBSCRIBE_PARAM = { ";method=SUBSCRIBE", 17 }; static pj_str_t PRESENTITY = { "presentity", 10 }; @@ -126,20 +127,23 @@ PJ_DEF(pjxpidf_pres*) pjxpidf_parse(pj_pool_t *pool, char *text, pj_size_t len) /* Validate <presence> */ if (pj_stricmp(&pres->name, &PRESENCE) != 0) return NULL; - if (pj_xml_find_attr(pres, &URI, NULL) == NULL) - return NULL; /* Validate <presentity> */ node = pj_xml_find_node(pres, &PRESENTITY); if (node == NULL) return NULL; + if (pj_xml_find_attr(node, &URI, NULL) == NULL) + return NULL; /* Validate <atom> */ node = pj_xml_find_node(pres, &ATOM); if (node == NULL) return NULL; - if (pj_xml_find_attr(node, &ATOMID, NULL) == NULL) + if (pj_xml_find_attr(node, &ATOMID, NULL) == NULL && + pj_xml_find_attr(node, &ID, NULL) == NULL) + { return NULL; + } /* Address */ node = pj_xml_find_node(node, &ADDRESS); @@ -246,7 +250,7 @@ PJ_DEF(pj_bool_t) pjxpidf_get_status(pjxpidf_pres *pres) pj_assert(0); return PJ_FALSE; } - status = pj_xml_find_node(atom, &STATUS); + status = pj_xml_find_node(addr, &STATUS); if (!status) { pj_assert(0); return PJ_FALSE; @@ -257,7 +261,7 @@ PJ_DEF(pj_bool_t) pjxpidf_get_status(pjxpidf_pres *pres) return PJ_FALSE; } - return pj_stricmp(&attr->value, &OPEN) ? PJ_TRUE : PJ_FALSE; + return pj_stricmp(&attr->value, &OPEN)==0 ? PJ_TRUE : PJ_FALSE; } diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c index c94aff25..6a614bc2 100644 --- a/pjsip/src/pjsip-ua/sip_reg.c +++ b/pjsip/src/pjsip-ua/sip_reg.c @@ -25,11 +25,12 @@ #include <pjsip/sip_util.h> #include <pjsip/sip_auth_msg.h> #include <pjsip/sip_errno.h> -#include <pj/pool.h> -#include <pj/string.h> +#include <pj/assert.h> #include <pj/guid.h> +#include <pj/os.h> +#include <pj/pool.h> #include <pj/log.h> -#include <pj/assert.h> +#include <pj/string.h> #define REFRESH_TIMER 1 @@ -53,6 +54,7 @@ struct pjsip_regc pjsip_uri *srv_url; pjsip_cid_hdr *cid_hdr; pjsip_cseq_hdr *cseq_hdr; + pj_str_t from_uri; pjsip_from_hdr *from_hdr; pjsip_to_hdr *to_hdr; char *contact_buf; @@ -68,6 +70,8 @@ struct pjsip_regc /* Auto refresh registration. */ pj_bool_t auto_reg; + pj_time_val last_reg; + pj_time_val next_reg; pj_timer_entry timer; }; @@ -110,6 +114,8 @@ PJ_DEF(pj_status_t) pjsip_regc_create( pjsip_endpoint *endpt, void *token, PJ_DEF(pj_status_t) pjsip_regc_destroy(pjsip_regc *regc) { + PJ_ASSERT_RETURN(regc, PJ_EINVAL); + if (regc->pending_tsx) { regc->_delete_flag = 1; regc->cb = NULL; @@ -121,6 +127,36 @@ PJ_DEF(pj_status_t) pjsip_regc_destroy(pjsip_regc *regc) } +PJ_DEF(pj_status_t) pjsip_regc_get_info( pjsip_regc *regc, + pjsip_regc_info *info ) +{ + PJ_ASSERT_RETURN(regc && info, PJ_EINVAL); + + info->server_uri = regc->str_srv_url; + info->client_uri = regc->from_uri; + info->is_busy = (regc->pending_tsx != 0); + info->auto_reg = regc->auto_reg; + info->interval = regc->expires; + + if (regc->pending_tsx) + info->next_reg = 0; + else if (regc->auto_reg == 0) + info->next_reg = 0; + else if (regc->expires < 0) + info->next_reg = regc->expires; + else { + pj_time_val now, next_reg; + + next_reg = regc->next_reg; + pj_gettimeofday(&now); + PJ_TIME_VAL_SUB(next_reg, now); + info->next_reg = next_reg.sec; + } + + return PJ_SUCCESS; +} + + PJ_DEF(pj_pool_t*) pjsip_regc_get_pool(pjsip_regc *regc) { return regc->pool; @@ -194,7 +230,8 @@ PJ_DEF(pj_status_t) pjsip_regc_init( pjsip_regc *regc, } /* Set "From" header. */ - pj_strdup_with_null(regc->pool, &tmp, from_url); + pj_strdup_with_null(regc->pool, ®c->from_uri, from_url); + tmp = regc->from_uri; regc->from_hdr = pjsip_from_hdr_create(regc->pool); regc->from_hdr->uri = pjsip_parse_uri(regc->pool, tmp.ptr, tmp.slen, PJSIP_PARSE_URI_AS_NAMEADDR); @@ -325,6 +362,8 @@ PJ_DEF(pj_status_t) pjsip_regc_register(pjsip_regc *regc, pj_bool_t autoreg, pj_status_t status; pjsip_tx_data *tdata; + PJ_ASSERT_RETURN(regc && p_tdata, PJ_EINVAL); + status = create_request(regc, &tdata); if (status != PJ_SUCCESS) return status; @@ -355,6 +394,8 @@ PJ_DEF(pj_status_t) pjsip_regc_unregister(pjsip_regc *regc, pjsip_msg *msg; pj_status_t status; + PJ_ASSERT_RETURN(regc && p_tdata, PJ_EINVAL); + if (regc->timer.id != 0) { pjsip_endpt_cancel_timer(regc->endpt, ®c->timer); regc->timer.id = 0; @@ -377,6 +418,7 @@ PJ_DEF(pj_status_t) pjsip_regc_update_contact( pjsip_regc *regc, int contact_cnt, const pj_str_t contact[] ) { + PJ_ASSERT_RETURN(regc, PJ_EINVAL); return set_contact( regc, contact_cnt, contact ); } @@ -384,12 +426,14 @@ PJ_DEF(pj_status_t) pjsip_regc_update_contact( pjsip_regc *regc, PJ_DEF(pj_status_t) pjsip_regc_update_expires( pjsip_regc *regc, pj_uint32_t expires ) { + PJ_ASSERT_RETURN(regc, PJ_EINVAL); set_expires( regc, expires ); return PJ_SUCCESS; } -static void call_callback(pjsip_regc *regc, int status, const pj_str_t *reason, +static void call_callback(pjsip_regc *regc, pj_status_t status, int st_code, + const pj_str_t *reason, pjsip_rx_data *rdata, pj_int32_t expiration, int contact_cnt, pjsip_contact_hdr *contact[]) { @@ -398,7 +442,8 @@ static void call_callback(pjsip_regc *regc, int status, const pj_str_t *reason, cbparam.regc = regc; cbparam.token = regc->token; - cbparam.code = status; + cbparam.status = status; + cbparam.code = st_code; cbparam.reason = *reason; cbparam.rdata = rdata; cbparam.contact_cnt = contact_cnt; @@ -427,7 +472,7 @@ static void regc_refresh_timer_cb( pj_timer_heap_t *timer_heap, } else { char errmsg[PJ_ERR_MSG_SIZE]; pj_str_t reason = pj_strerror(status, errmsg, sizeof(errmsg)); - call_callback(regc, -1, &reason, NULL, -1, 0, NULL); + call_callback(regc, status, 400, &reason, NULL, -1, 0, NULL); } } @@ -437,11 +482,16 @@ static void tsx_callback(void *token, pjsip_event *event) pjsip_regc *regc = token; pjsip_transaction *tsx = event->body.tsx_state.tsx; + /* Decrement pending transaction counter. */ + --regc->pending_tsx; + /* If registration data has been deleted by user then remove registration * data from transaction's callback, and don't call callback. */ if (regc->_delete_flag) { - --regc->pending_tsx; + + /* Nothing to do */ + ; } else if (tsx->status_code == PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED || tsx->status_code == PJSIP_SC_UNAUTHORIZED) @@ -455,13 +505,12 @@ static void tsx_callback(void *token, pjsip_event *event) &tdata); if (status == PJ_SUCCESS) { - --regc->pending_tsx; pjsip_regc_send(regc, tdata); return; } else { - call_callback(regc, tsx->status_code, &rdata->msg_info.msg->line.status.reason, + call_callback(regc, status, tsx->status_code, + &rdata->msg_info.msg->line.status.reason, rdata, -1, 0, NULL); - --regc->pending_tsx; } } else { int contact_cnt = 0; @@ -512,6 +561,9 @@ static void tsx_callback(void *token, pjsip_event *event) regc->timer.id = REFRESH_TIMER; regc->timer.user_data = regc; pjsip_endpt_schedule_timer( regc->endpt, ®c->timer, &delay); + pj_gettimeofday(®c->last_reg); + regc->next_reg = regc->last_reg; + regc->next_reg.sec += delay.sec; } } else { @@ -522,13 +574,12 @@ static void tsx_callback(void *token, pjsip_event *event) /* Call callback. */ if (expiration == 0xFFFF) expiration = -1; - call_callback(regc, tsx->status_code, + call_callback(regc, PJ_SUCCESS, tsx->status_code, (rdata ? &rdata->msg_info.msg->line.status.reason : pjsip_get_status_text(tsx->status_code)), rdata, expiration, contact_cnt, contact); - --regc->pending_tsx; } /* Delete the record if user destroy regc during the callback. */ @@ -543,10 +594,8 @@ PJ_DEF(pj_status_t) pjsip_regc_send(pjsip_regc *regc, pjsip_tx_data *tdata) /* Make sure we don't have pending transaction. */ if (regc->pending_tsx) { - pj_str_t reason = pj_str("Transaction in progress"); - call_callback(regc, -1, &reason, NULL, -1, 0, NULL); pjsip_tx_data_dec_ref( tdata ); - return PJ_EINVALIDOP; + return PJSIP_EBUSY; } /* Invalidate message buffer. */ @@ -559,11 +608,6 @@ PJ_DEF(pj_status_t) pjsip_regc_send(pjsip_regc *regc, pjsip_tx_data *tdata) status = pjsip_endpt_send_request(regc->endpt, tdata, -1, regc, &tsx_callback); if (status==PJ_SUCCESS) ++regc->pending_tsx; - else { - char errmsg[PJ_ERR_MSG_SIZE]; - pj_str_t reason = pj_strerror(status, errmsg, sizeof(errmsg)); - call_callback(regc, status, &reason, NULL, -1, 0, NULL); - } return status; } diff --git a/pjsip/src/pjsua/main.c b/pjsip/src/pjsua/main.c index 4a40d324..66d4de4e 100644 --- a/pjsip/src/pjsua/main.c +++ b/pjsip/src/pjsua/main.c @@ -98,8 +98,31 @@ static void print_buddy_list(void) */ static void keystroke_help(void) { + char reg_status[128]; - printf(">>>>\nOnline status: %s\n", + if (pjsua.regc == NULL) { + pj_ansi_strcpy(reg_status, " -not registered to server-"); + } else if (pjsua.regc_last_err != PJ_SUCCESS) { + pj_strerror(pjsua.regc_last_err, reg_status, sizeof(reg_status)); + } else if (pjsua.regc_last_code>=200 && pjsua.regc_last_code<=699) { + + pjsip_regc_info info; + + pjsip_regc_get_info(pjsua.regc, &info); + + pj_snprintf(reg_status, sizeof(reg_status), + "%s (%.*s;expires=%d)", + pjsip_get_status_text(pjsua.regc_last_code)->ptr, + (int)info.server_uri.slen, + info.server_uri.ptr, + info.next_reg); + + } else { + pj_sprintf(reg_status, "in progress (%d)", pjsua.regc_last_code); + } + + printf(">>>>\nRegistration status: %s\n", reg_status); + printf("Online status: %s\n", (pjsua.online_status ? "Online" : "Invisible")); print_buddy_list(); @@ -108,9 +131,9 @@ static void keystroke_help(void) puts("| Call Commands: | IM & Presence: | Misc: |"); puts("| | | |"); puts("| m Make new call | i Send IM | o Send OPTIONS |"); - puts("| a Answer call | s Subscribe presence | d Dump status |"); - puts("| h Hangup call | u Unsubscribe presence | d1 Dump detailed |"); - puts("| ] Select next dialog | t Toggle Online status | |"); + puts("| a Answer call | s Subscribe presence | R (Re-)register |"); + puts("| h Hangup call | u Unsubscribe presence | r Unregister |"); + puts("| ] Select next dialog | t Toggle Online status | d Dump status |"); puts("| [ Select previous dialog | | |"); puts("+-----------------------------------------------------------------------------+"); puts("| q QUIT |"); @@ -223,7 +246,7 @@ static void ui_input_url(const char *title, char *buf, int len, pj_status_t status; if ((status=pjsua_verify_sip_url(buf)) != PJ_SUCCESS) { - pjsua_perror("Invalid URL", status); + pjsua_perror(THIS_FILE, "Invalid URL", status); return; } @@ -290,7 +313,8 @@ static void ui_console_main(void) status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); if (status != PJ_SUCCESS) - pjsua_perror("Unable to create/send response", status); + pjsua_perror(THIS_FILE, "Unable to create/send response", + status); } break; @@ -310,13 +334,17 @@ static void ui_console_main(void) status = pjsip_inv_end_session(inv_session->inv, PJSIP_SC_DECLINE, NULL, &tdata); if (status != PJ_SUCCESS) { - pjsua_perror("Failed to create end session message", status); + pjsua_perror(THIS_FILE, + "Failed to create end session message", + status); continue; } status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); if (status != PJ_SUCCESS) { - pjsua_perror("Failed to send end session message", status); + pjsua_perror(THIS_FILE, + "Failed to send end session message", + status); continue; } } @@ -354,6 +382,14 @@ static void ui_console_main(void) break; + case 'R': + pjsua_regc_update(PJ_TRUE); + break; + + case 'r': + pjsua_regc_update(PJ_FALSE); + break; + case 't': pjsua.online_status = !pjsua.online_status; pjsua_pres_refresh(); @@ -500,13 +536,14 @@ void app_logging_shutdown(void) /* * Display error message for the specified error code. */ -void pjsua_perror(const char *title, pj_status_t status) +void pjsua_perror(const char *sender, const char *title, + pj_status_t status) { char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(status, errmsg, sizeof(errmsg)); - PJ_LOG(1,(THIS_FILE, "%s: %s [code=%d]", title, errmsg, status)); + PJ_LOG(1,(sender, "%s: %s [code=%d]", title, errmsg, status)); } diff --git a/pjsip/src/pjsua/pjsua.h b/pjsip/src/pjsua/pjsua.h index 202c2840..6bd19d57 100644 --- a/pjsip/src/pjsua/pjsua.h +++ b/pjsip/src/pjsua/pjsua.h @@ -127,6 +127,7 @@ struct pjsua pjsip_regc *regc; pj_int32_t reg_timeout; pj_timer_entry regc_timer; + pj_status_t regc_last_err; /**< Last registration error. */ int regc_last_code;/**< Last status last register. */ @@ -199,7 +200,8 @@ void pjsua_default(void); /** * Display error message for the specified error code. */ -void pjsua_perror(const char *title, pj_status_t status); +void pjsua_perror(const char *sender, const char *title, + pj_status_t status); /** diff --git a/pjsip/src/pjsua/pjsua_core.c b/pjsip/src/pjsua/pjsua_core.c index 2d059d92..75560205 100644 --- a/pjsip/src/pjsua/pjsua_core.c +++ b/pjsip/src/pjsua/pjsua_core.c @@ -72,6 +72,10 @@ void pjsua_default(void) pjsua.local_uri = pj_str(PJSUA_LOCAL_URI); + /* Default registration timeout: */ + + pjsua.reg_timeout = 55; + /* Init route set list: */ pj_list_init(&pjsua.route_set); @@ -155,13 +159,13 @@ static pj_status_t init_sockets() /* Create and bind SIP UDP socket. */ status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock[SIP_SOCK]); if (status != PJ_SUCCESS) { - pjsua_perror("socket() error", status); + pjsua_perror(THIS_FILE, "socket() error", status); goto on_error; } status = pj_sock_bind_in(sock[SIP_SOCK], 0, pjsua.sip_port); if (status != PJ_SUCCESS) { - pjsua_perror("bind() error", status); + pjsua_perror(THIS_FILE, "bind() error", status); goto on_error; } @@ -174,7 +178,7 @@ static pj_status_t init_sockets() /* Create and bind RTP socket. */ status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock[RTP_SOCK]); if (status != PJ_SUCCESS) { - pjsua_perror("socket() error", status); + pjsua_perror(THIS_FILE, "socket() error", status); goto on_error; } @@ -188,7 +192,7 @@ static pj_status_t init_sockets() /* Create and bind RTCP socket. */ status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock[RTCP_SOCK]); if (status != PJ_SUCCESS) { - pjsua_perror("socket() error", status); + pjsua_perror(THIS_FILE, "socket() error", status); goto on_error; } @@ -217,7 +221,8 @@ static pj_status_t init_sockets() addr.sin_family = PJ_AF_INET; status = pj_sockaddr_in_set_str_addr( &addr, hostname); if (status != PJ_SUCCESS) { - pjsua_perror("Unresolvable local hostname", status); + pjsua_perror(THIS_FILE, "Unresolvable local hostname", + status); goto on_error; } @@ -234,7 +239,7 @@ static pj_status_t init_sockets() &pjsua.stun_srv2, pjsua.stun_port2, mapped_addr); if (status != PJ_SUCCESS) { - pjsua_perror("STUN error", status); + pjsua_perror(THIS_FILE, "STUN error", status); goto on_error; } @@ -310,7 +315,7 @@ static pj_status_t init_stack(void) status = pjsip_endpt_create(&pjsua.cp.factory, endpt_name, &pjsua.endpt); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create SIP endpoint", status); + pjsua_perror(THIS_FILE, "Unable to create SIP endpoint", status); return status; } } @@ -320,7 +325,8 @@ static pj_status_t init_stack(void) status = pjsip_tsx_layer_init(pjsua.endpt); if (status != PJ_SUCCESS) { - pjsua_perror("Transaction layer initialization error", status); + pjsua_perror(THIS_FILE, "Transaction layer initialization error", + status); goto on_error; } @@ -328,7 +334,7 @@ static pj_status_t init_stack(void) status = pjsip_ua_init( pjsua.endpt, NULL ); if (status != PJ_SUCCESS) { - pjsua_perror("UA layer initialization error", status); + pjsua_perror(THIS_FILE, "UA layer initialization error", status); goto on_error; } @@ -357,7 +363,8 @@ static pj_status_t init_stack(void) status = pjsip_endpt_register_module(pjsua.endpt, &pjsua.mod); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to register pjsua module", status); + pjsua_perror(THIS_FILE, "Unable to register pjsua module", + status); goto on_error; } } @@ -377,7 +384,8 @@ static pj_status_t init_stack(void) /* Initialize invite session module: */ status = pjsip_inv_usage_init(pjsua.endpt, &pjsua.mod, &inv_cb); if (status != PJ_SUCCESS) { - pjsua_perror("Invite usage initialization error", status); + pjsua_perror(THIS_FILE, "Invite usage initialization error", + status); goto on_error; } @@ -427,7 +435,7 @@ pj_status_t pjsua_init(void) status = pj_init(); if (status != PJ_SUCCESS) { - pjsua_perror("pj_init() error", status); + pjsua_perror(THIS_FILE, "pj_init() error", status); return status; } @@ -445,7 +453,8 @@ pj_status_t pjsua_init(void) status = init_stack(); if (status != PJ_SUCCESS) { pj_caching_pool_destroy(&pjsua.cp); - pjsua_perror("Stack initialization has returned error", status); + pjsua_perror(THIS_FILE, "Stack initialization has returned error", + status); return status; } @@ -469,7 +478,9 @@ pj_status_t pjsua_init(void) status = pjmedia_endpt_create(&pjsua.cp.factory, &pjsua.med_endpt); if (status != PJ_SUCCESS) { pj_caching_pool_destroy(&pjsua.cp); - pjsua_perror("Media stack initialization has returned error", status); + pjsua_perror(THIS_FILE, + "Media stack initialization has returned error", + status); return status; } @@ -478,7 +489,9 @@ pj_status_t pjsua_init(void) status = pjmedia_codec_init(pjsua.med_endpt); if (status != PJ_SUCCESS) { pj_caching_pool_destroy(&pjsua.cp); - pjsua_perror("Media codec initialization has returned error", status); + pjsua_perror(THIS_FILE, + "Media codec initialization has returned error", + status); return status; } @@ -503,7 +516,8 @@ pj_status_t pjsua_start(void) status = init_sockets(); if (status != PJ_SUCCESS) { - pjsua_perror("init_sockets() has returned error", status); + pjsua_perror(THIS_FILE, "init_sockets() has returned error", + status); return status; } @@ -527,7 +541,8 @@ pj_status_t pjsua_start(void) &addr_name, 1, &udp_transport); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to start UDP transport", status); + pjsua_perror(THIS_FILE, "Unable to start UDP transport", + status); return status; } } @@ -552,7 +567,8 @@ pj_status_t pjsua_start(void) uri = pjsip_parse_uri(pjsua.pool, pjsua.local_uri.ptr, pjsua.local_uri.slen, 0); if (uri == NULL) { - pjsua_perror("Invalid local URI", PJSIP_EINVALIDURI); + pjsua_perror(THIS_FILE, "Invalid local URI", + PJSIP_EINVALIDURI); return PJSIP_EINVALIDURI; } @@ -560,7 +576,8 @@ pj_status_t pjsua_start(void) /* Local URI MUST be a SIP or SIPS: */ if (!PJSIP_URI_SCHEME_IS_SIP(uri) && !PJSIP_URI_SCHEME_IS_SIPS(uri)) { - pjsua_perror("Invalid local URI", PJSIP_EINVALIDSCHEME); + pjsua_perror(THIS_FILE, "Invalid local URI", + PJSIP_EINVALIDSCHEME); return PJSIP_EINVALIDSCHEME; } @@ -594,7 +611,7 @@ pj_status_t pjsua_start(void) } if (len < 1 || len >= sizeof(contact)) { - pjsua_perror("Invalid Contact", PJSIP_EURITOOLONG); + pjsua_perror(THIS_FILE, "Invalid Contact", PJSIP_EURITOOLONG); return PJSIP_EURITOOLONG; } @@ -617,7 +634,8 @@ pj_status_t pjsua_start(void) pjsua.outbound_proxy.slen, &parsed_len); if (route == NULL) { - pjsua_perror("Invalid outbound proxy URL", PJSIP_EINVALIDURI); + pjsua_perror(THIS_FILE, "Invalid outbound proxy URL", + PJSIP_EINVALIDURI); return PJSIP_EINVALIDURI; } diff --git a/pjsip/src/pjsua/pjsua_inv.c b/pjsip/src/pjsua/pjsua_inv.c index 6f9607b5..bfd714b1 100644 --- a/pjsip/src/pjsua/pjsua_inv.c +++ b/pjsip/src/pjsua/pjsua_inv.c @@ -53,7 +53,7 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, &pjsua.contact_uri, &dest_uri, &dest_uri, &dlg); if (status != PJ_SUCCESS) { - pjsua_perror("Dialog creation failed", status); + pjsua_perror(THIS_FILE, "Dialog creation failed", status); return status; } @@ -62,7 +62,7 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, status = pjmedia_endpt_create_sdp( pjsua.med_endpt, dlg->pool, 1, &pjsua.med_skinfo, &offer); if (status != PJ_SUCCESS) { - pjsua_perror("pjmedia unable to create SDP", status); + pjsua_perror(THIS_FILE, "pjmedia unable to create SDP", status); goto on_error; } @@ -70,7 +70,7 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, status = pjsip_inv_create_uac( dlg, offer, 0, &inv); if (status != PJ_SUCCESS) { - pjsua_perror("Invite session creation failed", status); + pjsua_perror(THIS_FILE, "Invite session creation failed", status); goto on_error; } @@ -99,7 +99,8 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, status = pjsip_inv_invite(inv, &tdata); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create initial INVITE request", status); + pjsua_perror(THIS_FILE, "Unable to create initial INVITE request", + status); goto on_error; } @@ -108,7 +109,8 @@ pj_status_t pjsua_invite(const char *cstr_dest_uri, status = pjsip_inv_send_msg(inv, tdata, NULL); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to send initial INVITE request", status); + pjsua_perror(THIS_FILE, "Unable to send initial INVITE request", + status); goto on_error; } @@ -301,7 +303,7 @@ void pjsua_inv_on_media_update(pjsip_inv_session *inv, pj_status_t status) if (status != PJ_SUCCESS) { - pjsua_perror("SDP negotiation has failed", status); + pjsua_perror(THIS_FILE, "SDP negotiation has failed", status); return; } @@ -318,14 +320,18 @@ void pjsua_inv_on_media_update(pjsip_inv_session *inv, pj_status_t status) status = pjmedia_sdp_neg_get_active_local(inv->neg, &local_sdp); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to retrieve currently active local SDP", status); + pjsua_perror(THIS_FILE, + "Unable to retrieve currently active local SDP", + status); return; } status = pjmedia_sdp_neg_get_active_remote(inv->neg, &remote_sdp); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to retrieve currently active remote SDP", status); + pjsua_perror(THIS_FILE, + "Unable to retrieve currently active remote SDP", + status); return; } @@ -340,7 +346,8 @@ void pjsua_inv_on_media_update(pjsip_inv_session *inv, pj_status_t status) local_sdp, remote_sdp, &inv_data->session ); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create media session", status); + pjsua_perror(THIS_FILE, "Unable to create media session", + status); return; } diff --git a/pjsip/src/pjsua/pjsua_pres.c b/pjsip/src/pjsua/pjsua_pres.c index db009eed..8129a829 100644 --- a/pjsip/src/pjsua/pjsua_pres.c +++ b/pjsip/src/pjsua/pjsua_pres.c @@ -98,7 +98,9 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, &pjsua.contact_uri, &dlg); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create UAS dialog for subscription", status); + pjsua_perror(THIS_FILE, + "Unable to create UAS dialog for subscription", + status); return PJ_FALSE; } @@ -110,7 +112,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) status = pjsip_pres_create_uas( dlg, &pres_cb, rdata, &sub); if (status != PJ_SUCCESS) { PJ_TODO(DESTROY_DIALOG); - pjsua_perror("Unable to create server subscription", status); + pjsua_perror(THIS_FILE, "Unable to create server subscription", + status); return PJ_FALSE; } @@ -134,7 +137,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) /* Create and send 200 (OK) to the SUBSCRIBE request: */ status = pjsip_pres_accept(sub, rdata, 200, NULL); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to accept presence subscription", status); + pjsua_perror(THIS_FILE, "Unable to accept presence subscription", + status); pj_list_erase(uapres); return PJ_FALSE; } @@ -157,7 +161,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) status = pjsip_pres_send_request( sub, tdata); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create/send NOTIFY", status); + pjsua_perror(THIS_FILE, "Unable to create/send NOTIFY", + status); pj_list_erase(uapres); return PJ_FALSE; } @@ -304,7 +309,8 @@ static void subscribe_buddy_presence(unsigned index) &pjsua.buddies[index].uri, NULL, &dlg); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create dialog", status); + pjsua_perror(THIS_FILE, "Unable to create dialog", + status); return; } @@ -312,7 +318,8 @@ static void subscribe_buddy_presence(unsigned index) &pjsua.buddies[index].sub); if (status != PJ_SUCCESS) { pjsua.buddies[index].sub = NULL; - pjsua_perror("Unable to create presence client", status); + pjsua_perror(THIS_FILE, "Unable to create presence client", + status); return; } @@ -322,14 +329,16 @@ static void subscribe_buddy_presence(unsigned index) status = pjsip_pres_initiate(pjsua.buddies[index].sub, 60, &tdata); if (status != PJ_SUCCESS) { pjsua.buddies[index].sub = NULL; - pjsua_perror("Unable to create initial SUBSCRIBE", status); + pjsua_perror(THIS_FILE, "Unable to create initial SUBSCRIBE", + status); return; } status = pjsip_pres_send_request(pjsua.buddies[index].sub, tdata); if (status != PJ_SUCCESS) { pjsua.buddies[index].sub = NULL; - pjsua_perror("Unable to send initial SUBSCRIBE", status); + pjsua_perror(THIS_FILE, "Unable to send initial SUBSCRIBE", + status); return; } @@ -364,7 +373,8 @@ static void unsubscribe_buddy_presence(unsigned index) //pjsua.buddies[index].sub = NULL; } else { - pjsua_perror("Unable to unsubscribe presence", status); + pjsua_perror(THIS_FILE, "Unable to unsubscribe presence", + status); } } @@ -396,7 +406,8 @@ pj_status_t pjsua_pres_init() status = pjsip_endpt_register_module( pjsua.endpt, &mod_pjsua_pres); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to register pjsua presence module", status); + pjsua_perror(THIS_FILE, "Unable to register pjsua presence module", + status); } return status; diff --git a/pjsip/src/pjsua/pjsua_reg.c b/pjsip/src/pjsua/pjsua_reg.c index 972791b1..f11ff3fd 100644 --- a/pjsip/src/pjsua/pjsua_reg.c +++ b/pjsip/src/pjsua/pjsua_reg.c @@ -37,9 +37,15 @@ static void regc_cb(struct pjsip_regc_cbparam *param) /* * Print registration status. */ - if (param->code < 0 || param->code >= 300) { + if (param->status!=PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "SIP registration error", + param->status); + pjsua.regc = NULL; + + } else if (param->code < 0 || param->code >= 300) { PJ_LOG(2, (THIS_FILE, "SIP registration failed, status=%d (%s)", - param->code, pjsip_get_status_text(param->code)->ptr)); + param->code, + pjsip_get_status_text(param->code)->ptr)); pjsua.regc = NULL; } else if (PJSIP_IS_STATUS_IN_CLASS(param->code, 200)) { @@ -53,6 +59,7 @@ static void regc_cb(struct pjsip_regc_cbparam *param) PJ_LOG(4, (THIS_FILE, "SIP registration updated status=%d", param->code)); } + pjsua.regc_last_err = param->status; pjsua.regc_last_code = param->code; pjsua_ui_regc_on_state_changed(pjsua.regc_last_code); @@ -68,19 +75,33 @@ void pjsua_regc_update(pj_bool_t renew) pjsip_tx_data *tdata; if (renew) { - PJ_LOG(3,(THIS_FILE, "Performing SIP registration...")); + if (pjsua.regc == NULL) { + status = pjsua_regc_init(); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "Unable to create registration", + status); + return; + } + } status = pjsip_regc_register(pjsua.regc, 1, &tdata); } else { - PJ_LOG(3,(THIS_FILE, "Performing SIP unregistration...")); + if (pjsua.regc == NULL) { + PJ_LOG(3,(THIS_FILE, "Currently not registered")); + return; + } status = pjsip_regc_unregister(pjsua.regc, &tdata); } + if (status == PJ_SUCCESS) + status = pjsip_regc_send( pjsua.regc, tdata ); + if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create REGISTER request", status); - return; + pjsua_perror(THIS_FILE, "Unable to create/send REGISTER", + status); + } else { + PJ_LOG(3,(THIS_FILE, "%s sent", + (renew? "Registration" : "Unregistration"))); } - - pjsip_regc_send( pjsua.regc, tdata ); } /* @@ -96,7 +117,8 @@ pj_status_t pjsua_regc_init(void) status = pjsip_regc_create( pjsua.endpt, NULL, ®c_cb, &pjsua.regc); if (status != PJ_SUCCESS) { - pjsua_perror("Unable to create client registration", status); + pjsua_perror(THIS_FILE, "Unable to create client registration", + status); return status; } @@ -107,7 +129,9 @@ pj_status_t pjsua_regc_init(void) 1, &pjsua.contact_uri, pjsua.reg_timeout); if (status != PJ_SUCCESS) { - pjsua_perror("Client registration initialization error", status); + pjsua_perror(THIS_FILE, + "Client registration initialization error", + status); return status; } |