[Freeswitch-svn] [commit] r7328 - in freeswitch/trunk/libs/sofia-sip: . libsofia-sip-ua/docs libsofia-sip-ua/iptsec libsofia-sip-ua/nta libsofia-sip-ua/nta/sofia-sip libsofia-sip-ua/nua libsofia-sip-ua/sip libsofia-sip-ua/soa libsofia-sip-ua/soa/sofia-sip libsofia-sip-ua/sresolv libsofia-sip-ua/sresolv/sofia-resolv libsofia-sip-ua/su libsofia-sip-ua/su/sofia-sip libsofia-sip-ua/tport tests win32/libsofia-sip-ua win32/libsofia-sip-ua-static win32/tests/test_htable win32/tests/test_memmem win32/tests/test_nta win32/tests/test_nua win32/tests/test_su win32/tests/test_tport win32/tests/torture_rbtree win32/tests/torture_su win32/tests/torture_su_alloc win32/tests/torture_su_bm win32/tests/torture_su_port win32/tests/torture_su_root win32/tests/torture_su_tag win32/tests/torture_su_time win32/tests/torture_su_timer win32/utils/localinfo win32/utils/sip_dig win32/utils/sip_options win32/utils/sip_options_static win32/utils/stunc

Freeswitch SVN mikej at freeswitch.org
Wed Jan 23 13:37:33 EST 2008


Author: mikej
Date: Wed Jan 23 13:37:33 2008
New Revision: 7328

Modified:
   freeswitch/trunk/libs/sofia-sip/.update
   freeswitch/trunk/libs/sofia-sip/AUTHORS
   freeswitch/trunk/libs/sofia-sip/Makefile.am
   freeswitch/trunk/libs/sofia-sip/RELEASE
   freeswitch/trunk/libs/sofia-sip/autogen.sh
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Doxyfile.aliases
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Makefile.am
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/conformance.docs
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/iptsec/test_auth_digest.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta_api.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_event_server.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_notifier.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_publish.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_register.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_subnotref.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_refer.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_extra.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_util.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/torture_sip.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_tag.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/sofia-sip/soa_session.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/test_soa.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_cache.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres_cache.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/htable2.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_addrinfo.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_addrinfo.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_global_log.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_port.h
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_root.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/test_htable2.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/torture_su.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/test_tport.c
   freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/tport_internal.h
   freeswitch/trunk/libs/sofia-sip/tests/Makefile.am
   freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua-static/libsofia_sip_ua_static.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua/libsofia_sip_ua.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/test_htable/test_htable.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/test_memmem/test_memmem.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/test_nta/test_nta.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/test_nua/test_nua.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/test_su/test_su.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/test_tport/test_tport.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_rbtree/torture_rbtree.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su/torture_su.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_alloc/torture_su_alloc.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_bm/torture_su_bm.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_port/torture_su_port.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_root/torture_su_root.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_tag/torture_su_tag.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_time/torture_su_time.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_timer/torture_su_timer.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/utils/localinfo/localinfo.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/utils/sip_dig/sip_dig.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options/sip_options.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options_static/sip_options_static.vcproj
   freeswitch/trunk/libs/sofia-sip/win32/utils/stunc/stunc.vcproj

Log:
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 at 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 at nokia.com
  * soa_tag.c: documented SOATAG_HOLD() inactive mode

Fri Jan 11 09:28:46 EST 2008  Pekka.Pessi at 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 at nokia.com
  * Makefile.am: added tests to DIST_SUBDIRS

Fri Jan 11 12:11:12 EST 2008  Pekka.Pessi at nokia.com
  * nta.c: NetModule hack re-prioritizing SRV records
  
  Original hack by Stefan Leuenberger <Stefan.Leuenberger at 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 at nokia.com
  * sres.c, sres_cache.c: NetModule hack for re-prioritizing SRV records
    
  Original hack by Stefan Leuenberger <Stefan.Leuenberger at 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 at nokia.com
  * Makefile.am: fixed dist target

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

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

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

Thu Jan 17 07:48:10 EST 2008  Pekka.Pessi at 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 at 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 at nokia.com
  * sofia-sip/htable2.h: marked new features for release 1.12.8

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

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

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

Thu Jan 17 07:55:18 EST 2008  Pekka.Pessi at 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 at nokia.com>
  * autogen.sh: use automake 1.9 unless otherwise specified

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

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

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

Fri Jan 18 11:06:10 EST 2008  Pekka.Pessi at 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 at nokia.com
  * tport: build fixes from Freeswitch

Mon Jan 21 12:14:25 EST 2008  Pekka.Pessi at 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 at 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 at 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 at nokia.com
  * nua: removed asserts() on hairy dialog/request handling cases

Mon Jan 21 14:06:35 EST 2008  Pekka.Pessi at 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 at 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 at 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 at 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 at 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 at nokia.com
  * conformance.docs: added RFC 5057 (sipping-dialogusage)

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

Tue Jan 22 11:35:44 EST 2008  Pekka.Pessi at 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 at 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 at 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 at nokia.com
  * docs/Makefile.am, docs/conformance.docs: fixed links to RFC 5057.

Tue Jan 22 13:57:38 EST 2008  Pekka.Pessi at 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 at 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 at nokia.com
  * RELEASE: updated.

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

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

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

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

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

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

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

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

Wed Jan 23 11:05:23 EST 2008  Pekka.Pessi at 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 at nokia.com
  * nta.c: asserting in proper place when handling queue tail

Wed Jan 23 12:11:09 EST 2008  Pekka.Pessi at 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 at nokia.com
  * nua: terminate dialog when redirected and re-establish it with new request

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




Modified: freeswitch/trunk/libs/sofia-sip/.update
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/.update	(original)
+++ freeswitch/trunk/libs/sofia-sip/.update	Wed Jan 23 13:37:33 2008
@@ -1 +1 @@
-Sat Jan 19 01:47:55 GMT 2008
+Wed Jan 23 13:36:34 EST 2008

Modified: freeswitch/trunk/libs/sofia-sip/AUTHORS
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/AUTHORS	(original)
+++ freeswitch/trunk/libs/sofia-sip/AUTHORS	Wed Jan 23 13:37:33 2008
@@ -16,13 +16,16 @@
 Jacobs, Remeres <first.surname at nokia.com>
 Jalava, Teemu <first.surname at nokia.com>
 Jerris, Michael <mike -at jerris -dot com>
-Legostayev Denis <legostayev -at neic -dot nsk -dot su>
+Legostayev, Denis <legostayev -at neic -dot nsk -dot su>
+Leuenberger, Stefan <first.surname -at netmodule -dot com>
 Prado, Dimitri E. <dprado -at e3c -dot com -dot br>
 Puolakka, Petteri <first.surname at nokia.com>
 Puustinen, Ismo <first.surname at nokia.com>
 Rinne-Rahkola, Pasi <first.surname at nokia.com>
+Rondina, Daniele <geaary -at gmail -dot com>
 Saari, Mika <first.surname at nokia.com>
 Selin, Jari <first.surname at nokia.com>
+Suttner, Bernhard <suttner -at comdasys -dot com>
 Underwood, Steve <steveu -at coppice -dot org>
 Urpalainen, Jari <first.surname at nokia.com>
 Whittaker, Colin <colinw -at occamnetworks -dot com>

Modified: freeswitch/trunk/libs/sofia-sip/Makefile.am
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/Makefile.am	(original)
+++ freeswitch/trunk/libs/sofia-sip/Makefile.am	Wed Jan 23 13:37:33 2008
@@ -9,7 +9,7 @@
 
 SUBDIRS = libsofia-sip-ua $(GLIB_SUBDIRS) utils packages tests
 DIST_SUBDIRS = libsofia-sip-ua libsofia-sip-ua-glib utils packages \
-	win32 open_c
+	tests win32 open_c
 
 # note: when glib devel files are not available, make should not
 #       enter the libsofia-sip-ua-glib subdir at all
@@ -32,7 +32,8 @@
 		docs/devel_platform_notes.txt \
 		docs/release_management.txt
 
-EXTRA_DIST +=   scripts/lcov-report scripts/uncovered
+EXTRA_DIST +=   scripts/lcov-report scripts/uncovered \
+		scripts/hide_emails.sh
 
 dist_man_MANS = man/man1/sip-date.1 man/man1/sip-options.1 \
 		man/man1/localinfo.1 man/man1/addrinfo.1 \

Modified: freeswitch/trunk/libs/sofia-sip/RELEASE
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/RELEASE	(original)
+++ freeswitch/trunk/libs/sofia-sip/RELEASE	Wed Jan 23 13:37:33 2008
@@ -5,26 +5,31 @@
 Changes since last release
 --------------------------
 
-<changes since last written in freshmeat.net "Changes:" style;
- and in less than 10 lines, written in 3rd person English, with
- complete sentences />
+Beside bugfixes, a server graylisting was added to nta and a few
+improvements in event handling were made in nua interface.
 
-Bugs in blaa and foo have been fixed. The stack now supports
-use of foobar...
+A check-based test program was added, too.
 
 API/ABI changes and versioning
 ------------------------------
 
-<see previous release notes at
- http://sofia-sip.sourceforge.net/relnotes/ for examples ;
- - should include all changes to public headers, and 
-   other important information to developers; 
- - and should be updated _continuously_! />
-
-**template**: New features in API are marked with Doxytag macro @VERSION_1_XX_X.
+New features in API are marked with Doxytag macro @NEW_1_12_8 or
+ at VERSION_1_12_8.
 
 libsofia-sip-ua:
-- **template**: Added foobar() function (sofia-sip/foobar.h).
+- Added nta_sip_is_internal(), nta_msg_is_internal() function in
+  <sofia-sip/nta.h>. Deprecating nta_is_internal_msg().
+- Added su_msg_new(), su_msg_send_to() and su_msg_deinitializer() for more 
+  robust and light-weight message passing in <sofia-sip/su_wait.h>
+- Added su_home_lock(), su_home_trylock(), and su_home_unlock() in
+  <sofia-sip/su_alloc.h>
+- Added type-neutral template macros for hash tables HTABLE2_DECLARE2(), HTABLE2_PROTOS2(),
+  and HTABLE2_BODIES2().
+- Added sres_cache_set_srv_priority() in <sofia-resolv/sres_cache.h> and 
+  sres_set_cached_srv_priority() <sofia-resolv/sres.h> for graylisting
+  SRV records for inresponsive servers.
+- nua_create()/nta_agent_create()/tport_bind() now joins to multicast group
+  if "maddr" parameter is specified
 - This release is ABI/API compatible with applications linked against 
   any 1.12.x release. However, applications built against this release won't 
   work against an older library. The ABI has been tested with the nua module 
@@ -38,32 +43,74 @@
 Contributors to this release
 ----------------------------
 
-<list of people who contributed to _this_ release
- - update as people's patches are added, or when you commit stuff
- - current development team members (see AUTHORS) may be omitted,
-   or listed at the end of the contribur list (depending on the scope 
-   of the work done since the last release)
- - name of the contributor should be enough (email addresses in AUTHORS),
-   plus a _brief_ description of what was contributed
- - roughly sorted by number of patches accepted
-/> 
-
-- **template**: First Surname (patch to nua/soa/msg)
-
+- Bernhard Suttner contributed patch to soa for using a=inactive attribute
+  with call hold
+- Stefan Leuenberger from Netmodule contributed the hack for changing
+  priority of SRV records if a SIP server was inresponsive
+- Daniele Rondina contributed patches fixing crash in STUN discovery cleanup
+  and for transport handling with nta_outgoing_*create()
+- Youness Alaoui sent a iPhone build fix
+- Michael Jerris and Stefan Knoblich from Freeswitch project reported
+  numerous bugs and contributed fixes
+  
 See the AUTHORS file in the distribution package.
 
 Notes on new features
 ---------------------
 
-<information about major new features
- - new/changed/removed functionality
- - links to further documentation
- - section may be omitted for minor releases
-/> 
+SIP Server Graylisting
+----------------------
+
+The hack contributed by Stefan Leuenberger from Netmodule changes the
+priority of SRV records which are used when SIP URI is resolved.
+
+If your domain has multiple servers, you can define separate SRV records for
+them. If any of them becomes unresponsive, a SIP request sent to it times
+out or gets rejected because of network error and Sofia SIP automatically
+retries with another server. However, as Sofia SIP does not keep track of
+failed servers with the next request it may again try first the failed
+server. The graylisting repriotizes the SRV records so that the priority of
+the failed server gets reduced and it won't be tried again until all other
+servers have failed, too. Note that the SIP URI resolver may get confused
+when using this kind of repriotizing if a single SRV record corresponds to
+multiple servers or servers with multiple addresses.
+
+You can disable the reprioritizing hack by including tag NTATAG_GREYLIST(0)
+with nua_create(), nua_set_params(), nta_agent_create() or
+nta_agent_set_params().
 
 Bugs fixed in this release
 --------------------------
 
+* Fixed su_home_init not initializing suh_lock.
+* Fixed memory leak when increasing hash table size
+* Fixed problems with multiple authentication challenges. 
+* Fixed sf.net bug #1816647: Outbound contact does not make it to dialogs.
+* Fixed problem with tagargs, amd64 and Sun CC.
+* Fixed nta_outgoing_*create() not using NTATAG_TPORT() if
+  NTATAG_DEFAULT_PROXY() was set. 
+* Fixed memory leak from nua operations.
+* Fixed crash when INVITE destroyed session before UPDATE or PRACK completed
+* Fixed crash in stun when destroying stun context during discovery callback
+* Fixed nta timer interval calculation ignoring some transactions
+* Fixed request merging when client is RFC 2543 proxy
+* Fixed request matching and merging if To/From URI does not match
+* Fixed problem with soa and overlapping INVITEs
+* Fixed handling of RFC 2848 subscriptions (without Event header)
+* Fixed problems with expiration time calculations if NOTIFY is sent before
+  SUBSCRIBE has been responded
+* Fixed su_getaddrinfo() with ephemeral (NULL or "0") service
+* Fixed IPv6 build with Vista SDK
+* Fixed sf.net bug #1867753 (avoid duplicating initial route set
+* Fixed SCTP receive
+* Using tport_log and su_llog() when logging TLS warnings and errors
+* Removed asserts on hairy dialog shutdown cases.
+* Using remote activity mode derived from O/A result rather than mode based on remote
+  offer
+* Fixed mode in SDP offer while on hold
+* Fixed handling of REFER in nua when it gets redirected or challenged
+* Fixed memory corruption when sending of ACK request failed.
+
 < notable bugs fixed in this release
  - check the sf.net bug tracker; see closed bugs,
    sorted by closing date

Modified: freeswitch/trunk/libs/sofia-sip/autogen.sh
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/autogen.sh	(original)
+++ freeswitch/trunk/libs/sofia-sip/autogen.sh	Wed Jan 23 13:37:33 2008
@@ -1,6 +1,8 @@
 #!/bin/sh 
 
 set -x
+AUTOMAKE=${AUTOMAKE:-automake-1.9} ACLOCAL=${ACLOCAL:-aclocal-1.9}
+export AUTOMAKE ACLOCAL
 ${AUTORECONF:-autoreconf} -i
 find . \( -name 'run*' -o -name '*.sh' \) -a -type f | xargs chmod +x
 chmod +x scripts/*

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Doxyfile.aliases
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Doxyfile.aliases	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Doxyfile.aliases	Wed Jan 23 13:37:33 2008
@@ -52,4 +52,7 @@
  "VERSION_1_12_7=<a href=\"http://sofia-sip.sf.net/relnotes/relnotes-sofia-sip-1.12.7.txt\">1.12.7</a>" \
  "NEW_1_12_7=@since New in <a href=\"http://sofia-sip.sf.net/relnotes/relnotes-sofia-sip-1.12.7.txt\">1.12.7</a>" \
  "EXP_1_12_7=@since Experimental in <a href=\"http://sofia-sip.sf.net/relnotes/relnotes-sofia-sip-1.12.7.txt\">1.12.7</a>, available if --enable-experimental configuration option is given" \
+ "VERSION_1_12_8=<a href=\"http://sofia-sip.sf.net/relnotes/relnotes-sofia-sip-1.12.8.txt\">1.12.8</a>" \
+ "NEW_1_12_8=@since New in <a href=\"http://sofia-sip.sf.net/relnotes/relnotes-sofia-sip-1.12.8.txt\">1.12.8</a>" \
+
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Makefile.am
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Makefile.am	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/Makefile.am	Wed Jan 23 13:37:33 2008
@@ -2,7 +2,6 @@
 		docguide.docs \
 		mainpage.docs \
 		conformance.docs \
-		hide_emails.sh \
 		ChangeLog \
 	pictures/SIP_basic_incoming_operation.eps \
 	pictures/SIP_basic_incoming_operation.gif \
@@ -37,7 +36,7 @@
 		  print "RFC"i"=\"<a href="q site i type q">RFC "i"</a>\" "b; \
 		}}' \
 	site=http://www.faqs.org/rfcs/rfc type=.html \
-	from=700 to=4800 \
+	from=700 to=5500 \
 	/dev/null > $@
 
 CLEANFILES = Doxyfile.rfc *.doxytags

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/conformance.docs
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/conformance.docs	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/docs/conformance.docs	Wed Jan 23 13:37:33 2008
@@ -49,6 +49,7 @@
 <a href="#4168">RFC 4168</a> <br>
 <a href="#4320">RFC 4320</a> <br>
 <a href="#4488">RFC 4488</a> <br>
+<a href="#5057">RFC 5057</a> <br>
 </td><td>
 <a href="#4566">RFC 4566</a> <br>
 <a href="#2327">RFC 2327</a> <br>
@@ -963,6 +964,23 @@
     </td>
 </tr>
 
+<a name="5057"></a>
+<tr valign=top>
+    <th align="left">
+	@RFC5057: Multiple Dialog Usages in SIP
+    </th>
+    <td>
+	Sofia-SIP provides function sip_response_terminates_dialog() that
+	can be used to determine the effect of error response with dialog.
+	
+	The nua UA engine uses sip_response_terminates_dialog().
+    </td>
+    <td>
+        The client application must either use NUA or
+        sip_response_terminates_dialog().
+    </td>
+</tr>
+
 </table>
 
 <table border=1 cellpadding=4 cellspacing=0>

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/iptsec/test_auth_digest.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/iptsec/test_auth_digest.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/iptsec/test_auth_digest.c	Wed Jan 23 13:37:33 2008
@@ -520,6 +520,11 @@
 	 sip_www_authenticate_class,
 	 sip_authentication_info_class
 	}};
+    auth_challenger_t pach[1] = 
+      {{ 407, "Proxy Authorization required", 
+	 sip_proxy_authenticate_class,
+	 sip_proxy_authentication_info_class
+	}};
 
     TEST_1(home = su_home_new(sizeof(*home)));
 
@@ -994,6 +999,46 @@
     TEST(as->as_status, 0);
     auth_mod_destroy(am); aucs = NULL;
 
+    /* Test empty realm */
+    TEST_1(am = auth_mod_create(root, 
+				AUTHTAG_METHOD("Digest"),
+				AUTHTAG_REALM(""),
+				AUTHTAG_DB(testpasswd),
+				TAG_END()));
+    reinit_as(as);
+    auth_mod_check_client(am, as, NULL, ach); TEST(as->as_status, 401);
+    TEST(auc_challenge(&aucs, home, (msg_auth_t *)as->as_response, 
+		       sip_authorization_class), 1);
+    reinit_as(as);
+
+    TEST(auc_all_credentials(&aucs, "Digest", "\"\"", "user1", "secret"), 1);
+    msg_header_remove(m2, (void *)sip, (void *)sip->sip_authorization);
+    TEST(auc_authorization(&aucs, m2, (msg_pub_t*)sip, rq->rq_method_name, 
+			   (url_t *)"sip:surf3 at ims3.so.noklab.net",
+			   sip->sip_payload), 1);
+    TEST_1(sip->sip_authorization);
+
+    auth_mod_check_client(am, as, sip->sip_authorization, ach);
+    TEST(as->as_status, 0);
+    aucs = NULL;
+    reinit_as(as); 
+    auth_mod_check_client(am, as, NULL, pach); TEST(as->as_status, 407);
+    TEST(auc_challenge(&aucs, home, (msg_auth_t *)as->as_response, 
+		       sip_proxy_authorization_class), 1);
+    reinit_as(as);
+
+    TEST(auc_credentials(&aucs, as->as_home, "Digest:\"\":user1:secret"), 1);
+    msg_header_remove(m2, (void *)sip, (void *)sip->sip_proxy_authorization);
+    TEST(auc_authorization(&aucs, m2, (msg_pub_t*)sip, rq->rq_method_name, 
+			   (url_t *)"sip:surf3 at ims3.so.noklab.net",
+			   sip->sip_payload), 1);
+    TEST_1(sip->sip_proxy_authorization);
+
+    auth_mod_check_client(am, as, sip->sip_proxy_authorization, pach);
+    TEST(as->as_status, 0);
+
+    auth_mod_destroy(am); aucs = NULL;
+
     /* Test Basic authentication scheme */
     TEST_1(am = auth_mod_create(root, 
 				AUTHTAG_METHOD("Basic"),

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c	Wed Jan 23 13:37:33 2008
@@ -176,9 +176,7 @@
 			   url_t const *request_uri,
 			   sip_call_id_t const *i,
 			   char const *from_tag,
-			   url_t const *from_uri,
-			   char const *to_tag,
-			   url_t const *to_uri);
+			   char const *to_tag);
 static nta_leg_t *dst_find(nta_agent_t const *sa, url_t const *u0,
 			   char const *method);
 static void leg_recv(nta_leg_t *, msg_t *, sip_t *, tport_t *);
@@ -340,7 +338,7 @@
  * NTATAG_BAD_REQ_MASK(), NTATAG_BAD_RESP_MASK(), NTATAG_BLACKLIST(),
  * NTATAG_CANCEL_2543(), NTATAG_CANCEL_487(), NTATAG_CLIENT_RPORT(),
  * NTATAG_DEBUG_DROP_PROB(), NTATAG_DEFAULT_PROXY(),
- * NTATAG_EXTRA_100(),
+ * NTATAG_EXTRA_100(), NTATAG_GRAYLIST(),
  * NTATAG_MAXSIZE(), NTATAG_MAX_FORWARDS(), NTATAG_MERGE_482(), NTATAG_MCLASS()
  * NTATAG_PASS_100(), NTATAG_PASS_408(), NTATAG_PRELOAD(), NTATAG_PROGRESS(), 
  * NTATAG_REL100(), 
@@ -402,6 +400,7 @@
     agent->sa_t4              = NTA_SIP_T4;
     agent->sa_t1x64 	      = 64 * NTA_SIP_T1;
     agent->sa_timer_c         = 185 * 1000;
+    agent->sa_graylist        = 600;
     agent->sa_drop_prob       = 0;
     agent->sa_is_a_uas        = 0;
     agent->sa_progress        = 60 * 1000;
@@ -896,7 +895,7 @@
  * NTATAG_BAD_REQ_MASK(), NTATAG_BAD_RESP_MASK(), NTATAG_BLACKLIST(),
  * NTATAG_CANCEL_2543(), NTATAG_CANCEL_487(), NTATAG_CLIENT_RPORT(),
  * NTATAG_DEBUG_DROP_PROB(), NTATAG_DEFAULT_PROXY(),
- * NTATAG_EXTRA_100(),
+ * NTATAG_EXTRA_100(), NTATAG_GRAYLIST(),
  * NTATAG_MAXSIZE(), NTATAG_MAX_FORWARDS(), NTATAG_MERGE_482(), NTATAG_MCLASS()
  * NTATAG_PASS_100(), NTATAG_PASS_408(), NTATAG_PRELOAD(), NTATAG_PROGRESS(), 
  * NTATAG_REL100(), 
@@ -946,6 +945,7 @@
   unsigned sip_t4     = agent->sa_t4;
   unsigned sip_t1x64  = agent->sa_t1x64;
   unsigned timer_c    = agent->sa_timer_c;
+  unsigned graylist   = agent->sa_graylist;
   unsigned blacklist  = agent->sa_blacklist;
   int ua              = agent->sa_is_a_uas;
   unsigned progress   = agent->sa_progress;
@@ -989,6 +989,7 @@
 	      NTATAG_DEBUG_DROP_PROB_REF(drop_prob),
 	      NTATAG_DEFAULT_PROXY_REF(proxy),
 	      NTATAG_EXTRA_100_REF(extra_100),
+	      NTATAG_GRAYLIST_REF(graylist),
 	      NTATAG_MAXSIZE_REF(maxsize),
 	      NTATAG_MAX_PROCEEDING_REF(max_proceeding),
 	      NTATAG_MAX_FORWARDS_REF(max_forwards),
@@ -1142,6 +1143,12 @@
     outgoing_queue_adjust(agent, agent->sa_out.inv_proceeding, timer_c);
   }
 
+  if (graylist > 24 * 60 * 60)
+    graylist = 24 * 60 * 60;
+  agent->sa_graylist = graylist;
+
+  if (blacklist > 24 * 60 * 60)
+    blacklist = 24 * 60 * 60;
   agent->sa_blacklist = blacklist;
 
   if (progress == 0)
@@ -1204,7 +1211,7 @@
  * NTATAG_CANCEL_2543_REF(), NTATAG_CANCEL_487_REF(),
  * NTATAG_CLIENT_RPORT_REF(), NTATAG_CONTACT_REF(), 
  * NTATAG_DEBUG_DROP_PROB_REF(), NTATAG_DEFAULT_PROXY_REF(),
- * NTATAG_EXTRA_100_REF(),
+ * NTATAG_EXTRA_100_REF(), NTATAG_GRAYLIST_REF(),
  * NTATAG_MAXSIZE_REF(), NTATAG_MAX_FORWARDS_REF(), NTATAG_MCLASS_REF(),
  * NTATAG_MERGE_482_REF(), NTATAG_MAX_PROCEEDING_REF(),
  * NTATAG_PASS_100_REF(), NTATAG_PASS_408_REF(), NTATAG_PRELOAD_REF(),
@@ -1253,6 +1260,7 @@
 	     NTATAG_DEBUG_DROP_PROB(agent->sa_drop_prob),
 	     NTATAG_DEFAULT_PROXY(agent->sa_default_proxy),
 	     NTATAG_EXTRA_100(agent->sa_extra_100),
+	     NTATAG_GRAYLIST(agent->sa_graylist),
 	     NTATAG_MAXSIZE(agent->sa_maxsize),
 		 NTATAG_MAX_PROCEEDING(agent->sa_max_proceeding),
 	     NTATAG_MAX_FORWARDS(agent->sa_max_forwards->mf_count),
@@ -2416,8 +2424,8 @@
   if ((leg = leg_find(agent, 
 		      method_name, url, 
 		      sip->sip_call_id,
-		      sip->sip_from->a_tag, sip->sip_from->a_url, 
-		      sip->sip_to->a_tag, sip->sip_to->a_url))) {
+		      sip->sip_from->a_tag, 
+		      sip->sip_to->a_tag))) {
     /* Try existing dialog */
     SU_DEBUG_5(("nta: %s (%u) %s\n",
 		method_name, cseq, "going to existing leg"));
@@ -3991,12 +3999,12 @@
 
     id->i_hash = msg_hash_string(id->i_id = rp->rp_call_id);
 
-    leg = leg_find(sa, NULL, NULL, id, from_tag, NULL, to_tag, NULL);
+    leg = leg_find(sa, NULL, NULL, id, from_tag, to_tag);
 
     if (leg == NULL && strcmp(from_tag, "0") == 0)
-      leg = leg_find(sa, NULL, NULL, id, NULL, NULL, to_tag, NULL);
+      leg = leg_find(sa, NULL, NULL, id, NULL, to_tag);
     if (leg == NULL && strcmp(to_tag, "0") == 0)
-      leg = leg_find(sa, NULL, NULL, id, from_tag, NULL, NULL, NULL);
+      leg = leg_find(sa, NULL, NULL, id, from_tag, NULL);
   }
 
   return leg;
@@ -4120,11 +4128,14 @@
  * @param call_id      if non-NULL, must match with @CallID header contents
  * @param remote_tag   if there is remote tag 
  *                     associated with dialog, @a remote_tag must match 
- * @param remote_uri   if there is no remote tag, the remote URI must match
+ * @param remote_uri   ignored
  * @param local_tag    if non-NULL and there is local tag associated with leg,
  *                     it must math
- * @param local_uri    if there is no local tag, the local URI must match
+ * @param local_uri    ignored
  *
+ * @note
+ * If @a remote_tag or @a local_tag is an empty string (""), the tag is
+ * ignored when matching legs.
  */
 nta_leg_t *nta_leg_by_dialog(nta_agent_t const *agent,
 			     url_t const *request_uri,
@@ -4134,7 +4145,7 @@
 			     char const *local_tag,
 			     url_t const *local_uri)
 {
-  void *to_be_freed = NULL, *tbf2 = NULL, *tbf3 = NULL;
+  void *to_be_freed = NULL;
   url_t *url;
   url_t url0[1];
   nta_leg_t *leg;
@@ -4158,21 +4169,18 @@
     agent_aliases(agent, url, NULL); /* canonize url */
   }
 
-  if (remote_uri && URL_IS_STRING(remote_uri))
-    request_uri = tbf2 = url_hdup(NULL, remote_uri);
+  if (remote_tag && remote_tag[0] == '\0')
+    remote_tag = NULL;
+  if (local_tag && local_tag[0] == '\0')
+    local_tag = NULL;
 
-  if (local_uri && URL_IS_STRING(local_uri))
-    local_uri = tbf3 = url_hdup(NULL, local_uri);
-  
   leg = leg_find(agent, 
 		 NULL, url, 
 		 call_id, 
-		 remote_tag, remote_uri,
-		 local_tag, local_uri);
+		 remote_tag, 
+		 local_tag);
 
   if (to_be_freed) su_free(NULL, to_be_freed);
-  if (tbf2) su_free(NULL, tbf2);
-  if (tbf3) su_free(NULL, tbf3);
 
   return leg;
 }
@@ -4181,7 +4189,7 @@
  * Find a leg corresponding to the request message.
  *
  * A leg matches to message if leg_match_request() returns true ("Call-ID",
- * "To", and "From" match).
+ * "To"-tag, and "From"-tag match).
  */
 static
 nta_leg_t *leg_find(nta_agent_t const *sa,
@@ -4189,9 +4197,7 @@
 		    url_t const *request_uri,
 		    sip_call_id_t const *i,
 		    char const *from_tag,
-		    url_t const *from_uri,
-		    char const *to_tag,
-		    url_t const *to_uri)
+		    char const *to_tag)
 {
   hash_value_t hash = i->i_hash;
   leg_htable_t const *lht = sa->sa_dialogs;
@@ -4201,10 +4207,9 @@
        (leg = *ll);
        ll = leg_htable_next(lht, ll)) {
     sip_call_id_t const *leg_i = leg->leg_id;
-    url_t const *remote_uri = leg->leg_remote->a_url;
     char const *remote_tag = leg->leg_remote->a_tag;
-    url_t const *local_uri = leg->leg_local->a_url;
     char const *local_tag = leg->leg_local->a_tag;
+
     url_t const *leg_url = leg->leg_url;
     char const *leg_method = leg->leg_method;
 
@@ -4212,6 +4217,7 @@
       continue;
     if (strcmp(leg_i->i_id, i->i_id) != 0)
       continue;
+
     /* Do not match if the incoming To has tag, but the local does not */
     if (!local_tag && to_tag)
       continue;
@@ -4226,15 +4232,14 @@
     /* Do not match if incoming From has no tag but remote has a tag */
     if (remote_tag && !from_tag)
       continue;
+
     /* Avoid matching with itself */
     if (!remote_tag != !from_tag && !local_tag != !to_tag)
       continue;
 
-    if (local_tag && to_tag ? 
-	strcasecmp(local_tag, to_tag) : addr_cmp(local_uri, to_uri))
+    if (local_tag && to_tag && strcasecmp(local_tag, to_tag) && to_tag[0])
       continue;
-    if (remote_tag && from_tag ? 
-	strcasecmp(remote_tag, from_tag) : addr_cmp(remote_uri, from_uri))
+    if (remote_tag && from_tag && strcasecmp(remote_tag, from_tag) && from_tag[0])
       continue;
 
     if (leg_url && request_uri && url_cmp(leg_url, request_uri))
@@ -6390,7 +6395,7 @@
 			       char const *timer, 
 			       su_duration_t now);
 
-static void outgoing_ack(nta_outgoing_t *orq, msg_t *msg, sip_t *sip);
+static void outgoing_ack(nta_outgoing_t *orq, sip_t *sip);
 static msg_t *outgoing_ackmsg(nta_outgoing_t *, sip_method_t, char const *,
 			      tagi_t const *tags);
 static void outgoing_retransmit(nta_outgoing_t *orq);
@@ -7657,6 +7662,7 @@
   if (outgoing_is_queued(orq))
     outgoing_remove(orq);
 
+  assert(orq->orq_next == NULL);
   assert(*queue->q_tail == NULL);
 
   orq->orq_timeout = set_timeout(orq->orq_agent, queue->q_timeout);
@@ -7680,7 +7686,7 @@
   if ((*orq->orq_prev = orq->orq_next))
     orq->orq_next->orq_prev = orq->orq_prev;
   else
-    orq->orq_queue->q_tail = orq->orq_prev, assert(!*orq->orq_queue->q_tail);
+    orq->orq_queue->q_tail = orq->orq_prev;
 
   orq->orq_queue->q_length--;
   orq->orq_next = NULL;
@@ -8334,7 +8340,7 @@
     else {
       /* Final response */
       if (status >= 300 && !internal)
-	outgoing_ack(orq, msg, sip);
+	outgoing_ack(orq, sip);
 
       if (!orq->orq_completed) {
 	if (outgoing_complete(orq))
@@ -8532,7 +8538,7 @@
 /** @internal ACK to a final response (300..699).
  * These messages are ACK'ed via the original URL (and tport)
  */
-void outgoing_ack(nta_outgoing_t *orq, msg_t *msg, sip_t *sip)
+void outgoing_ack(nta_outgoing_t *orq, sip_t *sip)
 {
   nta_outgoing_t *ack;
   msg_t *ackmsg;
@@ -8563,7 +8569,7 @@
 			       TAG_END())))
       ;
     else
-      msg_destroy(msg);
+      msg_destroy(ackmsg);
   }
 }
 
@@ -8836,8 +8842,8 @@
   char const *sq_proto;
   char const *sq_domain;
   char     sq_port[6];		/* port number */
-
-  uint16_t sq_type;
+  uint16_t sq_otype;		/* origin type of query data (0 means request) */
+  uint16_t sq_type;		/* query type */
   uint16_t sq_priority;		/* priority or preference  */
   uint16_t sq_weight;		/* preference or weight */
 };
@@ -9068,6 +9074,65 @@
   outgoing_reset_timer(orq);
   outgoing_queue(orq->orq_agent->sa_out.resolving, orq);
 
+  if (orq->orq_status > 0)
+    /* PP: don't hack priority if a preliminary response has been received */
+    ;
+  else if (orq->orq_agent->sa_graylist == 0)
+    /* PP: priority hacking disabled */
+    ;
+  /* NetModule hack: 
+   * Move server that did not work to end of queue in sres cache
+   *
+   * the next request does not try to use the server that is currently down
+   *
+   * @TODO: fix cases with only A or AAAA answering, or all servers down.
+   */
+  else if (sr && sr->sr_target) {
+    struct sipdns_query *sq;
+
+    /* find latest A/AAAA record */
+    sq = sr->sr_head;
+    if (!sq || (sr->sr_a_aaaa1 != sr->sr_a_aaaa2 && sq->sq_type == sr->sr_a_aaaa1))
+	sq = sr->sr_done;	
+    
+    if (sq && sq->sq_otype == sres_type_srv) {
+      char const *target = sq->sq_domain, *proto = sq->sq_proto;
+      unsigned prio = sq->sq_priority, maxprio = prio;
+
+      SU_DEBUG_5(("nta: no response from %s:%s;transport=%s\n", target, sq->sq_port, proto));
+
+      for (sq = sr->sr_head; sq; sq = sq->sq_next) 
+	if (sq->sq_otype == sres_type_srv && sq->sq_priority > maxprio)
+	  maxprio = sq->sq_priority;
+
+      for (sq = sr->sr_done; sq; sq = sq->sq_next)
+	if (sq->sq_otype == sres_type_srv && sq->sq_priority > maxprio)
+	  maxprio = sq->sq_priority;
+
+      for (sq = sr->sr_done; sq; sq = sq->sq_next) {
+	int modified;
+
+	if (sq->sq_type != sres_type_srv || strcmp(proto, sq->sq_proto))
+	  continue;
+
+	/* modify the SRV record(s) corresponding to the latest A/AAAA record */
+	modified = sres_set_cached_srv_priority(
+	  orq->orq_agent->sa_resolver, 
+	  sq->sq_domain, 
+	  target,
+	  sq->sq_port[0] ? (uint16_t)strtoul(sq->sq_port, NULL, 10) : 0,
+	  orq->orq_agent->sa_graylist,
+	  maxprio + 1);
+
+	if (modified >= 0)
+	  SU_DEBUG_3(("nta: reduced priority of %d %s SRV records (increase value to %u)\n",
+		      modified, sq->sq_domain, maxprio + 1));
+	else
+	  SU_DEBUG_3(("nta: failed to reduce %s SRV priority\n", sq->sq_domain));
+      }
+    }
+  }
+
   return outgoing_resolve_next(orq);
 }
 
@@ -9346,6 +9411,7 @@
     sq = su_zalloc(home, (sizeof *sq) + rlen);
 
     *tail = sq, tail = &sq->sq_next;    
+    sq->sq_otype = sres_type_naptr;
     sq->sq_priority = na->na_prefer;
     sq->sq_weight = j;
     sq->sq_type = type;
@@ -9446,11 +9512,11 @@
     if (sq) {
       *tail = sq, tail = &sq->sq_next;
 
+      sq->sq_otype = sres_type_srv;
       sq->sq_type = sr->sr_a_aaaa1;
       sq->sq_proto = sq0->sq_proto;
       sq->sq_domain = memcpy(sq + 1, srv->srv_target, tlen);
       snprintf(sq->sq_port, sizeof(sq->sq_port), "%u", srv->srv_port);
-
       sq->sq_priority = srv->srv_priority;
       sq->sq_weight = srv->srv_weight;
     }
@@ -10143,8 +10209,8 @@
   if ((leg = leg_find(irq->irq_agent, 
 		      method_name, url, 
 		      sip->sip_call_id,
-		      sip->sip_from->a_tag, sip->sip_from->a_url, 
-		      sip->sip_to->a_tag, sip->sip_to->a_url))) {
+		      sip->sip_from->a_tag,  
+		      sip->sip_to->a_tag))) {
     /* Use existing dialog */
     SU_DEBUG_5(("nta: %s (%u) %s\n",
 		method_name, sip->sip_cseq->cs_seq, 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h	Wed Jan 23 13:37:33 2008
@@ -167,6 +167,8 @@
   /** SIP timer C - interval between provisional responses receivedxs */
   unsigned              sa_timer_c;
 
+  /** Graylisting period */
+  unsigned              sa_graylist;
   /** Blacklisting period */
   unsigned              sa_blacklist;
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c	Wed Jan 23 13:37:33 2008
@@ -643,6 +643,31 @@
  */
 tag_typedef_t ntatag_timer_c = UINTTAG_TYPEDEF(timer_c);
 
+/**@def NTATAG_GRAYLIST(x)
+ *
+ * Avoid failed servers.
+ *
+ * The NTATAG_GRAYLIST() provides the time that the servers are avoided
+ * after a request sent to them has been failed. Avoiding means that if a
+ * domain provides multiple servers, the failed servers are tried last.
+ *
+ * @par Used with
+ *    nua_create(), nua_set_params(),
+ *    nta_agent_create(), nta_agent_set_params()
+ *
+ * @par Parameter type
+ *     unsigned int
+ *
+ * @par Values
+ *    - Number of seconds that server is kept in graylist, from 0 to 86400.
+ *
+ * @par Default Value
+ *    - 600 (graylist server for 10 minutes)
+ *
+ * @sa NTATAG_BLACKLIST(), NTATAG_TIMEOUT_408()
+ */
+tag_typedef_t ntatag_graylist = UINTTAG_TYPEDEF(graylist);
+
 /**@def NTATAG_BLACKLIST(x)
  *
  * Add Retry-After header to error responses returned to application.
@@ -660,7 +685,7 @@
  *     unsigned int
  *
  * @par Values
- *    - Value of delta-seconds in @RetryAfter header
+ *    - Value of @i delta-seconds in @RetryAfter header, from 0 to 86400
  *
  * @par Default Value
  *    - 0 (no Retry-After is included)

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h	Wed Jan 23 13:37:33 2008
@@ -203,6 +203,12 @@
 NTA_DLL extern tag_typedef_t ntatag_timer_c_ref;
 #define NTATAG_TIMER_C_REF(x) ntatag_timer_c_ref, tag_uint_vr(&(x))
 
+NTA_DLL extern tag_typedef_t ntatag_graylist;
+#define NTATAG_GRAYLIST(x)  ntatag_graylist, tag_uint_v((x))
+
+NTA_DLL extern tag_typedef_t ntatag_graylist_ref;
+#define NTATAG_GRAYLIST_REF(x) ntatag_graylist_ref, tag_uint_vr(&(x))
+
 NTA_DLL extern tag_typedef_t ntatag_blacklist;
 #define NTATAG_BLACKLIST(x)  ntatag_blacklist, tag_uint_v((x))
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c	Wed Jan 23 13:37:33 2008
@@ -363,8 +363,16 @@
   return 200;
 }
 
+static client_check_f client_check_to_tag;
 
-static client_check_f * const default_checks[];
+static client_check_f * const default_checks[] = {
+  client_check_to_tag,
+  NULL
+};
+
+static client_check_f * const no_default_checks[] = {
+  NULL
+};
 
 int outgoing_callback(client_t *ctx,
 		      nta_outgoing_t *orq,
@@ -1014,14 +1022,6 @@
 }
 
 
-static client_check_f * const default_checks[] = {
-  client_check_to_tag,
-  NULL
-};
-
-static client_check_f * const no_default_checks[] = {
-  NULL
-};
 
 
 /* Test transports */
@@ -2256,8 +2256,23 @@
   END();
 }
 
-/* Test merging  */
+static ssize_t recv_udp(agent_t *ag, void *b, size_t size)
+{
+  ssize_t n;
 
+  memset(b, size, 0);
+  
+  for (;;) {
+    su_root_step(ag->ag_root, 10L);
+    if (su_wait(ag->ag_sink_wait, 1, 0) == 0) {
+      n = su_recv(ag->ag_sink_socket, b, size, MSG_TRUNC);
+      if (n > 0)
+	return n;
+    }
+  }
+}
+
+/* Test merging  */
 int test_merging(agent_t *ag)
 {
   BEGIN();
@@ -2289,11 +2304,17 @@
   size_t len, l1, l2;
   su_sockaddr_t *su = ag->ag_su_nta;
   socklen_t sulen = ag->ag_su_nta_len;
-  int n;
+
+#ifndef MSG_TRUNC
+#define MSG_TRUNC 0
+#endif
 
   /* Empty sink socket */
-  while (su_wait(ag->ag_sink_wait, 1, 0) == 0) 
-    su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC);
+  su_setblocking(ag->ag_sink_socket, 0);
+  while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
+    ;
+  su_wait(ag->ag_sink_wait, 1, 0);
+  su_wait(ag->ag_sink_wait, 1, 0);
 
   {
     /* RFC 3261 8.2.2.2 Merged Requests:
@@ -2338,16 +2359,9 @@
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1);
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2);
 
-    for (n = 0; n < 2; ) {
-      su_root_step(ag->ag_root, 10L);
-      if (su_wait(ag->ag_sink_wait, 1, 0) == 0) {
-	if (n == 0)
-	  su_recv(ag->ag_sink_socket, r1, sizeof r1, MSG_TRUNC);
-	else
-	  su_recv(ag->ag_sink_socket, r2, sizeof r2, MSG_TRUNC);
-	n++;
-      }
-    }
+    recv_udp(ag, r1, sizeof r1);
+    recv_udp(ag, r2, sizeof r2);
+
     len = strlen("SIP/2.0 200 ");
     TEST_1(memcmp(r1, "SIP/2.0 200 ", len) == 0);
     TEST_1(memcmp(r2, "SIP/2.0 482 ", len) == 0);
@@ -2355,6 +2369,9 @@
     TEST_P(ag->ag_latest_leg, ag->ag_server_leg);
   }
 
+  while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
+    ;
+
   {
     /*
      * Check that request with same call-id, cseq and from-tag 
@@ -2392,16 +2409,8 @@
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1);
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2);
 
-    for (n = 0; n < 2; ) {
-      su_root_step(ag->ag_root, 10L);
-      if (su_wait(ag->ag_sink_wait, 1, 0) == 0) {
-	if (n == 0)
-	  su_recv(ag->ag_sink_socket, r1, sizeof r1, MSG_TRUNC);
-	else
-	  su_recv(ag->ag_sink_socket, r2, sizeof r2, MSG_TRUNC);
-	n++;
-      }
-    }
+    recv_udp(ag, r1, sizeof r1);
+    recv_udp(ag, r2, sizeof r2);
 
     len = strlen("SIP/2.0 200 ");
     TEST_1(memcmp(r1, "SIP/2.0 200 ", len) == 0);
@@ -2410,6 +2419,9 @@
     TEST_P(ag->ag_latest_leg, ag->ag_server_leg);
   }
 
+  while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
+    ;
+
   {
     /* test with rfc2543 */
 
@@ -2440,16 +2452,9 @@
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1);
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2);
 
-    for (n = 0; n < 2; ) {
-      su_root_step(ag->ag_root, 10L);
-      if (su_wait(ag->ag_sink_wait, 1, 0) == 0) {
-	if (n == 0)
-	  su_recv(ag->ag_sink_socket, r1, sizeof r1, MSG_TRUNC);
-	else
-	  su_recv(ag->ag_sink_socket, r2, sizeof r2, MSG_TRUNC);
-	n++;
-      }
-    }
+    recv_udp(ag, r1, sizeof r1);
+    recv_udp(ag, r2, sizeof r2);
+
     l1 = strlen("SIP/2.0 200 ");
     TEST_1(memcmp(r1, "SIP/2.0 200 ", l1) == 0);
     TEST_1(memcmp(r2, "SIP/2.0 482 ", l1) == 0);
@@ -2457,6 +2462,9 @@
     TEST_P(ag->ag_latest_leg, ag->ag_server_leg);
   }
 
+  while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
+    ;
+
   {
     /* test with to-tag */
 
@@ -2487,16 +2495,9 @@
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1);
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2);
 
-    for (n = 0; n < 2; ) {
-      su_root_step(ag->ag_root, 10L);
-      if (su_wait(ag->ag_sink_wait, 1, 0) == 0) {
-	if (n == 0)
-	  su_recv(ag->ag_sink_socket, r1, sizeof r1, MSG_TRUNC);
-	else
-	  su_recv(ag->ag_sink_socket, r2, sizeof r2, MSG_TRUNC);
-	n++;
-      }
-    }
+    recv_udp(ag, r1, sizeof r1);
+    recv_udp(ag, r2, sizeof r2);
+
     l1 = strlen("SIP/2.0 200 ");
     TEST_1(memcmp(r1, "SIP/2.0 200 ", l1) == 0);
     TEST_1(memcmp(r2, "SIP/2.0 482 ", l1) != 0);
@@ -2504,6 +2505,9 @@
     TEST_P(ag->ag_latest_leg, ag->ag_server_leg);
   }
 
+  while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
+    ;
+
   {
     /* test with rfc2543 and to-tag */
 
@@ -2532,16 +2536,9 @@
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1);
     TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2);
 
-    for (n = 0; n < 2; ) {
-      su_root_step(ag->ag_root, 10L);
-      if (su_wait(ag->ag_sink_wait, 1, 0) == 0) {
-	if (n == 0)
-	  su_recv(ag->ag_sink_socket, r1, sizeof r1, MSG_TRUNC);
-	else
-	  su_recv(ag->ag_sink_socket, r2, sizeof r2, MSG_TRUNC);
-	n++;
-      }
-    }
+    recv_udp(ag, r1, sizeof r1);
+    recv_udp(ag, r2, sizeof r2);
+
     l1 = strlen("SIP/2.0 200 ");
     TEST_1(memcmp(r1, "SIP/2.0 200 ", l1) == 0);
     TEST_1(memcmp(r2, "SIP/2.0 482 ", l1) != 0);

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta_api.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta_api.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/test_nta_api.c	Wed Jan 23 13:37:33 2008
@@ -1268,15 +1268,17 @@
   TEST_P(leg = nta_leg_by_dialog(nta, (url_t *)"sip:pc.al.us", i, 
 				 "xyzzy", a2->a_url, a1->a_tag, a1->a_url),
 	 dialog1);
+#if nomore
   /* remote url is required */
   TEST_P(leg = nta_leg_by_dialog(nta, (url_t *)"sip:pc.al.us", i, 
 				 a2->a_tag, a1->a_url, a1->a_tag, a1->a_url),
 	 NULL);
+#endif
   TEST_P(leg = nta_leg_by_dialog(nta, (url_t *)"sip:pc.al.us", i, 
 				 a2->a_tag, NULL, a1->a_tag, a1->a_url),
 	 dialog1);
 
-  /* local url is used if there is no local tag */
+  /* local url is used if there is no local tag */ /* XXX - not really */
   TEST_P(leg = nta_leg_by_dialog(nta, (url_t *)"sip:pc.al.us", i, 
 				 a2->a_tag, a2->a_url, NULL, NULL),
 	 NULL);

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.c	Wed Jan 23 13:37:33 2008
@@ -183,22 +183,35 @@
   }
 }
 
+/** Remove dialog information. */
+int nua_dialog_zap(nua_owner_t *own,
+		   nua_dialog_state_t *ds)
+{
+  /* zap peer info */
+  nua_dialog_store_peer_info(own, ds, NULL); 
+  /* Local Contact */
+  msg_header_free(own, (msg_header_t *)ds->ds_ltarget), ds->ds_ltarget = NULL;
+  /* Leg */
+  nta_leg_destroy(ds->ds_leg), ds->ds_leg = NULL;
+  /* Remote tag */
+  su_free(own, (void *)ds->ds_remote_tag), ds->ds_remote_tag = NULL;
+  /* Ready to set route/remote target */
+  ds->ds_route = 0;
+
+  return 0;
+}
+
 /** Remove dialog (if there is no other usages). */
 int nua_dialog_remove(nua_owner_t *own,
 		      nua_dialog_state_t *ds,
 		      nua_dialog_usage_t *usage)
 {
   if (ds->ds_usage == usage && (usage == NULL || usage->du_next == NULL)) {
-    nua_dialog_store_peer_info(own, ds, NULL); /* zap peer info */
-    msg_header_free(own, (msg_header_t *)ds->ds_ltarget), ds->ds_ltarget = NULL;
-    nta_leg_destroy(ds->ds_leg), ds->ds_leg = NULL;
-    su_free(own, (void *)ds->ds_remote_tag), ds->ds_remote_tag = NULL;
-    ds->ds_route = 0;
+    return nua_dialog_zap(own, ds);
   }
   return 0;
 }
 
-
 /** @internal Get dialog usage slot. */
 nua_dialog_usage_t **
 nua_dialog_usage_at(nua_dialog_state_t const *ds, 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h	Wed Jan 23 13:37:33 2008
@@ -422,6 +422,8 @@
 			  sip_t const *sip, int rtag);
 void nua_dialog_store_peer_info(nua_owner_t *, nua_dialog_state_t *ds,
 				sip_t const *sip);
+int nua_dialog_zap(nua_owner_t *own,
+		   nua_dialog_state_t *ds);
 int nua_dialog_remove(nua_owner_t *own,
 		      nua_dialog_state_t *ds,
 		      nua_dialog_usage_t *usage);
@@ -545,6 +547,8 @@
 
 int nua_client_init_request(nua_client_request_t *cr);
 
+msg_t *nua_client_request_template(nua_client_request_t *cr);
+
 int nua_client_restart_request(nua_client_request_t *cr,
 			       int terminating,
 			       tagi_t const *tags);

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_event_server.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_event_server.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_event_server.c	Wed Jan 23 13:37:33 2008
@@ -262,7 +262,7 @@
     nua_stack_event(nua, nh, NULL, e, SIP_200_OK, NULL);
   }
   else {
-    nua_stack_event(nua, nh, NULL, e, NUA_INTERNAL_ERROR, NULL);
+    nua_stack_event(nua, nh, NULL, e, NUA_ERROR_AT(__FILE__, __LINE__), NULL);
   }
 }
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_notifier.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_notifier.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_notifier.c	Wed Jan 23 13:37:33 2008
@@ -775,7 +775,7 @@
       return;
   }
 
-  nua_stack_tevent(nh->nh_nua, nh, NULL, e, NUA_INTERNAL_ERROR,
+  nua_stack_tevent(nh->nh_nua, nh, NULL, e, NUA_ERROR_AT(__FILE__, __LINE__),
 		   NUTAG_SUBSTATE(nua_substate_terminated),
 		   TAG_END());
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_publish.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_publish.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_publish.c	Wed Jan 23 13:37:33 2008
@@ -405,7 +405,7 @@
 	if (!ex || ex->ex_delta == 0)
 	  SET_STATUS(900, "Received Invalid Expiration Time");
 	else
-	  SET_STATUS1(NUA_INTERNAL_ERROR);
+	  SET_STATUS1(NUA_ERROR_AT(__FILE__, __LINE__));
       }
       else
 	nua_dialog_usage_set_refresh(du, ex->ex_delta);
@@ -428,7 +428,7 @@
   }
 
   nua_stack_event(nh->nh_nua, nh, NULL,
-		  nua_r_publish, NUA_INTERNAL_ERROR,
+		  nua_r_publish, NUA_ERROR_AT(__FILE__, __LINE__),
 		  NULL);
 
   nua_dialog_usage_remove(nh, ds, du);

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_register.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_register.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_register.c	Wed Jan 23 13:37:33 2008
@@ -1046,7 +1046,7 @@
   }
 
   /* Report that we have de-registered */
-  nua_stack_event(nua, nh, NULL, nua_r_register, NUA_INTERNAL_ERROR, NULL);
+  nua_stack_event(nua, nh, NULL, nua_r_register, NUA_ERROR_AT(__FILE__, __LINE__), NULL);
   nua_dialog_usage_remove(nh, ds, du);
 }
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c	Wed Jan 23 13:37:33 2008
@@ -1091,11 +1091,14 @@
 
   assert(cr->cr_orq);
 
+
   if (!ds->ds_leg) {
-	  nta_outgoing_destroy(cr->cr_orq);
-	  return -1;
+    /* XXX - fix nua_dialog_usage_remove_at() instead! */
+    nta_outgoing_destroy(cr->cr_orq);
+    return -1;
   }
 
+  assert(ds->ds_leg);
 
   msg = nta_outgoing_getrequest(cr->cr_orq);
   sip = sip_object(msg);

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c	Wed Jan 23 13:37:33 2008
@@ -650,7 +650,7 @@
   }
 
   if (error < 0) {
-    nua_stack_event(nh->nh_nua, nh, NULL, event, NUA_INTERNAL_ERROR, NULL);
+    nua_stack_event(nh->nh_nua, nh, NULL, event, NUA_ERROR_AT(__FILE__, __LINE__), NULL);
   }
 
   su_msg_destroy(nua->nua_signal);
@@ -1214,9 +1214,9 @@
     cr->cr_waiting = cr->cr_wait_for_cred = 0;
     
     if (status < 0)
-      nua_client_response(cr, 900, "Cannot add credentials", NULL);
+      nua_client_response(cr, 900, "Operation cannot add credentials", NULL);
     else
-      nua_client_response(cr, 904, "No matching challenge", NULL);
+      nua_client_response(cr, 904, "Operation has no matching challenge ", NULL);
   }
   else if (status < 0) {
     nua_stack_event(nua, nh, NULL, e, 900, "Cannot add credentials", NULL);
@@ -1984,7 +1984,7 @@
     return nua_stack_event(nh->nh_nua, nh, 
 			   NULL,
 			   event,
-			   NUA_INTERNAL_ERROR,
+			   NUA_ERROR_AT(__FILE__, __LINE__),
 			   NULL);
   }
 
@@ -2125,7 +2125,9 @@
   }
 
   if (du->du_cr && cr != du->du_cr) {
-
+    /* This should never happen (but it does):
+       assert(!nua_client_is_queued(du->du_cr)); 
+    */
     if (nua_client_is_queued(du->du_cr))
       return -1;
     if (nua_client_is_reporting(du->du_cr)) {
@@ -2161,7 +2163,7 @@
   int error = 0;
   
   if (!cr->cr_method_name)
-    return nua_client_return(cr, NUA_INTERNAL_ERROR, NULL);
+    return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), NULL);
 
   if (cr->cr_msg)
     return nua_client_request_try(cr);
@@ -2186,12 +2188,22 @@
   }
 
   if (!cr->cr_methods->crm_template ||
-      !cr->cr_methods->crm_template(cr, &msg, cr->cr_tags))
-    msg = nta_msg_create(nua->nua_nta, 0);
+      cr->cr_methods->crm_template(cr, &msg, cr->cr_tags) == 0)
+    msg = nua_client_request_template(cr);
 
   sip = sip_object(msg);
   if (!sip)
-    return nua_client_return(cr, NUA_INTERNAL_ERROR, msg);
+    return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
+
+  if (nh->nh_tags) {
+    for (t = nh->nh_tags; t; t = t_next(t)) {
+      if (t->t_tag == siptag_contact ||
+	  t->t_tag == siptag_contact_str)
+	has_contact = 1;
+      else if (t->t_tag == nutag_url)
+	url = (url_string_t const *)t->t_value;
+    }
+  }
 
   /**@par Populating SIP Request Message with Tagged Arguments
    *
@@ -2211,30 +2223,6 @@
    * However, if a tag value is #SIP_NONE (-1 casted as a void pointer),
    * the values from previous tags are ignored.
    */
-  if (nh->nh_tags) {
-    for (t = nh->nh_tags; t; t = t_next(t)) {
-      if (t->t_tag == siptag_contact ||
-	  t->t_tag == siptag_contact_str)
-	has_contact = 1;
-      else if (t->t_tag == nutag_url)
-	url = (url_string_t const *)t->t_value;
-    }
-
-    t = nh->nh_tags;
-
-    /* Use the From header from the dialog */
-    if (ds->ds_leg && t->t_tag == siptag_from)
-      t++;
-
-    sip_add_tagis(msg, sip, &t);
-  }
-
-  if (!ds->ds_route) {
-    sip_route_t *initial_route = NH_PGET(nh, initial_route);
-    if (initial_route)
-      sip_add_dup(msg, sip, (sip_header_t *)initial_route);
-  }
-
   for (t = cr->cr_tags; t; t = t_next(t)) {
     if (t->t_tag == siptag_contact ||
 	t->t_tag == siptag_contact_str)
@@ -2257,7 +2245,7 @@
   
   if ((t = cr->cr_tags)) {
     if (sip_add_tagis(msg, sip, &t) < 0)
-      goto error;
+      return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
   }
 
   /**
@@ -2277,11 +2265,11 @@
   if (!ds->ds_leg) {
     if (ds->ds_remote_tag && ds->ds_remote_tag[0] && 
 	sip_to_tag(nh->nh_home, sip->sip_to, ds->ds_remote_tag) < 0)
-      goto error;
+      return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
 
     if (sip->sip_from == NULL && 
 	sip_add_dup(msg, sip, (sip_header_t *)nua->nua_from) < 0)
-      goto error;
+      return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
 
     if (cr->cr_dialog) {
       ds->ds_leg = nta_leg_tcreate(nua->nua_nta,
@@ -2292,12 +2280,12 @@
 				   SIPTAG_CSEQ(sip->sip_cseq),
 				   TAG_END());
       if (!ds->ds_leg)
-	goto error;
+	return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
 
       if (!sip->sip_from->a_tag &&
 	  sip_from_tag(msg_home(msg), sip->sip_from,
 		       nta_leg_tag(ds->ds_leg, NULL)) < 0)
-	goto error;
+	return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
     }
   }
   else {
@@ -2306,7 +2294,7 @@
   }
 
   if (url && nua_client_set_target(cr, (url_t *)url) < 0)
-    goto error;
+    return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
 
   cr->cr_has_contact = has_contact;
 
@@ -2315,7 +2303,7 @@
     if (error < -1)
       msg = NULL;
     if (error < 0)
-      goto error;
+      return nua_client_return(cr, NUA_ERROR_AT(__FILE__, __LINE__), msg);
     if (error != 0)
       return error;
   }
@@ -2325,8 +2313,34 @@
 
   return nua_client_request_try(cr);
 
- error:
-  return nua_client_return(cr, NUA_INTERNAL_ERROR, msg);
+}
+
+msg_t *nua_client_request_template(nua_client_request_t *cr)
+{
+  nua_handle_t *nh = cr->cr_owner;
+  nua_t *nua = nh->nh_nua;
+  nua_dialog_state_t *ds = nh->nh_ds;
+
+  msg_t *msg = nta_msg_create(nua->nua_nta, 0);
+  sip_t *sip = sip_object(msg);
+
+  if (!sip)
+    return NULL;
+
+  if (nh->nh_tags) {
+    tagi_t const *t = nh->nh_tags;
+
+    /* Use the From header from the dialog. 
+       From is always first tag in the handle */
+    if (ds->ds_leg && t->t_tag == siptag_from)
+      t++;
+
+    /* When the INVITE message (or any other SIP message) is
+     * created, the tagged values saved with nua_handle() are used first. */
+    sip_add_tagis(msg, sip, &t);
+  }
+
+  return msg;
 }
 
 
@@ -2352,6 +2366,7 @@
 
     return nua_client_request_try(cr);
   }
+
   return 0;
 }
 
@@ -2415,7 +2430,7 @@
   }
 
   if (error < 0)
-    error = nua_client_response(cr, NUA_INTERNAL_ERROR, NULL);
+    error = nua_client_response(cr, NUA_ERROR_AT(__FILE__, __LINE__), NULL);
 
   assert(error > 0);
   return error;
@@ -2453,6 +2468,22 @@
     while (sip->sip_route)
       sip_route_remove(msg, sip);
   }
+  else if (!ds->ds_route) {
+    sip_route_t *initial_route = NH_PGET(nh, initial_route);
+
+    if (initial_route) {
+      initial_route = sip_route_dup(msg_home(msg), initial_route);
+      if (!initial_route) return -1;
+      msg_header_prepend(msg, (msg_pub_t*)sip, 
+			 /* This should be 
+			    (msg_header_t **)&sip->sip_route
+			  * but directly casting pointer &sip->sip_route gives
+			  * spurious type-punning warning */
+			 (msg_header_t **)((char *)sip + offsetof(sip_t, sip_route)),
+			 (msg_header_t *)initial_route);
+    }
+  }
+
   
   /**
    * For in-dialog requests, the request URI is taken from the @Contact
@@ -2747,14 +2778,16 @@
 
     switch (status) {
     case 302:
-      if (nua_client_set_target(cr, sip->sip_contact->m_url) >= 0)
+      if (nua_dialog_zap(nh, nh->nh_ds) == 0 &&
+	  nua_client_set_target(cr, sip->sip_contact->m_url) >= 0)
 	return nua_client_restart(cr, 100, "Redirected");
       break;
 
     case 305:
       sip_route_init(r);
       *r->r_url = *sip->sip_contact->m_url;
-      if (sip_add_dup(cr->cr_msg, cr->cr_sip, (sip_header_t *)r) >= 0)
+      if (nua_dialog_zap(nh, nh->nh_ds) == 0 &&
+	  sip_add_dup(cr->cr_msg, cr->cr_sip, (sip_header_t *)r) >= 0)
 	return nua_client_restart(cr, 100, "Redirected via a proxy");
       break;
 
@@ -2867,10 +2900,11 @@
 		       int status, char const *phrase)
 {
   nua_handle_t *nh = cr->cr_owner;
+  nua_dialog_state_t *ds = nh->nh_ds;
   nta_outgoing_t *orq;
   int error = -1, terminated, graceful;
-  msg_t *msg;
-  sip_t *sip;
+  msg_t *msg = NULL;
+  sip_t *sip = NULL;
 
   if (cr->cr_retry_count > NH_PGET(nh, retry_count))
     return 0;
@@ -2878,9 +2912,24 @@
   orq = cr->cr_orq, cr->cr_orq = NULL;  assert(orq);
   terminated = cr->cr_terminated, cr->cr_terminated = 0;
   graceful = cr->cr_graceful, cr->cr_graceful = 0;
+  cr->cr_offer_sent = cr->cr_answer_recv = 0;
+  cr->cr_offer_recv = cr->cr_answer_sent = 0;
 
-  msg = msg_copy(cr->cr_msg);
-  sip = sip_object(msg);
+  if (!ds->ds_leg && cr->cr_dialog) {
+    sip_t const *sip = cr->cr_sip;
+    ds->ds_leg = nta_leg_tcreate(nh->nh_nua->nua_nta,
+				 nua_stack_process_request, nh,
+				 SIPTAG_CALL_ID(sip->sip_call_id),
+				 SIPTAG_FROM(sip->sip_from),
+				 SIPTAG_TO(sip->sip_to),
+				 SIPTAG_CSEQ(sip->sip_cseq),
+				 TAG_END());
+  }
+
+  if (ds->ds_leg || !cr->cr_dialog) {
+    msg = msg_copy(cr->cr_msg);
+    sip = sip_object(msg);
+  }
 
   if (msg && sip) {
     cr->cr_restarting = 1;

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.h	Wed Jan 23 13:37:33 2008
@@ -207,6 +207,7 @@
 extern char const nua_internal_error[];
 
 #define NUA_INTERNAL_ERROR 900, nua_internal_error
+#define NUA_ERROR_AT(file, line) 900, "Internal error at " file ":" #line
 
 struct nua_s {
   su_home_t            nua_home[1];

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_subnotref.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_subnotref.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_subnotref.c	Wed Jan 23 13:37:33 2008
@@ -451,7 +451,7 @@
 
   if (!eu->eu_unsolicited)
     nua_stack_tevent(nh->nh_nua, nh, NULL,
-		     nua_i_notify, NUA_INTERNAL_ERROR,
+		     nua_i_notify, NUA_ERROR_AT(__FILE__, __LINE__),
 		     NUTAG_SUBSTATE(nua_substate_terminated),
 		     SIPTAG_EVENT(du->du_event),
 		     TAG_END());
@@ -831,22 +831,31 @@
 				    tagi_t const *tags)
 {
   nua_handle_t *nh = cr->cr_owner;
-  nua_dialog_usage_t *du = cr->cr_usage;
+  nua_dialog_usage_t *du, *du0 = cr->cr_usage;
   struct event_usage *eu;
   sip_event_t *event;
   int error;
 
   cr->cr_usage = NULL;
 
-  if (du)
-    nua_dialog_usage_remove(nh, nh->nh_ds, du);
-
   event = sip_event_format(nh->nh_home, "refer;id=%u", sip->sip_cseq->cs_seq);
   if (!event)
     return -1;
-  du = nua_dialog_usage_add(nh, nh->nh_ds, nua_subscribe_usage, event);
-  if (!du)
-    return -1;
+
+  if (du0 == NULL ||
+      du0->du_event == NULL ||
+      du0->du_event->o_id == NULL ||
+      strcmp(du0->du_event->o_id, event->o_id)) {
+    du = nua_dialog_usage_add(nh, nh->nh_ds, nua_subscribe_usage, event);
+    if (!du)
+      return -1;
+  }
+  else {
+    du = du0, du0 = NULL;
+  }
+
+  if (du0)
+    nua_dialog_usage_remove(nh, nh->nh_ds, du0);
 
   eu = nua_dialog_usage_private(cr->cr_usage = du);
   eu ->eu_refer = 1;

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c	Wed Jan 23 13:37:33 2008
@@ -1793,6 +1793,223 @@
 
   END();
 }
+
+int test_update_failure(struct context *ctx)
+{
+  BEGIN();
+#if 0
+  struct endpoint *a = &ctx->a,  *b = &ctx->b;
+  struct call *a_call = a->call, *b_call = b->call;
+  struct event *e, *eu, *ei;
+  enum nua_callstate ustate, istate;
+
+  if (print_headings)
+    printf("TEST NUA-10.4.1: UPDATE failure terminating session\n");
+
+/* Test UPDATE failing:
+
+   A			B
+   |-------INVITE------>|
+   |<----100 Trying-----|
+   |			|
+   |<-------183---------|
+   |-------PRACK------->|
+   |<-------200---------|
+   |			|
+   |<-------180---------|
+   |			|
+ +------------------------+
+   |<------200 OK-------|
+   |-------UPDATE------>|
+   |			|
+   |<-------481---------|
+   |			|
+   |--------ACK-------->|
+   |			|
+   |<-------BYE---------|
+   |-------200 OK-------|
+   |			|
+
+*/
+
+  a_call->sdp = "m=audio 5008 RTP/AVP 8";
+  b_call->sdp = "m=audio 5010 RTP/AVP 0 8";
+
+  nua_set_params(ctx->a.nua,
+		 NUTAG_EARLY_MEDIA(1),
+		 SIPTAG_SUPPORTED_STR("100rel, precondition, timer"),
+		 TAG_END());
+  run_a_until(ctx, nua_r_set_params, until_final_response);
+
+  nua_set_params(ctx->b.nua,
+		 NUTAG_EARLY_MEDIA(1),
+		 NUTAG_ONLY183_100REL(1),
+		 SIPTAG_SUPPORTED_STR("100rel, precondition, timer"),
+		 NUTAG_APPL_METHOD("UPDATE"),
+		 TAG_END());
+  run_b_until(ctx, nua_r_set_params, until_final_response);
+
+  TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END()));
+
+  INVITE(a, a_call, a_call->nh,
+	 TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)),
+	 SOATAG_USER_SDP_STR(a_call->sdp),
+	 SIPTAG_SUPPORTED_STR("100rel"),
+	 TAG_END());
+
+  run_ab_until(ctx, -1, save_until_final_response, -1, until_pracked);
+
+  /* Client transitions:
+     INIT -(C1)-> CALLING: nua_invite(), nua_i_state
+     CALLING -(C2)-> PROCEEDING: nua_r_invite, nua_i_state
+     PROCEEDING -(C3+C4)-> READY: nua_r_invite, nua_i_state
+  */
+  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */
+  TEST_1(is_offer_sent(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite);
+  TEST(e->data->e_status, 183);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_proceeding);
+  TEST_1(is_answer_recv(e->data->e_tags));
+  /* Offer is sent in PRACK */
+  TEST_1(is_offer_sent(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_prack);
+  TEST(e->data->e_status, 200);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_proceeding);
+  TEST_1(is_answer_recv(e->data->e_tags));
+  TEST_1(!is_offer_sent(e->data->e_tags));
+
+  /* Send UPDATE */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_proceeding);
+  TEST_1(!is_answer_recv(e->data->e_tags));
+  TEST_1(is_offer_sent(e->data->e_tags));
+
+  /* The final response to the UPDATE and INVITE can be received in any order */
+  eu = event_by_type(e->next, nua_r_update);
+  ei = event_by_type(e->next, nua_r_invite);
+
+  TEST_1(e = eu); TEST_E(e->data->e_event, nua_r_update);
+  TEST(e->data->e_status, 200);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  ustate = callstate(e->data->e_tags);
+  TEST_1(is_answer_recv(e->data->e_tags));
+  TEST_1(!is_offer_sent(e->data->e_tags));
+
+  TEST_1(e = ei); TEST_E(e->data->e_event, nua_r_invite);
+  TEST(e->data->e_status, 180);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_proceeding); /* PROCEEDING */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+
+  /* Final response to INVITE  */
+  TEST_1(ei = event_by_type(ei->next, nua_r_invite));
+
+  TEST_E(ei->data->e_event, nua_r_invite); TEST(ei->data->e_status, 200);
+  TEST_1(e = ei->next); TEST_E(e->data->e_event, nua_i_state);
+  istate = callstate(e->data->e_tags);
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+
+  if (eu == e->next) {
+    /* 200 OK to UPDATE is received after 200 OK to INVITE */
+    TEST(ustate, nua_callstate_ready);
+    TEST(istate, nua_callstate_completing);
+  }
+  else {
+    /* 200 OK to UPDATE is received before 200 OK to INVITE */
+    TEST(ustate, nua_callstate_proceeding);
+    TEST(istate, nua_callstate_ready);
+  }
+
+  free_events_in_list(ctx, a->events);
+
+  /*
+   Server transitions:
+   INIT -(S1)-> RECEIVED: nua_i_invite, nua_i_state
+   RECEIVED -(S2a)-> EARLY: nua_respond(), nua_i_state
+   EARLY -(S3b)-> COMPLETED: nua_respond(), nua_i_state
+   COMPLETED -(S4)-> READY: nua_i_ack, nua_i_state
+  */
+  TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_invite);
+  TEST(e->data->e_status, 100);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */
+
+  /* Responded with 183 Session Progress */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */
+  TEST_1(is_answer_sent(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_prack);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */
+  TEST_1(is_offer_recv(e->data->e_tags));
+  TEST_1(is_answer_sent(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_update);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */
+  TEST_1(is_offer_recv(e->data->e_tags));
+  TEST_1(is_answer_sent(e->data->e_tags));
+
+  /* Responded with 180 Ringing */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+
+  /* Responded with 200 OK */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_completed); /* COMPLETED */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_ack);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_ready); /* READY */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+  TEST_1(!e->next);
+  free_events_in_list(ctx, b->events);
+
+  if (print_headings)
+    printf("TEST NUA-10.4.1: PASSED\n");
+
+  if (print_headings)
+    printf("TEST NUA-10.4.2: terminate call\n");
+
+  BYE(b, b_call, b_call->nh, TAG_END());
+  run_ab_until(ctx, -1, until_terminated, -1, until_terminated);
+
+  /* B transitions:
+   READY --(T2)--> TERMINATING: nua_bye()
+   TERMINATING --(T3)--> TERMINATED: nua_r_bye, nua_i_state
+  */
+  TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_r_bye);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */
+  TEST_1(!e->next);
+  free_events_in_list(ctx, b->events);
+
+  /* A: READY -(T1)-> TERMINATED: nua_i_bye, nua_i_state */
+  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_bye);
+  TEST(e->data->e_status, 200);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */
+  TEST_1(!e->next);
+  free_events_in_list(ctx, a->events);
+
+  nua_handle_destroy(a_call->nh), a_call->nh = NULL;
+  nua_handle_destroy(b_call->nh), b_call->nh = NULL;
+
+  if (print_headings)
+    printf("TEST NUA-10.4.2: PASSED\n");
+#endif
+  END();
+}
  
 int cancel_when_pracked(CONDITION_PARAMS);
 int alert_call(CONDITION_PARAMS);
@@ -2105,19 +2322,281 @@
   END();
 }
 
+int redirect_pracked(CONDITION_PARAMS);
+
+int test_180rel_redirected(struct context *ctx)
+{
+  BEGIN();
+
+  struct endpoint *a = &ctx->a,  *b = &ctx->b;
+  struct call *a_call = a->call, *b_call = b->call;
+  struct event *e, *ep, *ei;
+  sip_t *sip;
+
+  if (print_headings)
+    printf("TEST NUA-10.8.1: Call with 100rel and 180\n");
+
+/* Test for 100rel:
+
+   A			B
+   |-------INVITE------>|
+   |<----100 Trying-----|
+   |			|
+   |<-------180---------|
+   |-------PRACK------->|
+   |<-------200---------|
+   |			|
+   |<----302 Moved------|
+   |--------ACK-------->|
+   |			|
+   |-------INVITE------>|
+   |<----100 Trying-----|
+   |			|
+   |<-------180---------|
+   |-------PRACK------->|
+   |<-------200---------|
+   |			|
+   |<------200 OK-------|
+   |--------ACK-------->|
+   |			|
+   |<-------BYE---------|
+   |-------200 OK-------|
+   |			|
+
+*/
+
+  a_call->sdp = "m=audio 5008 RTP/AVP 8";
+  b_call->sdp = "m=audio 5010 RTP/AVP 0 8";
+
+  nua_set_params(ctx->a.nua,
+		 NUTAG_EARLY_MEDIA(1),
+		 TAG_END());
+  run_a_until(ctx, nua_r_set_params, until_final_response);
+
+  nua_set_params(ctx->b.nua,
+		 NUTAG_EARLY_MEDIA(1),
+		 NUTAG_SESSION_TIMER(180),
+		 TAG_END());
+  run_b_until(ctx, nua_r_set_params, until_final_response);
+
+  TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END()));
+
+  INVITE(a, a_call, a_call->nh,
+	 TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)),
+	 SOATAG_USER_SDP_STR(a_call->sdp),
+	 TAG_END());
+
+  run_ab_until(ctx, -1, until_ready, -1, redirect_pracked);
+
+  /* Client transitions:
+     INIT -(C1)-> CALLING: nua_invite(), nua_i_state
+     CALLING -(C2)-> PROCEEDING: nua_r_invite, nua_i_state, nua_r_prack
+     PROCEEDING->(redirected)->CALLING: nua_r_invite, nua_i_state
+     CALLING -(C2)-> PROCEEDING: nua_r_invite, nua_i_state, nua_r_prack
+     PROCEEDING -(C3+C4)-> READY: nua_r_invite, nua_i_state
+  */
+  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */
+  TEST_1(is_offer_sent(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite);
+  TEST(e->data->e_status, 180);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_proceeding);
+  TEST_1(is_answer_recv(e->data->e_tags));
+  TEST_1(!is_offer_sent(e->data->e_tags));
+
+  ei = event_by_type(e->next, nua_r_invite); /* 302 */
+  ep = event_by_type(e->next, nua_r_prack); /* 200 */
+  if (!ep) {
+    run_a_until(ctx, -1, save_until_final_response);
+    ep = event_by_type(e->next, nua_r_prack);
+  }
+
+  TEST_1(e = ep); TEST_E(e->data->e_event, nua_r_prack);
+  TEST(e->data->e_status, 200);
+
+  TEST_1(e = ei); TEST_E(e->data->e_event, nua_r_invite);
+  TEST(e->data->e_status, 100);
+  TEST_1(sip = sip_object(e->data->e_msg));
+  TEST(sip->sip_status->st_status, 302);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite);
+  TEST(e->data->e_status, 180);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_proceeding);
+  TEST_1(is_answer_recv(e->data->e_tags));
+  TEST_1(!is_offer_sent(e->data->e_tags));
+
+  ei = event_by_type(e->next, nua_r_invite);
+  ep = event_by_type(e->next, nua_r_prack);
+  if (!ep) {
+    run_a_until(ctx, -1, save_until_final_response);
+    ep = event_by_type(e->next, nua_r_prack);
+  }
+
+  TEST_1(e = ep); TEST_E(e->data->e_event, nua_r_prack);
+  TEST(e->data->e_status, 200);
+
+  TEST_1(e = ei); TEST_E(e->data->e_event, nua_r_invite);
+  TEST(e->data->e_status, 200);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_ready); /* READY */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+
+  TEST_1(!e->next || !ep->next);
+  free_events_in_list(ctx, a->events);
+
+  /*
+   Server transitions:
+   INIT -(S1)-> RECEIVED: nua_i_invite, nua_i_state
+   RECEIVED -(S2a)-> EARLY: nua_respond(), nua_i_state
+   EARLY -(S3b)-> COMPLETED: nua_respond(), nua_i_state
+   COMPLETED -(S4)-> READY: nua_i_ack, nua_i_state
+  */
+  TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_invite);
+  TEST(e->data->e_status, 100);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */
+  TEST_1(is_offer_recv(e->data->e_tags));
+
+  /* Responded with 180 Ringing */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */
+  TEST_1(is_answer_sent(e->data->e_tags));
+
+  /* 180 is PRACKed */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_prack);
+  /* 302 terminates call */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* Terminated */
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_invite);
+  TEST(e->data->e_status, 100);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */
+  TEST_1(is_offer_recv(e->data->e_tags));
+
+  /* Responded with 180 Ringing */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */
+  TEST_1(is_answer_sent(e->data->e_tags));
+
+  /* 180 is PRACKed */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_prack);
+  /* Does not have effect on call state */
+
+  /* Respond with 200 OK */
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_completed); /* COMPLETED */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_ack);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_ready); /* READY */
+  TEST_1(!is_offer_answer_done(e->data->e_tags));
+  TEST_1(!e->next);
+  free_events_in_list(ctx, b->events);
+
+  if (print_headings)
+    printf("TEST NUA-10.8.1: PASSED\n");
+
+  if (print_headings)
+    printf("TEST NUA-10.8.2: terminate call\n");
+
+  BYE(b, b_call, b_call->nh, TAG_END());
+  run_ab_until(ctx, -1, until_terminated, -1, until_terminated);
+
+  /* B transitions:
+   READY --(T2)--> TERMINATING: nua_bye()
+   TERMINATING --(T3)--> TERMINATED: nua_r_bye, nua_i_state
+  */
+  TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_r_bye);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */
+  TEST_1(!e->next);
+  free_events_in_list(ctx, b->events);
+
+  /* A: READY -(T1)-> TERMINATED: nua_i_bye, nua_i_state */
+  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_bye);
+  TEST(e->data->e_status, 200);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);
+  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */
+  TEST_1(!e->next);
+  free_events_in_list(ctx, a->events);
+
+  nua_handle_destroy(a_call->nh), a_call->nh = NULL;
+  nua_handle_destroy(b_call->nh), b_call->nh = NULL;
+
+  if (print_headings)
+    printf("TEST NUA-10.8.2: PASSED\n");
+  
+  END();
+}
+
+int redirect_pracked(CONDITION_PARAMS)
+{
+  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))
+    return 0;
+
+  save_event_in_list(ctx, event, ep, call);
+
+  if (event == nua_i_prack) {
+    if (!ep->flags.bit0) {
+      sip_contact_t m[1];
+      
+      ep->flags.bit0 = 1;
+
+      *m = *ep->contact;
+      m->m_url->url_user = "302";
+      RESPOND(ep, call, nh, SIP_302_MOVED_TEMPORARILY, SIPTAG_CONTACT(m), TAG_END());
+      return 0;
+    }
+    else {
+      RESPOND(ep, call, nh, SIP_200_OK,
+	      TAG_IF(call->sdp, SOATAG_USER_SDP_STR(call->sdp)),
+	      TAG_END());
+    }
+  }
+
+
+  switch (callstate(tags)) {
+  case nua_callstate_received:
+    RESPOND(ep, call, nh, SIP_180_RINGING,
+	    TAG_IF(call->sdp, SOATAG_USER_SDP_STR(call->sdp)),
+	    TAG_END());
+    return 0;
+  case nua_callstate_ready:
+    return 1;
+  case nua_callstate_terminated:
+    if (call)
+      nua_handle_destroy(call->nh), call->nh = NULL;
+    return 0;
+  default:
+    return 0;
+  }
+}
 
 int test_100rel(struct context *ctx)
 {
   int retval = 0;
-  
+
   retval = test_180rel(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_prack_auth(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_183rel(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_preconditions(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_preconditions2(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_update_by_uas(ctx); RETURN_ON_SINGLE_FAILURE(retval);
+  retval = test_update_failure(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_180rel_cancel1(ctx); RETURN_ON_SINGLE_FAILURE(retval);
   retval = test_180rel_cancel2(ctx); RETURN_ON_SINGLE_FAILURE(retval);
+  retval = test_180rel_redirected(ctx); RETURN_ON_SINGLE_FAILURE(retval);
 
   nua_set_params(ctx->a.nua,
 		 NUTAG_EARLY_MEDIA(0),

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_refer.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_refer.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/test_refer.c	Wed Jan 23 13:37:33 2008
@@ -48,13 +48,14 @@
 
 int test_refer0(struct context *ctx, char const *tests,
 		int refer_with_id, int notify_by_appl);
-
 int notify_until_terminated(CONDITION_PARAMS);
+int test_challenge_refer(struct context *ctx);
 
 int test_refer(struct context *ctx)
 {
   /* test twice, once without id and once with id */
   return
+    test_challenge_refer(ctx) ||
     test_refer0(ctx, "NUA-9.1", 0, 0) ||
     test_refer0(ctx, "NUA-9.2", 1, 0) ||
     test_refer0(ctx, "NUA-9.3", 0, 1) ||
@@ -713,3 +714,139 @@
     return 0;
   }
 }
+
+int authenticate_refer(CONDITION_PARAMS);
+int reject_refer_after_notified(CONDITION_PARAMS);
+
+int test_challenge_refer(struct context *ctx)
+{
+  BEGIN();
+
+  struct endpoint *a = &ctx->a, *b = &ctx->b, *c = &ctx->c;
+  struct call *a_call = a->call, *c_call = c->call;
+  struct event *e;
+  sip_t const *sip;
+
+  sip_refer_to_t r0[1];
+
+  if (!ctx->proxy_tests)
+    return 0;
+
+  if (print_headings)
+    printf("TEST NUA-9.0.1: challenge REFER\n");
+
+  nua_set_params(ctx->a.nua, NUTAG_APPL_METHOD("REFER"), TAG_END());
+  run_a_until(ctx, nua_r_set_params, until_final_response);
+
+  *sip_refer_to_init(r0)->r_url = *b->contact->m_url;
+  r0->r_url->url_headers = "subject=referred";
+  r0->r_display = "B";
+
+  TEST_1(c_call->nh = nua_handle(c->nua, c_call, SIPTAG_TO(a->to), TAG_END()));
+
+  REFER(c, c_call, c_call->nh,
+	SIPTAG_FROM(c->to),
+	SIPTAG_REFER_TO(r0),
+	TAG_END());
+
+  run_abc_until(ctx, -1, reject_refer_after_notified, -1, NULL, -1, authenticate_refer);
+
+  /*
+    Events in A:
+    nua_i_refer
+  */
+  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_refer);
+  TEST(e->data->e_status, 100);
+  TEST_1(sip = sip_object(e->data->e_msg));
+  TEST_1(sip->sip_refer_to);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_notify);
+  TEST(e->data->e_status, 200);
+  TEST_1(!e->next); 
+  /*
+     Events in C after nua_refer():
+     nua_r_refer
+  */
+  TEST_1(e = c->events->head); TEST_E(e->data->e_event, nua_r_refer);
+  TEST(e->data->e_status, 100);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_refer);
+  TEST(e->data->e_status, 407);
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_refer);
+  TEST(e->data->e_status, 100);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_notify);
+  TEST(e->data->e_status, 200);
+
+  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_refer);
+  TEST(e->data->e_status, 480);
+
+  TEST_1(!e->next);
+  
+  free_events_in_list(ctx, a->events);
+  free_events_in_list(ctx, c->events);
+
+  nua_handle_destroy(a_call->nh), a_call->nh = NULL;
+  nua_handle_destroy(c_call->nh), c_call->nh = NULL;
+
+  nua_set_params(ctx->a.nua,
+		 NUTAG_APPL_METHOD(NULL),
+		 NUTAG_APPL_METHOD("INVITE, REGISTER, PUBLISH, SUBSCRIBE"),
+		 TAG_END());
+  run_a_until(ctx, nua_r_set_params, until_final_response);
+
+  if (print_headings)
+    printf("TEST NUA-9.0.1: PASSED\n");
+
+  END();
+}
+
+int reject_refer_after_notified(CONDITION_PARAMS)
+{
+  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))
+    return 0;
+
+  save_event_in_list(ctx, event, ep, call);
+
+  if (event == nua_i_refer) {
+  }
+
+  if (event == nua_r_notify) {
+    /* Respond to refer only after initial notify has been responded */
+    struct eventlist *list;
+    struct event *e;
+
+    if (call->events)
+      list = call->events;
+    else
+      list = ep->events;
+
+    for (e = list->head; e; e = e->next)
+      if (e->data->e_event == nua_i_refer)
+	break;
+
+    if (e) {
+      RESPOND(ep, call, nh, SIP_480_TEMPORARILY_UNAVAILABLE,
+	      NUTAG_WITH(e->data->e_msg),
+	      TAG_END());
+      return 1;
+    }
+    return 0;
+  }
+
+  return 0;
+}
+
+int authenticate_refer(CONDITION_PARAMS)
+{
+  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))
+    return 0;
+
+  save_event_in_list(ctx, event, ep, call);
+
+  if (status == 401 || status == 407) {
+    AUTHENTICATE(ep, call, nh,
+		 NUTAG_AUTH("Digest:\"test-proxy\":charlie:secret"),
+		 TAG_END());
+  }
+
+  return status == 480;
+}

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_extra.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_extra.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_extra.c	Wed Jan 23 13:37:33 2008
@@ -220,9 +220,13 @@
  *
  * The parsed Alert-Info header is stored in #sip_alert_info_t structure.
  *
- * @NEW_1_12_7. In order to use @b Alert-Info header, 
- * initialize the SIP parser with, e.g.,
- * sip_update_default_mclass(sip_extend_mclass(NULL))
+ * @NEW_1_12_7. In order to use @b Alert-Info header, initialize the SIP
+ * parser before calling nta_agent_create() or nua_create() with, e.g.,
+ * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ *
+ * The #sip_t structure does not contain a @a sip_alert_info field, but
+ * sip_alert_info() function should be used for accessing the @b Alert-Info
+ * header structure.
  */
 
 /**@ingroup sip_alert_info
@@ -283,8 +287,14 @@
  * @sa sip_update_default_mclass()
  *
  * @NEW_1_12_7. In order to use @b Reply-To header,
- * initialize the SIP parser with, e.g.,
+ * initialize the SIP parser before calling nta_agent_create() or
+ * nua_create() with, e.g.,
  * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ *
+ * @note
+ * The #sip_t structure does not contain a @a sip_reply_to field, but
+ * sip_reply_to() function should be used for accessing the @b Reply-To
+ * header structure.
  */
 
 /**@ingroup sip_reply_to
@@ -933,7 +943,13 @@
  *
  * @sa @RFC3265, draft-niemi-sip-subnot-etags-01.txt
  *
- * @EXP_1_12_5. Note that #sip_t does not contain @a
+ * @EXP_1_12_5. 
+ * In order to use @b Suppress-Body-If-Match header, 
+ * initialize the SIP parser with, e.g.,
+ * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ * 
+ * @note
+ * The #sip_t structure does not contain a @a
  * sip_suppress_body_if_match field, but sip_suppress_body_if_match()
  * function should be used for accessing the @b Suppress-Body-If-Match
  * header structure.
@@ -999,10 +1015,15 @@
  *
  * @sa @RFC3265, draft-niemi-sip-subnot-etag-01
  *
- * @EXP_1_12_5. Note that #sip_t does not contain @a
- * sip_suppress_notify_if_match field, but sip_suppress_notify_if_match()
- * function should be used for accessing the @b Suppress-Notify-If-Match
- * header structure.
+ * @EXP_1_12_5. 
+ * In order to use @b Suppress-Notify-If-Match header, 
+ * initialize the SIP parser with, e.g.,
+ * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ * 
+ * @note
+ * The #sip_t struct does not contain @a sip_suppress_notify_if_match field,
+ * but sip_suppress_notify_if_match() function should be used for accessing
+ * the @b Suppress-Notify-If-Match header structure.
  */
 
 /**@ingroup sip_suppress_notify_if_match
@@ -1085,8 +1106,14 @@
  * @sa sip_update_default_mclass(), draft-ietf-sip-privacy-04.txt, @RFC3325
  *
  * @NEW_1_12_7. In order to use @b Remote-Party-ID header,
- * initialize the SIP parser with, e.g.,
+ * initialize the SIP parser before calling nta_agent_create() or
+ * nua_create() with, e.g.,
  * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ *
+ * @note
+ * The #sip_t structure does not contain @a sip_remote_party_id field, but
+ * sip_remote_party_id() function should be used for accessing the @b
+ * Remote-Party-ID header structure.
  */
 
 /**@ingroup sip_remote_party_id
@@ -1222,8 +1249,14 @@
  * @sa @RFC3325, @PPreferredIdentity
  *
  * @NEW_1_12_7. In order to use @b P-Asserted-Identity header, 
- * initialize the SIP parser with, e.g.,
+ * initialize the SIP parser before calling nta_agent_create() or
+ * nua_create() with, e.g.,
  * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ *
+ * @note
+ * The #sip_t structure does not contain @a sip_p_asserted_identity field,
+ * but sip_p_asserted_identity() function should be used for accessing the
+ * @b P-Asserted-Identity header structure.
  */
 
 /**@ingroup sip_p_asserted_identity
@@ -1325,8 +1358,14 @@
  * @sa @RFC3325, @PAssertedIdentity
  *
  * @NEW_1_12_7. In order to use @b P-Preferred-Identity header,
- * initialize the SIP parser with, e.g.,
+ * initialize the SIP parser before calling nta_agent_create() or
+ * nua_create() with, e.g.,
  * sip_update_default_mclass(sip_extend_mclass(NULL)).
+ *
+ * @note
+ * The #sip_t structure does not contain @a sip_p_preferred_identity field,
+ * but sip_p_preferred_identity() function should be used for accessing the
+ * @b P-Preferred-Identity header structure.
  */
 
 /**@ingroup sip_p_preferred_identity

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_parser.c	Wed Jan 23 13:37:33 2008
@@ -90,6 +90,8 @@
  * @retval 0 when successful
  * @retval -1 upon an error
  *
+ * @sa sip_extend_mclass()
+ *
  * @NEW_1_12_7.
  */
 int sip_update_default_mclass(msg_mclass_t const *mclass)
@@ -103,12 +105,22 @@
 /**Extend SIP parser class with extension headers.
  *
  * Extend given SIP parser class with extension headers. If the given parser
- * class is the default one or NULL, make a clone of it before extending it.
+ * (message class) is the default one or NULL, make a clone of default
+ * parser before extending it.
  *
  * @param input pointer to a SIP message class (may be NULL)
  *
  * @return Pointer to extended mclass, or NULL upon an error.
  *
+ * @sa
+ * @AlertInfo,
+ * @ReplyTo,
+ * @RemotePartyId,
+ * @PAssertedIdentity,
+ * @PPreferredIdentity,
+ * @SuppressBodyIfMatch,
+ * @SuppressNotifyIfMatch
+ *
  * @NEW_1_12_7.
  */
 msg_mclass_t *sip_extend_mclass(msg_mclass_t *input)

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_util.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_util.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/sip_util.c	Wed Jan 23 13:37:33 2008
@@ -883,8 +883,7 @@
  * decide whether to gracefully terminate or not, the
  * @a *return_graceful_terminate_usage is left unmodified.
  *
- * @sa 
- * http://www.ietf.org/internet-drafts/draft-ietf-sipping-dialogusage-02.txt
+ * @RFC 5057
  */
 int sip_response_terminates_dialog(int response_code,
 				   sip_method_t method,
@@ -1060,8 +1059,6 @@
       usage in an existing dialog, no new usage is created and existing
       usages are unaffected.
     */
-    *return_graceful_terminate_usage = 0;
-    return 0;
 
   case 423: /** @par 423 Interval Too Brief 
 
@@ -1070,8 +1067,6 @@
       subscribe usage is not destroyed (or otherwise affected).  No
       other usages of the dialog are affected.
     */
-    *return_graceful_terminate_usage = 0;
-    return sip_method_subscribe == method ? terminate_usage : no_effect;
 
   case 428: /** @par 428 Use Identity Header
 
@@ -1079,8 +1074,6 @@
       the usage.  The usage is not affected.  The dialog is only
       affected by a change in its local @CSeq.  No other usages of the
       dialog are affected. */
-    *return_graceful_terminate_usage = 0;
-    return 0;
 
   case 429: /** @par 429 Provide Referrer Identity 
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/torture_sip.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/torture_sip.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sip/torture_sip.c	Wed Jan 23 13:37:33 2008
@@ -77,6 +77,9 @@
 static int test_identity(void)
 {
   su_home_t *home;
+  sip_alert_info_t *ai;
+  sip_reply_to_t *rplyto;
+  sip_remote_party_id_t *rpid;
   sip_p_asserted_identity_t *paid;
   sip_p_preferred_identity_t *ppid;
 
@@ -115,15 +118,21 @@
     "Call-ID: 0ha0isndaksdj at 10.1.2.3\r\n"
     "CSeq: 8 SUBSCRIBE\r\n"
     "Via: SIP/2.0/UDP 135.180.130.133\r\n"
+    "Alert-Info: <http://test.com/tune>;walz, <http://test.com/buzz>\r\n"
+    "Reply-To: Arska <sip:arska at gov.ca.us>;humppa\r\n"
     "P-Asserted-Identity: <sip:test at test.domain.com>\r\n"
     "P-Preferred-Identity: <sip:test at test.domain.com>, <tel:+358708008000>\r\n"
+    "Remote-Party-ID: <sip:test2 at test.domain.com>\r\n"
     "Content-Length: 0\r\n"
     "\r\n");
 
   sip = sip_object(msg);
 
+  TEST_1(!sip_alert_info(sip));
+  TEST_1(!sip_reply_to(sip));
   TEST_1(!sip_p_asserted_identity(sip));
   TEST_1(!sip_p_preferred_identity(sip));
+  TEST_1(!sip_remote_party_id(sip));
 
   msg_destroy(msg);
 
@@ -139,13 +148,22 @@
     "Call-ID: 0ha0isndaksdj at 10.1.2.3\r\n"
     "CSeq: 8 SUBSCRIBE\r\n"
     "Via: SIP/2.0/UDP 135.180.130.133\r\n"
+    "Alert-Info: <http://test.com/tune>;walz, <http://test.com/buzz>\r\n"
+    "Reply-To: Arska <sip:arska at gov.ca.us>;humppa\r\n"
     "P-Asserted-Identity: <sip:test at test.domain.com>\r\n"
     "P-Preferred-Identity: <sip:test at test.domain.com>, <tel:+358708008000>\r\n"
+    "Remote-Party-ID: <sip:test2 at test.domain.com>\r\n"
     "Content-Length: 0\r\n"
     "\r\n");
 
   sip = sip_object(msg);
 
+  TEST_1(!sip_alert_info(sip));
+  TEST_1(!sip_reply_to(sip));
+  TEST_1(sip_p_asserted_identity(sip));
+  TEST_1(sip_p_preferred_identity(sip));
+  TEST_1(!sip_remote_party_id(sip));
+
   TEST_1(home = msg_home(msg));
   
   TEST_1((paid = sip_p_asserted_identity_make(home, "sip:joe at example.com")));
@@ -161,6 +179,34 @@
   /* Now with extensions */
   TEST_1(test_mclass = msg_mclass_clone(def1, 0, 0));
 
+  msg = read_message(MSG_DO_EXTRACT_COPY, 
+    "BYE sip:foo at bar SIP/2.0\r\n"
+    "To: <sip:foo at bar>;tag=deadbeef\r\n"
+    "From: <sip:bar at foo>;\r\n"
+    "Call-ID: 0ha0isndaksdj at 10.1.2.3\r\n"
+    "CSeq: 8 SUBSCRIBE\r\n"
+    "Via: SIP/2.0/UDP 135.180.130.133\r\n"
+    "Alert-Info: <http://test.com/tune>;walz, <http://test.com/buzz>\r\n"
+    "Reply-To: Arska <sip:arska at gov.ca.us>;humppa\r\n"
+    "P-Asserted-Identity: <sip:test at test.domain.com>\r\n"
+    "P-Preferred-Identity: <sip:test at test.domain.com>, <tel:+358708008000>\r\n"
+    "Remote-Party-ID: <sip:test2 at test.domain.com>\r\n"
+    "Content-Length: 0\r\n"
+    "\r\n");
+
+  sip = sip_object(msg);
+
+  TEST_1(ai = sip_alert_info(sip));
+  TEST_S(ai->ai_url->url_host, "test.com");
+  TEST_1(rplyto = sip_reply_to(sip));
+  TEST_S(rplyto->rplyto_url->url_host, "gov.ca.us");
+  TEST_1(paid = sip_p_asserted_identity(sip));
+  TEST_1(ppid = sip_p_preferred_identity(sip));
+  TEST_1(rpid = sip_remote_party_id(sip));
+  TEST_S(rpid->rpid_url->url_host, "test.domain.com");
+
+  msg_destroy(msg);
+
   {
     su_home_t *home = su_home_clone(NULL, sizeof *home);
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa.c	Wed Jan 23 13:37:33 2008
@@ -70,10 +70,6 @@
 /* ======================================================================== */
 
 /* 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 @@
   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 @@
   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 @@
     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 @@
     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 @@
   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 @@
   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 @@
 
 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;
-
-  remote = !!remote;
+  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;
 
-  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;
+  }
 }
 
 /* ----------------------------------------------------------------------*/

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c	Wed Jan 23 13:37:33 2008
@@ -974,58 +974,28 @@
   return 0;
 }
 
-/** Check if @a session mode should be changed. */ 
-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 */ 
+/** 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(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 @@
   rm = remote ? remote->sdp_media : NULL, rm_next = NULL;
 
   hold_all = str0cmp(hold, "*") == 0;
+  inactive_all = str0cmp(hold, "#") == 0;
+
+  i = 0;
 
-  for (sm = session->sdp_media; sm; sm = sm->m_next, rm = rm_next) {
+  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 = um->m_mode & sdp_recvonly;
+
+    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;
 
-    sm->m_mode = recv_mode | send_mode;
+    if (!dryrun) {
+      sm->m_mode = recv_mode | send_mode;
+    }
   }
 
-  return 0;
+  return retval;
 }
 
 enum offer_answer_action {
@@ -1213,16 +1216,22 @@
 
   /* 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:

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_tag.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_tag.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_tag.c	Wed Jan 23 13:37:33 2008
@@ -585,12 +585,22 @@
 
 /**@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

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/sofia-sip/soa_session.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/sofia-sip/soa_session.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/sofia-sip/soa_session.h	Wed Jan 23 13:37:33 2008
@@ -238,8 +238,11 @@
 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,

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/test_soa.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/test_soa.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/test_soa.c	Wed Jan 23 13:37:33 2008
@@ -451,20 +451,67 @@
   TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDONLY);
   TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDONLY);
 
+  /* '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=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=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"));
+  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"));
+  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 @@
 {
   BEGIN();
 
-#if 0
+#if 0				/* This has never been implemented */
   int n;
   
   char const *caps = NONE, *offer = NONE, *answer = NONE;

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres.h	Wed Jan 23 13:37:33 2008
@@ -218,6 +218,16 @@
                                              uint16_t type,
 					     struct sockaddr const *addr);
 
+/**Modify the priority of the specified SRV records. */
+SRESPUBFUN
+int sres_set_cached_srv_priority(sres_resolver_t *res,
+				 char const *domain,
+				 char const *target,
+				 uint16_t port,
+				 uint32_t newttl,
+				 uint16_t newprio);
+
+
 /** Send a query, wait for answer, return results. */
 SRESPUBFUN 
 int sres_blocking_query(sres_resolver_t *res,

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_cache.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_cache.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sofia-resolv/sres_cache.h	Wed Jan 23 13:37:33 2008
@@ -102,6 +102,14 @@
 /** Store a record to cache */
 SRESPUBFUN void sres_cache_store(sres_cache_t *, sres_record_t *, time_t now);
 
+/** Modify the priority in the specified SRV record */
+SRESPUBFUN int sres_cache_set_srv_priority(sres_cache_t *, 
+					   char const *domain,
+					   char const *target,
+					   uint16_t port,
+					   uint32_t newttl,
+					   uint16_t newprio);
+
 #ifdef __cplusplus
 }
 #endif

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres.c	Wed Jan 23 13:37:33 2008
@@ -1347,6 +1347,47 @@
   return result;
 }
 
+/** Set the priority of the matching cached SRV record.
+ *
+ * The SRV records with the domain name, target and port are matched and
+ * their priority value is adjusted. This function is used to implement
+ * greylisting of SIP servers.
+ *
+ * @param res      pointer to resolver
+ * @param domain   domain name of the SRV record(s) to modify
+ * @param target   SRV target of the SRV record(s) to modify
+ * @param port     port number of SRV record(s) to modify 
+ *                 (in host byte order) 
+ * @param ttl      new ttl for SRV records of the domain
+ * @param priority new priority value (0=highest, 65535=lowest)
+ *
+ * @sa sres_cache_set_srv_priority()
+ * 
+ * @NEW_1_12_8
+ */
+int sres_set_cached_srv_priority(sres_resolver_t *res,
+				 char const *domain,
+				 char const *target,
+				 uint16_t port,
+				 uint32_t ttl,
+				 uint16_t priority)
+{
+  char rooted_domain[SRES_MAXDNAME];
+
+  if (res == NULL || res->res_cache == NULL)
+    return su_seterrno(EFAULT);
+
+  domain = sres_toplevel(rooted_domain, sizeof rooted_domain, domain);
+
+  if (!domain)
+    return -1;
+
+  return sres_cache_set_srv_priority(res->res_cache, 
+				     domain, target, port, 
+				     ttl, priority);
+}
+
+
 /** Sort answers. */
 int
 sres_sort_answers(sres_resolver_t *res, sres_record_t **answers)

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres_cache.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres_cache.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/sresolv/sres_cache.c	Wed Jan 23 13:37:33 2008
@@ -471,6 +471,75 @@
   }
 }
 
+/** Set the priority of the matching cached SRV record.
+ *
+ * The SRV records with the domain name, target and port are matched and
+ * their priority value is adjusted. This function is used to implement
+ * greylisting of SIP servers.
+ *
+ * @param cache    pointer to DNS cache object
+ * @param domain   domain name of the SRV record(s) to modify 
+ *                 (including final dot)
+ * @param target   SRV target of the SRV record(s) to modify
+ * @param port     port number of SRV record(s) to modify 
+ *                 (in host byte order) 
+ * @param ttl      new ttl
+ * @param priority new priority value (0=highest, 65535=lowest)
+ *
+ * @sa sres_set_cached_srv_priority()
+ * 
+ * @NEW_1_12_8
+ */
+int sres_cache_set_srv_priority(sres_cache_t *cache,
+				char const *domain,
+				char const *target,
+				uint16_t port,
+				uint32_t ttl,
+				uint16_t priority)
+{
+  int ret = 0;
+  unsigned hash;
+  sres_rr_hash_entry_t **iter;
+  time_t expires;
+  
+  if (cache == NULL || domain == NULL || target == NULL)
+    return -1;
+
+  hash = sres_hash_key(domain);
+
+  if (!LOCK(cache))
+    return -1;
+
+  time(&expires);
+  expires += ttl;
+
+  for (iter = sres_htable_hash(cache->cache_hash, hash);
+       iter && *iter;
+       iter = sres_htable_next(cache->cache_hash, iter)) {
+    sres_record_t *rr = (*iter)->rr;
+    
+    if (rr && rr->sr_name &&
+	sres_type_srv == rr->sr_type &&
+	strcasecmp(rr->sr_name, domain) == 0) {
+
+      (*iter)->rr_expires = expires;
+      
+      if ((port == 0 || rr->sr_srv->srv_port == port) &&
+	  rr->sr_srv->srv_target &&
+	  strcasecmp(rr->sr_srv->srv_target, target) == 0) {
+	/* record found --> change priority of server */
+	rr->sr_srv->srv_priority = priority;
+	ret++;
+      }
+    }
+  }
+
+  UNLOCK(cache);
+
+  /** @return number of modified entries or -1 upon an error. */
+  return ret;
+}
+
 HTABLE_BODIES_WITH(sres_htable, ht, sres_rr_hash_entry_t, SRES_HENTRY_HASH,
 		   unsigned, size_t);
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/htable2.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/htable2.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/htable2.h	Wed Jan 23 13:37:33 2008
@@ -34,30 +34,29 @@
  * always storing a pointer to element). It can be used without
  * <sofia-sip/su_alloc.h>.
  * 
- * This file contain a hash table template for C.  The hash tables are
- * resizeable, and they usually contain pointers to entries.  The
- * declaration for template datatypes is instantiated with macro
- * HTABLE2_DECLARE().  The prototypes for hashing functions are instantiated
- * with macro HTABLE2_PROTOS().  The implementation is instantiated with
- * macro HTABLE2_BODIES().
+ * This file contain a hash table template for C. The hash tables are
+ * resizeable, and they usually contain pointers to entries. The declaration
+ * for template datatypes is instantiated with macro HTABLE2_DECLARE2(). The
+ * prototypes for hashing functions are instantiated with macro
+ * HTABLE2_PROTOS2(). The implementation is instantiated with macro
+ * HTABLE2_BODIES2().
  *
  * The hash table template is most efficient when the hash value is
  * precalculated and stored in each entry.  The hash "function" given to the
- * HTABLE2_BODIES() would then be something like macro
+ * HTABLE2_BODIES2() would then be something like macro
  * @code
- * #define HTABLE2_ENTRY_HASH(e) ((e).e_hash_value)
+ * #define ENTRY_HASH(e) ((e).e_hash_value)
  * @endcode
  *
- * When a entry with new identical hash key is added to the table, it can be
- * either @e inserted (before any other entry with same key value) or
- * @e appended.
+ * When a entry with new identical key is added to the table, it can be
+ * either @e inserted (before any other entry with same key value) or @e
+ * appended.
  * 
  * Example code can be found from <htable_test.c>.
  * 
  * @author Pekka Pessi <Pekka.Pessi at nokia.com>.
  *
  * @date Created: Tue Sep 25 17:42:40 2001 ppessi
- *
  */
 
 typedef unsigned long hash_value_t;
@@ -75,6 +74,8 @@
  * @param sname     name of struct
  * @param pr        hash table field prefix
  * @param entrytype entry type
+ *
+ * @NEW_1_12_8
  */
 #define HTABLE2_DECLARE2(type, sname, pr, entrytype, size_t)	\
 typedef struct sname { \
@@ -101,6 +102,8 @@
  * @param prefix    function prefix
  * @param pr        hash table field prefix (not used)
  * @param entrytype entry type
+ *
+ * @NEW_1_12_8
  */
 #define HTABLE2_PROTOS2(type, prefix, pr, entrytype, size_t)	    \
 HTABLE2_SCOPE int prefix##_resize(void *a, type *, size_t); \
@@ -131,6 +134,8 @@
  * @param reclaim   function or macro zeroing entry
  * @param is_equal  equality test
  * @param halloc    function allocating or freeing memory
+ *
+ * @NEW_1_12_8
  */
 #define HTABLE2_BODIES2(type, prefix, pr, entrytype, size_t,		\
 		        hfun, is_used, reclaim, is_equal, halloc)	\

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_addrinfo.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_addrinfo.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_addrinfo.h	Wed Jan 23 13:37:33 2008
@@ -126,7 +126,7 @@
 #define	AI_MASK		(AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
 #endif
 
-/** RFC 1576 address info structure. */
+/** @RFC1576 address info structure. */
 typedef struct addrinfo su_addrinfo_t;
 
 /** Translate address and service. */

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h	Wed Jan 23 13:37:33 2008
@@ -398,8 +398,8 @@
 			     su_msg_r msg,
 			     su_msg_arg_t *arg);
 
-/** Message deinitialize. */
-typedef void su_msg_deinit_func(su_msg_arg_t *arg);
+/** Message deinitializer function type. @NEW_1_12_8 */
+typedef void su_msg_deinit_function(su_msg_arg_t *arg);
 
 /** Message delivery function pointer type. */
 typedef su_msg_function *su_msg_f;
@@ -529,7 +529,7 @@
 			      su_task_r const to, su_task_r const from, 
 			      su_msg_f wakeup, isize_t size);
 SOFIAPUBFUN int su_msg_report(su_msg_r msg, su_msg_f report);
-SOFIAPUBFUN int su_msg_deinitializer(su_msg_r msg, su_msg_deinit_func *);
+SOFIAPUBFUN int su_msg_deinitializer(su_msg_r msg, su_msg_deinit_function *);
 SOFIAPUBFUN int su_msg_reply(su_msg_r reply, su_msg_cr msg,
 			     su_msg_f wakeup, isize_t size);
 SOFIAPUBFUN void su_msg_destroy(su_msg_r msg);

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_addrinfo.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_addrinfo.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_addrinfo.c	Wed Jan 23 13:37:33 2008
@@ -893,6 +893,7 @@
 {
   int retval;
   su_addrinfo_t *ai;
+  char const *realservice = service;
 
   if (!service || service[0] == '\0')
     service = "0";
@@ -932,6 +933,9 @@
 
   retval = getaddrinfo(node, service, hints, res);
 
+  if (service != realservice && retval == EAI_SERVICE)
+    retval = getaddrinfo(node, realservice, hints, res);
+
   if (retval == 0) {
     for (ai = *res; ai; ai = ai->ai_next) {
       if (ai->ai_protocol)

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c	Wed Jan 23 13:37:33 2008
@@ -1494,7 +1494,10 @@
   return 0;
 }
 
-/** Release exclusive lock on home and decrease refcount (if home is threadsafe) */
+/** Release exclusive lock on home and decrease refcount (if home is threadsafe).
+ *
+ * @sa su_home_unlock().
+ */
 int su_home_mutex_unlock(su_home_t *home)
 {
   if (home == NULL)
@@ -1517,8 +1520,14 @@
 
 /** Obtain exclusive lock on home without increasing refcount. 
  *
+ * Unless su_home_threadsafe() has been used to intialize locking on home
+ * object the function just returns -1.
+ *
  * @return 0 if successful, -1 if not threadsafe, error code otherwise.
  *
+ * @sa su_home_mutex_lock(), su_home_unlock(), su_home_trylock().
+ *
+ * @NEW_1_12_8
  */
 int su_home_lock(su_home_t *home)
 {
@@ -1537,6 +1546,9 @@
  * @return 0 if successful, -1 if not threadsafe, 
  * EBUSY if already locked, error code otherwise.
  *
+ * @sa su_home_lock(), su_home_unlock().
+ *
+ * @NEW_1_12_8
  */
 int su_home_trylock(su_home_t *home)
 {
@@ -1550,9 +1562,15 @@
 }
 
 
-/** Release exclusive lock on home. 
+/** Release exclusive lock on home.
+ *
+ * Release lock without decreasing refcount.
  *
  * @return 0 if successful, -1 if not threadsafe, error code otherwise.
+ *
+ * @sa su_home_lock(), su_home_trylock(), su_home_mutex_unlock().
+ *
+ * @NEW_1_12_8
  */
 int su_home_unlock(su_home_t *home)
 {

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_global_log.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_global_log.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_global_log.c	Wed Jan 23 13:37:33 2008
@@ -38,6 +38,7 @@
 #include <sofia-sip/su_log.h>
 #include <sofia-sip/su_debug.h>
 
+#ifdef DOXYGEN_ONLY
 /**@var SU_DEBUG
  *
  * Environment variable determining the debug log level for @b su module.

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_port.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_port.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_port.h	Wed Jan 23 13:37:33 2008
@@ -67,7 +67,7 @@
   su_task_r      sum_from;
   su_msg_f       sum_func;
   su_msg_f       sum_report;
-  su_msg_deinit_func *sum_deinit;
+  su_msg_deinit_function *sum_deinit;
   su_msg_arg_t   sum_data[1];		/* minimum size, may be extended */
 };
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_root.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_root.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/su_root.c	Wed Jan 23 13:37:33 2008
@@ -885,6 +885,8 @@
  *
  * @retval  0 if successful,
  * @retval -1 if message allocation fails.  
+ *
+ * @NEW_1_12_8
  */
 int su_msg_new(su_msg_r rmsg, size_t size)
 {
@@ -957,9 +959,11 @@
  *
  * @param rmsg   message reference
  * @param deinit pointer to deinitializer function
+ *
+ * @NEW_1_12_8
  */
 int su_msg_deinitializer(su_msg_r rmsg,
-			 su_msg_deinit_func *deinit)
+			 su_msg_deinit_function *deinit)
 {
   if (rmsg && rmsg[0]) {
     rmsg[0]->sum_deinit = deinit;
@@ -1156,7 +1160,10 @@
   return 0;		
 }
 
-/** Send message to the @a to_task and mark @a from_task as sender */
+/** Send message to the @a to_task and mark @a from_task as sender.
+ *
+ * @NEW_1_12_8
+ */
 SOFIAPUBFUN int su_msg_send_to(su_msg_r rmsg,
 			       su_task_r const to_task,
 			       su_msg_f wakeup)

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/test_htable2.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/test_htable2.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/test_htable2.c	Wed Jan 23 13:37:33 2008
@@ -83,15 +83,15 @@
 
 typedef struct hentry_s entry_t;
 
-HTABLE2_DECLARE2(htable2_t, htable2_s, ht2_, entry_t, size_t);
-HTABLE2_PROTOS2(htable2_t, htable2, ht2_, entry_t, size_t);
-
 struct hentry_s 
 {
-  unsigned long e_hash;
+  hash_value_t e_hash;
   unsigned long e_n;
 };
 
+HTABLE2_DECLARE2(htable2_t, htable2_s, ht2_, entry_t, size_t);
+HTABLE2_PROTOS2(htable2_t, htable2, ht2_, entry_t, size_t);
+
 #define HENTRY_HASH(e) ((e).e_hash)
 #define HENTRY_IS_USED(e) ((e).e_n != 0)
 #define HENTRY_REMOVE(e) ((e)->e_n = 0, (e)->e_hash = 0)

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/torture_su.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/torture_su.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/torture_su.c	Wed Jan 23 13:37:33 2008
@@ -155,7 +155,7 @@
 int test_sendrecv(void)
 {
   su_socket_t s, l, a;
-  int n;
+  ssize_t n;
   su_sockaddr_t su, csu;
   socklen_t sulen = sizeof su.su_sin, csulen = sizeof csu.su_sin;
   char b1[8], b2[8], b3[8];
@@ -172,6 +172,7 @@
   BEGIN();
 
   s = su_socket(AF_INET, SOCK_DGRAM, 0); TEST_1(s != -1);
+  su_setblocking(s, 1);
 
   memset(&su, 0, sulen);
   su.su_len = sulen;
@@ -209,6 +210,8 @@
   TEST(connect(s, &su.su_sa, sulen), 0);
   a = accept(l, &csu.su_sa, &csulen); TEST_1(a != -1);
 
+  TEST(su_setblocking(a, 1), 0);
+
   n = su_vsend(s, sv, 3, 0, NULL, 0); TEST(n, 8 + 8 + 6);
   n = su_vrecv(a, rv, 3, 0, NULL, NULL); TEST(n, 8 + 8 + 6);
 

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/test_tport.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/test_tport.c	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/test_tport.c	Wed Jan 23 13:37:33 2008
@@ -1009,18 +1009,19 @@
 
   s = su_socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
   TEST_1(s != SOCKET_ERROR);
-
+  
+  su_setblocking(s, 1);
   connected = connect(s, ai->ai_addr, (socklen_t)ai->ai_addrlen);
 
   su_root_step(tt->tt_root, 50);
   
-  TEST(send(s, "F", 1, 0), 1);
+  TEST(su_send(s, "F", 1, 0), 1);
   su_root_step(tt->tt_root, 50);
-  TEST(send(s, "O", 1, 0), 1);
+  TEST(su_send(s, "O", 1, 0), 1);
   su_root_step(tt->tt_root, 50);
-  TEST(send(s, "O", 1, 0), 1);
+  TEST(su_send(s, "O", 1, 0), 1);
   su_root_step(tt->tt_root, 50);
-  TEST(send(s, " ", 1, 0), 1);
+  TEST(su_send(s, " ", 1, 0), 1);
   su_root_step(tt->tt_root, 50);
   
   tt->tt_received = 0;

Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/tport_internal.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/tport_internal.h	(original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/tport/tport_internal.h	Wed Jan 23 13:37:33 2008
@@ -371,7 +371,7 @@
 
 int tport_register_type(tport_vtable_t const *vtp);
 
-/** @internal Test if transport is needs connect() before sending. */
+/** @internal Test if transport needs connect() before sending. */
 su_inline int tport_is_connection_oriented(tport_t const *self)
 {
   return self->tp_conn_orient;

Modified: freeswitch/trunk/libs/sofia-sip/tests/Makefile.am
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/tests/Makefile.am	(original)
+++ freeswitch/trunk/libs/sofia-sip/tests/Makefile.am	Wed Jan 23 13:37:33 2008
@@ -2,7 +2,7 @@
 # Tests using check
 #
 
-EXTRA_DIST = check_nua.c
+EXTRA_DIST = check_sofia.h check_sofia.c suite_for_nua.c
 
 TESTS =
 check_PROGRAMS =

Modified: freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua-static/libsofia_sip_ua_static.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua-static/libsofia_sip_ua_static.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua-static/libsofia_sip_ua_static.vcproj	Wed Jan 23 13:37:33 2008
@@ -47,10 +47,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/libsofia_sip_ua_static.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\libsofia_sip_ua_static.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -84,7 +84,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/libsofia_sip_ua_static.bsc"
+				OutputFile=".\Debug\libsofia_sip_ua_static.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -127,10 +127,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/libsofia_sip_ua_static.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\libsofia_sip_ua_static.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -163,7 +163,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/libsofia_sip_ua_static.bsc"
+				OutputFile=".\Release\libsofia_sip_ua_static.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua/libsofia_sip_ua.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua/libsofia_sip_ua.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/libsofia-sip-ua/libsofia_sip_ua.vcproj	Wed Jan 23 13:37:33 2008
@@ -42,7 +42,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Debug/libsofia_sip_ua.tlb"
+				TypeLibraryName=".\Debug\libsofia_sip_ua.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -53,10 +53,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/libsofia_sip_ua.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\libsofia_sip_ua.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -79,12 +79,12 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib advapi32.lib iphlpapi.lib"
-				OutputFile=".\Debug/libsofia_sip_ua.dll"
+				OutputFile=".\Debug\libsofia_sip_ua.dll"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/libsofia_sip_ua.pdb"
-				ImportLibrary=".\Debug/libsofia_sip_ua.lib"
+				ProgramDatabaseFile=".\Debug\libsofia_sip_ua.pdb"
+				ImportLibrary=".\Debug\libsofia_sip_ua.lib"
 				TargetMachine="1"
 			/>
 			<Tool
@@ -99,7 +99,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/libsofia_sip_ua.bsc"
+				OutputFile=".\Debug\libsofia_sip_ua.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -144,7 +144,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Release/libsofia_sip_ua.tlb"
+				TypeLibraryName=".\Release\libsofia_sip_ua.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -156,10 +156,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/libsofia_sip_ua.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\libsofia_sip_ua.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -181,11 +181,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib advapi32.lib iphlpapi.lib"
-				OutputFile=".\Release/libsofia_sip_ua.dll"
+				OutputFile=".\Release\libsofia_sip_ua.dll"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/libsofia_sip_ua.pdb"
-				ImportLibrary=".\Release/libsofia_sip_ua.lib"
+				ProgramDatabaseFile=".\Release\libsofia_sip_ua.pdb"
+				ImportLibrary=".\Release\libsofia_sip_ua.lib"
 				TargetMachine="1"
 			/>
 			<Tool
@@ -200,7 +200,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/libsofia_sip_ua.bsc"
+				OutputFile=".\Release\libsofia_sip_ua.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/test_htable/test_htable.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/test_htable/test_htable.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/test_htable/test_htable.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/test_htable.tlb"
+				TypeLibraryName=".\Debug\test_htable.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/test_htable.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\test_htable.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/test_htable.exe"
+				OutputFile=".\Debug\test_htable.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/test_htable.pdb"
+				ProgramDatabaseFile=".\Debug\test_htable.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/test_htable.bsc"
+				OutputFile=".\Debug\test_htable.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/test_htable.tlb"
+				TypeLibraryName=".\Release\test_htable.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/test_htable.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\test_htable.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/test_htable.exe"
+				OutputFile=".\Release\test_htable.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/test_htable.pdb"
+				ProgramDatabaseFile=".\Release\test_htable.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/test_htable.bsc"
+				OutputFile=".\Release\test_htable.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/test_memmem/test_memmem.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/test_memmem/test_memmem.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/test_memmem/test_memmem.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/test_memmem.tlb"
+				TypeLibraryName=".\Debug\test_memmem.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/test_memmem.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\test_memmem.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -73,11 +73,11 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				OutputFile=".\Debug/test_memmem.exe"
+				OutputFile=".\Debug\test_memmem.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/test_memmem.pdb"
+				ProgramDatabaseFile=".\Debug\test_memmem.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/test_memmem.bsc"
+				OutputFile=".\Debug\test_memmem.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/test_memmem.tlb"
+				TypeLibraryName=".\Release\test_memmem.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -144,10 +144,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/test_memmem.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\test_memmem.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -167,10 +167,10 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				OutputFile=".\Release/test_memmem.exe"
+				OutputFile=".\Release\test_memmem.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/test_memmem.pdb"
+				ProgramDatabaseFile=".\Release\test_memmem.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -186,7 +186,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/test_memmem.bsc"
+				OutputFile=".\Release\test_memmem.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/test_nta/test_nta.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/test_nta/test_nta.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/test_nta/test_nta.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/test_nta.tlb"
+				TypeLibraryName=".\Release\test_nta.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -50,10 +50,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/test_nta.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\test_nta.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,10 +74,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/test_nta.exe"
+				OutputFile=".\Release\test_nta.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/test_nta.pdb"
+				ProgramDatabaseFile=".\Release\test_nta.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/test_nta.bsc"
+				OutputFile=".\Release\test_nta.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/test_nta.tlb"
+				TypeLibraryName=".\Debug\test_nta.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -143,10 +143,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/test_nta.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\test_nta.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -168,11 +168,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/test_nta.exe"
+				OutputFile=".\Debug\test_nta.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/test_nta.pdb"
+				ProgramDatabaseFile=".\Debug\test_nta.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/test_nta.bsc"
+				OutputFile=".\Debug\test_nta.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/test_nua/test_nua.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/test_nua/test_nua.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/test_nua/test_nua.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/test_nua.tlb"
+				TypeLibraryName=".\Debug\test_nua.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/test_nua.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\test_nua.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/test_nua.exe"
+				OutputFile=".\Debug\test_nua.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/test_nua.pdb"
+				ProgramDatabaseFile=".\Debug\test_nua.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/test_nua.bsc"
+				OutputFile=".\Debug\test_nua.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/test_nua.tlb"
+				TypeLibraryName=".\Release\test_nua.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/test_nua.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\test_nua.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/test_nua.exe"
+				OutputFile=".\Release\test_nua.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/test_nua.pdb"
+				ProgramDatabaseFile=".\Release\test_nua.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/test_nua.bsc"
+				OutputFile=".\Release\test_nua.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/test_su/test_su.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/test_su/test_su.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/test_su/test_su.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/test_su.tlb"
+				TypeLibraryName=".\Debug\test_su.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/test_su.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\test_su.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/test_su.exe"
+				OutputFile=".\Debug\test_su.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/test_su.pdb"
+				ProgramDatabaseFile=".\Debug\test_su.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/test_su.bsc"
+				OutputFile=".\Debug\test_su.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/test_su.tlb"
+				TypeLibraryName=".\Release\test_su.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/test_su.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\test_su.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/test_su.exe"
+				OutputFile=".\Release\test_su.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/test_su.pdb"
+				ProgramDatabaseFile=".\Release\test_su.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/test_su.bsc"
+				OutputFile=".\Release\test_su.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/test_tport/test_tport.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/test_tport/test_tport.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/test_tport/test_tport.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/test_tport.tlb"
+				TypeLibraryName=".\Debug\test_tport.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/test_tport.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\test_tport.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -73,11 +73,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/test_tport.exe"
+				OutputFile=".\Debug\test_tport.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/test_tport.pdb"
+				ProgramDatabaseFile=".\Debug\test_tport.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/test_tport.bsc"
+				OutputFile=".\Debug\test_tport.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/test_tport.tlb"
+				TypeLibraryName=".\Release\test_tport.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -144,10 +144,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/test_tport.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\test_tport.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -167,10 +167,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/test_tport.exe"
+				OutputFile=".\Release\test_tport.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/test_tport.pdb"
+				ProgramDatabaseFile=".\Release\test_tport.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -186,7 +186,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/test_tport.bsc"
+				OutputFile=".\Release\test_tport.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_rbtree/torture_rbtree.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_rbtree/torture_rbtree.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_rbtree/torture_rbtree.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_rbtree.tlb"
+				TypeLibraryName=".\Release\torture_rbtree.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -50,10 +50,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_rbtree.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_rbtree.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,10 +74,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_rbtree.exe"
+				OutputFile=".\Release\torture_rbtree.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_rbtree.pdb"
+				ProgramDatabaseFile=".\Release\torture_rbtree.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_rbtree.bsc"
+				OutputFile=".\Release\torture_rbtree.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_rbtree.tlb"
+				TypeLibraryName=".\Debug\torture_rbtree.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -143,10 +143,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_rbtree.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_rbtree.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -168,11 +168,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_rbtree.exe"
+				OutputFile=".\Debug\torture_rbtree.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_rbtree.pdb"
+				ProgramDatabaseFile=".\Debug\torture_rbtree.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_rbtree.bsc"
+				OutputFile=".\Debug\torture_rbtree.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su/torture_su.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su/torture_su.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su/torture_su.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su.tlb"
+				TypeLibraryName=".\Release\torture_su.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -50,10 +50,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,10 +74,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su.exe"
+				OutputFile=".\Release\torture_su.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su.pdb"
+				ProgramDatabaseFile=".\Release\torture_su.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su.bsc"
+				OutputFile=".\Release\torture_su.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su.tlb"
+				TypeLibraryName=".\Debug\torture_su.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -143,10 +143,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -168,11 +168,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su.exe"
+				OutputFile=".\Debug\torture_su.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su.bsc"
+				OutputFile=".\Debug\torture_su.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_alloc/torture_su_alloc.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_alloc/torture_su_alloc.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_alloc/torture_su_alloc.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_alloc.tlb"
+				TypeLibraryName=".\Release\torture_su_alloc.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -50,10 +50,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_alloc.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_alloc.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,10 +74,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_alloc.exe"
+				OutputFile=".\Release\torture_su_alloc.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_alloc.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_alloc.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_alloc.bsc"
+				OutputFile=".\Release\torture_su_alloc.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_alloc.tlb"
+				TypeLibraryName=".\Debug\torture_su_alloc.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -143,10 +143,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_alloc.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_alloc.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -168,11 +168,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_alloc.exe"
+				OutputFile=".\Debug\torture_su_alloc.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_alloc.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_alloc.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_alloc.bsc"
+				OutputFile=".\Debug\torture_su_alloc.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_bm/torture_su_bm.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_bm/torture_su_bm.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_bm/torture_su_bm.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_bm.tlb"
+				TypeLibraryName=".\Debug\torture_su_bm.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_bm.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_bm.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_bm.exe"
+				OutputFile=".\Debug\torture_su_bm.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_bm.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_bm.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_bm.bsc"
+				OutputFile=".\Debug\torture_su_bm.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_bm.tlb"
+				TypeLibraryName=".\Release\torture_su_bm.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_bm.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_bm.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_bm.exe"
+				OutputFile=".\Release\torture_su_bm.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_bm.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_bm.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_bm.bsc"
+				OutputFile=".\Release\torture_su_bm.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_port/torture_su_port.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_port/torture_su_port.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_port/torture_su_port.vcproj	Wed Jan 23 13:37:33 2008
@@ -37,7 +37,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_port.tlb"
+				TypeLibraryName=".\Release\torture_su_port.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_port.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_port.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="3"
 				WarnAsError="true"
@@ -72,10 +72,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_port.exe"
+				OutputFile=".\Release\torture_su_port.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_port.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_port.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -91,7 +91,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_port.bsc"
+				OutputFile=".\Release\torture_su_port.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -130,7 +130,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_port.tlb"
+				TypeLibraryName=".\Debug\torture_su_port.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -141,10 +141,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_port.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_port.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="3"
 				WarnAsError="true"
@@ -165,11 +165,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_port.exe"
+				OutputFile=".\Debug\torture_su_port.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_port.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_port.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -185,7 +185,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_port.bsc"
+				OutputFile=".\Debug\torture_su_port.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_root/torture_su_root.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_root/torture_su_root.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_root/torture_su_root.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_root.tlb"
+				TypeLibraryName=".\Debug\torture_su_root.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_root.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_root.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_root.exe"
+				OutputFile=".\Debug\torture_su_root.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_root.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_root.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_root.bsc"
+				OutputFile=".\Debug\torture_su_root.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_root.tlb"
+				TypeLibraryName=".\Release\torture_su_root.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_root.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_root.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_root.exe"
+				OutputFile=".\Release\torture_su_root.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_root.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_root.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_root.bsc"
+				OutputFile=".\Release\torture_su_root.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_tag/torture_su_tag.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_tag/torture_su_tag.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_tag/torture_su_tag.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_tag.tlb"
+				TypeLibraryName=".\Debug\torture_su_tag.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_tag.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_tag.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_tag.exe"
+				OutputFile=".\Debug\torture_su_tag.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_tag.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_tag.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_tag.bsc"
+				OutputFile=".\Debug\torture_su_tag.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_tag.tlb"
+				TypeLibraryName=".\Release\torture_su_tag.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_tag.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_tag.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_tag.exe"
+				OutputFile=".\Release\torture_su_tag.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_tag.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_tag.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_tag.bsc"
+				OutputFile=".\Release\torture_su_tag.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_time/torture_su_time.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_time/torture_su_time.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_time/torture_su_time.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_time.tlb"
+				TypeLibraryName=".\Release\torture_su_time.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -50,10 +50,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_time.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_time.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,10 +74,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_time.exe"
+				OutputFile=".\Release\torture_su_time.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_time.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_time.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_time.bsc"
+				OutputFile=".\Release\torture_su_time.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -132,7 +132,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_time.tlb"
+				TypeLibraryName=".\Debug\torture_su_time.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -143,10 +143,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_time.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_time.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -168,11 +168,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_time.exe"
+				OutputFile=".\Debug\torture_su_time.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_time.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_time.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_time.bsc"
+				OutputFile=".\Debug\torture_su_time.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_timer/torture_su_timer.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_timer/torture_su_timer.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/tests/torture_su_timer/torture_su_timer.vcproj	Wed Jan 23 13:37:33 2008
@@ -38,7 +38,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Debug/torture_su_timer.tlb"
+				TypeLibraryName=".\Debug\torture_su_timer.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -49,10 +49,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/torture_su_timer.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\torture_su_timer.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -74,11 +74,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/torture_su_timer.exe"
+				OutputFile=".\Debug\torture_su_timer.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/torture_su_timer.pdb"
+				ProgramDatabaseFile=".\Debug\torture_su_timer.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -94,7 +94,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/torture_su_timer.bsc"
+				OutputFile=".\Debug\torture_su_timer.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -133,7 +133,7 @@
 			/>
 			<Tool
 				Name="VCMIDLTool"
-				TypeLibraryName=".\Release/torture_su_timer.tlb"
+				TypeLibraryName=".\Release\torture_su_timer.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -145,10 +145,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/torture_su_timer.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\torture_su_timer.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				BrowseInformation="1"
 				WarningLevel="4"
 				WarnAsError="true"
@@ -169,10 +169,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/torture_su_timer.exe"
+				OutputFile=".\Release\torture_su_timer.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/torture_su_timer.pdb"
+				ProgramDatabaseFile=".\Release\torture_su_timer.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -188,7 +188,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/torture_su_timer.bsc"
+				OutputFile=".\Release\torture_su_timer.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/utils/localinfo/localinfo.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/utils/localinfo/localinfo.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/utils/localinfo/localinfo.vcproj	Wed Jan 23 13:37:33 2008
@@ -42,7 +42,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Debug/localinfo.tlb"
+				TypeLibraryName=".\Debug\localinfo.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -53,10 +53,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="1"
-				PrecompiledHeaderFile=".\Debug/localinfo.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\localinfo.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -78,11 +78,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/localinfo.exe"
+				OutputFile=".\Debug\localinfo.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/localinfo.pdb"
+				ProgramDatabaseFile=".\Debug\localinfo.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -98,7 +98,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/localinfo.bsc"
+				OutputFile=".\Debug\localinfo.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -141,7 +141,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Release/localinfo.tlb"
+				TypeLibraryName=".\Release\localinfo.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -153,10 +153,10 @@
 				StringPooling="true"
 				RuntimeLibrary="0"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/localinfo.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\localinfo.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -177,10 +177,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/localinfo.exe"
+				OutputFile=".\Release\localinfo.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/localinfo.pdb"
+				ProgramDatabaseFile=".\Release\localinfo.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -196,7 +196,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/localinfo.bsc"
+				OutputFile=".\Release\localinfo.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/utils/sip_dig/sip_dig.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/utils/sip_dig/sip_dig.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/utils/sip_dig/sip_dig.vcproj	Wed Jan 23 13:37:33 2008
@@ -42,7 +42,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Release/sip_dig.tlb"
+				TypeLibraryName=".\Release\sip_dig.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -54,10 +54,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/sip_dig.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\sip_dig.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -77,10 +77,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/sip_dig.exe"
+				OutputFile=".\Release\sip_dig.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/sip_dig.pdb"
+				ProgramDatabaseFile=".\Release\sip_dig.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -96,7 +96,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/sip_dig.bsc"
+				OutputFile=".\Release\sip_dig.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -139,7 +139,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Debug/sip_dig.tlb"
+				TypeLibraryName=".\Debug\sip_dig.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -150,10 +150,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/sip_dig.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\sip_dig.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -174,11 +174,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/sip_dig.exe"
+				OutputFile=".\Debug\sip_dig.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/sip_dig.pdb"
+				ProgramDatabaseFile=".\Debug\sip_dig.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -194,7 +194,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/sip_dig.bsc"
+				OutputFile=".\Debug\sip_dig.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options/sip_options.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options/sip_options.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options/sip_options.vcproj	Wed Jan 23 13:37:33 2008
@@ -42,7 +42,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Release/sip_options.tlb"
+				TypeLibraryName=".\Release\sip_options.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -54,10 +54,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/sip_options.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\sip_options.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -77,10 +77,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/sip_options.exe"
+				OutputFile=".\Release\sip_options.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/sip_options.pdb"
+				ProgramDatabaseFile=".\Release\sip_options.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -96,7 +96,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/sip_options.bsc"
+				OutputFile=".\Release\sip_options.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -139,7 +139,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Debug/sip_options.tlb"
+				TypeLibraryName=".\Debug\sip_options.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -150,10 +150,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/sip_options.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\sip_options.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -174,11 +174,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/sip_options.exe"
+				OutputFile=".\Debug\sip_options.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/sip_options.pdb"
+				ProgramDatabaseFile=".\Debug\sip_options.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -194,7 +194,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/sip_options.bsc"
+				OutputFile=".\Debug\sip_options.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options_static/sip_options_static.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options_static/sip_options_static.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/utils/sip_options_static/sip_options_static.vcproj	Wed Jan 23 13:37:33 2008
@@ -42,7 +42,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Release/sip_options_static.tlb"
+				TypeLibraryName=".\Release\sip_options_static.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -54,10 +54,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/sip_options_static.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\sip_options_static.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -77,10 +77,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib advapi32.lib iphlpapi.lib"
-				OutputFile=".\Release/sip_options_static.exe"
+				OutputFile=".\Release\sip_options_static.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/sip_options_static.pdb"
+				ProgramDatabaseFile=".\Release\sip_options_static.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -96,7 +96,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/sip_options_static.bsc"
+				OutputFile=".\Release\sip_options_static.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -139,7 +139,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Debug/sip_options_static.tlb"
+				TypeLibraryName=".\Debug\sip_options_static.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -150,10 +150,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/sip_options_static.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\sip_options_static.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -174,11 +174,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib advapi32.lib iphlpapi.lib"
-				OutputFile=".\Debug/sip_options_static.exe"
+				OutputFile=".\Debug\sip_options_static.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/sip_options_static.pdb"
+				ProgramDatabaseFile=".\Debug\sip_options_static.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -194,7 +194,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/sip_options_static.bsc"
+				OutputFile=".\Debug\sip_options_static.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"

Modified: freeswitch/trunk/libs/sofia-sip/win32/utils/stunc/stunc.vcproj
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/win32/utils/stunc/stunc.vcproj	(original)
+++ freeswitch/trunk/libs/sofia-sip/win32/utils/stunc/stunc.vcproj	Wed Jan 23 13:37:33 2008
@@ -42,7 +42,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Debug/stunc.tlb"
+				TypeLibraryName=".\Debug\stunc.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -53,10 +53,10 @@
 				MinimalRebuild="true"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
-				PrecompiledHeaderFile=".\Debug/stunc.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\Debug\stunc.pch"
+				AssemblerListingLocation=".\Debug\"
+				ObjectFile=".\Debug\"
+				ProgramDataBaseFileName=".\Debug\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -77,11 +77,11 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Debug/stunc.exe"
+				OutputFile=".\Debug\stunc.exe"
 				LinkIncremental="2"
 				SuppressStartupBanner="true"
 				GenerateDebugInformation="true"
-				ProgramDatabaseFile=".\Debug/stunc.pdb"
+				ProgramDatabaseFile=".\Debug\stunc.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -97,7 +97,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Debug/stunc.bsc"
+				OutputFile=".\Debug\stunc.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"
@@ -140,7 +140,7 @@
 				MkTypLibCompatible="true"
 				SuppressStartupBanner="true"
 				TargetEnvironment="1"
-				TypeLibraryName=".\Release/stunc.tlb"
+				TypeLibraryName=".\Release\stunc.tlb"
 				HeaderFileName=""
 			/>
 			<Tool
@@ -152,10 +152,10 @@
 				StringPooling="true"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
-				PrecompiledHeaderFile=".\Release/stunc.pch"
-				AssemblerListingLocation=".\Release/"
-				ObjectFile=".\Release/"
-				ProgramDataBaseFileName=".\Release/"
+				PrecompiledHeaderFile=".\Release\stunc.pch"
+				AssemblerListingLocation=".\Release\"
+				ObjectFile=".\Release\"
+				ProgramDataBaseFileName=".\Release\"
 				WarningLevel="4"
 				WarnAsError="true"
 				SuppressStartupBanner="true"
@@ -175,10 +175,10 @@
 			<Tool
 				Name="VCLinkerTool"
 				AdditionalDependencies="ws2_32.lib"
-				OutputFile=".\Release/stunc.exe"
+				OutputFile=".\Release\stunc.exe"
 				LinkIncremental="1"
 				SuppressStartupBanner="true"
-				ProgramDatabaseFile=".\Release/stunc.pdb"
+				ProgramDatabaseFile=".\Release\stunc.pdb"
 				SubSystem="1"
 				TargetMachine="1"
 			/>
@@ -194,7 +194,7 @@
 			<Tool
 				Name="VCBscMakeTool"
 				SuppressStartupBanner="true"
-				OutputFile=".\Release/stunc.bsc"
+				OutputFile=".\Release\stunc.bsc"
 			/>
 			<Tool
 				Name="VCFxCopTool"



More information about the Freeswitch-svn mailing list