merge to sofia sip darcs tree. Includes multiple fixes and several merges of changes from the freeswitch tree back to darcs as follows:

Mon Nov 19 22:05:07 EST 2007  Pekka Pessi <first.lastname@nokia.com>
  * test_htable2.c: define struct before using it in prototypes

Fri Jan 11 09:12:01 EST 2008  Bernhard Suttner <suttner at comdasys.com>
  * Using # in SOATAG_HOLD to set media as inactive instead of sendonly

Fri Jan 11 09:15:18 EST 2008  Pekka.Pessi@nokia.com
  * soa_tag.c: documented SOATAG_HOLD() inactive mode

Fri Jan 11 09:28:46 EST 2008  Pekka.Pessi@nokia.com
  * su_addrinfo.c: if su_getaddrinfo() service is NULL, try both with "0" and NULL

Fri Jan 11 09:30:23 EST 2008  Pekka.Pessi@nokia.com
  * Makefile.am: added tests to DIST_SUBDIRS

Fri Jan 11 12:11:12 EST 2008  Pekka.Pessi@nokia.com
  * nta.c: NetModule hack re-prioritizing SRV records
  
  Original hack by Stefan Leuenberger <Stefan.Leuenberger@netmodule.com>.
  
  The hack reprioritizes the SRV records used with transaction in case a
  server refuses connection or it does not answer.

Fri Jan 11 12:12:23 EST 2008  Pekka.Pessi@nokia.com
  * sres.c, sres_cache.c: NetModule hack for re-prioritizing SRV records
    
  Original hack by Stefan Leuenberger <Stefan.Leuenberger@netmodule.com>.
  
  The hack reprioritizes the SRV records used with transaction in case a
  server refuses connection or it does not answer.
  
  New functions sres_cache_set_srv_priority() and
  sres_set_cached_srv_priority().
  
Fri Jan 11 12:15:19 EST 2008  Pekka.Pessi@nokia.com
  * Makefile.am: fixed dist target

Fri Jan 11 12:19:33 EST 2008  Pekka.Pessi@nokia.com
  * tport_internal.h: grammar in doc

Mon Jan 14 06:59:17 EST 2008  Pekka.Pessi@nokia.com
  * su.h: IPv6 fix for Vista SDK
    
  Patch by Michael Jerris

Wed Jan 16 13:20:47 EST 2008  Pekka.Pessi@nokia.com
  * nua: fix sf.net bug #1867753 (avoid duplicating initial route set)

Thu Jan 17 07:48:10 EST 2008  Pekka.Pessi@nokia.com
  * sres.c, sres_cache.c: documented sres_set_cached_srv_priority(), sres_cache_set_srv_priority()

Thu Jan 17 07:51:32 EST 2008  Pekka.Pessi@nokia.com
  * sofia-sip/su_wait.h, su_port.h, su_root.c: documented new functions and types for 1.12.8

Thu Jan 17 07:52:03 EST 2008  Pekka.Pessi@nokia.com
  * sofia-sip/htable2.h: marked new features for release 1.12.8

Thu Jan 17 07:52:33 EST 2008  Pekka.Pessi@nokia.com
  * su_alloc.c: marked new features for release 1.12.8.

Thu Jan 17 07:53:01 EST 2008  Pekka.Pessi@nokia.com
  * AUTHORS: updated

Thu Jan 17 07:53:21 EST 2008  Pekka.Pessi@nokia.com
  * RELEASE: added new features and bug fixes since 1.12.7

Thu Jan 17 07:55:18 EST 2008  Pekka.Pessi@nokia.com
  * libsofia-sip-ua/docs/Doxyfile.aliases: added @NEW_1_12_8 and @VERSION_1_12_8

Thu Jan 17 09:48:48 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * autogen.sh: use automake 1.9 unless otherwise specified

Thu Jan 17 11:40:46 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * soa_static.c: cleaned inactive hold, added tests

Thu Jan 17 11:41:54 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * Makefile.am: added hide_emails.sh to dist

Thu Jan 17 11:42:35 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * nua_stack.c: removed noisy debug message from nua_client_request_sendmsg()

Fri Jan 18 11:06:10 EST 2008  Pekka.Pessi@nokia.com
  * nua: Added NUA_ERROR_AT() macro
  
  Made internally generated 900 (and 904) response phrases unique as suggested
  by Jerry Richards.

Mon Jan 21 10:39:50 EST 2008  Stefan Knoblich
  * TLS debug cleanup

Mon Jan 21 12:05:38 EST 2008  Pekka.Pessi@nokia.com
  * tport: build fixes from Freeswitch

Mon Jan 21 12:14:25 EST 2008  Pekka.Pessi@nokia.com
  * su_global_log.c: disable warning on SU_DEBUG[] (Doxygen-only variable)
  
  Patch from Michael Jerris.

Mon Jan 21 12:15:19 EST 2008  Pekka.Pessi@nokia.com
  * sres.c: default log level to the same as SU_DEBUG define
  
  Patch by Michael Jerris

Mon Jan 21 12:16:39 EST 2008  Pekka.Pessi@nokia.com
  * stun.c: default log level to the same as SU_DEBUG define
  
  Patch by Michael Jerris

Mon Jan 21 12:45:04 EST 2008  Stefan Knoblich
  * TLS debug cleanup, 2/2.
  
  Silence openssl messages, part 2 of 2. Changed to TPORT_DEBUG=1 (thanks
  MikeJ). This one converts all ERR_print_errors() calls

Mon Jan 21 13:00:49 EST 2008  Pekka.Pessi@nokia.com
  * nua: removed asserts() on hairy dialog/request handling cases

Mon Jan 21 14:06:35 EST 2008  Pekka.Pessi@nokia.com
  * soa.c: using session state in soa_set_activity()
  
  The media mode bits are set using (local) session description instead of
  remote offer/answer when O/A has been completed.

Mon Jan 21 14:08:08 EST 2008  Pekka.Pessi@nokia.com
  * soa_static.c: soa_sdp_mode_set() now includes wanted media state in offer
  
  The wanted media state is based on original user SDP and SOATAG_HOLD()
  content. Removed soa_sdp_mode_set_is_needed(), using dry-run parameter
  instead.
  
Mon Jan 21 14:09:11 EST 2008  Pekka.Pessi@nokia.com
  * nua_subnotref.c: fixed REFER re-try case
  
  REFER trashed its dialog when it got retried if there was no other dialog
  usages.

Mon Jan 21 14:20:31 EST 2008  Pekka.Pessi@nokia.com
  * nua_stack.c: return specific error phrases from nua_client_init_request()
  
  As suggested by Jerry Richards.

Tue Jan 22 11:15:04 EST 2008  Pekka.Pessi@nokia.com
  * sip_util.c: updated sip_response_terminates_dialog() as per RFC 5057.
  
  Changes handling of 423 in case of SUBSCRIBE.

Tue Jan 22 11:34:01 EST 2008  Pekka.Pessi@nokia.com
  * conformance.docs: added RFC 5057 (sipping-dialogusage)

Tue Jan 22 11:34:16 EST 2008  Pekka.Pessi@nokia.com
  * test_auth_digest.c: testing empty realm

Tue Jan 22 11:35:44 EST 2008  Pekka.Pessi@nokia.com
  * test_soa.c: testing hold with inactive, offered mode and setting remote activity flags while in hold

Tue Jan 22 12:27:41 EST 2008  Pekka.Pessi@nokia.com
  * nta.c: fixed memory corruption in case sending ACK failed
  
  Thanks for Fabio Margarido for reporting this problem.

Tue Jan 22 12:49:02 EST 2008  Pekka.Pessi@nokia.com
  * nua/test_refer.c: run test_challenge_refer() only if we use proxy
  
  Test case is now more deterministic, too.

Tue Jan 22 12:51:59 EST 2008  Pekka.Pessi@nokia.com
  * docs/Makefile.am, docs/conformance.docs: fixed links to RFC 5057.

Tue Jan 22 13:57:38 EST 2008  Pekka.Pessi@nokia.com
  * sres: added ttl parameter to sres_set_cached_srv_priority() and sres_cache_set_srv_priority().

Tue Jan 22 13:59:44 EST 2008  Pekka.Pessi@nokia.com
  * nta.c: added NTATAG_GRAYLIST(). 
  
  Use NTATAG_GRAYLIST() as ttl value for sres_set_cached_srv_priority().

Tue Jan 22 14:04:29 EST 2008  Pekka.Pessi@nokia.com
  * RELEASE: updated.

Tue Jan 22 14:04:29 EST 2008  Pekka.Pessi@nokia.com
  * RELEASE: updated.

Wed Jan 23 06:56:11 EST 2008  Pekka.Pessi@nokia.com
  * sip_extra.c, sip_parser.c: updated documentation

Wed Jan 23 09:47:50 EST 2008  Pekka.Pessi@nokia.com
  * test_nta.c: fixed receiving with sink socket

Wed Jan 23 10:07:30 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * soa_static.c: fixed signedness error

Wed Jan 23 10:11:14 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * win32 project files: fixed slash direction

Wed Jan 23 10:13:00 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * torture_su.c: set blocking on

Wed Jan 23 10:13:36 EST 2008  Pekka Pessi <Pekka.Pessi@nokia.com>
  * test_tport.c: using blocking sockets in test_incomplete()

Wed Jan 23 11:01:11 EST 2008  Pekka.Pessi@nokia.com
  * nta.c: now using RFC3261-compliant dialog-matching

Wed Jan 23 11:05:23 EST 2008  Pekka.Pessi@nokia.com
  * nta.c: ignore tags in nta_leg_by_dialog() if they are empty strings

Wed Jan 23 11:05:58 EST 2008  Pekka.Pessi@nokia.com
  * nta.c: asserting in proper place when handling queue tail

Wed Jan 23 12:11:09 EST 2008  Pekka.Pessi@nokia.com
  * torture_sip.c: added tests for accessing other extra headers beside P-Asserted-Identity/P-Preferred-Identity

Wed Jan 23 13:08:55 EST 2008  Pekka.Pessi@nokia.com
  * nua: terminate dialog when redirected and re-establish it with new request

Wed Jan 23 13:18:16 EST 2008  Pekka.Pessi@nokia.com
  * test_100rel.c: added test for redirect after 100rel response.




git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7328 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Jerris committed 2008-01-23 18:37:33 +00:00
1 parent c7b311fdcd
commit da29143b60
75 files changed
+1976 -727

No files matched your search

+53 -41
View File
@@ -70,10 +70,6 @@ static char const __func__[] = "soa";
/* ======================================================================== */
/* Internal prototypes */
void soa_set_activity(soa_session_t *ss,
sdp_media_t const *,
int remote);
su_inline int soa_media_is_ready(soa_session_t const *ss);
enum soa_sdp_kind {
@@ -1171,7 +1167,7 @@ int soa_base_set_remote_sdp(soa_session_t *ss,
if (!new_version)
return 0;
soa_set_activity(ss, sdp->sdp_media, 1);
soa_set_activity(ss, sdp->sdp_media, soa_activity_remote);
ss->ss_remote_version++;
@@ -1454,7 +1450,7 @@ int soa_base_generate_offer(soa_session_t *ss,
if (!sdp)
return -1;
soa_set_activity(ss, sdp->sdp_media, 0);
soa_set_activity(ss, sdp->sdp_media, soa_activity_local); /* Wanted activity */
ss->ss_offer_sent = 1;
ss->ss_answer_recv = 0;
@@ -1542,8 +1538,7 @@ int soa_base_generate_answer(soa_session_t *ss,
su_free(ss->ss_home, ss->ss_rsession);
ss->ss_rsession = rsession;
soa_set_activity(ss, l_sdp->sdp_media, 0);
soa_set_activity(ss, r_sdp->sdp_media, 1);
soa_set_activity(ss, l_sdp->sdp_media, soa_activity_session);
ss->ss_offer_recv = 1;
ss->ss_answer_sent = 1;
@@ -1624,8 +1619,7 @@ int soa_base_process_answer(soa_session_t *ss,
su_free(ss->ss_home, ss->ss_rsession);
ss->ss_rsession = rsession;
soa_set_activity(ss, l_sdp->sdp_media, 0);
soa_set_activity(ss, r_sdp->sdp_media, 1);
soa_set_activity(ss, l_sdp->sdp_media, soa_activity_session);
ss->ss_answer_recv = 1;
ss->ss_complete = 1;
@@ -1692,7 +1686,7 @@ int soa_base_process_reject(soa_session_t *ss,
if (!l_sdp)
return -1;
soa_set_activity(ss, l_sdp->sdp_media, 0);
soa_set_activity(ss, l_sdp->sdp_media, soa_activity_session);
ss->ss_offer_sent = 0;
@@ -1783,8 +1777,7 @@ void soa_base_terminate(soa_session_t *ss, char const *option)
ss->ss_oa_rounds = 0;
soa_description_free(ss, ss->ss_remote);
soa_set_activity(ss, NULL, 0);
soa_set_activity(ss, NULL, 1);
soa_set_activity(ss, NULL, soa_activity_session);
}
/** Return true if the SDP Offer/Answer negotation is complete.
@@ -1889,56 +1882,75 @@ int soa_media_is_ready(soa_session_t const *ss)
void soa_set_activity(soa_session_t *ss,
sdp_media_t const *m,
int remote)
enum soa_activity activity)
{
struct soa_media_activity *ma;
sdp_connection_t const *c;
int mode;
int ma_audio = SOA_ACTIVE_DISABLED;
int ma_video = SOA_ACTIVE_DISABLED;
int ma_chat = SOA_ACTIVE_DISABLED;
int ma_image = SOA_ACTIVE_DISABLED;
int *p;
int mode, swap;
int l_audio = SOA_ACTIVE_DISABLED, r_audio = SOA_ACTIVE_DISABLED;
int l_video = SOA_ACTIVE_DISABLED, r_video = SOA_ACTIVE_DISABLED;
int l_chat = SOA_ACTIVE_DISABLED, r_chat = SOA_ACTIVE_DISABLED;
int l_image = SOA_ACTIVE_DISABLED, r_image = SOA_ACTIVE_DISABLED;
remote = !!remote;
ma = remote ? ss->ss_remote_activity : ss->ss_local_activity;
int *l, *r;
for (; m; m = m->m_next) {
if (m->m_type == sdp_media_audio)
p = &ma_audio;
l = &l_audio, r = &r_audio;
else if (m->m_type == sdp_media_video)
p = &ma_video;
l = &l_video, r = &r_video;
else if (m->m_type == sdp_media_image)
p = &ma_image;
l = &l_image, r = &r_image;
else if (strcasecmp(m->m_type_name, "message") == 0)
p = &ma_chat;
l = &l_chat, r = &r_chat;
else
continue;
if (m->m_rejected) {
if (*p < 0)
*p = SOA_ACTIVE_REJECTED;
if (*l < 0) *l = SOA_ACTIVE_REJECTED;
if (*r < 0) *r = SOA_ACTIVE_REJECTED;
continue;
}
mode = m->m_mode;
mode = m->m_mode, swap = ((mode << 1) & 2) | ((mode >> 1) & 1);
c = sdp_media_connections((sdp_media_t *)m);
if (remote != (c && c->c_mcast))
mode = ((mode << 1) & 2) | ((mode >> 1) & 1);
if (*p < 0)
*p = mode;
else
*p |= mode;
switch (activity) {
case soa_activity_local:
*l &= SOA_ACTIVE_SENDRECV;
*l |= c && c->c_mcast ? swap : mode;
break;
case soa_activity_remote:
*r &= SOA_ACTIVE_SENDRECV;
*r = c && c->c_mcast ? mode : swap;
break;
case soa_activity_session:
*l &= SOA_ACTIVE_SENDRECV;
*l |= c && c->c_mcast ? swap : mode;
*r &= SOA_ACTIVE_SENDRECV;
*r = c && c->c_mcast ? swap : mode;
break;
}
}
ma->ma_audio = ma_audio;
ma->ma_video = ma_video;
ma->ma_image = ma_image;
ma->ma_chat = ma_chat;
if (activity == soa_activity_local ||
activity == soa_activity_session) {
ma = ss->ss_local_activity;
ma->ma_audio = l_audio;
ma->ma_video = l_video;
ma->ma_image = l_image;
ma->ma_chat = l_chat;
}
if (activity == soa_activity_remote ||
activity == soa_activity_session) {
ma = ss->ss_remote_activity;
ma->ma_audio = r_audio;
ma->ma_video = r_video;
ma->ma_image = r_image;
ma->ma_chat = r_chat;
}
}
/* ----------------------------------------------------------------------*/
+65 -56
View File
@@ -974,58 +974,28 @@ int soa_sdp_reject(su_home_t *home,
return 0;
}
/** Check if @a session mode should be changed. */
/** Update mode within session.
*
* @sa soatag_hold
*
* @retval 1 if session was changed (or to be changed, if @a dryrun is nonzero)
*/
static
int soa_sdp_mode_set_is_needed(sdp_session_t const *session,
sdp_session_t const *remote,
char const *hold)
{
sdp_media_t const *sm, *rm, *rm_next;
int hold_all;
sdp_mode_t recv_mode;
SU_DEBUG_7(("soa_sdp_mode_set_is_needed(%p, %p, \"%s\"): called\n",
(void *)session, (void *)remote, hold ? hold : ""));
if (!session )
return 0;
hold_all = str0cmp(hold, "*") == 0;
rm = remote ? remote->sdp_media : NULL, rm_next = NULL;
for (sm = session->sdp_media; sm; sm = sm->m_next, rm = rm_next) {
rm_next = rm ? rm->m_next : NULL;
if (sm->m_rejected)
continue;
if (rm) {
/* Mode bits do not match */
if (((rm->m_mode & sdp_recvonly) == sdp_recvonly)
!= ((sm->m_mode & sdp_sendonly) == sdp_sendonly))
return 1;
}
recv_mode = sm->m_mode & sdp_recvonly;
if (recv_mode && hold &&
(hold_all || strcasestr(hold, sm->m_type_name)))
return 1;
}
return 0;
}
/** Update mode within session */
static
int soa_sdp_mode_set(sdp_session_t *session,
int soa_sdp_mode_set(sdp_session_t const *user,
int const *s2u,
sdp_session_t *session,
sdp_session_t const *remote,
char const *hold)
char const *hold,
int dryrun)
{
sdp_media_t *sm;
sdp_media_t const *rm, *rm_next;
sdp_media_t const *rm, *rm_next, *um;
int retval = 0, i, j;
int hold_all;
int inactive_all;
int inactive = 0;
char const *hold_media = NULL;
sdp_mode_t send_mode, recv_mode;
SU_DEBUG_7(("soa_sdp_mode_set(%p, %p, \"%s\"): called\n",
@@ -1037,25 +1007,58 @@ int soa_sdp_mode_set(sdp_session_t *session,
rm = remote ? remote->sdp_media : NULL, rm_next = NULL;
hold_all = str0cmp(hold, "*") == 0;
inactive_all = str0cmp(hold, "#") == 0;
for (sm = session->sdp_media; sm; sm = sm->m_next, rm = rm_next) {
i = 0;
for (sm = session->sdp_media; sm; sm = sm->m_next, rm = rm_next, i++) {
rm_next = rm ? rm->m_next : NULL;
inactive = 0;
if (sm->m_rejected)
continue;
send_mode = sdp_sendonly;
assert(s2u);
for (j = 0, um = user->sdp_media; j != s2u[i]; um = um->m_next, j++)
assert(um);
assert(um);
send_mode = um->m_mode & sdp_sendonly;
if (rm)
send_mode = (rm->m_mode & sdp_recvonly) ? sdp_sendonly : 0;
recv_mode = sm->m_mode & sdp_recvonly;
if (recv_mode && hold && (hold_all || strcasestr(hold, sm->m_type_name)))
recv_mode = 0;
recv_mode = um->m_mode & sdp_recvonly;
sm->m_mode = recv_mode | send_mode;
if (rm && rm->m_mode == sdp_inactive) {
send_mode = recv_mode = 0;
}
else if (inactive_all) {
send_mode = recv_mode = 0;
}
else if (hold_all) {
recv_mode = 0;
}
else if (hold && (hold_media = strcasestr(hold, sm->m_type_name))) {
recv_mode = 0;
hold_media += strlen(sm->m_type_name);
hold_media += strspn(hold_media, " \t");
if (hold_media[0] == '=') {
hold_media += strspn(hold, " \t");
if (strncasecmp(hold_media, "inactive", strlen("inactive")) == 0)
recv_mode = send_mode = 0;
}
}
if (sm->m_mode != (unsigned)(recv_mode | send_mode))
retval = 1;
if (!dryrun) {
sm->m_mode = recv_mode | send_mode;
}
}
return 0;
return retval;
}
enum offer_answer_action {
@@ -1213,16 +1216,22 @@ static int offer_answer_step(soa_session_t *ss,
/* Step D: Set media mode bits */
switch (action) {
int const *s2u_;
case generate_offer:
case generate_answer:
case process_answer:
if (soa_sdp_mode_set_is_needed(local, remote, ss->ss_hold)) {
s2u_ = s2u;
if (!s2u_) s2u_ = sss->sss_s2u;
if (soa_sdp_mode_set(user, s2u_, local, remote, ss->ss_hold, 1)) {
if (local != local0) {
*local0 = *local, local = local0;
DUP_LOCAL(local);
}
soa_sdp_mode_set(local, remote, ss->ss_hold);
soa_sdp_mode_set(user, s2u_, local, remote, ss->ss_hold, 0);
}
break;
default:
+16 -6
View File
@@ -585,12 +585,22 @@ tag_typedef_t soatag_srtp_integrity = BOOLTAG_TYPEDEF(srtp_integrity);
/**@def SOATAG_HOLD(x)
*
* Hold media stream or streams. When putting a SIP session on hold, the
* application can include, e.g., SOATAG_HOLD("audio") or
* SOATAG_HOLD("video") or SOATAG_HOLD("audio, video") or SOATAG_HOLD("*")
* as @soa parameters. When resuming the session, it can include
* SOATAG_HOLD(NULL). Note that last SOATAG_HOLD() in the tag list will
* override the SOATAG_HOLD() tags before it.
* Hold media stream or streams.
*
* The hold media stream will have the attribute a=sendonly (meaning that
* some hold announcements or pause music is sent to the held party but that
* the held party should not generate any media) or a=inactive (meaning that
* no media is sent).
*
* When putting a SIP session on hold with sendonly, the application can
* include, e.g., SOATAG_HOLD("audio") or SOATAG_HOLD("video") or
* SOATAG_HOLD("audio, video") or SOATAG_HOLD("*") as @soa parameters. When
* using inactive instead, the application should use "#" or
* "audio=inactive" instead. When resuming the session, application should
* include the tag SOATAG_HOLD(NULL).
*
* Note that last SOATAG_HOLD() in the tag list will override the
* SOATAG_HOLD() tags before it.
*
* @par Used with
* soa_set_params(), soa_get_params(), soa_get_paramlist() \n
@@ -238,8 +238,11 @@ SOFIAPUBFUN int soa_has_received_sdp(soa_session_t const *ss);
SOFIAPUBFUN int soa_set_status(soa_session_t *ss,
int status, char const *phrase);
enum soa_activity { soa_activity_local, soa_activity_remote, soa_activity_session };
SOFIAPUBFUN void soa_set_activity(soa_session_t *ss,
sdp_media_t const *m, int remote);
sdp_media_t const *m,
enum soa_activity activity);
SOFIAPUBFUN int soa_description_set(soa_session_t *ss,
struct soa_description *ssd,
+52 -5
View File
@@ -451,20 +451,67 @@ int test_static_offer_answer(struct context *ctx)
TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDONLY);
TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDONLY);
/* 'A' will release hold. */
TEST(soa_set_params(a, SOATAG_HOLD(NULL), TAG_END()), 1);
/* 'A' will put call inactive */
offer = NONE;
TEST(soa_set_params(a, SOATAG_HOLD("#"), TAG_END()), 1);
TEST(soa_generate_offer(a, 1, test_completed), 0);
TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1);
TEST_1(offer != NULL && offer != NONE);
TEST_1(!strstr(offer, "a=sendonly"));
TEST_1(strstr(offer, "a=inactive"));
TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1);
TEST(soa_generate_answer(b, test_completed), 0);
TEST_1(soa_is_complete(b));
TEST(soa_activate(b, NULL), 0);
TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1);
TEST_1(answer != NULL && answer != NONE);
TEST_1(!strstr(answer, "a=recvonly"));
TEST_1(strstr(answer, "a=inactive"));
TEST(soa_set_remote_sdp(a, 0, answer, -1), 1);
TEST(soa_process_answer(a, test_completed), 0);
TEST(soa_activate(a, NULL), 0);
TEST(soa_is_audio_active(a), SOA_ACTIVE_INACTIVE);
TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_INACTIVE);
/* B will send an offer to A, but there is no change in O/A status */
TEST(soa_generate_offer(b, 1, test_completed), 0);
TEST(soa_get_local_sdp(b, NULL, &offer, &offerlen), 1);
TEST_1(offer != NULL && offer != NONE);
TEST_1(!strstr(offer, "a=inactive"));
printf("offer:\n%s", offer);
TEST(soa_set_remote_sdp(a, 0, offer, offerlen), 1);
TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV);
TEST(soa_generate_answer(a, test_completed), 0);
TEST(soa_is_audio_active(a), SOA_ACTIVE_INACTIVE);
TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_INACTIVE);
TEST_1(soa_is_complete(a));
TEST(soa_activate(a, NULL), 0);
TEST(soa_get_local_sdp(a, NULL, &answer, &answerlen), 1);
TEST_1(answer != NULL && answer != NONE);
TEST_1(strstr(answer, "a=inactive"));
printf("answer:\n%s", answer);
TEST(soa_set_remote_sdp(b, 0, answer, -1), 1);
TEST(soa_process_answer(b, test_completed), 0);
TEST(soa_activate(b, NULL), 0);
TEST(soa_is_audio_active(b), SOA_ACTIVE_INACTIVE);
TEST(soa_is_remote_audio_active(b), SOA_ACTIVE_INACTIVE);
/* 'A' will release hold. */
TEST(soa_set_params(a, SOATAG_HOLD(NULL), TAG_END()), 1);
TEST(soa_generate_offer(a, 1, test_completed), 0);
TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1);
TEST_1(offer != NULL && offer != NONE);
TEST_1(!strstr(offer, "a=sendonly") && !strstr(offer, "a=inactive"));
TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1);
TEST(soa_generate_answer(b, test_completed), 0);
TEST_1(soa_is_complete(b));
TEST(soa_activate(b, NULL), 0);
TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1);
TEST_1(answer != NULL && answer != NONE);
TEST_1(!strstr(answer, "a=recvonly") && !strstr(answer, "a=inactive"));
TEST(soa_set_remote_sdp(a, 0, answer, -1), 1);
TEST(soa_process_answer(a, test_completed), 0);
TEST(soa_activate(a, NULL), 0);
@@ -1329,7 +1376,7 @@ int test_asynch_offer_answer(struct context *ctx)
{
BEGIN();
#if 0
#if 0 /* This has never been implemented */
int n;
char const *caps = NONE, *offer = NONE, *answer = NONE;