static int agent_rcand_decode_add(struct trice *icem, const char *val) { struct ice_cand_attr rcand; int err; err = ice_cand_attr_decode(&rcand, val); if (err) return err; /* add only if not exist */ return trice_rcand_add(NULL, icem, rcand.compid, rcand.foundation, rcand.proto, rcand.prio, &rcand.addr, rcand.type, rcand.tcptype); }
TEST(media, ice_cand_decode) { struct ice_cand_attr cand; struct sa addr; int err; err = ice_cand_attr_decode(&cand, "42 1 udp 2113937151 10.0.0.63 2004 typ host"); ASSERT_EQ(0, err); sa_set_str(&addr, "10.0.0.63", 2004); ASSERT_STREQ("42", cand.foundation); ASSERT_EQ(1, cand.compid); ASSERT_EQ(IPPROTO_UDP, cand.proto); ASSERT_EQ(2113937151, cand.prio); ASSERT_TRUE(sa_cmp(&addr, &cand.addr, SA_ALL)); ASSERT_EQ(ICE_CAND_TYPE_HOST, cand.type); }
static void mediaflow_localcand_handler( const struct zapi_candidate *candv, size_t candc, void *arg) { TestMedia *tm = static_cast<TestMedia *>(arg); ASSERT_TRUE(tm->candc < ARRAY_SIZE(tm->candv)); for (size_t i=0; i<candc; i++) { struct ice_cand_attr *cand = &tm->candv[tm->candc]; const struct zapi_candidate *zcand = &candv[i]; int err; if (0 == str_casecmp(zcand->sdp, "a=end-of-candidates")) { ++tm->n_local_eoc; continue; } tm->candc++; err = ice_cand_attr_decode(cand, zcand->sdp); ASSERT_EQ(0, err); ASSERT_STREQ("audio", zcand->mid); ASSERT_EQ(0, zcand->mline_index); /* verify that SRFLX and RELAY candidates contain the related address */ switch (cand->type) { case ICE_CAND_TYPE_SRFLX: case ICE_CAND_TYPE_RELAY: ASSERT_TRUE(sa_isset(&cand->rel_addr, SA_ALL)); break; default: break; } } if (tm->candc >= tm->candc_expected) re_cancel(); }