aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/util/eab-book-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/util/eab-book-util.c')
-rw-r--r--addressbook/util/eab-book-util.c293
1 files changed, 293 insertions, 0 deletions
diff --git a/addressbook/util/eab-book-util.c b/addressbook/util/eab-book-util.c
new file mode 100644
index 0000000000..2c80d6f8a1
--- /dev/null
+++ b/addressbook/util/eab-book-util.c
@@ -0,0 +1,293 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * eab-util.c
+ *
+ * Copyright (C) 2001-2003 Ximian, Inc.
+ *
+ * Authors: Jon Trowbridge <trow@ximian.com>
+ * Chris Toshok <toshok@ximian.com>
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ */
+
+#include <config.h>
+#include "eab-book-util.h"
+
+#include <string.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <e-util/e-config-listener.h>
+
+EConfigListener *
+eab_get_config_database ()
+{
+ static EConfigListener *config_db;
+
+ if (config_db == NULL)
+ config_db = e_config_listener_new ();
+
+ return config_db;
+}
+
+/*
+ *
+ * Specialized Queries
+ *
+ */
+
+guint
+eab_name_and_email_query (EBook *book,
+ const gchar *name,
+ const gchar *email,
+ EBookContactsCallback cb,
+ gpointer closure)
+{
+ gchar *email_query=NULL, *name_query=NULL, *query;
+ guint tag;
+
+ g_return_val_if_fail (book && E_IS_BOOK (book), 0);
+ g_return_val_if_fail (cb != NULL, 0);
+
+ if (name && !*name)
+ name = NULL;
+ if (email && !*email)
+ email = NULL;
+
+ if (name == NULL && email == NULL)
+ return 0;
+
+ /* Build our e-mail query.
+ * We only query against the username part of the address, to avoid not matching
+ * fred@foo.com and fred@mail.foo.com. While their may be namespace collisions
+ * in the usernames of everyone out there, it shouldn't be that bad. (Famous last words.)
+ */
+ if (email) {
+ const gchar *t = email;
+ while (*t && *t != '@')
+ ++t;
+ if (*t == '@') {
+ email_query = g_strdup_printf ("(beginswith \"email\" \"%.*s@\")", t-email, email);
+
+ } else {
+ email_query = g_strdup_printf ("(beginswith \"email\" \"%s\")", email);
+ }
+ }
+
+ /* Build our name query.
+ * We only do name-query stuff if we don't have an e-mail address. Our basic assumption
+ * is that the username part of the email is good enough to keep the amount of stuff returned
+ * in the query relatively small.
+ */
+ if (name && !email)
+ name_query = g_strdup_printf ("(or (beginswith \"file_as\" \"%s\") (beginswith \"full_name\" \"%s\"))", name, name);
+
+ /* Assemble our e-mail & name queries */
+ if (email_query && name_query) {
+ query = g_strdup_printf ("(and %s %s)", email_query, name_query);
+ } else if (email_query) {
+ query = email_query;
+ email_query = NULL;
+ } else if (name_query) {
+ query = name_query;
+ name_query = NULL;
+ } else
+ return 0;
+
+ tag = e_book_async_get_contacts (book, query, cb, closure);
+
+ g_free (email_query);
+ g_free (name_query);
+ g_free (query);
+
+ return tag;
+}
+
+/*
+ * Simple nickname query
+ */
+guint
+eab_nickname_query (EBook *book,
+ const char *nickname,
+ EBookContactsCallback cb,
+ gpointer closure)
+{
+ gchar *query;
+ guint retval;
+
+ g_return_val_if_fail (E_IS_BOOK (book), 0);
+ g_return_val_if_fail (nickname != NULL, 0);
+
+ /* The empty-string case shouldn't generate a warning. */
+ if (! *nickname)
+ return 0;
+
+ query = g_strdup_printf ("(is \"nickname\" \"%s\")", nickname);
+
+ retval = e_book_async_get_contacts (book, query, cb, closure);
+
+ g_free (query);
+
+ return retval;
+}
+
+GList*
+eab_contact_list_from_string (const char *str)
+{
+ GList *contacts = NULL;
+ GString *gstr = g_string_new ("");
+ char *p = (char*)str;
+ char *q;
+ char *blank_line;
+
+ while (*p) {
+ if (*p != '\r') g_string_append_c (gstr, *p);
+
+ p++;
+ }
+
+ p = g_string_free (gstr, FALSE);
+ q = p;
+ do {
+ char *temp;
+
+ blank_line = strstr (q, "\n\n");
+ if (blank_line) {
+ temp = g_strndup (q, blank_line - q);
+ }
+ else {
+ temp = g_strdup (q);
+ }
+
+ contacts = g_list_append (contacts, e_contact_new_from_vcard (temp));
+
+ g_free (temp);
+
+ if (blank_line)
+ q = blank_line + 2;
+ else
+ q = NULL;
+ } while (blank_line);
+
+ g_free (p);
+
+ return contacts;
+}
+
+char*
+eab_contact_list_to_string (GList *contacts)
+{
+ GString *str = g_string_new ("");
+ GList *l;
+
+ for (l = contacts; l; l = l->next) {
+ EContact *contact = l->data;
+ char *vcard_str = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
+
+ g_string_append (str, vcard_str);
+ if (l->next)
+ g_string_append (str, "\r\n");
+ }
+
+ return g_string_free (str, FALSE);
+}
+
+#if notyet
+/*
+ * Convenience routine to check for addresses in the local address book.
+ */
+
+typedef struct _HaveAddressInfo HaveAddressInfo;
+struct _HaveAddressInfo {
+ gchar *email;
+ EBookHaveAddressCallback cb;
+ gpointer closure;
+};
+
+static void
+have_address_query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *contacts, gpointer closure)
+{
+ HaveAddressInfo *info = (HaveAddressInfo *) closure;
+
+ info->cb (book,
+ info->email,
+ contacts && (status == E_BOOK_ERROR_OK) ? E_CONTACT (contacts->data) : NULL,
+ info->closure);
+
+ g_free (info->email);
+ g_free (info);
+}
+
+static void
+have_address_book_open_cb (EBook *book, gpointer closure)
+{
+ HaveAddressInfo *info = (HaveAddressInfo *) closure;
+
+ if (book) {
+
+ e_book_name_and_email_query (book, NULL, info->email, have_address_query_cb, info);
+
+ } else {
+
+ info->cb (NULL, info->email, NULL, info->closure);
+
+ g_free (info->email);
+ g_free (info);
+
+ }
+}
+
+void
+eab_query_address_default (const gchar *email,
+ EABHaveAddressCallback cb,
+ gpointer closure)
+{
+ HaveAddressInfo *info;
+
+ g_return_if_fail (email != NULL);
+ g_return_if_fail (cb != NULL);
+
+ info = g_new0 (HaveAddressInfo, 1);
+ info->email = g_strdup (email);
+ info->cb = cb;
+ info->closure = closure;
+
+ e_book_use_default_book (have_address_book_open_cb, info);
+}
+#endif
+
+/* bad place for this i know. */
+int
+e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len)
+{
+ gchar *s1 = g_utf8_casefold(str1, len);
+ gchar *s2 = g_utf8_casefold(str2, len);
+ int rv;
+
+ rv = g_utf8_collate (s1, s2);
+
+ g_free (s1);
+ g_free (s2);
+
+ return rv;
+}
+
+int
+e_utf8_casefold_collate (const gchar *str1, const gchar *str2)
+{
+ return e_utf8_casefold_collate_len (str1, str2, -1);
+}