diff --git a/README.md b/README.md index 2ab15e44d3eeeb5f1d267df063ec84bf5abc2151..a5121995aae3d77e20cb5df793d833d4013da428 100644 --- a/README.md +++ b/README.md @@ -85,9 +85,6 @@ address book is in the works but needs some finishing touches. `--with-sqlite` Use SQLite for GPE address books. -`--with-rubrica` - Use libxml2 for Rubrica2 address book support. - `--with-osmo` Enable experimental support for read-only DBus access to the Osmo contacts. Note that Osmo svn rev. 1099 or later is required. diff --git a/configure.ac b/configure.ac index f572b280999db654eeee3adb5af7b517be4d206a..8e5cf05ec1ee55394a2f203ec14b67eac85b9090 100644 --- a/configure.ac +++ b/configure.ac @@ -110,11 +110,6 @@ AC_ARG_WITH([macosx-desktop], [Use Mac OS X Desktop Integration (default=no, extremely experimental)]), [use_igemacint=$withval],[use_igemacint=no]) -AC_ARG_WITH([rubrica], - AS_HELP_STRING([--with-rubrica], - [add Rubrica2 address book support (needs libxml2, default=no)]), - [with_rubrica=$withval],[with_rubrica=no]) - AC_ARG_WITH([osmo], AS_HELP_STRING([--with-osmo], [add Osmo address book support (experimental, needs osmo > svn rev. 1099, default=no)]), @@ -378,20 +373,6 @@ else AC_MSG_RESULT([no]) fi -# Rubrica (libxml2) configuration -# -AC_MSG_CHECKING(whether to include Rubrica2 support) -if test x$with_rubrica != xno ; then - AC_MSG_RESULT([yes]) - PKG_CHECK_MODULES(LIBXML2, [libxml-2.0]) - AC_DEFINE(HAVE_RUBRICA,1,[If defined, enable Rubrica2 address book support.]) - BALSA_CFLAGS="$BALSA_CFLAGS $LIBXML2_CFLAGS" - BALSA_LIBS="$BALSA_LIBS $LIBXML2_LIBS" - BALSA_AB_LIBS="$BALSA_AB_LIBS $LIBXML2_LIBS" -else - AC_MSG_RESULT([no]) -fi - # Osmo address book support AC_MSG_CHECKING(whether to include experimental Osmo support) if test x$with_osmo != xno ; then diff --git a/doc/C/balsa.xml b/doc/C/balsa.xml index 9367e71118e6264d433162dd75f8d6be3b11e23b..faa6b5f4124a0549650b552e08e89677dedaf8db 100644 --- a/doc/C/balsa.xml +++ b/doc/C/balsa.xml @@ -3205,7 +3205,7 @@ This is version 2.721 of the Balsa manual. share address books with other GNOME applications. &Balsa; also supports LDIF address books, and can be built to use GPE address books, when SQLite is - available, and Rubrica address books. Which types are supported + available. Which types are supported depends on how &Balsa; was built. diff --git a/doc/C/preferences-address-books.page b/doc/C/preferences-address-books.page index 2be9d1d7f34b16b1cfce94191eeb190026abe7ad..f3c2eee96f30349527b337480973718ed1d25d86 100644 --- a/doc/C/preferences-address-books.page +++ b/doc/C/preferences-address-books.page @@ -15,8 +15,8 @@ id="preferences-address-books"> &Balsa; to share address books with other GNOME applications.

&Balsa; also supports LDIF address books, and can be built - to use GPE address books, when SQLite is available, and Rubrica - address books. Which types are supported depends on how + to use GPE address books, when SQLite is available. + Which types are supported depends on how &Balsa; was built.

The main portion of the preferences page is occupied by the list of current address books for &Balsa;. The list shows the diff --git a/libbalsa/Makefile.am b/libbalsa/Makefile.am index 3e72b6cd78942b8be0bac75411ed8d06dac478f5..7fdb4e9a60775dec4b2faf3e0364eb8352c87601 100644 --- a/libbalsa/Makefile.am +++ b/libbalsa/Makefile.am @@ -16,8 +16,6 @@ libbalsa_a_SOURCES = \ address-book-ldif.h \ address-book-osmo.c \ address-book-osmo.h \ - address-book-rubrica.c \ - address-book-rubrica.h \ address-book-text.c \ address-book-text.h \ address-book-vcard.c \ diff --git a/libbalsa/address-book-rubrica.c b/libbalsa/address-book-rubrica.c deleted file mode 100644 index 3e63bf228090a95d59d0e78cf8fba137ae9808d5..0000000000000000000000000000000000000000 --- a/libbalsa/address-book-rubrica.c +++ /dev/null @@ -1,748 +0,0 @@ -/* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */ -/* Balsa E-Mail Client - * - * Copyright (C) 1997-2019 Stuart Parmenter and others, - * See the file AUTHORS for a list. - * - * Rubrica2 address book support was written by Copyright (C) - * Albrecht Dreß 2007. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -/* - * A Rubrica (XML) addressbook. - */ - -#if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H -# include "config.h" -#endif /* HAVE_CONFIG_H */ -#include "address-book-rubrica.h" - -#if HAVE_RUBRICA - -#include -#include -#include -#include "abook-completion.h" -#include "misc.h" - - -static LibBalsaABErr libbalsa_address_book_rubrica_load(LibBalsaAddressBook - * ab, - const gchar * - filter, - LibBalsaAddressBookLoadFunc - callback, - gpointer data); -static GList - *libbalsa_address_book_rubrica_alias_complete(LibBalsaAddressBook * ab, - const gchar * prefix); -static LibBalsaABErr -libbalsa_address_book_rubrica_add_address(LibBalsaAddressBook * ab, - LibBalsaAddress * new_address); -static LibBalsaABErr -libbalsa_address_book_rubrica_remove_address(LibBalsaAddressBook * ab, - LibBalsaAddress * address); -static LibBalsaABErr -libbalsa_address_book_rubrica_modify_address(LibBalsaAddressBook * ab, - LibBalsaAddress * address, - LibBalsaAddress * newval); - -static LibBalsaABErr lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * - ab_rubrica, xmlDocPtr * docptr); -static void lbab_insert_address_node(LibBalsaAddress * address, - xmlNodePtr parent); -static gboolean lbab_rubrica_starts_from(const gchar * str, - const gchar * filter_hi); - -static GSList *extract_cards(xmlNodePtr card); -static void extract_data(xmlNodePtr entry, gchar ** first_name, - gchar ** last_name, gchar ** nick_name); -static void extract_work(xmlNodePtr entry, gchar ** org); -static guint extract_net(xmlNodePtr entry, LibBalsaAddress *address); -static gchar *xml_node_get_attr(xmlNodePtr node, const xmlChar * attname); -static gchar *xml_node_get_text(xmlNodePtr node); - -#define CXMLCHARP(x) ((const xmlChar *)(x)) - -struct _LibBalsaAddressBookRubrica { - LibBalsaAddressBookText parent; - - GSList *item_list; - time_t mtime; - LibBalsaCompletion *name_complete; -}; - -G_DEFINE_TYPE(LibBalsaAddressBookRubrica, libbalsa_address_book_rubrica, - LIBBALSA_TYPE_ADDRESS_BOOK_TEXT); - - -static void -libbalsa_address_book_rubrica_class_init(LibBalsaAddressBookRubricaClass * - klass) -{ - LibBalsaAddressBookClass *address_book_class; - LibBalsaAddressBookTextClass *address_book_text_class; - - address_book_class = LIBBALSA_ADDRESS_BOOK_CLASS(klass); - address_book_text_class = LIBBALSA_ADDRESS_BOOK_TEXT_CLASS(klass); - - address_book_class->load = libbalsa_address_book_rubrica_load; - address_book_class->add_address = - libbalsa_address_book_rubrica_add_address; - address_book_class->remove_address = - libbalsa_address_book_rubrica_remove_address; - address_book_class->modify_address = - libbalsa_address_book_rubrica_modify_address; - - address_book_class->alias_complete = - libbalsa_address_book_rubrica_alias_complete; - - address_book_text_class->text_item_free_func = g_object_unref; -} - -static void -libbalsa_address_book_rubrica_init(LibBalsaAddressBookRubrica * ab_rubrica) -{ - LibBalsaAddressBookText *ab_text = - LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); - - libbalsa_address_book_text_set_path(ab_text, NULL); - libbalsa_address_book_text_set_item_list(ab_text, NULL); - libbalsa_address_book_text_set_mtime(ab_text, 0); - - if (libbalsa_address_book_text_get_name_complete(ab_text) != NULL) - libbalsa_completion_free(libbalsa_address_book_text_get_name_complete(ab_text)); - libbalsa_address_book_text_set_name_complete(ab_text, - libbalsa_completion_new((LibBalsaCompletionFunc) - completion_data_extract)); - libbalsa_completion_set_compare(libbalsa_address_book_text_get_name_complete(ab_text), - strncmp_word); -} - -/* Public method */ -LibBalsaAddressBook * -libbalsa_address_book_rubrica_new(const gchar * name, const gchar * path) -{ - LibBalsaAddressBookRubrica *ab_rubrica; - LibBalsaAddressBookText *ab_text; - LibBalsaAddressBook *ab; - - ab_rubrica = - LIBBALSA_ADDRESS_BOOK_RUBRICA(g_object_new - (LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA, - NULL)); - ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); - ab = LIBBALSA_ADDRESS_BOOK(ab_rubrica); - - libbalsa_address_book_set_name(ab, name); - libbalsa_address_book_text_set_path(ab_text, path); - - return ab; -} - -/* Class methods */ -static LibBalsaABErr -libbalsa_address_book_rubrica_load(LibBalsaAddressBook * ab, - const gchar * filter, - LibBalsaAddressBookLoadFunc callback, - gpointer data) -{ - LibBalsaAddressBookRubrica *ab_rubrica = - LIBBALSA_ADDRESS_BOOK_RUBRICA(ab); - LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab); - LibBalsaABErr load_res; - gchar *filter_hi = NULL; - GSList *list; - - /* try to load the xml file if necessary */ - load_res = lbab_rubrica_load_xml(ab_rubrica, NULL); - if (load_res != LBABERR_OK) - return load_res; - - if (filter) - filter_hi = g_utf8_strup(filter, -1); - - for (list = libbalsa_address_book_text_get_item_list(ab_text); list != NULL; list = list->next) { - LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); - - if (!address) - continue; - - if (callback && - (!filter_hi || - lbab_rubrica_starts_from(libbalsa_address_get_last_name(address), filter_hi) || - lbab_rubrica_starts_from(libbalsa_address_get_full_name(address), filter_hi))) - callback(ab, address, data); - } - if (callback) - callback(ab, NULL, data); - - g_free(filter_hi); - - return LBABERR_OK; -} - -/* Alias complete method */ -static GList * -libbalsa_address_book_rubrica_alias_complete(LibBalsaAddressBook * ab, - const gchar * prefix) -{ - LibBalsaAddressBookRubrica *ab_rubrica = - LIBBALSA_ADDRESS_BOOK_RUBRICA(ab); - LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab); - GList *list; - GList *res = NULL; - - if (!libbalsa_address_book_get_expand_aliases(ab)) - return NULL; - - if (lbab_rubrica_load_xml(ab_rubrica, NULL) != LBABERR_OK) - return NULL; - - for (list = - libbalsa_completion_complete(libbalsa_address_book_text_get_name_complete(ab_text), - (gchar *) prefix); - list; list = list->next) { - InternetAddress *ia = ((CompletionData *) list->data)->ia; - res = g_list_prepend(res, g_object_ref(ia)); - } - - return g_list_reverse(res); -} - -/* store address method */ -static LibBalsaABErr -libbalsa_address_book_rubrica_add_address(LibBalsaAddressBook * ab, - LibBalsaAddress * new_address) -{ - LibBalsaAddressBookRubrica *ab_rubrica = - LIBBALSA_ADDRESS_BOOK_RUBRICA(ab); - LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab); - const gchar *path = libbalsa_address_book_text_get_path(ab_text); - int fd; - xmlDocPtr doc = NULL; - xmlNodePtr root_element = NULL; - LibBalsaABErr result; - - /* try to load the current file (an empty file is ok) */ - result = lbab_rubrica_load_xml(ab_rubrica, &doc); - if (result != LBABERR_OK && result != LBABERR_CANNOT_READ) - return result; - - /* eject if we already have this address */ - if (g_slist_find_custom(libbalsa_address_book_text_get_item_list(ab_text), new_address, - (GCompareFunc) libbalsa_address_compare)) { - xmlFreeDoc(doc); - return LBABERR_DUPLICATE; - } - - /* try to open the address book for writing */ - if ((fd = open(path, O_WRONLY | O_CREAT, 0666)) == -1) { - xmlFreeDoc(doc); - return LBABERR_CANNOT_WRITE; - } - if (libbalsa_lock_file(path, fd, TRUE, TRUE, FALSE) < 0) { - xmlFreeDoc(doc); - close(fd); - return LBABERR_CANNOT_WRITE; - } - - /* create a new xml document if necessary */ - if (!doc) { - doc = xmlNewDoc(CXMLCHARP("1.0")); - root_element = - xmlNewDocNode(doc, NULL, CXMLCHARP("Rubrica"), NULL); - xmlDocSetRootElement(doc, root_element); - xmlNewProp(root_element, CXMLCHARP("version"), CXMLCHARP("2.0.1")); - xmlNewProp(root_element, CXMLCHARP("fileformat"), CXMLCHARP("0")); - xmlNewProp(root_element, CXMLCHARP("doctype"), - CXMLCHARP("AddressBook")); - } else - root_element = xmlDocGetRootElement(doc); - - /* insert a new card */ - lbab_insert_address_node(new_address, root_element); - - /* store the document */ - if (xmlSaveFormatFileEnc(path, doc, "UTF-8", 1) == -1) - result = LBABERR_CANNOT_WRITE; - else - result = LBABERR_OK; - libbalsa_unlock_file(path, fd, FALSE); - close(fd); - xmlFreeDoc(doc); - /* force re-load upon the next access: */ - libbalsa_address_book_text_set_mtime(ab_text, 0); - - /* done */ - return result; -} - -/* Remove address method */ -static LibBalsaABErr -libbalsa_address_book_rubrica_remove_address(LibBalsaAddressBook * ab, - LibBalsaAddress * address) -{ - return libbalsa_address_book_rubrica_modify_address(ab, address, NULL); -} - -/* Remove address method */ -static LibBalsaABErr -libbalsa_address_book_rubrica_modify_address(LibBalsaAddressBook * ab, - LibBalsaAddress * address, - LibBalsaAddress * newval) -{ - LibBalsaAddressBookRubrica *ab_rubrica = - LIBBALSA_ADDRESS_BOOK_RUBRICA(ab); - LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab); - const gchar *path = libbalsa_address_book_text_get_path(ab_text); - int fd; - xmlDocPtr doc = NULL; - xmlNodePtr root_element; - xmlNodePtr card; - const gchar *full_name = libbalsa_address_get_full_name(address); - LibBalsaABErr result; - - /* try to load the current file */ - if ((result = lbab_rubrica_load_xml(ab_rubrica, &doc)) != LBABERR_OK) - return result; - - /* check if we have a node with the correct full name */ - if (!(root_element = xmlDocGetRootElement(doc)) || - xmlStrcmp(root_element->name, CXMLCHARP("Rubrica"))) { - xmlFreeDoc(doc); - return LBABERR_ADDRESS_NOT_FOUND; - } - - for (card = root_element->children; card != NULL; card = card->next) { - if (xmlStrcmp(card->name, CXMLCHARP("Card")) == 0) { - gchar *name = xml_node_get_attr(card, CXMLCHARP("name")); - - if (name != NULL) { - gboolean found = g_ascii_strcasecmp(full_name, name) == 0; - - g_free(name); - if (found) - break; - } - } - } - - if (card == NULL) { - xmlFreeDoc(doc); - return LBABERR_ADDRESS_NOT_FOUND; - } - - /* remove the card from the document */ - xmlUnlinkNode(card); - xmlFreeNode(card); - - /* add the new card */ - if (newval) - lbab_insert_address_node(newval, root_element); - - /* try to open the address book for writing */ - if ((fd = open(path, O_WRONLY | O_CREAT, 0666)) == -1) { - xmlFreeDoc(doc); - return LBABERR_CANNOT_WRITE; - } - if (libbalsa_lock_file(path, fd, TRUE, TRUE, FALSE) < 0) { - xmlFreeDoc(doc); - close(fd); - return LBABERR_CANNOT_WRITE; - } - - /* store the document */ - if (xmlSaveFormatFileEnc(path, doc, "UTF-8", 1) == -1) - result = LBABERR_CANNOT_WRITE; - else - result = LBABERR_OK; - libbalsa_unlock_file(path, fd, FALSE); - close(fd); - xmlFreeDoc(doc); - /* force re-load upon the next access: */ - libbalsa_address_book_text_set_mtime(ab_text, 0); - - /* done */ - return result; -} - -/* -- helpers -- */ -static LibBalsaABErr -lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica, - xmlDocPtr * docptr) -{ - LibBalsaAddressBook *ab = LIBBALSA_ADDRESS_BOOK(ab_rubrica); - LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); - const gchar *path = libbalsa_address_book_text_get_path(ab_text); - 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(path, &stat_buf) == 0) { - if (stat_buf.st_mtime == libbalsa_address_book_text_get_mtime(ab_text)) - return LBABERR_OK; - else - libbalsa_address_book_text_set_mtime(ab_text, stat_buf.st_mtime); - } - - /* free old data */ - libbalsa_address_book_text_set_item_list(ab_text, NULL); - - g_list_foreach(libbalsa_address_book_text_get_name_complete(ab_text)->items, - (GFunc) completion_data_free, NULL); - libbalsa_completion_clear_items(libbalsa_address_book_text_get_name_complete(ab_text)); - - /* try to read the address book */ - if ((fd = open(path, O_RDONLY)) == -1) - return LBABERR_CANNOT_READ; - if (libbalsa_lock_file(path, fd, FALSE, TRUE, FALSE) < 0) { - close(fd); - return LBABERR_CANNOT_READ; - } - - doc = xmlParseFile(path); - libbalsa_unlock_file(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"))) - libbalsa_address_book_text_set_item_list(ab_text, - 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 = libbalsa_address_book_text_get_item_list(ab_text); list != NULL; list = list->next) { - LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); - guint n_addrs; - - if (address == NULL) - continue; - - n_addrs = libbalsa_address_get_n_addrs(address); - if (libbalsa_address_book_get_dist_list_mode(ab) - && n_addrs > 1) { - /* Create a group address. */ - InternetAddress *ia = - internet_address_group_new(libbalsa_address_get_full_name(address)); - InternetAddressGroup *group = (InternetAddressGroup *) ia; - guint n; - - for (n = 0; n < n_addrs; ++n) { - const gchar *addr = libbalsa_address_get_nth_addr(address, n); - InternetAddress *member = - internet_address_mailbox_new(NULL, addr); - internet_address_group_add_member(group, member); - g_object_unref(member); - } - cmp_data = completion_data_new(ia, libbalsa_address_get_nick_name(address)); - completion_list = g_list_prepend(completion_list, cmp_data); - g_object_unref(ia); - } else { - /* Create name addresses. */ - guint n; - - for (n = 0; n < n_addrs; ++n) { - const gchar *addr = libbalsa_address_get_nth_addr(address, n); - InternetAddress *ia = - internet_address_mailbox_new(libbalsa_address_get_full_name(address), addr); - cmp_data = completion_data_new(ia, libbalsa_address_get_nick_name(address)); - completion_list = - g_list_prepend(completion_list, cmp_data); - g_object_unref(ia); - } - } - } - - completion_list = g_list_reverse(completion_list); - libbalsa_completion_add_items(libbalsa_address_book_text_get_name_complete(ab_text), - completion_list); - g_list_free(completion_list); - - return LBABERR_OK; -} - -static void -lbab_insert_address_node(LibBalsaAddress * address, - xmlNodePtr parent) -{ - xmlNodePtr new_addr; - xmlNodePtr new_data; - guint n_addrs; - guint n; - - /* create a new card */ - new_addr = xmlNewChild(parent, NULL, CXMLCHARP("Card"), NULL); - xmlNewProp(new_addr, CXMLCHARP("name"), CXMLCHARP(libbalsa_address_get_full_name(address))); - - /* create the Data section of the card */ - new_data = xmlNewChild(new_addr, NULL, CXMLCHARP("Data"), NULL); - xmlNewChild(new_data, NULL, CXMLCHARP("FirstName"), - CXMLCHARP(libbalsa_address_get_first_name(address))); - xmlNewChild(new_data, NULL, CXMLCHARP("LastName"), - CXMLCHARP(libbalsa_address_get_last_name(address))); - xmlNewChild(new_data, NULL, CXMLCHARP("NickName"), - CXMLCHARP(libbalsa_address_get_nick_name(address))); - - /* create the Work section of the card */ - new_data = xmlNewChild(new_addr, NULL, CXMLCHARP("Work"), NULL); - xmlNewChild(new_data, NULL, CXMLCHARP("Organization"), - CXMLCHARP(libbalsa_address_get_organization(address))); - - /* create the Net section of the card */ - new_data = xmlNewChild(new_addr, NULL, CXMLCHARP("Net"), NULL); - - n_addrs = libbalsa_address_get_n_addrs(address); - for (n = 0; n < n_addrs; ++n) { - const gchar *addr = libbalsa_address_get_nth_addr(address, n); - xmlNodePtr new_mail = - xmlNewChild(new_data, NULL, CXMLCHARP("Uri"), - CXMLCHARP(addr)); - xmlNewProp(new_mail, CXMLCHARP("type"), CXMLCHARP("email")); - } -} - -/* Case-insensitive utf-8 string-has-prefix */ -static gboolean -lbab_rubrica_starts_from(const gchar * str, const gchar * filter_hi) -{ - if (!str) - return FALSE; - - while (*str && *filter_hi && - g_unichar_toupper(g_utf8_get_char(str)) == - g_utf8_get_char(filter_hi)) { - str = g_utf8_next_char(str); - filter_hi = g_utf8_next_char(filter_hi); - } - - return *filter_hi == '\0'; -} - - -/* XML stuff to extract the data we need from the Rubrica file */ -static GSList * -extract_cards(xmlNodePtr card) -{ - GSList *addrlist = NULL; - - while (card) { - if (!xmlStrcmp(card->name, CXMLCHARP("Card"))) { - LibBalsaAddress *address = libbalsa_address_new(); - xmlNodePtr children; - gchar *full_name; - guint n_addrs = 0; - - full_name = xml_node_get_attr(card, CXMLCHARP("name")); - libbalsa_address_set_full_name(address, full_name); - g_free(full_name); - - children = card->children; - while (children) { - if (!xmlStrcmp(children->name, CXMLCHARP("Data"))) { - gchar *first_name; - gchar *last_name = NULL; - gchar *nick_name = NULL; - - extract_data(children->children, - &first_name, &last_name, &nick_name); - - libbalsa_address_set_first_name(address, first_name); - libbalsa_address_set_last_name(address, last_name); - libbalsa_address_set_nick_name(address, nick_name); - - g_free(first_name); - g_free(last_name); - g_free(nick_name); - } else if (!xmlStrcmp(children->name, CXMLCHARP("Work"))) { - gchar *organization = NULL; - - extract_work(children->children, &organization); - libbalsa_address_set_organization(address, organization); - g_free(organization); - } else if (!xmlStrcmp(children->name, CXMLCHARP("Net"))) { - n_addrs += extract_net(children->children, address); - } - - children = children->next; - } - - if (n_addrs > 0) - addrlist = g_slist_prepend(addrlist, address); - else - g_object_unref(address); - } - - card = card->next; - } - - return addrlist; -} - - -static void -extract_data(xmlNodePtr entry, gchar ** first_name, gchar ** last_name, - gchar ** nick_name) -{ - gchar *title = NULL; - gchar *prefix = NULL; - gchar *first = NULL; - gchar *middle = NULL; - GString *_first_name = NULL; - - while (entry) { - if (!xmlStrcmp(entry->name, CXMLCHARP("FirstName"))) - first = xml_node_get_text(entry); - else if (!xmlStrcmp(entry->name, CXMLCHARP("MiddleName"))) - middle = xml_node_get_text(entry); - else if (!xmlStrcmp(entry->name, CXMLCHARP("Title"))) - title = xml_node_get_text(entry); - else if (!xmlStrcmp(entry->name, CXMLCHARP("NamePrefix"))) - prefix = xml_node_get_text(entry); - else if (!xmlStrcmp(entry->name, CXMLCHARP("LastName"))) - *last_name = xml_node_get_text(entry); - else if (!xmlStrcmp(entry->name, CXMLCHARP("NickName"))) - *nick_name = xml_node_get_text(entry); - - entry = entry->next; - } - - /* construct first name */ - if (title) { - _first_name = g_string_new(title); - g_free(title); - } - - if (prefix) { - if (_first_name) { - _first_name = g_string_append_c(_first_name, ' '); - _first_name = g_string_append(_first_name, prefix); - } else - _first_name = g_string_new(prefix); - g_free(prefix); - } - - if (first) { - if (_first_name) { - _first_name = g_string_append_c(_first_name, ' '); - _first_name = g_string_append(_first_name, first); - } else - _first_name = g_string_new(first); - g_free(first); - } - - if (middle) { - if (_first_name) { - _first_name = g_string_append_c(_first_name, ' '); - _first_name = g_string_append(_first_name, middle); - } else - _first_name = g_string_new(middle); - g_free(middle); - } - - if (_first_name) - *first_name = g_string_free(_first_name, FALSE); - else - *first_name = NULL; -} - - -static void -extract_work(xmlNodePtr entry, gchar ** org) -{ - while (entry) { - if (!xmlStrcmp(entry->name, CXMLCHARP("Organization"))) { - *org = xml_node_get_text(entry); - return; - } - - entry = entry->next; - } -} - - -static guint -extract_net(xmlNodePtr entry, LibBalsaAddress *address) -{ - guint n_addrs = 0; - - while (entry) { - gchar *uri_type = NULL; - gchar *mail_addr; - - if (!xmlStrcmp(entry->name, CXMLCHARP("Uri")) - && g_strcmp0(uri_type = xml_node_get_attr(entry, CXMLCHARP("type")), - "email") == 0 - && (mail_addr = xml_node_get_text(entry)) != NULL) { - libbalsa_address_append_addr(address, mail_addr); - g_free(mail_addr); - ++n_addrs; - } - g_free(uri_type); - - entry = entry->next; - } - - return n_addrs; -} - - -static gchar * -xml_node_get_text(xmlNodePtr node) -{ - if ((node = node->children) != NULL && node->type == XML_TEXT_NODE) - return g_strdup((const gchar *) node->content); - else - return NULL; -} - - -static gchar * -xml_node_get_attr(xmlNodePtr node, const xmlChar * attname) -{ - xmlAttrPtr props; - - for (props = node->properties; props != NULL; props = props->next) { - if (props->type == XML_ATTRIBUTE_NODE - && !xmlStrcmp(props->name, attname) && props->children - && props->children->type == XML_TEXT_NODE) - return g_strdup((const gchar *) props->children->content); - } - - return NULL; -} - - -#endif /* HAVE_RUBRICA */ diff --git a/libbalsa/address-book-rubrica.h b/libbalsa/address-book-rubrica.h deleted file mode 100644 index ff985862705db86c1fa8968d6bdc5cc5c29b74ed..0000000000000000000000000000000000000000 --- a/libbalsa/address-book-rubrica.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */ -/* Balsa E-Mail Client - * - * Copyright (C) 1997-2019 Stuart Parmenter and others, - * See the file AUTHORS for a list. - * - * Rubrica2 address book support was written by Copyright (C) - * Albrecht Dreß 2007. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -/* - * Rubrica address book ... - */ - -#ifndef __LIBBALSA_ADDRESS_BOOK_RUBRICA_H__ -#define __LIBBALSA_ADDRESS_BOOK_RUBRICA_H__ - -#include "address-book-text.h" - -#define LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA libbalsa_address_book_rubrica_get_type() -G_DECLARE_FINAL_TYPE(LibBalsaAddressBookRubrica, libbalsa_address_book_rubrica, - LIBBALSA, ADDRESS_BOOK_RUBRICA, LibBalsaAddressBookText) - -LibBalsaAddressBook *libbalsa_address_book_rubrica_new(const gchar * name, - const gchar * path); - -#endif /* __LIBBALSA_ADDRESS_BOOK_RUBRICA_H__ */ diff --git a/libbalsa/libbalsa.c b/libbalsa/libbalsa.c index d7be8e10a1e988ad1277cf0b566eda3e94f762ee..2f5b5610e58cd658c4207b3a22ce6ef17131b142 100644 --- a/libbalsa/libbalsa.c +++ b/libbalsa/libbalsa.c @@ -85,9 +85,6 @@ libbalsa_init(void) #if HAVE_SQLITE LIBBALSA_TYPE_ADDRESS_BOOK_GPE; #endif -#if HAVE_RUBRICA - LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA; -#endif #if HAVE_OSMO LIBBALSA_TYPE_ADDRESS_BOOK_OSMO; #endif diff --git a/libbalsa/libbalsa.h b/libbalsa/libbalsa.h index f9cc0b9032abf3b63ccf455e90ad806f1c078052..c363f402404c4da59dfd6e3fbae99fd8ddd4b978 100644 --- a/libbalsa/libbalsa.h +++ b/libbalsa/libbalsa.h @@ -56,9 +56,6 @@ typedef struct _LibbalsaVfs LibbalsaVfs; #if HAVE_SQLITE #include "address-book-gpe.h" #endif -#if HAVE_RUBRICA -#include "address-book-rubrica.h" -#endif #if HAVE_OSMO #include "address-book-osmo.h" #endif diff --git a/libbalsa/meson.build b/libbalsa/meson.build index b18fc70570485430e5f243d70c2cbd7eb612e5c2..c68ec4fd43a6c5496458f267c25b2a58d0495c5c 100644 --- a/libbalsa/meson.build +++ b/libbalsa/meson.build @@ -13,8 +13,6 @@ libbalsa_a_sources = [ 'address-book-ldif.h', 'address-book-osmo.c', 'address-book-osmo.h', - 'address-book-rubrica.c', - 'address-book-rubrica.h', 'address-book-text.c', 'address-book-text.h', 'address-book-vcard.c', diff --git a/meson.build b/meson.build index 8b1fffd953f9d5b98696f7622ef5d732a15f342a..2bc006ca7234ea5443af5ea68475607e76b8a476 100644 --- a/meson.build +++ b/meson.build @@ -59,7 +59,6 @@ gtksourceview = get_option('gtksourceview') spell_checker = get_option('spell-checker') ldap = get_option('ldap') igemacint = get_option('macosx-desktop') -rubrica = get_option('rubrica') osmo = get_option('osmo') sqlite = get_option('sqlite') libsecret = get_option('libsecret') @@ -270,16 +269,6 @@ if sqlite != 'false' balsa_ab_deps += real_dep endif # sqlite != 'false' -# Rubrica (libxml2) configuration -# -if rubrica - xml_dep = dependency('libxml-2.0') - conf.set('HAVE_RUBRICA', 1, - description : 'If defined, enable Rubrica2 address book support.') - balsa_deps += xml_dep - balsa_ab_deps += xml_dep -endif # rubrica - # Osmo address book support # if osmo diff --git a/meson_options.txt b/meson_options.txt index bf599ac499a7b4c944d72a121c82d7d9824acdcf..c32e282eb632b0a8433394bc0e5cc60cc2eb15ca 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -65,11 +65,6 @@ option('macosx-desktop', value : false, description : 'Use Mac OS X Desktop Integration (default=false, extremely experimental)') -option('rubrica', - type : 'boolean', - value : false, - description : 'add Rubrica2 address book support (needs libxml2, default=false)') - option('osmo', type : 'boolean', value : false, diff --git a/src/ab-main.c b/src/ab-main.c index ae667430acb3687354f8653affb4debef42eaeb8..959ccca35cb962c941bbb89df302a6f2d30b773f 100644 --- a/src/ab-main.c +++ b/src/ab-main.c @@ -44,9 +44,6 @@ #if HAVE_SQLITE #include "address-book-gpe.h" #endif /* HAVE_SQLITE */ -#if HAVE_RUBRICA -#include "address-book-rubrica.h" -#endif /* HAVE_RUBRICA */ #include "address-book-config.h" #include "application-helpers.h" #include "libbalsa-conf.h" @@ -209,10 +206,6 @@ bab_window_set_title(LibBalsaAddressBook * address_book) else if (LIBBALSA_IS_ADDRESS_BOOK_GPE(address_book)) type = "GPE"; #endif -#if HAVE_RUBRICA - else if (LIBBALSA_IS_ADDRESS_BOOK_RUBRICA(address_book)) - type = "Rubrica"; -#endif /* HAVE_RUBRICA */ title = g_strconcat(type, _(" address book: "), libbalsa_address_book_get_name(address_book), NULL); @@ -403,18 +396,6 @@ file_new_gpe_activated(GSimpleAction * action, } #endif /* HAVE_SQLITE */ -#if HAVE_RUBRICA -static void -file_new_rubrica_activated(GSimpleAction * action, - GVariant * state, - gpointer user_data) -{ - balsa_address_book_config_new_from_type - (LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA, address_book_change, - contacts_app.window); -} -#endif /* HAVE_RUBRICA */ - static void file_properties_activated(GSimpleAction * action, GVariant * state, @@ -562,9 +543,6 @@ get_main_menu(GtkApplication * application) #if HAVE_SQLITE {"file-new-gpe", file_new_gpe_activated}, #endif /* HAVE_SQLITE */ -#if HAVE_RUBRICA - {"file-new-rubrica", file_new_rubrica_activated}, -#endif /* HAVE_RUBRICA */ {"file-properties", file_properties_activated}, {"file-delete", file_delete_activated}, {"file-quit", file_quit_activated}, @@ -1017,9 +995,6 @@ bab_init(void) #if HAVE_SQLITE LIBBALSA_TYPE_ADDRESS_BOOK_GPE; #endif -#if HAVE_RUBRICA - LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA; -#endif /* HAVE_RUBRICA */ memset(&contacts_app, 0, sizeof(contacts_app)); } diff --git a/src/ab-window.c b/src/ab-window.c index beb49a83c71a750ad89602c02480623f461e49e8..b89fe8041bef87e28d67dc97da8ab0a62c093000 100644 --- a/src/ab-window.c +++ b/src/ab-window.c @@ -696,10 +696,6 @@ balsa_ab_window_set_title(BalsaAbWindow *ab) else if (LIBBALSA_IS_ADDRESS_BOOK_GPE(address_book)) type = "GPE"; #endif -#if HAVE_RUBRICA - else if (LIBBALSA_IS_ADDRESS_BOOK_RUBRICA(address_book)) - type = "Rubrica"; -#endif title = g_strconcat(type, _(" address book: "), diff --git a/src/address-book-config.c b/src/address-book-config.c index 8250a87ffcb1de9795947a9660b48738b0c8c638..94a71512e1c55db34186ab7d0a9a1d0615dd7922 100644 --- a/src/address-book-config.c +++ b/src/address-book-config.c @@ -75,9 +75,6 @@ static GtkWidget *create_ldap_dialog(AddressBookConfig * abc); #ifdef HAVE_SQLITE static GtkWidget *create_gpe_dialog(AddressBookConfig * abc); #endif -#ifdef HAVE_RUBRICA -static GtkWidget *create_rubrica_dialog(AddressBookConfig * abc); -#endif #ifdef HAVE_OSMO static GtkWidget *create_osmo_dialog(AddressBookConfig *abc); #endif @@ -306,10 +303,6 @@ create_dialog_from_type(AddressBookConfig * abc) } else if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_GPE) { return create_gpe_dialog(abc); #endif -#ifdef HAVE_RUBRICA - } else if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA) { - return create_rubrica_dialog(abc); -#endif #ifdef HAVE_OSMO } else if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_OSMO) { return create_osmo_dialog(abc); @@ -580,14 +573,6 @@ create_gpe_dialog(AddressBookConfig * abc) } #endif -#if HAVE_RUBRICA -static GtkWidget * -create_rubrica_dialog(AddressBookConfig * abc) -{ - return create_local_dialog(abc, "Rubrica"); -} -#endif - static void help_button_cb(AddressBookConfig * abc) { @@ -740,14 +725,6 @@ create_book(AddressBookConfig * abc) address_book = libbalsa_address_book_gpe_new(name); #endif -#ifdef HAVE_RUBRICA - } else if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA) { - gchar *path = - gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(abc->window)); - if (path != NULL) - address_book = libbalsa_address_book_rubrica_new(name, path); - g_free(path); -#endif #ifdef HAVE_OSMO } else if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_OSMO) { address_book = libbalsa_address_book_osmo_new(name); @@ -776,9 +753,6 @@ modify_book(AddressBookConfig * abc) if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_VCARD || abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_LDIF -#ifdef HAVE_RUBRICA - || abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA -#endif /* HAVE_RUBRICA */ ) { LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(address_book); @@ -897,16 +871,6 @@ add_gpe_cb(GtkWidget * widget, AddressBookConfig * abc) } #endif /* HAVE_SQLITE */ -#ifdef HAVE_RUBRICA -static void -add_rubrica_cb(GtkWidget * widget, AddressBookConfig * abc) -{ - abc->type = LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA; - abc->window = create_rubrica_dialog(abc); - gtk_widget_show_all(abc->window); -} -#endif /* HAVE_SQLITE */ - #ifdef HAVE_OSMO static void add_osmo_cb(GtkWidget * widget, AddressBookConfig * abc) @@ -962,13 +926,6 @@ balsa_address_book_add_menu(BalsaAddressBookCallback callback, gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); #endif /* HAVE_SQLITE */ -#ifdef HAVE_RUBRICA - menuitem = gtk_menu_item_new_with_label(_("Rubrica2 Address Book")); - g_signal_connect(menuitem, "activate", - G_CALLBACK(add_rubrica_cb), abc); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); -#endif /* HAVE_RUBRICA */ - #ifdef HAVE_OSMO menuitem = gtk_menu_item_new_with_label(_("Osmo Address Book")); g_signal_connect(menuitem, "activate", diff --git a/src/main.c b/src/main.c index cc4c532d0bf8e86b6d92e9ee521d20d6c8e9c9fd..b038749d06ab42557c9973b559fdb853079b3077 100644 --- a/src/main.c +++ b/src/main.c @@ -29,10 +29,6 @@ #include #endif -#ifdef HAVE_RUBRICA -#include -#endif - #include #include "balsa-app.h" @@ -500,11 +496,6 @@ balsa_startup_cb(GApplication *application, setlocale(LC_ALL, ""); #endif -#ifdef HAVE_RUBRICA - /* initialise libxml */ - LIBXML_TEST_VERSION -#endif - /* initialise the gpgme library and set the callback funcs */ libbalsa_gpgme_init(lb_gpgme_passphrase, lb_gpgme_select_key, lb_gpgme_accept_low_trust_key); diff --git a/src/pref-manager.c b/src/pref-manager.c index b0dbf25e976f843d1a11a65cd7e0d74d342c21d5..a815fbc46d6b3329d8b11b3db057a2b2d1ebe69f 100644 --- a/src/pref-manager.c +++ b/src/pref-manager.c @@ -951,10 +951,6 @@ update_address_books(void) else if (LIBBALSA_IS_ADDRESS_BOOK_GPE(address_book)) type = "GPE"; #endif -#if HAVE_RUBRICA - else if (LIBBALSA_IS_ADDRESS_BOOK_RUBRICA(address_book)) - type = "Rubrica"; -#endif #if HAVE_OSMO else if (LIBBALSA_IS_ADDRESS_BOOK_OSMO(address_book)) type = "Osmo"; diff --git a/ui/ab-main.ui b/ui/ab-main.ui index 07630aa26f886fb5f8dc98ce6ec6124debf464f1..36a632b2228ab4977a8373429163b9eac918df97 100644 --- a/ui/ab-main.ui +++ b/ui/ab-main.ui @@ -33,11 +33,6 @@ translatable="yes">_GPE Address Book win.file-new-gpe - - _Rubrica Address Book - win.file-new-rubrica -