diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-09-15 08:30:16 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-09-15 08:30:16 +0000 |
commit | 229e150c7b96a344f371fe02262d363ed0b88898 (patch) | |
tree | bd8b4b253ceb3ba011088a91559cf0626dfcf6bc /pjmedia | |
parent | 560a0d9b22efac7c63b45566f8e69ac592421da1 (diff) |
Ticket #370: Implemented callback notification to application when ICE negotiation fails (via on_call_media_state callback)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1435 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia/transport_ice.h | 18 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_ice.c | 44 |
2 files changed, 44 insertions, 18 deletions
diff --git a/pjmedia/include/pjmedia/transport_ice.h b/pjmedia/include/pjmedia/transport_ice.h index cf72886d..2a51ae76 100644 --- a/pjmedia/include/pjmedia/transport_ice.h +++ b/pjmedia/include/pjmedia/transport_ice.h @@ -40,6 +40,22 @@ PJ_BEGIN_DECL /** + * Structure containing callbacks to receive ICE notifications. + */ +typedef struct pjmedia_ice_cb +{ + /** + * This callback will be called when ICE negotiation completes. + * + * @param tp PJMEDIA ICE transport. + * @param status ICE negotiation result, PJ_SUCCESS on success. + */ + void (*on_ice_complete)(pjmedia_transport *tp, + pj_status_t status); + +} pjmedia_ice_cb; + +/** * Create the media transport. * * @param endpt The media endpoint. @@ -47,6 +63,7 @@ PJ_BEGIN_DECL * for logging purposes. * @param comp_cnt Number of components to be created. * @param stun_cfg Pointer to STUN configuration settings. + * @param cb Optional callbacks. * @param p_tp Pointer to receive the media transport instance. * * @return PJ_SUCCESS on success, or the appropriate error code. @@ -55,6 +72,7 @@ PJ_DECL(pj_status_t) pjmedia_ice_create(pjmedia_endpt *endpt, const char *name, unsigned comp_cnt, pj_stun_config *stun_cfg, + const pjmedia_ice_cb *cb, pjmedia_transport **p_tp); /** diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c index 019ba04c..4fa21c29 100644 --- a/pjmedia/src/pjmedia/transport_ice.c +++ b/pjmedia/src/pjmedia/transport_ice.c @@ -25,6 +25,7 @@ struct transport_ice { pjmedia_transport base; pj_ice_strans *ice_st; + pjmedia_ice_cb cb; pj_time_val start_ice; @@ -95,6 +96,7 @@ PJ_DEF(pj_status_t) pjmedia_ice_create(pjmedia_endpt *endpt, const char *name, unsigned comp_cnt, pj_stun_config *stun_cfg, + const pjmedia_ice_cb *cb, pjmedia_transport **p_tp) { pj_ice_strans *ice_st; @@ -123,6 +125,9 @@ PJ_DEF(pj_status_t) pjmedia_ice_create(pjmedia_endpt *endpt, tp_ice->base.op = &tp_ice_op; tp_ice->base.type = PJMEDIA_TRANSPORT_TYPE_ICE; + if (cb) + pj_memcpy(&tp_ice->cb, cb, sizeof(pjmedia_ice_cb)); + ice_st->user_data = (void*)tp_ice; /* Done */ @@ -686,7 +691,7 @@ static void ice_on_rx_data(pj_ice_strans *ice_st, unsigned comp_id, static void ice_on_ice_complete(pj_ice_strans *ice_st, - pj_status_t status) + pj_status_t result) { struct transport_ice *tp_ice = (struct transport_ice*) ice_st->user_data; pj_time_val end_ice; @@ -698,30 +703,33 @@ static void ice_on_ice_complete(pj_ice_strans *ice_st, pj_gettimeofday(&end_ice); PJ_TIME_VAL_SUB(end_ice, tp_ice->start_ice); - if (status != PJ_SUCCESS) { + if (result != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; - pj_strerror(status, errmsg, sizeof(errmsg)); + pj_strerror(result, errmsg, sizeof(errmsg)); PJ_LOG(1,(ice_st->obj_name, "ICE negotiation failed after %d:%03ds: %s", (int)end_ice.sec, (int)end_ice.msec, errmsg)); - return; + } else { + check = &ice_st->ice->valid_list.checks[0]; + + lcand = check->lcand; + rcand = check->rcand; + + pj_ansi_strcpy(src_addr, pj_inet_ntoa(lcand->addr.ipv4.sin_addr)); + pj_ansi_strcpy(dst_addr, pj_inet_ntoa(rcand->addr.ipv4.sin_addr)); + + PJ_LOG(4,(ice_st->obj_name, + "ICE negotiation completed in %d.%03ds. Sending from " + "%s:%d to %s:%d", + (int)end_ice.sec, (int)end_ice.msec, + src_addr, pj_ntohs(lcand->addr.ipv4.sin_port), + dst_addr, pj_ntohs(rcand->addr.ipv4.sin_port))); } - check = &ice_st->ice->valid_list.checks[0]; - - lcand = check->lcand; - rcand = check->rcand; - - pj_ansi_strcpy(src_addr, pj_inet_ntoa(lcand->addr.ipv4.sin_addr)); - pj_ansi_strcpy(dst_addr, pj_inet_ntoa(rcand->addr.ipv4.sin_addr)); - - PJ_LOG(3,(ice_st->obj_name, - "ICE negotiation completed in %d.%03ds. Sending from " - "%s:%d to %s:%d", - (int)end_ice.sec, (int)end_ice.msec, - src_addr, pj_ntohs(lcand->addr.ipv4.sin_port), - dst_addr, pj_ntohs(rcand->addr.ipv4.sin_port))); + /* Notify application */ + if (tp_ice->cb.on_ice_complete) + (*tp_ice->cb.on_ice_complete)(&tp_ice->base, result); } |