From 4c8fdb86de12dfe3b4b23e724d76173f99c6bd55 Mon Sep 17 00:00:00 2001
From: Michael Jerris <mike@jerris.com>
Date: Wed, 27 Feb 2008 21:58:17 +0000
Subject: [PATCH] can't pull patches one at a time because they don't compile

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7760 d0543943-73ff-0310-b7d9-9358b9ac24b2
---
 libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c      | 11 ++++-------
 libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c        |  3 ++-
 .../sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h |  1 -
 libs/sofia-sip/libsofia-sip-ua/nua/test_cancel_bye.c  |  3 +++
 libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h         |  5 ++++-
 libs/sofia-sip/libsofia-sip-ua/nua/test_ops.c         |  6 ++++++
 6 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c
index ba6ea387d2..393f9e11e0 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c
+++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c
@@ -1854,9 +1854,8 @@ nua_invite_server_init(nua_server_request_t *sr)
     nua_client_request_t const *cr;
 
     for (sr0 = nh->nh_ds->ds_sr; sr0; sr0 = sr0->sr_next) {
-      /* Final response have not been sent to previous INVITE */
-      if (sr0->sr_method == sip_method_invite && 
-	  nua_server_request_is_pending(sr0))
+      /* Previous INVITE has not been ACKed */
+      if (sr0->sr_method == sip_method_invite)
 	break;
       /* Or we have sent offer but have not received an answer */
       if (sr->sr_sdp && sr0->sr_offer_sent && !sr0->sr_answer_recv)
@@ -1879,10 +1878,8 @@ nua_invite_server_init(nua_server_request_t *sr)
 
     ss = nua_dialog_usage_private(sr->sr_usage);
 
-    if (ss->ss_state < nua_callstate_completed &&
+    if (ss->ss_state < nua_callstate_ready &&
 	ss->ss_state != nua_callstate_init) {
-      /* We should never trigger this, 
-	 but better not to assert() on network input */
       return nua_server_retry_after(sr, 500, "Overlapping Requests 2", 0, 10);
     }
   }
@@ -1917,7 +1914,7 @@ nua_session_server_init(nua_server_request_t *sr)
   else if (sr->sr_usage) {
     nua_session_usage_t *ss = nua_dialog_usage_private(sr->sr_usage);
     if (ss->ss_state >= nua_callstate_terminating)
-      return SR_STATUS1(sr, 481, "Call is being terminated");
+      return SR_STATUS(sr, 481, "Call is being terminated");
   }
 
   if (nh->nh_soa) {
diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c
index 4cc659a4e7..bc5e626277 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c
+++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c
@@ -293,7 +293,8 @@ int nua_stack_event(nua_t *nua, nua_handle_t *nh, msg_t *msg,
   if ((event > nua_r_authenticate && event <= nua_r_ack)
       || event < nua_i_error
       || (nh && !nh->nh_valid)
-      || (nua->nua_shutdown && event != nua_r_shutdown)) {
+      || (nua->nua_shutdown && event != nua_r_shutdown && 
+	  !nua->nua_prefs->ngp_shutdown_events)) {
     if (msg)
       msg_destroy(msg);
     return event;
diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h b/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h
index 785247f47e..b8d71c7ca8 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h
+++ b/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h
@@ -507,7 +507,6 @@ SOFIAPUBVAR tag_typedef_t nutag_newsub;
 #define NUTAG_NEWSUB_REF(x) nutag_newsub_ref, tag_bool_vr(&(x))
 SOFIAPUBVAR tag_typedef_t nutag_newsub_ref;
 
-
 #define NUTAG_REFER_EXPIRES(x)  nutag_refer_expires, tag_uint_v((x))
 SOFIAPUBVAR tag_typedef_t nutag_refer_expires;
 #define NUTAG_REFER_EXPIRES_REF(x) nutag_refer_expires_ref, tag_uint_vr((&(x)))
diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/test_cancel_bye.c b/libs/sofia-sip/libsofia-sip-ua/nua/test_cancel_bye.c
index 69f91dffa8..88c2ae61b1 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nua/test_cancel_bye.c
+++ b/libs/sofia-sip/libsofia-sip-ua/nua/test_cancel_bye.c
@@ -1433,6 +1433,9 @@ int test_bye_with_407(struct context *ctx)
   a_call->sdp = "m=audio 5008 RTP/AVP 8";
   c_call->sdp = "m=audio 5010 RTP/AVP 0 8";
 
+  if (!ctx->proxy_tests)
+    return 0;
+
 /* BYE after receiving 401
 
    A			C
diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h b/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h
index 1d035fcae1..5c67d014d3 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h
+++ b/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h
@@ -178,7 +178,10 @@ struct context
       unsigned bit4:1, bit5:1, bit6:1, bit7:1;
       unsigned :0;
     } flags;
-
+    /* Accross-run state information */
+    struct {
+      unsigned n;
+    } state;
   } a, b, c;
 
   struct proxy *p;
diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/test_ops.c b/libs/sofia-sip/libsofia-sip-ua/nua/test_ops.c
index 355d289adb..0c43d9bf40 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nua/test_ops.c
+++ b/libs/sofia-sip/libsofia-sip-ua/nua/test_ops.c
@@ -182,6 +182,12 @@ void print_event(nua_event_t event,
 	    ep->name, (void *)nh, nua_event_name(event), phrase,
 	    nua_substate_name(t ? t->t_value : 0));
   }
+  else if ((int)event >= nua_i_bye || 
+	   event == nua_i_invite || event == nua_i_cancel ||
+	   event == nua_i_ack) {
+    fprintf(stderr, "%s %s.nua(%p): event %s %03d %s\n", timestamp,
+	    ep->name, (void *)nh, nua_event_name(event), status, phrase);
+  }
   else if ((int)event >= 0) {
     fprintf(stderr, "%s %s.nua(%p): event %s %s\n", timestamp,
 	    ep->name, (void *)nh, nua_event_name(event), phrase);