static InternetAddress * decode_group (const char **in) { InternetAddressGroup *group; InternetAddress *addr; const char *inptr; inptr = *in; addr = internet_address_group_new (NULL); group = (InternetAddressGroup *) addr; decode_lwsp (&inptr); while (*inptr && *inptr != ';') { InternetAddress *member; if ((member = decode_address (&inptr))) _internet_address_group_add_member (group, member); decode_lwsp (&inptr); while (*inptr == ',') { inptr++; decode_lwsp (&inptr); if ((member = decode_address (&inptr))) _internet_address_group_add_member (group, member); decode_lwsp (&inptr); } } *in = inptr; return addr; }
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); }
/* -- helpers -- */ static LibBalsaABErr lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica, xmlDocPtr * docptr) { LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); struct stat stat_buf; int fd; xmlDocPtr doc = NULL; xmlNodePtr root_element = NULL; GList *completion_list; CompletionData *cmp_data; GSList *list; /* init the return pointer (if any) */ if (docptr) *docptr = NULL; /* eject if the file did not change on disk and no document result pointer is passed */ if (!docptr && stat(ab_text->path, &stat_buf) == 0) { if (stat_buf.st_mtime == ab_text->mtime) return LBABERR_OK; else ab_text->mtime = stat_buf.st_mtime; } /* free old data */ g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL); g_slist_free(ab_text->item_list); ab_text->item_list = NULL; g_list_foreach(ab_text->name_complete->items, (GFunc) completion_data_free, NULL); libbalsa_completion_clear_items(ab_text->name_complete); /* try to read the address book */ if ((fd = open(ab_text->path, O_RDONLY)) == -1) return LBABERR_CANNOT_READ; if (libbalsa_lock_file(ab_text->path, fd, FALSE, TRUE, FALSE) < 0) { close(fd); return LBABERR_CANNOT_READ; } doc = xmlParseFile(ab_text->path); libbalsa_unlock_file(ab_text->path, fd, FALSE); close(fd); if (!doc) return LBABERR_CANNOT_READ; /* Get the root element node and extract cards if it is a Rubrica book */ root_element = xmlDocGetRootElement(doc); if (!xmlStrcmp(root_element->name, CXMLCHARP("Rubrica"))) ab_text->item_list = extract_cards(root_element->children); /* return the document if requested of free it */ if (docptr) *docptr = doc; else xmlFreeDoc(doc); /* build the completion list */ // FIXME - Rubrica provides groups... completion_list = NULL; for (list = ab_text->item_list; list; list = list->next) { LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); GList *l; if (!address) continue; if (address->address_list->next && LIBBALSA_ADDRESS_BOOK(ab_rubrica)->dist_list_mode) { /* Create a group address. */ InternetAddress *ia = internet_address_group_new(address->full_name); InternetAddressGroup *group = (InternetAddressGroup *) ia; for (l = address->address_list; l; l = l->next) { InternetAddress *member = internet_address_mailbox_new(NULL, l->data); internet_address_group_add_member(group, member); g_object_unref(member); } cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } else { /* Create name addresses. */ GList *l; for (l = address->address_list; l; l = l->next) { InternetAddress *ia = internet_address_mailbox_new(address->full_name, l->data); cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } } } completion_list = g_list_reverse(completion_list); libbalsa_completion_add_items(ab_text->name_complete, completion_list); g_list_free(completion_list); return LBABERR_OK; }