/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * 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: Jeffrey Stedfast */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "camel-mime-filter-progress.h" #include "camel-operation.h" #define CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), CAMEL_TYPE_MIME_FILTER_PROGRESS, CamelMimeFilterProgressPrivate)) #define d(x) #define w(x) struct _CamelMimeFilterProgressPrivate { GCancellable *cancellable; gsize total; gsize count; }; G_DEFINE_TYPE (CamelMimeFilterProgress, camel_mime_filter_progress, CAMEL_TYPE_MIME_FILTER) static void mime_filter_progress_dispose (GObject *object) { CamelMimeFilterProgressPrivate *priv; priv = CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE (object); if (priv->cancellable != NULL) { g_object_unref (priv->cancellable); priv->cancellable = NULL; } /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (camel_mime_filter_progress_parent_class)->dispose (object); } static void mime_filter_progress_filter (CamelMimeFilter *mime_filter, const gchar *in, gsize len, gsize prespace, gchar **out, gsize *outlen, gsize *outprespace) { CamelMimeFilterProgressPrivate *priv; gdouble percent; priv = CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE (mime_filter); priv->count += len; if (priv->count < priv->total) percent = ((gdouble) priv->count * 100.0) / ((gdouble) priv->total); else percent = 100.0; camel_operation_progress (priv->cancellable, (gint) percent); *outprespace = prespace; *outlen = len; *out = (gchar *) in; } static void mime_filter_progress_complete (CamelMimeFilter *mime_filter, const gchar *in, gsize len, gsize prespace, gchar **out, gsize *outlen, gsize *outprespace) { mime_filter_progress_filter ( mime_filter, in, len, prespace, out, outlen, outprespace); } static void mime_filter_progress_reset (CamelMimeFilter *mime_filter) { CamelMimeFilterProgressPrivate *priv; priv = CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE (mime_filter); priv->count = 0; } static void camel_mime_filter_progress_class_init (CamelMimeFilterProgressClass *class) { GObjectClass *object_class; CamelMimeFilterClass *mime_filter_class; g_type_class_add_private (class, sizeof (CamelMimeFilterProgressPrivate)); object_class = G_OBJECT_CLASS (class); object_class->dispose = mime_filter_progress_dispose; mime_filter_class = CAMEL_MIME_FILTER_CLASS (class); mime_filter_class->filter = mime_filter_progress_filter; mime_filter_class->complete = mime_filter_progress_complete; mime_filter_class->reset = mime_filter_progress_reset; } static void camel_mime_filter_progress_init (CamelMimeFilterProgress *filter) { filter->priv = CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE (filter); } /** * camel_mime_filter_progress_new: * @cancellable: a #CamelOperation cast as a #GCancellable * @total: total number of bytes to report progress on * * Create a new #CamelMimeFilterProgress object that will report streaming * progress. While the function will silently accept @cancellable being * %NULL or a plain #GCancellable for convenience sake, no progress will be * reported unless @cancellable is a #CamelOperation. * * Returns: a new #CamelMimeFilter object * * Since: 2.24 **/ CamelMimeFilter * camel_mime_filter_progress_new (GCancellable *cancellable, gsize total) { CamelMimeFilter *filter; CamelMimeFilterProgressPrivate *priv; filter = g_object_new (CAMEL_TYPE_MIME_FILTER_PROGRESS, NULL); priv = CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE (filter); if (CAMEL_IS_OPERATION (cancellable)) priv->cancellable = g_object_ref (cancellable); priv->total = total; return filter; }