|
Packit Service |
ca3877 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
Packit Service |
ca3877 |
/*
|
|
Packit Service |
ca3877 |
* soup-session-feature.c: Miscellaneous session feature-provider interface
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Copyright (C) 2008 Red Hat, Inc.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
ca3877 |
#include <config.h>
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include "soup-session-feature.h"
|
|
Packit Service |
ca3877 |
#include "soup.h"
|
|
Packit Service |
ca3877 |
#include "soup-message-private.h"
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SECTION:soup-session-feature
|
|
Packit Service |
ca3877 |
* @short_description: Interface for miscellaneous session features
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* #SoupSessionFeature is the interface used by classes that extend
|
|
Packit Service |
ca3877 |
* the functionality of a #SoupSession. Some features like HTTP
|
|
Packit Service |
ca3877 |
* authentication handling are implemented internally via
|
|
Packit Service |
ca3877 |
* #SoupSessionFeatures. Other features can be added to the session
|
|
Packit Service |
ca3877 |
* by the application. (Eg, #SoupLogger, #SoupCookieJar.)
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* See soup_session_add_feature(), etc, to add a feature to a session.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SoupSessionFeature:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* An object that implement some sort of optional feature for
|
|
Packit Service |
ca3877 |
* #SoupSession.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SoupSessionFeatureInterface:
|
|
Packit Service |
ca3877 |
* @parent: The parent interface.
|
|
Packit Service |
ca3877 |
* @attach: Perform setup when a feature is added to a session
|
|
Packit Service |
ca3877 |
* @detach: Perform cleanup when a feature is removed from a session
|
|
Packit Service |
ca3877 |
* @request_queued: Proxies the session's #SoupSession::request_queued signal
|
|
Packit Service |
ca3877 |
* @request_started: Proxies the session's #SoupSession::request_started signal. Deprecated 2.50. Use #SoupMessage::starting instead.
|
|
Packit Service |
ca3877 |
* @request_unqueued: Proxies the session's #SoupSession::request_unqueued signal
|
|
Packit Service |
ca3877 |
* @add_feature: adds a sub-feature to the main feature
|
|
Packit Service |
ca3877 |
* @remove_feature: removes a sub-feature from the main feature
|
|
Packit Service |
ca3877 |
* @has_feature: tests if the feature includes a sub-feature
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* The interface implemented by #SoupSessionFeatures.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
G_DEFINE_INTERFACE (SoupSessionFeature, soup_session_feature, G_TYPE_OBJECT)
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
weak_notify_unref (gpointer feature, GObject *ex_object)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_object_unref (feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
request_queued (SoupSession *session, SoupMessage *msg, gpointer feature)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (soup_message_disables_feature (msg, feature))
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature)->
|
|
Packit Service |
ca3877 |
request_queued (feature, session, msg);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
request_started (SoupSession *session, SoupMessage *msg,
|
|
Packit Service |
ca3877 |
SoupSocket *socket, gpointer feature)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (soup_message_disables_feature (msg, feature))
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature)->
|
|
Packit Service |
ca3877 |
request_started (feature, session, msg, socket);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
request_unqueued (SoupSession *session, SoupMessage *msg, gpointer feature)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (soup_message_disables_feature (msg, feature))
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature)->
|
|
Packit Service |
ca3877 |
request_unqueued (feature, session, msg);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_session_feature_real_attach (SoupSessionFeature *feature, SoupSession *session)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_object_weak_ref (G_OBJECT (session),
|
|
Packit Service |
ca3877 |
weak_notify_unref, g_object_ref (feature));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (SOUP_SESSION_FEATURE_GET_CLASS (feature)->request_queued) {
|
|
Packit Service |
ca3877 |
g_signal_connect (session, "request_queued",
|
|
Packit Service |
ca3877 |
G_CALLBACK (request_queued), feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (SOUP_SESSION_FEATURE_GET_CLASS (feature)->request_started) {
|
|
Packit Service |
ca3877 |
g_signal_connect (session, "request_started",
|
|
Packit Service |
ca3877 |
G_CALLBACK (request_started), feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (SOUP_SESSION_FEATURE_GET_CLASS (feature)->request_unqueued) {
|
|
Packit Service |
ca3877 |
g_signal_connect (session, "request_unqueued",
|
|
Packit Service |
ca3877 |
G_CALLBACK (request_unqueued), feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_session_feature_attach (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
SoupSession *session)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_SESSION (session));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature)->attach (feature, session);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_session_feature_real_detach (SoupSessionFeature *feature, SoupSession *session)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_object_weak_unref (G_OBJECT (session), weak_notify_unref, feature);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_signal_handlers_disconnect_by_func (session, request_queued, feature);
|
|
Packit Service |
ca3877 |
g_signal_handlers_disconnect_by_func (session, request_started, feature);
|
|
Packit Service |
ca3877 |
g_signal_handlers_disconnect_by_func (session, request_unqueued, feature);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_object_unref (feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_session_feature_detach (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
SoupSession *session)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_SESSION (session));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature)->detach (feature, session);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_session_feature_default_init (SoupSessionFeatureInterface *iface)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
iface->attach = soup_session_feature_real_attach;
|
|
Packit Service |
ca3877 |
iface->detach = soup_session_feature_real_detach;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_session_feature_add_feature:
|
|
Packit Service |
ca3877 |
* @feature: the "base" feature
|
|
Packit Service |
ca3877 |
* @type: the #GType of a "sub-feature"
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Adds a "sub-feature" of type @type to the base feature @feature.
|
|
Packit Service |
ca3877 |
* This is used for features that can be extended with multiple
|
|
Packit Service |
ca3877 |
* different types. Eg, the authentication manager can be extended
|
|
Packit Service |
ca3877 |
* with subtypes of #SoupAuth.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE if @feature accepted @type as a subfeature.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.34
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_session_feature_add_feature (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
GType type)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupSessionFeatureInterface *feature_iface =
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (feature_iface->add_feature)
|
|
Packit Service |
ca3877 |
return feature_iface->add_feature (feature, type);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_session_feature_remove_feature:
|
|
Packit Service |
ca3877 |
* @feature: the "base" feature
|
|
Packit Service |
ca3877 |
* @type: the #GType of a "sub-feature"
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Removes the "sub-feature" of type @type from the base feature
|
|
Packit Service |
ca3877 |
* @feature. See soup_session_feature_add_feature().
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE if @type was removed from @feature
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.34
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_session_feature_remove_feature (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
GType type)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupSessionFeatureInterface *feature_iface =
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (feature_iface->remove_feature)
|
|
Packit Service |
ca3877 |
return feature_iface->remove_feature (feature, type);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_session_feature_has_feature:
|
|
Packit Service |
ca3877 |
* @feature: the "base" feature
|
|
Packit Service |
ca3877 |
* @type: the #GType of a "sub-feature"
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Tests if @feature has a "sub-feature" of type @type. See
|
|
Packit Service |
ca3877 |
* soup_session_feature_add_feature().
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE if @feature has a subfeature of type @type
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.34
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_session_feature_has_feature (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
GType type)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupSessionFeatureInterface *feature_iface =
|
|
Packit Service |
ca3877 |
SOUP_SESSION_FEATURE_GET_CLASS (feature);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (feature_iface->has_feature)
|
|
Packit Service |
ca3877 |
return feature_iface->has_feature (feature, type);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|