MT#60476 Rework `sdp_version_check()`

Due to deprecation of the sdp_replace
approach just rework the `sdp_version_check()`
functionality as well as the `sdp_version_replace()` so,
that it complies with current state of things.

Chopper processing is not honored anymore.
Sessions parameter has been obsoleted, hence removed.

Change-Id: I4cee1e63c70e5ff5c3694d185a1bb841b5e6fa3a
pull/1870/head
Donat Zenichev 2 years ago
parent 8e9e8b520a
commit e13a096a3f

@ -2563,66 +2563,39 @@ static void insert_rtcp_attr(GString *s, struct packet_stream *ps, const sdp_ng_
} }
/** /**
* chop - used by sdp_replace * Handle sdp version replacements.
* s - used by sdp_create
*
* TODO: deprecate chop-based handling, as soon as sdp_replace is gone.
*/ */
static void sdp_version_replace(struct sdp_chopper *chop, GString *s, static void sdp_version_replace(GString *s, sdp_origin *src_orig, sdp_origin *other_orig)
sdp_sessions_q *sessions,
sdp_origin *src_orig,
sdp_origin *other_orig)
{ {
char version_str[64]; char version_str[64];
snprintf(version_str, sizeof(version_str), "%llu", src_orig->version_num); snprintf(version_str, sizeof(version_str), "%llu", src_orig->version_num);
size_t version_len = strlen(version_str); size_t version_len = strlen(version_str);
/* for sdp_replace */ if (!other_orig)
if (chop) { return;
/* start from the top */
chop->offset = 0;
for (__auto_type l = sessions->head; l; l = l->next) other_orig->version_num = src_orig->version_num;
{ /* is our new value longer? */
struct sdp_session *session = l->data; if (version_len > other_orig->version_str.len) {
sdp_origin *origin = &session->origin; /* overwrite + insert */
/* update string unconditionally to keep position tracking intact */ g_string_overwrite_len(s, other_orig->version_output_pos, version_str, other_orig->version_str.len);
chopper_replace(chop, &origin->version_str, &origin->version_output_pos, version_str, version_len); g_string_insert(s, other_orig->version_output_pos + other_orig->version_str.len, version_str + other_orig->version_str.len);
} other_orig->version_str.len = version_len;
} }
/* for sdp_create */
else { else {
if (!other_orig) /* overwrite + optional erase */
return; g_string_overwrite(s, other_orig->version_output_pos, version_str);
if (version_len < other_orig->version_str.len) {
other_orig->version_num = src_orig->version_num; g_string_erase(s, other_orig->version_output_pos + version_len, other_orig->version_str.len - version_len);
/* is our new value longer? */
if (version_len > other_orig->version_str.len) {
/* overwrite + insert */
g_string_overwrite_len(s, other_orig->version_output_pos, version_str, other_orig->version_str.len);
g_string_insert(s, other_orig->version_output_pos + other_orig->version_str.len, version_str + other_orig->version_str.len);
other_orig->version_str.len = version_len; other_orig->version_str.len = version_len;
} }
else {
/* overwrite + optional erase */
g_string_overwrite(s, other_orig->version_output_pos, version_str);
if (version_len < other_orig->version_str.len) {
g_string_erase(s, other_orig->version_output_pos + version_len, other_orig->version_str.len - version_len);
other_orig->version_str.len = version_len;
}
}
} }
} }
/** /**
* `chop` - used by sdp_replace (in this case `s` is NULL) * SDP session version manipulations.
* `s` - used by sdp_create (in this case `chop` is NULL)
*
* TODO: deprecate chop-based handling, as soon as sdp_replace is gone.
*/ */
static void sdp_version_check(struct sdp_chopper *chop, GString *s, static void sdp_version_check(GString *s, struct call_monologue *monologue,
sdp_sessions_q *sessions,
struct call_monologue *monologue,
bool force_increase) bool force_increase)
{ {
if (!monologue->session_last_sdp_orig) if (!monologue->session_last_sdp_orig)
@ -2639,7 +2612,7 @@ static void sdp_version_check(struct sdp_chopper *chop, GString *s,
* and use the same version number on all of them */ * and use the same version number on all of them */
/* First update all versions to match our single version */ /* First update all versions to match our single version */
sdp_version_replace(chop, s, sessions, origin, other_origin); sdp_version_replace(s, origin, other_origin);
/* Now check if we need to change the version actually. /* Now check if we need to change the version actually.
* The version change will be forced with the 'force_increase', * The version change will be forced with the 'force_increase',
@ -2649,17 +2622,17 @@ static void sdp_version_check(struct sdp_chopper *chop, GString *s,
if (!force_increase) { if (!force_increase) {
if (!monologue->last_out_sdp) if (!monologue->last_out_sdp)
goto dup; goto dup;
if (g_string_equal(monologue->last_out_sdp, (chop ? chop->output : s))) if (g_string_equal(monologue->last_out_sdp, s))
return; return;
} }
/* mismatch detected. increment version, update again, and store copy */ /* mismatch detected. increment version, update again, and store copy */
origin->version_num++; origin->version_num++;
sdp_version_replace(chop, s, sessions, origin, other_origin); sdp_version_replace(s, origin, other_origin);
if (monologue->last_out_sdp) if (monologue->last_out_sdp)
g_string_free(monologue->last_out_sdp, TRUE); g_string_free(monologue->last_out_sdp, TRUE);
dup: dup:
monologue->last_out_sdp = g_string_new_len((chop ? chop->output->str : s->str), (chop ? chop->output->len : s->len)); monologue->last_out_sdp = g_string_new_len(s->str, s->len);
} }
const char *sdp_get_sendrecv(struct call_media *media) { const char *sdp_get_sendrecv(struct call_media *media) {
@ -3361,7 +3334,7 @@ int sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags)
* which forces version increase regardless changes in the SDP information. * which forces version increase regardless changes in the SDP information.
*/ */
if (flags->force_inc_sdp_ver || flags->replace_sdp_version || flags->replace_origin_full) if (flags->force_inc_sdp_ver || flags->replace_sdp_version || flags->replace_origin_full)
sdp_version_check(NULL, s, NULL, monologue, !!flags->force_inc_sdp_ver); sdp_version_check(s, monologue, !!flags->force_inc_sdp_ver);
out->len = s->len; out->len = s->len;
out->s = g_string_free(s, FALSE); out->s = g_string_free(s, FALSE);

Loading…
Cancel
Save