mirror of https://github.com/djcb/mu.git
* mu-msg-gmime: refactoring, cleanups
This commit is contained in:
parent
f28cb97a5d
commit
e56743d9c5
|
@ -26,6 +26,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "mu-util.h"
|
||||||
#include "mu-msg-gmime.h"
|
#include "mu-msg-gmime.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -536,14 +537,15 @@ convert_to_utf8 (GMimePart *part, char *buffer)
|
||||||
|
|
||||||
/* of course, the charset specified may be incorrect... */
|
/* of course, the charset specified may be incorrect... */
|
||||||
if (charset) {
|
if (charset) {
|
||||||
char * utf8 = g_convert_with_fallback (buffer, -1, "UTF-8",
|
char * utf8;
|
||||||
charset, (gchar*)".",
|
utf8 = g_convert_with_fallback (buffer, -1, "UTF-8",
|
||||||
NULL, NULL,
|
charset, (gchar*)".",
|
||||||
&err);
|
NULL, NULL,
|
||||||
|
&err);
|
||||||
if (!utf8) {
|
if (!utf8) {
|
||||||
/* g_message ("%s: conversion failed from %s: %s", */
|
MU_WRITE_LOG ("%s: conversion failed from %s: %s",
|
||||||
/* __FUNCTION__, charset, */
|
__FUNCTION__, charset,
|
||||||
/* err ? err ->message : ""); */
|
err ? err ->message : "");
|
||||||
if (err)
|
if (err)
|
||||||
g_error_free (err);
|
g_error_free (err);
|
||||||
} else {
|
} else {
|
||||||
|
@ -714,13 +716,64 @@ mu_msg_gmime_get_field_numeric (MuMsgGMime *msg, const MuMsgField* field)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_fill_contact (MuMsgContact *contact, InternetAddress *addr,
|
||||||
|
MuMsgContactType ctype)
|
||||||
|
{
|
||||||
|
if (!addr)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
contact->_name = internet_address_get_name (addr);
|
||||||
|
contact->_type = ctype;
|
||||||
|
|
||||||
|
/* we only support internet addresses;
|
||||||
|
* if we don't check, g_mime hits an assert
|
||||||
|
*/
|
||||||
|
contact->_addr = internet_address_mailbox_get_addr
|
||||||
|
(INTERNET_ADDRESS_MAILBOX(addr));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
_address_list_foreach (InternetAddressList *addrlist,
|
||||||
|
MuMsgContactType ctype,
|
||||||
|
MuMsgGMimeContactsCallback cb,
|
||||||
|
void *ptr)
|
||||||
|
{
|
||||||
|
int i,rv;
|
||||||
|
|
||||||
|
if (!addrlist)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0, rv = 0; i != internet_address_list_length(addrlist); ++i) {
|
||||||
|
|
||||||
|
MuMsgContact contact;
|
||||||
|
if (!_fill_contact(&contact,
|
||||||
|
internet_address_list_get_address (addrlist, i),
|
||||||
|
ctype))
|
||||||
|
{
|
||||||
|
MU_WRITE_LOG ("ignoring contact");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = (cb)(&contact, ptr);
|
||||||
|
if (rv != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
|
mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
|
||||||
void *ptr)
|
void *ptr)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
InternetAddressList *list;
|
InternetAddressList *list;
|
||||||
|
int rv;
|
||||||
|
|
||||||
/* we go through this whole excercise of trying to get a *list*
|
/* we go through this whole excercise of trying to get a *list*
|
||||||
* of 'From:' address (usually there is only one...), because
|
* of 'From:' address (usually there is only one...), because
|
||||||
* internet_address_parse_string has the nice side-effect of
|
* internet_address_parse_string has the nice side-effect of
|
||||||
|
@ -729,53 +782,20 @@ mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
|
||||||
list = internet_address_list_parse_string (
|
list = internet_address_list_parse_string (
|
||||||
g_mime_message_get_sender (msg->_mime_msg));
|
g_mime_message_get_sender (msg->_mime_msg));
|
||||||
|
|
||||||
|
rv = _address_list_foreach (list, MU_MSG_CONTACT_TYPE_FROM, cb, ptr);
|
||||||
|
|
||||||
for (i = 0; i != internet_address_list_length(list); ++i) {
|
|
||||||
|
|
||||||
MuMsgContact contact; /* stack allocated */
|
|
||||||
InternetAddress *addr =
|
|
||||||
internet_address_list_get_address (list, i);
|
|
||||||
if (addr) {
|
|
||||||
int result;
|
|
||||||
|
|
||||||
contact._name = internet_address_get_name (addr);
|
|
||||||
contact._type = MU_MSG_CONTACT_TYPE_FROM;
|
|
||||||
|
|
||||||
/* we only support internet addresses;
|
|
||||||
* if we don't check, g_mime hits an assert
|
|
||||||
*/
|
|
||||||
contact._addr = internet_address_mailbox_get_addr
|
|
||||||
(INTERNET_ADDRESS_MAILBOX(addr));
|
|
||||||
result = (cb)(&contact,ptr);
|
|
||||||
|
|
||||||
/* note: don't unref addr here, as it's owned */
|
|
||||||
/* by the list (well, hat is what valgrind says... */
|
|
||||||
if ((result = (cb)(&contact,ptr)) != 0) {
|
|
||||||
/* callback tells us to stop */
|
|
||||||
if (list)
|
|
||||||
g_object_unref (G_OBJECT(list));
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list)
|
if (list)
|
||||||
g_object_unref (G_OBJECT(list));
|
g_object_unref (G_OBJECT(list));
|
||||||
|
|
||||||
return 0;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: this is too complicated */
|
|
||||||
int
|
int
|
||||||
mu_msg_gmime_get_contacts_foreach (MuMsgGMime *msg,
|
mu_msg_gmime_get_contacts_foreach (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
|
||||||
MuMsgGMimeContactsCallback cb,
|
|
||||||
void *ptr)
|
void *ptr)
|
||||||
{
|
{
|
||||||
int i, result;
|
int i, rv;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
GMimeRecipientType _gmime_type;
|
GMimeRecipientType _gmime_type;
|
||||||
MuMsgContactType _type;
|
MuMsgContactType _type;
|
||||||
|
@ -788,42 +808,20 @@ mu_msg_gmime_get_contacts_foreach (MuMsgGMime *msg,
|
||||||
g_return_val_if_fail (cb && msg, -1);
|
g_return_val_if_fail (cb && msg, -1);
|
||||||
|
|
||||||
/* first, get the from address */
|
/* first, get the from address */
|
||||||
if ((result = mu_msg_gmime_get_contacts_from (msg, cb, ptr)) != 0)
|
rv = mu_msg_gmime_get_contacts_from (msg, cb, ptr);
|
||||||
return result; /* callback told us to stop */
|
if (rv != 0)
|
||||||
|
return rv; /* callback told us to stop */
|
||||||
for (i = 0; i != sizeof(ctypes)/sizeof(ctypes[0]); ++i) {
|
|
||||||
|
|
||||||
MuMsgContact contact; /* stack allocated */
|
for (i = 0, rv = 0; i != G_N_ELEMENTS(ctypes); ++i) {
|
||||||
InternetAddressList *list;
|
InternetAddressList *addrlist;
|
||||||
int j;
|
addrlist = g_mime_message_get_recipients (msg->_mime_msg,
|
||||||
|
ctypes[i]._gmime_type);
|
||||||
list = g_mime_message_get_recipients
|
rv = _address_list_foreach (addrlist, ctypes[i]._type,cb, ptr);
|
||||||
(msg->_mime_msg, ctypes[i]._gmime_type);
|
if (rv != 0)
|
||||||
|
break;
|
||||||
for (j = 0; j != internet_address_list_length(list); ++j) {
|
|
||||||
|
|
||||||
InternetAddress *addr =
|
|
||||||
internet_address_list_get_address (list, j);
|
|
||||||
if (addr) {
|
|
||||||
|
|
||||||
contact._name = internet_address_get_name (addr);
|
|
||||||
contact._type = ctypes[i]._type;
|
|
||||||
|
|
||||||
/* we only support internet addresses;
|
|
||||||
* if we don't check, g_mime hits an assert
|
|
||||||
*/
|
|
||||||
contact._addr = internet_address_mailbox_get_addr(
|
|
||||||
INTERNET_ADDRESS_MAILBOX(addr));
|
|
||||||
|
|
||||||
result = (cb)(&contact,ptr);
|
|
||||||
|
|
||||||
if (result != 0) /* callback tells us to stop */
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -837,6 +835,7 @@ mu_msg_gmime_init (void)
|
||||||
if (!_initialized) {
|
if (!_initialized) {
|
||||||
g_mime_init(0);
|
g_mime_init(0);
|
||||||
_initialized = TRUE;
|
_initialized = TRUE;
|
||||||
|
MU_WRITE_LOG ("%s", __FUNCTION__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,5 +846,6 @@ mu_msg_gmime_uninit (void)
|
||||||
if (_initialized) {
|
if (_initialized) {
|
||||||
g_mime_shutdown();
|
g_mime_shutdown();
|
||||||
_initialized = FALSE;
|
_initialized = FALSE;
|
||||||
|
MU_WRITE_LOG ("%s", __FUNCTION__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue