[commit] r9276 - in freeswitch/trunk/libs/sofia-sip: . libsofia-sip-ua/soa
Author: mikej Date: Tue Aug 12 13:06:57 2008 New Revision: 9276 Modified: freeswitch/trunk/libs/sofia-sip/.update freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c Log: Thu Aug 7 07:53:01 EDT 2008 Pekka Pessi <first.last@nokia.com> * soa_static.c: increment version number in o= line only when generating offer or answer Bug reported by Timo Bruhn. Modified: freeswitch/trunk/libs/sofia-sip/.update ============================================================================== --- freeswitch/trunk/libs/sofia-sip/.update (original) +++ freeswitch/trunk/libs/sofia-sip/.update Tue Aug 12 13:06:57 2008 @@ -1 +1 @@ -Tue Aug 12 13:06:30 EDT 2008 +Tue Aug 12 13:06:53 EDT 2008 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 Tue Aug 12 13:06:57 2008 @@ -87,6 +87,9 @@ int *sss_u2s; /** Mapping from session SDP m= lines to user SDP m= lines */ int *sss_s2u; + + /** Our latest offer or answer */ + sdp_session_t *sss_latest; } soa_static_session_t; @@ -1103,6 +1106,8 @@ int *u2s = NULL, *s2u = NULL, *tbf; + sdp_session_t *latest = NULL, *previous = NULL; + char const *phrase = "Internal Media Error"; su_home_t tmphome[SU_HOME_AUTO_SIZE(8192)]; @@ -1327,10 +1332,27 @@ if (ss->ss_local->ssd_sdp != local && sdp_session_cmp(ss->ss_local->ssd_sdp, local)) { - /* We have modified local session: update origin-line */ - if (local->sdp_origin != o) - *o = *local->sdp_origin, local->sdp_origin = o; - o->o_version++; + int bump; + + switch (action) { + case generate_offer: + bump = sdp_session_cmp(local, sss->sss_latest); + break; + case generate_answer: + bump = 1; + break; + case process_answer: + default: + bump = 0; + break; + } + + if (bump) { + /* Upgrade the version number */ + if (local->sdp_origin != o) + *o = *local->sdp_origin, local->sdp_origin = o; + o->o_version++; + } /* Do sanity checks for the created SDP */ if (!local->sdp_subject) /* s= is mandatory */ @@ -1362,6 +1384,11 @@ goto internal_error; } + + if (bump) { + latest = sdp_session_dup(ss->ss_home, ss->ss_local->ssd_sdp); + previous = sss->sss_latest; + } } if (u2s) { @@ -1373,10 +1400,12 @@ switch (action) { case generate_offer: ss->ss_local_user_version = user_version; + sss->sss_latest = latest; break; case generate_answer: ss->ss_local_user_version = user_version; ss->ss_local_remote_version = remote_version; + sss->sss_latest = latest; break; case process_answer: ss->ss_local_remote_version = remote_version; @@ -1384,6 +1413,9 @@ break; } + if (previous) + su_free(ss->ss_home, previous); + su_home_deinit(tmphome); return 0;
participants (1)
-
Freeswitch SVN