From c997c819c66565c9057cd642683497f8046abe92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albrecht=20Dre=C3=9F?= Date: Sat, 25 Feb 2023 21:56:52 +0100 Subject: [PATCH] drop support for Rubrica address book MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rationale: * the latest Rubrica2 version has been created in October 2012, * it still uses Gtk+-2, and has never been ported to Gtk+-3, * it is not supported by *any* up-to-date disto (afaict), * the last time I tried to build it (back in 2019) its compilation failed. Therefore, IMHO it is safe to assume that nobody uses Rubrica (or the XML file created by it) any more, i.e. we can clean up the code by removing it. Signed-off-by: Albrecht Dreß --- README.md | 3 - configure.ac | 19 - doc/C/balsa.xml | 2 +- doc/C/preferences-address-books.page | 4 +- libbalsa/Makefile.am | 2 - libbalsa/address-book-rubrica.c | 748 --------------------------- libbalsa/address-book-rubrica.h | 40 -- libbalsa/libbalsa.c | 3 - libbalsa/libbalsa.h | 3 - libbalsa/meson.build | 2 - meson.build | 11 - meson_options.txt | 5 - src/ab-main.c | 25 - src/ab-window.c | 4 - src/address-book-config.c | 43 -- src/main.c | 9 - src/pref-manager.c | 4 - ui/ab-main.ui | 5 - 18 files changed, 3 insertions(+), 929 deletions(-) delete mode 100644 libbalsa/address-book-rubrica.c delete mode 100644 libbalsa/address-book-rubrica.h diff --git a/README.md b/README.md index 2ab15e44d..a5121995a 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 f572b2809..8e5cf05ec 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 9367e7111..faa6b5f41 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 2be9d1d7f..f3c2eee96 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 3e72b6cd7..7fdb4e9a6 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 3e63bf228..000000000 --- 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 ff9858627..000000000 --- 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 d7be8e10a..2f5b5610e 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 f9cc0b903..c363f4024 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 b18fc7057..c68ec4fd4 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 8b1fffd95..2bc006ca7 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 bf599ac49..c32e282eb 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 ae667430a..959ccca35 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 beb49a83c..b89fe8041 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 8250a87ff..94a71512e 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 cc4c532d0..b038749d0 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 b0dbf25e9..a815fbc46 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 07630aa26..36a632b22 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 -