static gboolean fill_contact (MuMsgContact *self, InternetAddress *addr, MuMsgContactType ctype) { if (!addr) return FALSE; self->name = internet_address_get_name (addr); self->type = ctype; /* we only support internet mailbox addresses; if we don't * check, g_mime hits an assert */ if (INTERNET_ADDRESS_IS_MAILBOX(addr)) self->address = internet_address_mailbox_get_addr (INTERNET_ADDRESS_MAILBOX(addr)); else self->address = NULL; /* if there's no address, just a name, it's probably a local * address (without @) */ if (self->name && !self->address) self->address = self->name; /* note, the address could NULL e.g. when the recipient is something like * 'Undisclosed recipients' */ return self->address != NULL; }
static void collect_addresses_into(InternetAddressList *ilist, AddressesList *addr_list, guint size) { g_return_if_fail(ilist != NULL); g_return_if_fail(addr_list != NULL); g_return_if_fail(size != 0); guint i; for (i = 0; i < size; i++) { InternetAddress *address = internet_address_list_get_address(ilist, i); // transfer none if (INTERNET_ADDRESS_IS_GROUP(address)) { InternetAddressGroup *group = INTERNET_ADDRESS_GROUP(address); InternetAddressList *group_list = internet_address_group_get_members(group); // transer none if (group_list) { guint gsize = internet_address_list_length(group_list); if (gsize) collect_addresses_into(group_list, addr_list, gsize); } } else if (INTERNET_ADDRESS_IS_MAILBOX(address)) { InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX(address); const gchar *name = internet_address_get_name(address); const gchar *address = internet_address_mailbox_get_addr(mailbox); Address *addr = new_address(address, name); addresses_list_add(addr_list, addr); } } }
/* Scan addresses in 'list'. * * If 'message' is non-NULL, then for each address in 'list' that is * not configured as one of the user's addresses in 'config', add that * address to 'message' as an address of 'type'. * * If 'user_from' is non-NULL and *user_from is NULL, *user_from will * be set to the first address encountered in 'list' that is the * user's address. * * Return the number of addresses added to 'message'. (If 'message' is * NULL, the function returns 0 by definition.) */ static unsigned int scan_address_list (InternetAddressList *list, notmuch_config_t *config, GMimeMessage *message, GMimeRecipientType type, const char **user_from) { InternetAddress *address; int i; unsigned int n = 0; for (i = 0; i < internet_address_list_length (list); i++) { address = internet_address_list_get_address (list, i); if (INTERNET_ADDRESS_IS_GROUP (address)) { InternetAddressGroup *group; InternetAddressList *group_list; group = INTERNET_ADDRESS_GROUP (address); group_list = internet_address_group_get_members (group); if (group_list == NULL) continue; n += scan_address_list (group_list, config, message, type, user_from); } else { InternetAddressMailbox *mailbox; const char *name; const char *addr; mailbox = INTERNET_ADDRESS_MAILBOX (address); name = internet_address_get_name (address); addr = internet_address_mailbox_get_addr (mailbox); if (address_is_users (addr, config)) { if (user_from && *user_from == NULL) *user_from = addr; } else if (message) { g_mime_message_add_recipient (message, type, name, addr); n++; } } } return n; }
/* For each address in 'list' that is not configured as one of the * user's addresses in 'config', add that address to 'message' as an * address of 'type'. * * The first address encountered that *is* the user's address will be * returned, (otherwise NULL is returned). */ static const char * add_recipients_for_address_list (GMimeMessage *message, notmuch_config_t *config, GMimeRecipientType type, InternetAddressList *list) { InternetAddress *address; int i; const char *ret = NULL; for (i = 0; i < internet_address_list_length (list); i++) { address = internet_address_list_get_address (list, i); if (INTERNET_ADDRESS_IS_GROUP (address)) { InternetAddressGroup *group; InternetAddressList *group_list; group = INTERNET_ADDRESS_GROUP (address); group_list = internet_address_group_get_members (group); if (group_list == NULL) continue; add_recipients_for_address_list (message, config, type, group_list); } else { InternetAddressMailbox *mailbox; const char *name; const char *addr; mailbox = INTERNET_ADDRESS_MAILBOX (address); name = internet_address_get_name (address); addr = internet_address_mailbox_get_addr (mailbox); if (address_is_users (addr, config)) { if (ret == NULL) ret = addr; } else { g_mime_message_add_recipient (message, type, name, addr); } } } return ret; }
static void json_add_address (JsonBuilder *builder, InternetAddress *ia) { if (INTERNET_ADDRESS_IS_GROUP(ia)) { InternetAddressGroup *group; InternetAddressList *group_list; group = INTERNET_ADDRESS_GROUP(ia); group_list = internet_address_group_get_members(group); json_add_address_list(builder, group_list); } else if (INTERNET_ADDRESS_IS_MAILBOX(ia)) { InternetAddressMailbox *mailbox; const char *addr_name; const char *addr_address; mailbox = INTERNET_ADDRESS_MAILBOX(ia); addr_name = internet_address_get_name(ia); addr_address = internet_address_mailbox_get_addr(mailbox); if (!addr_name && !addr_address) return; json_builder_begin_object (builder); if (addr_name) { json_builder_set_member_name (builder, "name"); json_builder_add_string_value (builder, addr_name); } if (addr_address) { json_builder_set_member_name (builder, "address"); json_builder_add_string_value (builder, addr_address); } json_builder_end_object (builder); } }
static void test_address_sync (void) { const char *raw_value, *value; InternetAddress *addr, *ia; InternetAddressList *list; GMimeHeaderList *headers; GMimeMessage *message; GMimeObject *object; GMimeHeader *header; message = g_mime_message_new (TRUE); list = g_mime_message_get_addresses (message, GMIME_ADDRESS_TYPE_TO); object = (GMimeObject *) message; headers = object->headers; testsuite_check ("address header synchronization"); try { /* first, check that the To recipients are empty */ if (list == NULL || internet_address_list_length (list) != 0) throw (exception_new ("unexpected initial internet address list")); /* now check that the initial header value is null */ if ((value = g_mime_object_get_header (object, "To")) != NULL) throw (exception_new ("unexpected initial value")); header = g_mime_header_list_get_header (headers, "To"); if ((raw_value = g_mime_header_get_raw_value (header)) != NULL) throw (exception_new ("unexpected initial raw_value")); /* now try adding an address */ addr = internet_address_mailbox_new ("Tester", "*****@*****.**"); internet_address_list_add (list, addr); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after adding recipient")); if (strcmp ("Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after adding recipient")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after adding recipient")); if (strcmp (" Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after adding recipient: %s", raw_value)); /* now let's try changing the address name to make sure signals properly chain up */ internet_address_set_name (addr, "Eva Lucy-Ann Tester"); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after changing name")); if (strcmp ("Eva Lucy-Ann Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after changing name: %s", value)); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after changing name")); if (strcmp (" Eva Lucy-Ann Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after changing name")); /* now let's try changing the address mailbox... */ internet_address_mailbox_set_addr ((InternetAddressMailbox *) addr, "*****@*****.**"); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after changing mailbox")); if (strcmp ("Eva Lucy-Ann Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after changing mailbox")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after changing mailbox")); if (strcmp (" Eva Lucy-Ann Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after changing mailbox")); /* now let's try inserting a group address */ g_object_unref (addr); addr = internet_address_group_new ("Group"); internet_address_list_insert (list, 0, addr); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after inserting group")); if (strcmp ("Group: ;, Eva Lucy-Ann Tester <*****@*****.**>", value) != 0) throw (exception_new ("unexpected address list header after inserting group")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after inserting group")); if (strcmp (" Group: ;, Eva Lucy-Ann Tester <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after inserting group")); /* now let's try removing the original recipient */ internet_address_list_remove_at (list, 1); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after removing recipient")); if (strcmp ("Group: ;", value) != 0) throw (exception_new ("unexpected address list header after removing recipient")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after removing recipient")); if (strcmp (" Group: ;\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after removing recipient")); /* now let's try adding an address to the group... */ ia = internet_address_mailbox_new ("Tester", "*****@*****.**"); internet_address_list_add (((InternetAddressGroup *) addr)->members, ia); if (!(value = g_mime_object_get_header (object, "To"))) throw (exception_new ("address list header unexpectedly null after adding addr to group")); if (strcmp ("Group: Tester <*****@*****.**>;", value) != 0) throw (exception_new ("unexpected address list header after adding addr to group")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after adding addr to group")); if (strcmp (" Group: Tester <*****@*****.**>;\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after adding addr to group")); /* let's try this in reverse... set the header value and make sure InternetAddressList gets updated */ g_mime_object_set_header (object, "To", "[email protected] (=?iso-8859-1?q?Fran=E7ois?= Pons)", NULL); if (internet_address_list_length (list) != 1) throw (exception_new ("unexpected number of addresses in addrlist after setting header value")); ia = internet_address_list_get_address (list, 0); value = internet_address_get_name (ia); if (strcmp ("Fran\xc3\xa7ois Pons", value) != 0) throw (exception_new ("unexpected name after setting header value")); value = internet_address_mailbox_get_addr ((InternetAddressMailbox *) ia); if (strcmp ("*****@*****.**", value) != 0) throw (exception_new ("unexpected addr after setting header value")); header = g_mime_header_list_get_header (headers, "To"); if (!(raw_value = g_mime_header_get_raw_value (header))) throw (exception_new ("raw_value is null after setting header value")); if (strcmp (" =?iso-8859-1?q?Fran=E7ois?= Pons <*****@*****.**>\n", raw_value) != 0) throw (exception_new ("unexpected raw_value after setting header value: %s", raw_value)); testsuite_check_passed (); } catch (ex) { testsuite_check_failed ("address header not synchronized: %s", ex->message); } finally; g_object_unref (message); }