lib: wrap use of g_mime_utils_header_decode_date
[notmuch] / util / gmime-extra.c
1 #include "gmime-extra.h"
2
3 GMimeStream *
4 g_mime_stream_stdout_new()
5 {
6     GMimeStream *stream_stdout = NULL;
7     GMimeStream *stream_buffered = NULL;
8
9     stream_stdout = g_mime_stream_pipe_new (STDOUT_FILENO);
10     if (!stream_stdout)
11         return NULL;
12
13     g_mime_stream_pipe_set_owner (GMIME_STREAM_PIPE (stream_stdout), FALSE);
14
15     stream_buffered = g_mime_stream_buffer_new (stream_stdout, GMIME_STREAM_BUFFER_BLOCK_WRITE);
16
17     g_object_unref (stream_stdout);
18
19     return stream_buffered;
20 }
21
22 /**
23  * copy a glib string into a talloc context, and free it.
24  */
25 static char*
26 g_string_talloc_strdup (void *ctx, char *g_string)
27 {
28     char *new_str = talloc_strdup (ctx, g_string);
29     g_free (g_string);
30     return new_str;
31 }
32
33 #if (GMIME_MAJOR_VERSION < 3)
34
35 char *
36 g_mime_message_get_address_string (GMimeMessage *message, GMimeRecipientType type)
37 {
38     InternetAddressList *list = g_mime_message_get_recipients (message, type);
39     return internet_address_list_to_string (list, 0);
40 }
41
42 inline InternetAddressList *
43 g_mime_message_get_addresses (GMimeMessage *message, GMimeRecipientType type)
44 {
45     return g_mime_message_get_recipients (message, type);
46 }
47
48 char *
49 g_mime_message_get_date_string (void *ctx, GMimeMessage *message)
50 {
51     char *date = g_mime_message_get_date_as_string (message);
52     return g_string_talloc_strdup (ctx, date);
53 }
54
55 InternetAddressList *
56 g_mime_message_get_from (GMimeMessage *message)
57 {
58     return internet_address_list_parse_string (g_mime_message_get_sender (message));
59 }
60
61 const char *
62 g_mime_message_get_from_string (GMimeMessage *message) {
63     return  g_mime_message_get_sender (message);
64 }
65
66 InternetAddressList *
67 g_mime_message_get_reply_to_list (GMimeMessage *message)
68 {
69     const char *reply_to;
70
71     reply_to = g_mime_message_get_reply_to (message);
72     if (reply_to && *reply_to)
73         return internet_address_list_parse_string (reply_to);
74     else
75         return NULL;
76 }
77
78 /**
79  * return talloc allocated reply-to string
80  */
81 char *
82 g_mime_message_get_reply_to_string (void *ctx, GMimeMessage *message)
83 {
84     return talloc_strdup(ctx, g_mime_message_get_reply_to (message));
85 }
86
87 gboolean
88 g_mime_signature_status_good (GMimeSignatureStatus status) {
89     return (status == GMIME_SIGNATURE_STATUS_GOOD);
90 }
91
92 gboolean
93 g_mime_signature_status_bad (GMimeSignatureStatus status) {
94     return (status == GMIME_SIGNATURE_STATUS_BAD);
95 }
96
97 gboolean
98 g_mime_signature_status_error (GMimeSignatureError error) {
99     return (error != GMIME_SIGNATURE_ERROR_NONE);
100 }
101
102 time_t
103 g_mime_utils_header_decode_date_unix (const char *date) {
104     return g_mime_utils_header_decode_date (date, NULL);
105 }
106
107 #else /* GMime >= 3.0 */
108
109 char *
110 g_mime_message_get_address_string (GMimeMessage *message, GMimeAddressType type)
111 {
112     InternetAddressList *list = g_mime_message_get_addresses (message, type);
113     return internet_address_list_to_string (list, NULL, 0);
114 }
115
116 char *
117 g_mime_message_get_date_string (void *ctx, GMimeMessage *message)
118 {
119     GDateTime* parsed_date = g_mime_message_get_date (message);
120     if (parsed_date) {
121         char *date = g_mime_utils_header_format_date (parsed_date);
122         return g_string_talloc_strdup (ctx, date);
123     } else {
124         return talloc_strdup(ctx, "Thu, 01 Jan 1970 00:00:00 +0000");
125     }
126 }
127
128 InternetAddressList *
129 g_mime_message_get_reply_to_list(GMimeMessage *message)
130 {
131     return g_mime_message_get_reply_to (message);
132 }
133
134 const char *
135 g_mime_message_get_from_string (GMimeMessage *message)
136 {
137     return g_mime_object_get_header (GMIME_OBJECT (message), "From");
138 }
139
140 char *
141 g_mime_message_get_reply_to_string (void *ctx, GMimeMessage *message)
142 {
143     InternetAddressList *list = g_mime_message_get_reply_to (message);
144     return g_string_talloc_strdup (ctx, internet_address_list_to_string (list, NULL, 0));
145 }
146
147 void
148 g_mime_parser_set_scan_from (GMimeParser *parser, gboolean flag)
149 {
150     g_mime_parser_set_format (parser, flag ? GMIME_FORMAT_MBOX : GMIME_FORMAT_MESSAGE);
151 }
152
153 /* In GMime 3.0, status GOOD and VALID both imply something about the
154  * validity of the UIDs attached to the signing key. This forces us to
155  * use following somewhat relaxed definition of a "good" signature to
156  * preserve current notmuch semantics.
157  */
158
159 gboolean
160 g_mime_signature_status_good (GMimeSignatureStatus status) {
161     return ((status  & (GMIME_SIGNATURE_STATUS_RED | GMIME_SIGNATURE_STATUS_ERROR_MASK)) == 0);
162 }
163
164 gboolean
165 g_mime_signature_status_bad (GMimeSignatureStatus status) {
166     return (status & GMIME_SIGNATURE_STATUS_RED);
167 }
168
169 gboolean
170 g_mime_signature_status_error (GMimeSignatureStatus status) {
171     return (status & GMIME_SIGNATURE_STATUS_ERROR_MASK);
172 }
173
174 gint64
175 g_mime_utils_header_decode_date_unix (const char *date) {
176     GDateTime* parsed_date = g_mime_utils_header_decode_date (date);
177     time_t ret;
178
179     if (parsed_date) {
180         ret = g_date_time_to_unix (parsed_date);
181         g_date_time_unref (parsed_date);
182     } else {
183         ret = 0;
184     }
185
186     return ret;
187 }
188
189 #endif