summaryrefslogtreecommitdiffstats
path: root/perl/Rspamd.xs
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-03-02 13:09:33 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-03-02 13:09:33 +0300
commitdef8d3d1a9135748a9c3223107edea592067cad4 (patch)
treed38bd6841f5b3b280643619e3bf47d3e300a90e4 /perl/Rspamd.xs
parentdb656e70f8d5a2e5522ef90d0b5127c8efe192ec (diff)
downloadrspamd-def8d3d1a9135748a9c3223107edea592067cad4.tar.gz
rspamd-def8d3d1a9135748a9c3223107edea592067cad4.zip
* Add compatibility with gmime24
Diffstat (limited to 'perl/Rspamd.xs')
-rw-r--r--perl/Rspamd.xs91
1 files changed, 86 insertions, 5 deletions
diff --git a/perl/Rspamd.xs b/perl/Rspamd.xs
index c6c33c007..8eb916a57 100644
--- a/perl/Rspamd.xs
+++ b/perl/Rspamd.xs
@@ -35,8 +35,13 @@ typedef struct _GMimeHeader {
} local_GMimeHeader;
/* enums */
-typedef GMimePartEncodingType Mail__Rspamd__PartEncodingType;
+#ifdef GMIME24
+typedef GMimeContentEncoding Mail__Rspamd__PartEncodingType;
+typedef int Mail__Rspamd__InternetAddressType;
+#else
typedef InternetAddressType Mail__Rspamd__InternetAddressType;
+typedef GMimePartEncodingType Mail__Rspamd__PartEncodingType;
+#endif
/* C types */
typedef GMimeObject * Mail__Rspamd__Object;
@@ -48,7 +53,11 @@ typedef GMimeMessage * Mail__Rspamd__Message;
typedef GMimeMessagePart * Mail__Rspamd__MessagePart;
typedef GMimeMessagePartial * Mail__Rspamd__MessagePartial;
typedef InternetAddress * Mail__Rspamd__InternetAddress;
+#ifdef GMIME24
+typedef GMimeContentDisposition * Mail__Rspamd__Disposition;
+#else
typedef GMimeDisposition * Mail__Rspamd__Disposition;
+#endif
typedef GMimeContentType * Mail__Rspamd__ContentType;
typedef GMimeCharset * Mail__Rspamd__Charset;
@@ -131,8 +140,9 @@ enum {
static GList *
local_message_get_header(GMimeMessage *message, const char *field)
{
- struct raw_header *h;
GList * gret = NULL;
+#ifndef GMIME24
+ struct raw_header *h;
if (field == NULL) {
return NULL;
@@ -145,6 +155,27 @@ local_message_get_header(GMimeMessage *message, const char *field)
h = h->next;
}
return gret;
+#else
+ GMimeHeaderList *ls;
+ GMimeHeaderIter *iter;
+ const char *name;
+
+ ls = GMIME_OBJECT(message)->headers;
+
+ if (g_mime_header_list_get_iter (ls, iter)) {
+ while (g_mime_header_iter_is_valid (iter)) {
+ name = g_mime_header_iter_get_name (iter);
+ if (!g_strncasecmp (field, name, strlen (name))) {
+ gret = g_list_prepend (gret, g_strdup (g_mime_header_iter_get_value (iter)));
+ }
+ if (!g_mime_header_iter_next (iter)) {
+ break;
+ }
+ }
+ }
+
+ return gret;
+#endif
}
/**
@@ -164,6 +195,35 @@ local_mime_message_set_date_from_string (GMimeMessage *message, const gchar *str
g_mime_message_set_date (message, date, offset);
}
+#ifdef GMIME24
+
+#define ADD_RECIPIENT_TEMPLATE(type,def) \
+static void \
+local_message_add_recipients_from_string_##type (GMimeMessage *message, const gchar *string, const gchar *value) \
+{ \
+ InternetAddressList *il, *new; \
+ \
+ il = g_mime_message_get_recipients (message, (def)); \
+ new = internet_address_list_parse_string (string); \
+ internet_address_list_append (il, new); \
+} \
+
+ADD_RECIPIENT_TEMPLATE(to, GMIME_RECIPIENT_TYPE_TO)
+ADD_RECIPIENT_TEMPLATE(cc, GMIME_RECIPIENT_TYPE_CC)
+ADD_RECIPIENT_TEMPLATE(bcc, GMIME_RECIPIENT_TYPE_BCC)
+
+#define GET_RECIPIENT_TEMPLATE(type,def) \
+static InternetAddressList* \
+local_message_get_recipients_##type (GMimeMessage *message, const char *unused) \
+{ \
+ return g_mime_message_get_recipients (message, (def)); \
+}
+
+GET_RECIPIENT_TEMPLATE(to, GMIME_RECIPIENT_TYPE_TO)
+GET_RECIPIENT_TEMPLATE(cc, GMIME_RECIPIENT_TYPE_CC)
+GET_RECIPIENT_TEMPLATE(bcc, GMIME_RECIPIENT_TYPE_BCC)
+
+#endif
/* different declarations for different types of set and get functions */
@@ -209,15 +269,28 @@ static struct {
} fieldfunc[] = {
{ "From", g_mime_message_get_sender, NULL, NULL, g_mime_message_set_sender, NULL, FUNC_CHARPTR },
{ "Reply-To", g_mime_message_get_reply_to, NULL, NULL, g_mime_message_set_reply_to, NULL, FUNC_CHARPTR },
+#ifndef GMIME24
{ "To", NULL, g_mime_message_get_recipients, NULL, NULL, g_mime_message_add_recipients_from_string, FUNC_IA },
{ "Cc", NULL, g_mime_message_get_recipients, NULL, NULL, g_mime_message_add_recipients_from_string, FUNC_IA },
{ "Bcc", NULL, g_mime_message_get_recipients, NULL, NULL, g_mime_message_add_recipients_from_string, FUNC_IA },
- { "Subject", g_mime_message_get_subject, NULL, NULL, g_mime_message_set_subject, NULL, FUNC_CHARPTR },
{ "Date", g_mime_message_get_date_string, NULL, NULL, local_mime_message_set_date_from_string, NULL, FUNC_CHARFREEPTR },
+#else
+ { "To", NULL, local_message_get_recipients_to, NULL, NULL, local_message_add_recipients_from_string_to, FUNC_IA },
+ { "Cc", NULL, local_message_get_recipients_cc, NULL, NULL, local_message_add_recipients_from_string_cc, FUNC_IA },
+ { "Bcc", NULL, local_message_get_recipients_bcc, NULL, NULL, local_message_add_recipients_from_string_bcc, FUNC_IA },
+ { "Date", g_mime_message_get_date_as_string, NULL, NULL, local_mime_message_set_date_from_string, NULL, FUNC_CHARFREEPTR },
+#endif
+ { "Subject", g_mime_message_get_subject, NULL, NULL, g_mime_message_set_subject, NULL, FUNC_CHARPTR },
{ "Message-Id", g_mime_message_get_message_id, NULL, NULL, g_mime_message_set_message_id, NULL, FUNC_CHARPTR },
+#ifndef GMIME24
{ NULL, NULL, NULL, local_message_get_header, NULL, g_mime_message_add_header, FUNC_LIST }
+#else
+ { NULL, NULL, NULL, local_message_get_header, NULL, g_mime_object_append_header, FUNC_LIST }
+#endif
};
+
+
/**
* message_set_header: set header of any type excluding special (Content- and MIME-Version:)
**/
@@ -259,7 +332,7 @@ static
GList *
message_get_header(GMimeMessage *message, const char *field) {
gint i;
- char * ret = NULL;
+ char * ret = NULL, *ia_string;
GList * gret = NULL;
InternetAddressList *ia_list = NULL, *ia;
@@ -276,13 +349,21 @@ message_get_header(GMimeMessage *message, const char *field) {
ia_list = (*(fieldfunc[i].rcptfunc))(message, field);
gret = g_list_alloc();
ia = ia_list;
+#ifndef GMIME24
while (ia && ia->address) {
- char *ia_string;
ia_string = internet_address_to_string ((InternetAddress *)ia->address, FALSE);
gret = g_list_append (gret, ia_string);
ia = ia->next;
}
+#else
+ i = internet_address_list_length (ia);
+ while (i > 0) {
+ ia_string = internet_address_to_string (internet_address_list_get_address (ia, i), FALSE);
+ gret = g_list_append (gret, ia_string);
+ -- i;
+ }
+#endif
break;
case FUNC_LIST:
gret = (*(fieldfunc[i].getlistfunc))(message, field);