Initialize the gmime for upstream
[platform/upstream/gmime.git] / gmime / gmime-filter-md5.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*  GMime
3  *  Copyright (C) 2000-2012 Jeffrey Stedfast
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public License
7  *  as published by the Free Software Foundation; either version 2.1
8  *  of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free
17  *  Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
18  *  02110-1301, USA.
19  */
20
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include "md5-utils.h"
27
28 #include "gmime-filter-md5.h"
29
30
31 /**
32  * SECTION: gmime-filter-md5
33  * @title: GMimeFilterMd5
34  * @short_description: Calculate an md5sum
35  * @see_also: #GMimeFilter
36  *
37  * Calculate an md5sum for a stream.
38  **/
39
40
41 struct _GMimeFilterMd5Private {
42         MD5Context md5;
43 };
44
45 static void g_mime_filter_md5_class_init (GMimeFilterMd5Class *klass);
46 static void g_mime_filter_md5_init (GMimeFilterMd5 *filter, GMimeFilterMd5Class *klass);
47 static void g_mime_filter_md5_finalize (GObject *object);
48
49 static GMimeFilter *filter_copy (GMimeFilter *filter);
50 static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace,
51                            char **out, size_t *outlen, size_t *outprespace);
52 static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace,
53                              char **out, size_t *outlen, size_t *outprespace);
54 static void filter_reset (GMimeFilter *filter);
55
56
57 static GMimeFilterClass *parent_class = NULL;
58
59
60 GType
61 g_mime_filter_md5_get_type (void)
62 {
63         static GType type = 0;
64         
65         if (!type) {
66                 static const GTypeInfo info = {
67                         sizeof (GMimeFilterMd5Class),
68                         NULL, /* base_class_init */
69                         NULL, /* base_class_finalize */
70                         (GClassInitFunc) g_mime_filter_md5_class_init,
71                         NULL, /* class_finalize */
72                         NULL, /* class_data */
73                         sizeof (GMimeFilterMd5),
74                         0,    /* n_preallocs */
75                         (GInstanceInitFunc) g_mime_filter_md5_init,
76                 };
77                 
78                 type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterMd5", &info, 0);
79         }
80         
81         return type;
82 }
83
84
85 static void
86 g_mime_filter_md5_class_init (GMimeFilterMd5Class *klass)
87 {
88         GObjectClass *object_class = G_OBJECT_CLASS (klass);
89         GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass);
90         
91         parent_class = g_type_class_ref (GMIME_TYPE_FILTER);
92         
93         object_class->finalize = g_mime_filter_md5_finalize;
94         
95         filter_class->copy = filter_copy;
96         filter_class->filter = filter_filter;
97         filter_class->complete = filter_complete;
98         filter_class->reset = filter_reset;
99 }
100
101 static void
102 g_mime_filter_md5_init (GMimeFilterMd5 *filter, GMimeFilterMd5Class *klass)
103 {
104         filter->priv = g_new (struct _GMimeFilterMd5Private, 1);
105         md5_init (&filter->priv->md5);
106 }
107
108 static void
109 g_mime_filter_md5_finalize (GObject *object)
110 {
111         GMimeFilterMd5 *filter = (GMimeFilterMd5 *) object;
112         
113         g_free (filter->priv);
114         
115         G_OBJECT_CLASS (parent_class)->finalize (object);
116 }
117
118
119 static GMimeFilter *
120 filter_copy (GMimeFilter *filter)
121 {
122         return g_mime_filter_md5_new ();
123 }
124
125
126 static void
127 filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace,
128                char **out, size_t *outlen, size_t *outprespace)
129 {
130         GMimeFilterMd5 *md5 = (GMimeFilterMd5 *) filter;
131         
132         md5_update (&md5->priv->md5, (unsigned char *) in, len);
133         
134         *out = in;
135         *outlen = len;
136         *outprespace = prespace;
137 }
138
139 static void
140 filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace,
141                  char **out, size_t *outlen, size_t *outprespace)
142 {
143         filter_filter (filter, in, len, prespace, out, outlen, outprespace);
144 }
145
146 static void
147 filter_reset (GMimeFilter *filter)
148 {
149         GMimeFilterMd5 *md5 = (GMimeFilterMd5 *) filter;
150         
151         md5_init (&md5->priv->md5);
152 }
153
154
155 /**
156  * g_mime_filter_md5_new:
157  *
158  * Creates a new Md5 filter.
159  *
160  * Returns: a new Md5 filter.
161  **/
162 GMimeFilter *
163 g_mime_filter_md5_new (void)
164 {
165         return g_object_newv (GMIME_TYPE_FILTER_MD5, 0, NULL);
166 }
167
168
169 /**
170  * g_mime_filter_md5_get_digest:
171  * @md5: md5 filter object
172  * @digest: output buffer of at least 16 bytes
173  *
174  * Outputs the md5 digest into @digest.
175  **/
176 void
177 g_mime_filter_md5_get_digest (GMimeFilterMd5 *md5, unsigned char digest[16])
178 {
179         g_return_if_fail (GMIME_IS_FILTER_MD5 (md5));
180         
181         md5_final (&md5->priv->md5, digest);
182 }