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 /pjnath | |
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 'pjnath')
-rw-r--r-- | pjnath/include/pjnath/ice_session.h | 1 | ||||
-rw-r--r-- | pjnath/src/pjnath/ice_session.c | 30 |
2 files changed, 30 insertions, 1 deletions
diff --git a/pjnath/include/pjnath/ice_session.h b/pjnath/include/pjnath/ice_session.h index 14dba41f..b601385c 100644 --- a/pjnath/include/pjnath/ice_session.h +++ b/pjnath/include/pjnath/ice_session.h @@ -464,6 +464,7 @@ struct pj_ice_sess pj_uint8_t *prefs; /**< Type preference. */ pj_bool_t is_complete; /**< Complete? */ pj_status_t ice_status; /**< Error status. */ + pj_timer_entry completion_timer; /**< To call callback. */ pj_ice_sess_cb cb; /**< Callback. */ pj_stun_config stun_cfg; /**< STUN settings. */ diff --git a/pjnath/src/pjnath/ice_session.c b/pjnath/src/pjnath/ice_session.c index 78422af1..27634442 100644 --- a/pjnath/src/pjnath/ice_session.c +++ b/pjnath/src/pjnath/ice_session.c @@ -336,6 +336,12 @@ static void destroy_ice(pj_ice_sess *ice, LOG4((ice->obj_name, "Destroying ICE session")); } + if (ice->completion_timer.id) { + pj_timer_heap_cancel(ice->stun_cfg.timer_heap, + &ice->completion_timer); + ice->completion_timer.id = PJ_FALSE; + } + for (i=0; i<ice->comp_cnt; ++i) { if (ice->comp[i].stun_sess) { pj_stun_session_destroy(ice->comp[i].stun_sess); @@ -945,6 +951,20 @@ static pj_status_t prune_checklist(pj_ice_sess *ice, return PJ_SUCCESS; } +/* Timer callback to call on_ice_complete() callback */ +static void on_completion_timer(pj_timer_heap_t *th, + pj_timer_entry *te) +{ + pj_ice_sess *ice = (pj_ice_sess*) te->user_data; + + PJ_UNUSED_ARG(th); + + te->id = PJ_FALSE; + + if (ice->cb.on_ice_complete) + (*ice->cb.on_ice_complete)(ice, ice->ice_status); +} + /* This function is called when ICE processing completes */ static void on_ice_complete(pj_ice_sess *ice, pj_status_t status) { @@ -962,7 +982,15 @@ static void on_ice_complete(pj_ice_sess *ice, pj_status_t status) /* Call callback */ if (ice->cb.on_ice_complete) { - (*ice->cb.on_ice_complete)(ice, status); + pj_time_val delay = {0, 0}; + + ice->completion_timer.cb = &on_completion_timer; + ice->completion_timer.user_data = (void*) ice; + ice->completion_timer.id = PJ_TRUE; + + pj_timer_heap_schedule(ice->stun_cfg.timer_heap, + &ice->completion_timer, + &delay); } } } |