/* -*- 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 * Chris Toshok * * Copyright (C) 2001, 2002, 2003, Ximian, Inc. */ #include #include "eab-contact-merging.h" #include "eab-contact-compare.h" #include #include #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-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(); }