/*
 * Send the next queued message, if any
 */
static gboolean
process_queue (gpointer data)
{
        GSSDPResourceGroup *resource_group;

        resource_group = GSSDP_RESOURCE_GROUP (data);

        if (g_queue_is_empty (resource_group->priv->message_queue)) {
                /* this is the timeout after last message in queue */
                resource_group->priv->message_src = NULL;

                return FALSE;
        } else {
                GSSDPClient *client;
                char *message;

                client = resource_group->priv->client;
                message = g_queue_pop_head
                        (resource_group->priv->message_queue);

                _gssdp_client_send_message (client,
                                            NULL,
                                            0,
                                            message,
                                            _GSSDP_DISCOVERY_RESPONSE);
                g_free (message);

                return TRUE;
        }
}
Example #2
0
/* Sends discovery request */
static void
send_discovery_request (GSSDPResourceBrowser *resource_browser)
{
        GSSDPResourceBrowserPrivate *priv;
        char *message = NULL;
        const char *group = NULL;
        char *dest = NULL;

        priv = gssdp_resource_browser_get_instance_private (resource_browser);
        group = _gssdp_client_get_mcast_group (priv->client);

        /* FIXME: Check for IPv6 - ugly and remove strcpys */
        if (strchr (group, ':')) {
            dest = g_strdup_printf ("[%s]", group);
        } else {
            dest = g_strdup (group);
        }

        priv = gssdp_resource_browser_get_instance_private (resource_browser);
        message = g_strdup_printf (SSDP_DISCOVERY_REQUEST,
                                   dest,
                                   priv->target,
                                   priv->mx,
                                   gssdp_client_get_server_id (priv->client));

        _gssdp_client_send_message (priv->client,
                                    NULL,
                                    0,
                                    message,
                                    _GSSDP_DISCOVERY_REQUEST);

        g_free (dest);
        g_free (message);
}
Example #3
0
/*
 * Send a discovery response
 */
static gboolean
discovery_response_timeout (gpointer user_data)
{
        DiscoveryResponse *response = user_data;
        GSSDPClient *client;
        SoupDate *date;
        char *al, *date_str, *message;
        guint max_age;
        char *usn;
        GSSDPResourceGroup *self = response->resource->resource_group;
        GSSDPResourceGroupPrivate *priv;

        priv = gssdp_resource_group_get_instance_private (self);

        /* Send message */
        client = priv->client;

        max_age = priv->max_age;

        al = construct_al (response->resource);
        usn = construct_usn (response->resource->usn,
                             response->target,
                             response->resource->target);
        date = soup_date_new_from_now (0);
        date_str = soup_date_to_string (date, SOUP_DATE_HTTP);
        soup_date_free (date);

        message = g_strdup_printf (SSDP_DISCOVERY_RESPONSE,
                                   (char *) response->resource->locations->data,
                                   al ? al : "",
                                   usn,
                                   gssdp_client_get_server_id (client),
                                   max_age,
                                   response->target,
                                   date_str);

        _gssdp_client_send_message (client,
                                    response->dest_ip,
                                    response->dest_port,
                                    message,
                                    _GSSDP_DISCOVERY_RESPONSE);

        g_free (message);
        g_free (date_str);
        g_free (al);
        g_free (usn);

        discovery_response_free (response);

        return FALSE;
}