/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* camelMedium.c : Abstract class for a medium
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors: Bertrand Guiheneuf
* Michael Zucchi
*/
#include "evolution-data-server-config.h"
#include
#include
#include "camel-medium.h"
#define d(x)
struct _CamelMediumPrivate {
/* The content of the medium, as opposed to our parent
* CamelDataWrapper, which wraps both the headers and
* the content. */
CamelDataWrapper *content;
};
enum {
PROP_0,
PROP_CONTENT
};
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (CamelMedium, camel_medium, CAMEL_TYPE_DATA_WRAPPER)
static void
medium_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_CONTENT:
camel_medium_set_content (
CAMEL_MEDIUM (object),
g_value_get_object (value));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
medium_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_CONTENT:
g_value_set_object (
value, camel_medium_get_content (
CAMEL_MEDIUM (object)));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
medium_dispose (GObject *object)
{
CamelMediumPrivate *priv;
priv = CAMEL_MEDIUM (object)->priv;
g_clear_object (&priv->content);
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (camel_medium_parent_class)->dispose (object);
}
static gboolean
medium_is_offline (CamelDataWrapper *data_wrapper)
{
CamelDataWrapper *content;
content = camel_medium_get_content (CAMEL_MEDIUM (data_wrapper));
return CAMEL_DATA_WRAPPER_CLASS (camel_medium_parent_class)->is_offline (data_wrapper) ||
camel_data_wrapper_is_offline (content);
}
static void
medium_set_content (CamelMedium *medium,
CamelDataWrapper *content)
{
if (medium->priv->content == content)
return;
if (content != NULL)
g_object_ref (content);
if (medium->priv->content != NULL)
g_object_unref (medium->priv->content);
medium->priv->content = content;
g_object_notify (G_OBJECT (medium), "content");
}
static CamelDataWrapper *
medium_get_content (CamelMedium *medium)
{
return medium->priv->content;
}
static void
camel_medium_class_init (CamelMediumClass *class)
{
GObjectClass *object_class;
CamelDataWrapperClass *data_wrapper_class;
object_class = G_OBJECT_CLASS (class);
object_class->set_property = medium_set_property;
object_class->get_property = medium_get_property;
object_class->dispose = medium_dispose;
data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (class);
data_wrapper_class->is_offline = medium_is_offline;
class->set_content = medium_set_content;
class->get_content = medium_get_content;
g_object_class_install_property (
object_class,
PROP_CONTENT,
g_param_spec_object (
"content",
"Content",
NULL,
CAMEL_TYPE_DATA_WRAPPER,
G_PARAM_READWRITE |
G_PARAM_EXPLICIT_NOTIFY));
}
static void
camel_medium_init (CamelMedium *medium)
{
medium->priv = camel_medium_get_instance_private (medium);
}
/**
* camel_medium_add_header:
* @medium: a #CamelMedium object
* @name: name of the header
* @value: value of the header
*
* Adds a header to a #CamelMedium.
**/
void
camel_medium_add_header (CamelMedium *medium,
const gchar *name,
const gchar *value)
{
CamelMediumClass *class;
g_return_if_fail (CAMEL_IS_MEDIUM (medium));
g_return_if_fail (name != NULL);
g_return_if_fail (value != NULL);
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_if_fail (class != NULL);
g_return_if_fail (class->add_header != NULL);
class->add_header (medium, name, value);
}
/**
* camel_medium_set_header:
* @medium: a #CamelMedium object
* @name: name of the header
* @value: (nullable): value of the header
*
* Sets the value of a header. Any other occurances of the header
* will be removed. Setting a %NULL header can be used to remove
* the header also.
**/
void
camel_medium_set_header (CamelMedium *medium,
const gchar *name,
const gchar *value)
{
CamelMediumClass *class;
g_return_if_fail (CAMEL_IS_MEDIUM (medium));
g_return_if_fail (name != NULL);
if (value == NULL) {
camel_medium_remove_header (medium, name);
return;
}
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_if_fail (class != NULL);
g_return_if_fail (class->set_header != NULL);
class->set_header (medium, name, value);
}
/**
* camel_medium_remove_header:
* @medium: a #CamelMedium
* @name: the name of the header
*
* Removes the named header from the medium. All occurances of the
* header are removed.
**/
void
camel_medium_remove_header (CamelMedium *medium,
const gchar *name)
{
CamelMediumClass *class;
g_return_if_fail (CAMEL_IS_MEDIUM (medium));
g_return_if_fail (name != NULL);
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_if_fail (class != NULL);
g_return_if_fail (class->remove_header != NULL);
class->remove_header (medium, name);
}
/**
* camel_medium_get_header:
* @medium: a #CamelMedium
* @name: the name of the header
*
* Gets the value of the named header in the medium, or %NULL if
* it is unset. The caller should not modify or free the data.
*
* If the header occurs more than once, only retrieve the first
* instance of the header. For multi-occuring headers, use
* camel_medium_dup_headers() or camel_medium_get_headers().
*
* Returns: (nullable): the value of the named header, or %NULL
**/
const gchar *
camel_medium_get_header (CamelMedium *medium,
const gchar *name)
{
CamelMediumClass *class;
g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL);
g_return_val_if_fail (name != NULL, NULL);
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_val_if_fail (class != NULL, NULL);
g_return_val_if_fail (class->get_header != NULL, NULL);
return class->get_header (medium, name);
}
/**
* camel_medium_dup_headers:
* @medium: a #CamelMedium object
*
* Gets an array of all header name/value pairs. The values will be
* decoded to UTF-8 for any headers that are recognized by Camel.
* See also camel_medium_get_headers().
*
* Returns: (transfer full): the array of headers, which must be freed with camel_name_value_array_free().
*
* Since: 3.24
**/
CamelNameValueArray *
camel_medium_dup_headers (CamelMedium *medium)
{
CamelMediumClass *class;
g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL);
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_val_if_fail (class != NULL, NULL);
g_return_val_if_fail (class->dup_headers != NULL, NULL);
return class->dup_headers (medium);
}
/**
* camel_medium_get_headers:
* @medium: a #CamelMedium object
*
* Gets an array of all header name/value pairs. The values will be
* decoded to UTF-8 for any headers that are recognized by Camel.
* See also camel_medium_dup_headers().
*
* Returns: (transfer none): the array of headers, owned by @medium.
*
* Since: 3.24
**/
const CamelNameValueArray *
camel_medium_get_headers (CamelMedium *medium)
{
CamelMediumClass *class;
g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL);
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_val_if_fail (class != NULL, NULL);
g_return_val_if_fail (class->get_headers != NULL, NULL);
return class->get_headers (medium);
}
/**
* camel_medium_get_content:
* @medium: a #CamelMedium object
*
* Gets a data wrapper that represents the content of the medium,
* without its headers.
*
* Returns: (transfer none) (nullable): a #CamelDataWrapper containing
* @medium's content. Can return %NULL.
**/
CamelDataWrapper *
camel_medium_get_content (CamelMedium *medium)
{
CamelMediumClass *class;
g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), NULL);
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_val_if_fail (class != NULL, NULL);
g_return_val_if_fail (class->get_content != NULL, NULL);
return class->get_content (medium);
}
/**
* camel_medium_set_content:
* @medium: a #CamelMedium object
* @content: (nullable): a #CamelDataWrapper object
*
* Sets the content of @medium to be @content.
**/
void
camel_medium_set_content (CamelMedium *medium,
CamelDataWrapper *content)
{
CamelMediumClass *class;
g_return_if_fail (CAMEL_IS_MEDIUM (medium));
if (content != NULL)
g_return_if_fail (CAMEL_IS_DATA_WRAPPER (content));
class = CAMEL_MEDIUM_GET_CLASS (medium);
g_return_if_fail (class != NULL);
g_return_if_fail (class->set_content != NULL);
class->set_content (medium, content);
}