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
-
-