summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-09-15 08:30:16 +0000
committerBenny Prijono <bennylp@teluu.com>2007-09-15 08:30:16 +0000
commit229e150c7b96a344f371fe02262d363ed0b88898 (patch)
treebd8b4b253ceb3ba011088a91559cf0626dfcf6bc /pjmedia
parent560a0d9b22efac7c63b45566f8e69ac592421da1 (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.h18
-rw-r--r--pjmedia/src/pjmedia/transport_ice.c44
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);
}