mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2025-01-07 20:35:31 +00:00
sip: media-manager: Simplify SDP generation
Use the newly added get_address_family().
This commit is contained in:
parent
1deee0b71b
commit
9dd3066649
1 changed files with 32 additions and 57 deletions
|
@ -34,9 +34,7 @@
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netdb.h>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,9 +50,6 @@
|
||||||
typedef struct _CallsSipMediaManager {
|
typedef struct _CallsSipMediaManager {
|
||||||
GObject parent;
|
GObject parent;
|
||||||
|
|
||||||
int address_family;
|
|
||||||
struct addrinfo hints;
|
|
||||||
|
|
||||||
CallsSettings *settings;
|
CallsSettings *settings;
|
||||||
GList *preferred_codecs;
|
GList *preferred_codecs;
|
||||||
GListStore *pipelines;
|
GListStore *pipelines;
|
||||||
|
@ -63,34 +58,6 @@ typedef struct _CallsSipMediaManager {
|
||||||
G_DEFINE_TYPE (CallsSipMediaManager, calls_sip_media_manager, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (CallsSipMediaManager, calls_sip_media_manager, G_TYPE_OBJECT);
|
||||||
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
get_address_family_string (CallsSipMediaManager *self,
|
|
||||||
const char *ip)
|
|
||||||
{
|
|
||||||
struct addrinfo *result = NULL;
|
|
||||||
const char *family;
|
|
||||||
|
|
||||||
if (getaddrinfo (ip, NULL, &self->hints, &result) != 0) {
|
|
||||||
g_warning ("Cannot parse session IP %s", ip);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check if IP is IPv4 or IPv6. We need to specify this in the c= line of SDP */
|
|
||||||
self->address_family = result->ai_family;
|
|
||||||
|
|
||||||
if (result->ai_family == AF_INET)
|
|
||||||
family = "IP4";
|
|
||||||
else if (result->ai_family == AF_INET6)
|
|
||||||
family = "IP6";
|
|
||||||
else
|
|
||||||
family = NULL;
|
|
||||||
|
|
||||||
freeaddrinfo (result);
|
|
||||||
|
|
||||||
return family;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_notify_preferred_audio_codecs (CallsSipMediaManager *self)
|
on_notify_preferred_audio_codecs (CallsSipMediaManager *self)
|
||||||
{
|
{
|
||||||
|
@ -183,10 +150,6 @@ calls_sip_media_manager_init (CallsSipMediaManager *self)
|
||||||
self);
|
self);
|
||||||
on_notify_preferred_audio_codecs (self);
|
on_notify_preferred_audio_codecs (self);
|
||||||
|
|
||||||
/* Hints are used with getaddrinfo() when setting the session IP */
|
|
||||||
self->hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_NUMERICHOST;
|
|
||||||
self->hints.ai_family = AF_UNSPEC;
|
|
||||||
|
|
||||||
self->pipelines = g_list_store_new (CALLS_TYPE_SIP_MEDIA_PIPELINE);
|
self->pipelines = g_list_store_new (CALLS_TYPE_SIP_MEDIA_PIPELINE);
|
||||||
|
|
||||||
add_new_pipeline (self);
|
add_new_pipeline (self);
|
||||||
|
@ -209,6 +172,28 @@ calls_sip_media_manager_default (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* helper for calls_sip_media_manager_get_capabilities() */
|
||||||
|
static char *
|
||||||
|
get_connection_line (const char *ip)
|
||||||
|
{
|
||||||
|
int af_family;
|
||||||
|
|
||||||
|
if (STR_IS_NULL_OR_EMPTY(ip))
|
||||||
|
goto invalid;
|
||||||
|
|
||||||
|
af_family = get_address_family_for_ip (ip, TRUE);
|
||||||
|
if (af_family == AF_UNSPEC)
|
||||||
|
goto invalid;
|
||||||
|
|
||||||
|
return g_strdup_printf ("c=IN %s %s\r\n",
|
||||||
|
af_family == AF_INET ? "IP4" : "IP6",
|
||||||
|
ip);
|
||||||
|
|
||||||
|
invalid:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* calls_sip_media_manager_get_capabilities:
|
/* calls_sip_media_manager_get_capabilities:
|
||||||
*
|
*
|
||||||
* @self: A #CallsSipMediaManager
|
* @self: A #CallsSipMediaManager
|
||||||
|
@ -231,8 +216,8 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
||||||
|
|
||||||
g_autoptr (GString) media_line = NULL;
|
g_autoptr (GString) media_line = NULL;
|
||||||
g_autoptr (GString) attribute_lines = NULL;
|
g_autoptr (GString) attribute_lines = NULL;
|
||||||
|
g_autofree char *connection_line = NULL;
|
||||||
GList *node;
|
GList *node;
|
||||||
const char *address_family_string;
|
|
||||||
|
|
||||||
g_return_val_if_fail (CALLS_IS_SIP_MEDIA_MANAGER (self), NULL);
|
g_return_val_if_fail (CALLS_IS_SIP_MEDIA_MANAGER (self), NULL);
|
||||||
|
|
||||||
|
@ -265,7 +250,7 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
||||||
calls_srtp_crypto_attribute *attr = node->data;
|
calls_srtp_crypto_attribute *attr = node->data;
|
||||||
g_autoptr (GError) error = NULL;
|
g_autoptr (GError) error = NULL;
|
||||||
g_autofree char *crypto_line =
|
g_autofree char *crypto_line =
|
||||||
calls_srtp_print_sdp_crypto_attribute(attr, &error);
|
calls_srtp_print_sdp_crypto_attribute (attr, &error);
|
||||||
|
|
||||||
if (!crypto_line) {
|
if (!crypto_line) {
|
||||||
g_warning ("Could not print SDP crypto line for tag %d: %s", attr->tag, error->message);
|
g_warning ("Could not print SDP crypto line for tag %d: %s", attr->tag, error->message);
|
||||||
|
@ -277,25 +262,15 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
||||||
g_string_append_printf (attribute_lines, "a=rtcp:%d\r\n", rtcp_port);
|
g_string_append_printf (attribute_lines, "a=rtcp:%d\r\n", rtcp_port);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (own_ip && *own_ip)
|
connection_line = get_connection_line (own_ip);
|
||||||
address_family_string = get_address_family_string (self, own_ip);
|
|
||||||
|
|
||||||
if (own_ip && *own_ip && address_family_string)
|
|
||||||
return g_strdup_printf ("v=0\r\n"
|
|
||||||
"c=IN %s %s\r\n"
|
|
||||||
"%s\r\n"
|
|
||||||
"%s\r\n",
|
|
||||||
address_family_string,
|
|
||||||
own_ip,
|
|
||||||
media_line->str,
|
|
||||||
attribute_lines->str);
|
|
||||||
else
|
|
||||||
return g_strdup_printf ("v=0\r\n"
|
|
||||||
"%s\r\n"
|
|
||||||
"%s\r\n",
|
|
||||||
media_line->str,
|
|
||||||
attribute_lines->str);
|
|
||||||
|
|
||||||
|
return g_strdup_printf ("v=0\r\n"
|
||||||
|
"%s"
|
||||||
|
"%s\r\n"
|
||||||
|
"%s\r\n",
|
||||||
|
connection_line ?: "",
|
||||||
|
media_line->str,
|
||||||
|
attribute_lines->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue