aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/merging/eab-contact-merging.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/gui/merging/eab-contact-merging.c')
-rw-r--r--addressbook/gui/merging/eab-contact-merging.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c
new file mode 100644
index 0000000000..38a3c188b2
--- /dev/null
+++ b/addressbook/gui/merging/eab-contact-merging.c
@@ -0,0 +1,197 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Code for checking for duplicates when doing EContact work.
+ *
+ * Authors:
+ * Christopher James Lahey <clahey@ximian.com>
+ * Chris Toshok <toshok@ximian.com>
+ *
+ * Copyright (C) 2001, 2002, 2003, Ximian, Inc.
+ */
+
+#include <config.h>
+
+#include "eab-contact-merging.h"
+#include "eab-contact-compare.h"
+#include <glade/glade.h>
+#include <gtk/gtksignal.h>
+#include "addressbook/gui/widgets/eab-contact-display.h"
+
+typedef enum {
+ E_CONTACT_MERGING_ADD,
+ E_CONTACT_MERGING_COMMIT
+} EContactMergingOpType;
+
+typedef struct {
+ EContactMergingOpType op;
+ EBook *book;
+ EContact *contact;
+ EBookIdCallback id_cb;
+ EBookCallback cb;
+ gpointer closure;
+} EContactMergingLookup;
+
+static void
+free_lookup (EContactMergingLookup *lookup)
+{
+ g_object_unref (lookup->book);
+ g_object_unref (lookup->contact);
+
+ g_free (lookup);
+}
+
+static void
+final_id_cb (EBook *book, EBookStatus status, const char *id, gpointer closure)
+{
+ EContactMergingLookup *lookup = closure;
+
+ if (lookup->id_cb)
+ lookup->id_cb (lookup->book, status, id, lookup->closure);
+
+ free_lookup (lookup);
+}
+
+static void
+final_cb (EBook *book, EBookStatus status, gpointer closure)
+{
+ EContactMergingLookup *lookup = closure;
+
+ if (lookup->cb)
+ lookup->cb (lookup->book, status, lookup->closure);
+
+ free_lookup (lookup);
+}
+
+static void
+doit (EContactMergingLookup *lookup)
+{
+ if (lookup->op == E_CONTACT_MERGING_ADD)
+ e_book_async_add_contact (lookup->book, lookup->contact, final_id_cb, lookup);
+ else if (lookup->op == E_CONTACT_MERGING_COMMIT)
+ e_book_async_commit_contact (lookup->book, lookup->contact, final_cb, lookup);
+}
+
+static void
+cancelit (EContactMergingLookup *lookup)
+{
+ if (lookup->op == E_CONTACT_MERGING_ADD) {
+ if (lookup->id_cb)
+ final_id_cb (lookup->book, E_BOOK_ERROR_CANCELLED, NULL, lookup);
+ } else if (lookup->op == E_CONTACT_MERGING_COMMIT) {
+ if (lookup->cb)
+ final_cb (lookup->book, E_BOOK_ERROR_CANCELLED, lookup);
+ }
+}
+
+static void
+response (GtkWidget *dialog, int response, EContactMergingLookup *lookup)
+{
+ gtk_widget_destroy (dialog);
+
+ switch (response) {
+ case 0:
+ doit (lookup);
+ break;
+ case 1:
+ cancelit (lookup);
+ break;
+ }
+}
+
+static void
+match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure)
+{
+ EContactMergingLookup *lookup = closure;
+
+ if ((gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE) {
+ doit (lookup);
+ } else {
+ GladeXML *ui;
+
+ GtkWidget *widget;
+
+ if (lookup->op == E_CONTACT_MERGING_ADD)
+ ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-duplicate-detected.glade", NULL, NULL);
+ else if (lookup->op == E_CONTACT_MERGING_COMMIT)
+ ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-merging-commit-duplicate-detected.glade", NULL, NULL);
+ else {
+ doit (lookup);
+ return;
+ }
+
+ widget = glade_xml_get_widget (ui, "custom-old-contact");
+ eab_contact_display_render (EAB_CONTACT_DISPLAY (widget),
+ match, EAB_CONTACT_DISPLAY_RENDER_COMPACT);
+
+ widget = glade_xml_get_widget (ui, "custom-new-contact");
+ eab_contact_display_render (EAB_CONTACT_DISPLAY (widget),
+ contact, EAB_CONTACT_DISPLAY_RENDER_COMPACT);
+
+ widget = glade_xml_get_widget (ui, "dialog-duplicate-contact");
+
+ g_signal_connect (widget, "response",
+ G_CALLBACK (response), lookup);
+
+ gtk_widget_show_all (widget);
+ }
+}
+
+gboolean
+eab_merging_book_add_contact (EBook *book,
+ EContact *contact,
+ EBookIdCallback cb,
+ gpointer closure)
+{
+ EContactMergingLookup *lookup;
+
+ lookup = g_new (EContactMergingLookup, 1);
+
+ lookup->op = E_CONTACT_MERGING_ADD;
+ lookup->book = g_object_ref (book);
+ lookup->contact = g_object_ref (contact);
+ lookup->id_cb = cb;
+ lookup->closure = closure;
+
+ eab_contact_locate_match_full (book, contact, NULL, match_query_callback, lookup);
+
+ return TRUE;
+}
+
+gboolean
+eab_merging_book_commit_contact (EBook *book,
+ EContact *contact,
+ EBookCallback cb,
+ gpointer closure)
+{
+ EContactMergingLookup *lookup;
+ GList *avoid;
+
+ lookup = g_new (EContactMergingLookup, 1);
+
+ lookup->op = E_CONTACT_MERGING_COMMIT;
+ lookup->book = g_object_ref (book);
+ lookup->contact = g_object_ref (contact);
+ lookup->cb = cb;
+ lookup->closure = closure;
+
+ avoid = g_list_append (NULL, contact);
+
+ eab_contact_locate_match_full (book, contact, avoid, match_query_callback, lookup);
+
+ g_list_free (avoid);
+
+ return TRUE;
+}
+
+GtkWidget *
+_eab_contact_merging_create_contact_display(gchar *name,
+ gchar *string1, gchar *string2,
+ gint int1, gint int2);
+
+GtkWidget *
+_eab_contact_merging_create_contact_display(gchar *name,
+ gchar *string1, gchar *string2,
+ gint int1, gint int2)
+{
+ return eab_contact_display_new();
+}