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; }
/* Print or prepare for printing addresses from InternetAddressList. */ static void process_address_list (const search_context_t *ctx, InternetAddressList *list) { InternetAddress *address; int i; 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; process_address_list (ctx, group_list); } else { InternetAddressMailbox *mailbox = INTERNET_ADDRESS_MAILBOX (address); mailbox_t mbx = { .name = internet_address_get_name (address), .addr = internet_address_mailbox_get_addr (mailbox), }; /* OUTPUT_COUNT only works with deduplication */ if (ctx->dedup != DEDUP_NONE && is_duplicate (ctx, mbx.name, mbx.addr)) continue; /* OUTPUT_COUNT and DEDUP_ADDRESS require a full pass. */ if (ctx->output & OUTPUT_COUNT || ctx->dedup == DEDUP_ADDRESS) continue; print_mailbox (ctx, &mbx); } } }
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); } }