/* * 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: Michael Zucchi */ #include "camel-mime-filter-index.h" #include "camel-text-index.h" #define CAMEL_MIME_FILTER_INDEX_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), CAMEL_TYPE_MIME_FILTER_INDEX, CamelMimeFilterIndexPrivate)) struct _CamelMimeFilterIndexPrivate { CamelIndex *index; CamelIndexName *name; }; G_DEFINE_TYPE (CamelMimeFilterIndex, camel_mime_filter_index, CAMEL_TYPE_MIME_FILTER) static void mime_filter_index_dispose (GObject *object) { CamelMimeFilterIndexPrivate *priv; priv = CAMEL_MIME_FILTER_INDEX_GET_PRIVATE (object); if (priv->name != NULL) { g_object_unref (priv->name); priv->name = NULL; } if (priv->index != NULL) { g_object_unref (priv->index); priv->index = NULL; } /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (camel_mime_filter_index_parent_class)->dispose (object); } static void mime_filter_index_filter (CamelMimeFilter *mime_filter, const gchar *in, gsize len, gsize prespace, gchar **out, gsize *outlenptr, gsize *outprespace) { CamelMimeFilterIndexPrivate *priv; priv = CAMEL_MIME_FILTER_INDEX_GET_PRIVATE (mime_filter); if (priv->index == NULL || priv->name == NULL) { goto donothing; } camel_index_name_add_buffer (priv->name, in, len); donothing: *out = (gchar *) in; *outlenptr = len; *outprespace = prespace; } static void mime_filter_index_complete (CamelMimeFilter *mime_filter, const gchar *in, gsize len, gsize prespace, gchar **out, gsize *outlenptr, gsize *outprespace) { CamelMimeFilterIndexPrivate *priv; priv = CAMEL_MIME_FILTER_INDEX_GET_PRIVATE (mime_filter); if (priv->index == NULL || priv->name == NULL) { goto donothing; } camel_index_name_add_buffer (priv->name, in, len); camel_index_name_add_buffer (priv->name, NULL, 0); donothing: *out = (gchar *) in; *outlenptr = len; *outprespace = prespace; } static void camel_mime_filter_index_class_init (CamelMimeFilterIndexClass *class) { GObjectClass *object_class; CamelMimeFilterClass *mime_filter_class; g_type_class_add_private (class, sizeof (CamelMimeFilterIndexPrivate)); object_class = G_OBJECT_CLASS (class); object_class->dispose = mime_filter_index_dispose; mime_filter_class = CAMEL_MIME_FILTER_CLASS (class); mime_filter_class->filter = mime_filter_index_filter; mime_filter_class->complete = mime_filter_index_complete; } static void camel_mime_filter_index_init (CamelMimeFilterIndex *filter) { filter->priv = CAMEL_MIME_FILTER_INDEX_GET_PRIVATE (filter); } /** * camel_mime_filter_index_new: * @index: a #CamelIndex object * * Create a new #CamelMimeFilterIndex based on @index. * * Returns: a new #CamelMimeFilterIndex object **/ CamelMimeFilter * camel_mime_filter_index_new (CamelIndex *index) { CamelMimeFilter *new; CamelMimeFilterIndexPrivate *priv; new = g_object_new (CAMEL_TYPE_MIME_FILTER_INDEX, NULL); priv = CAMEL_MIME_FILTER_INDEX_GET_PRIVATE (new); if (index != NULL) priv->index = g_object_ref (index); return new; } /* Set the match name for any indexed words */ /** * camel_mime_filter_index_set_name: * @filter: a #CamelMimeFilterIndex object * @name: a #CamelIndexName object * * Set the match name for any indexed words. **/ void camel_mime_filter_index_set_name (CamelMimeFilterIndex *filter, CamelIndexName *name) { g_return_if_fail (CAMEL_IS_MIME_FILTER_INDEX (filter)); if (name != NULL) { g_return_if_fail (CAMEL_IS_INDEX_NAME (name)); g_object_ref (name); } if (filter->priv->name != NULL) g_object_unref (filter->priv->name); filter->priv->name = name; } /** * camel_mime_filter_index_set_index: * @filter: a #CamelMimeFilterIndex object * @index: a #CamelIndex object * * Set @index on @filter. **/ void camel_mime_filter_index_set_index (CamelMimeFilterIndex *filter, CamelIndex *index) { g_return_if_fail (CAMEL_IS_MIME_FILTER_INDEX (filter)); if (index != NULL) { g_return_if_fail (CAMEL_IS_INDEX (index)); g_object_ref (index); } if (filter->priv->index) { gchar *out; gsize outlen, outspace; camel_mime_filter_complete ( CAMEL_MIME_FILTER (filter), "", 0, 0, &out, &outlen, &outspace); g_object_unref (filter->priv->index); } filter->priv->index = index; }