aboutsummaryrefslogtreecommitdiffstats
path: root/libemail-engine/e-mail-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libemail-engine/e-mail-utils.c')
-rw-r--r--libemail-engine/e-mail-utils.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/libemail-engine/e-mail-utils.c b/libemail-engine/e-mail-utils.c
index 83f90fe4f8..b65fbc32dd 100644
--- a/libemail-engine/e-mail-utils.c
+++ b/libemail-engine/e-mail-utils.c
@@ -705,3 +705,44 @@ em_utils_is_local_delivery_mbox_file (CamelURL *url)
!g_file_test (url->path, G_FILE_TEST_IS_DIR);
}
+/* Expands groups to individual addresses, or removes empty groups completely.
+ Usual email addresses are left untouched.
+*/
+void
+em_utils_expand_groups (CamelInternetAddress *addresses)
+{
+ gint ii, len;
+ const gchar *addr;
+ CamelAddress *addrs;
+
+ g_return_if_fail (CAMEL_IS_INTERNET_ADDRESS (addresses));
+
+ addrs = CAMEL_ADDRESS (addresses);
+ len = camel_address_length (addrs);
+ for (ii = len - 1; ii >= 0; ii--) {
+ addr = NULL;
+
+ if (!camel_internet_address_get (addresses, ii, NULL, &addr)) {
+ camel_address_remove (addrs, ii);
+ } else if (addr) {
+ gchar *encoded = camel_internet_address_encode_address (NULL, NULL, addr);
+
+ if (encoded) {
+ CamelInternetAddress *iaddr = camel_internet_address_new ();
+ gint decoded;
+
+ /* decode expands respective groups */
+ decoded = camel_address_decode (CAMEL_ADDRESS (iaddr), encoded);
+ if (decoded <= 0 || decoded > 1) {
+ camel_address_remove (addrs, ii);
+
+ if (decoded > 1)
+ camel_address_cat (addrs, CAMEL_ADDRESS (iaddr));
+ }
+
+ g_object_unref (iaddr);
+ g_free (encoded);
+ }
+ }
+ }
+}