aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/bbdb/bbdb.c
diff options
context:
space:
mode:
authorNat Friedman <nat@novell.com>2004-10-26 11:02:04 +0800
committerNat Friedman <nat@src.gnome.org>2004-10-26 11:02:04 +0800
commitb40eb4903c03a3025cc513c04da70209c099d0c3 (patch)
tree3206e437caa92677b78fac8c580c75891f74b5cd /plugins/bbdb/bbdb.c
parent58519e7cec5c94bc0c2064c260718565c0c6e489 (diff)
downloadgsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.tar
gsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.tar.gz
gsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.tar.bz2
gsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.tar.lz
gsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.tar.xz
gsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.tar.zst
gsoc2013-evolution-b40eb4903c03a3025cc513c04da70209c099d0c3.zip
Sync the Gaim buddy list. Set a timer to check for Gaim buddy list chnages
2004-10-25 Nat Friedman <nat@novell.com> * bbdb.c (e_plugin_lib_enable): Sync the Gaim buddy list. Set a timer to check for Gaim buddy list chnages to sync. (bbdb_do_it): Free some memory we were leaking before. (bbdb_open_addressbook): New function for Gaim buddy list support. (bbdb_check_gaim_enabled): Likewise. (enable_gaim_toggled_cb): Likewise. (synchronize_button_clicked_cb): Likewise. (bbdb_page_factory): Added UI for Gaim buddy list sync support. * gaimbuddies.c: New file, contains routines to synchronize IM information and buddy icons from a Gaim buddy list. * bbdb.h: New file, contains shared macros and prototypes. * test-evobuddy.c (main): New function, tests a gaim buddy list sync. svn path=/trunk/; revision=27723
Diffstat (limited to 'plugins/bbdb/bbdb.c')
-rw-r--r--plugins/bbdb/bbdb.c200
1 files changed, 163 insertions, 37 deletions
diff --git a/plugins/bbdb/bbdb.c b/plugins/bbdb/bbdb.c
index bc1b2cc4fe..66e56879f3 100644
--- a/plugins/bbdb/bbdb.c
+++ b/plugins/bbdb/bbdb.c
@@ -47,11 +47,10 @@
#include <mail/em-event.h>
#include <camel/camel-mime-message.h>
-/* Where to store the config values */
-#define GCONF_KEY_ENABLE "/apps/evolution/mail/autopopulate_addressbook"
-#define GCONF_KEY_WHICH_ADDRESSBOOK "/apps/evolution/mail/autopopulate_source"
+#include "bbdb.h"
/* Plugin hooks */
+int e_plugin_lib_enable (EPluginLib *ep, int enable);
void bbdb_handle_reply (EPlugin *ep, EMEventTargetMessage *target);
GtkWidget *bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data);
GtkWidget *bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data);
@@ -63,9 +62,11 @@ struct bbdb_stuff {
GtkWidget *option_menu;
GtkWidget *check;
+ GtkWidget *check_gaim;
};
/* Static forward declarations */
+static gboolean bbdb_timeout (gpointer data);
static void bbdb_do_it (EBook *book, const char *name, const char *email);
static void add_email_to_contact (EContact *contact, const char *email);
static void enable_toggled_cb (GtkWidget *widget, gpointer data);
@@ -73,7 +74,31 @@ static void source_changed_cb (GtkWidget *widget, ESource *source, gpointer data
static GtkWidget *create_addressbook_option_menu (struct bbdb_stuff *stuff);
static void cleanup_cb (GObject *o, gpointer data);
+int
+e_plugin_lib_enable (EPluginLib *ep, int enable)
+{
+ /* Start up the plugin. */
+ if (enable) {
+ fprintf (stderr, "BBDB spinning up...\n");
+
+ if (bbdb_check_gaim_enabled ())
+ bbdb_sync_buddy_list_check ();
+
+ g_timeout_add (BBDB_BLIST_CHECK_INTERVAL,
+ (GSourceFunc) bbdb_timeout,
+ NULL);
+ }
+ return 0;
+}
+
+static gboolean
+bbdb_timeout (gpointer data)
+{
+ bbdb_sync_buddy_list_check ();
+
+ return TRUE;
+}
/* Code to populate addressbook when you reply to a mail follows */
@@ -83,33 +108,11 @@ bbdb_handle_reply (EPlugin *ep, EMEventTargetMessage *target)
const CamelInternetAddress *cia;
const char *name;
const char *email;
- char *uri;
EBook *book = NULL;
int i;
- GConfClient *gconf;
-
- gboolean status;
- GError *error;
-
- gconf = gconf_client_get_default ();
- uri = gconf_client_get_string (gconf, GCONF_KEY_WHICH_ADDRESSBOOK, NULL);
- g_object_unref (G_OBJECT (gconf));
- if (uri == NULL)
- book = e_book_new_system_addressbook (&error);
- else
- book = e_book_new_from_uri (uri, &error);
- if (book == NULL) {
- g_warning ("bbdb: failed to open addressbook: %s\n", error->message);
- return;
- }
-
- status = e_book_open (book, FALSE, NULL);
-
- if (status == FALSE) {
- g_warning ("bbdb: failed to open local addressbook\n");
- return;
- }
+ /* Open the addressbook */
+ book = bbdb_open_addressbook ();
cia = camel_mime_message_get_from (target->message);
for (i = 0; i < camel_address_length CAMEL_ADDRESS (cia); i ++) {
@@ -143,7 +146,7 @@ bbdb_do_it (EBook *book, const char *name, const char *email)
{
char *query_string;
EBookQuery *query;
- GList *contacts;
+ GList *contacts, *l;
EContact *contact;
gboolean status;
@@ -166,8 +169,15 @@ bbdb_do_it (EBook *book, const char *name, const char *email)
g_free (query_string);
status = e_book_get_contacts (book, query, &contacts, NULL);
- if (contacts != NULL)
+ e_book_query_unref (query);
+ if (contacts != NULL) {
+ GList *l;
+ for (l = contacts; l != NULL; l = l->next)
+ g_object_unref ((GObject *)l->data);
+ g_list_free (contacts);
+
return;
+ }
/* If a contact exists with this name, add the email address to it. */
query_string = g_strdup_printf ("(is \"full_name\" \"%s\")", name);
@@ -175,17 +185,26 @@ bbdb_do_it (EBook *book, const char *name, const char *email)
g_free (query_string);
status = e_book_get_contacts (book, query, &contacts, NULL);
+ e_book_query_unref (query);
if (contacts != NULL) {
- /* If there's more than one contact with this name,
- just give up; we're not smart enough for this. */
+ /* FIXME: If there's more than one contact with this
+ name, just give up; we're not smart enough for
+ this. */
if (contacts->next != NULL)
return;
contact = (EContact *) contacts->data;
add_email_to_contact (contact, email);
- if (! e_book_commit_contact (book, contact, &error))
+ if (! e_book_commit_contact (book, contact, &error)) {
g_warning ("bbdb: Could not modify contact: %s\n", error->message);
+ g_error_free (error);
+ }
+
+ for (l = contacts; l != NULL; l = l->next)
+ g_object_unref ((GObject *)l->data);
+ g_list_free (contacts);
+
return;
}
@@ -196,8 +215,69 @@ bbdb_do_it (EBook *book, const char *name, const char *email)
if (! e_book_add_contact (book, contact, &error)) {
g_warning ("bbdb: Failed to add new contact: %s\n", error->message);
+ g_error_free (error);
return;
}
+
+ g_object_unref (G_OBJECT (contact));
+}
+
+EBook *
+bbdb_open_addressbook (void)
+{
+ GConfClient *gconf;
+ char *uri;
+ EBook *book = NULL;
+
+ gboolean enable;
+
+ gboolean status;
+ GError *error;
+
+ gconf = gconf_client_get_default ();
+
+ /* Check to see if we're supposed to be running */
+ enable = gconf_client_get_bool (gconf, GCONF_KEY_ENABLE, NULL);
+ if (! enable) {
+ g_object_unref (G_OBJECT (gconf));
+ return NULL;
+ }
+
+ /* Open the appropriate addresbook. */
+ uri = gconf_client_get_string (gconf, GCONF_KEY_WHICH_ADDRESSBOOK, NULL);
+ g_object_unref (G_OBJECT (gconf));
+ if (uri == NULL)
+ book = e_book_new_system_addressbook (&error);
+ else
+ book = e_book_new_from_uri (uri, &error);
+ if (book == NULL) {
+ g_warning ("bbdb: failed to get addressbook: %s\n", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ status = e_book_open (book, FALSE, &error);
+ if (! status) {
+ g_warning ("bbdb: failed to open addressbook: %s\n", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ return book;
+}
+
+gboolean
+bbdb_check_gaim_enabled ()
+{
+ GConfClient *gconf;
+ gboolean gaim_enabled;
+
+ gconf = gconf_client_get_default ();
+ gaim_enabled = gconf_client_get_bool (gconf, GCONF_KEY_ENABLE_GAIM, NULL);
+
+ g_object_unref (G_OBJECT (gconf));
+
+ return gaim_enabled;
}
static void
@@ -229,6 +309,24 @@ enable_toggled_cb (GtkWidget *widget, gpointer data)
}
static void
+enable_gaim_toggled_cb (GtkWidget *widget, gpointer data)
+{
+ struct bbdb_stuff *stuff = (struct bbdb_stuff *) data;
+ gboolean active;
+
+ active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+
+ /* Save the new setting to gconf */
+ gconf_client_set_bool (stuff->target->gconf, GCONF_KEY_ENABLE_GAIM, active, NULL);
+}
+
+static void
+synchronize_button_clicked_cb (GtkWidget *button)
+{
+ bbdb_sync_buddy_list ();
+}
+
+static void
source_changed_cb (GtkWidget *widget, ESource *source, gpointer data)
{
struct bbdb_stuff *stuff = (struct bbdb_stuff *) data;
@@ -276,6 +374,8 @@ bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data)
GtkWidget *inner_vbox;
GtkWidget *check;
GtkWidget *option;
+ GtkWidget *check_gaim;
+ GtkWidget *button;
/* A structure to pass some stuff around */
stuff = g_new0 (struct bbdb_stuff, 1);
@@ -289,9 +389,9 @@ bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data)
/* Frame */
frame = gtk_vbox_new (FALSE, 6);
- gtk_box_pack_start (GTK_BOX (page), frame, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
- /* Label */
+ /* "Automatic Contacts" */
frame_label = gtk_label_new ("");
gtk_label_set_markup (GTK_LABEL (frame_label), _("<span weight=\"bold\">Automatic Contacts</span>"));
GTK_MISC (frame_label)->xalign = 0.0;
@@ -319,6 +419,35 @@ bbdb_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data)
gtk_box_pack_start (GTK_BOX (inner_vbox), option, FALSE, FALSE, 0);
stuff->option_menu = option;
+ /* "Instant Messaging Contacts" */
+ frame = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (page), frame, TRUE, TRUE, 24);
+
+ frame_label = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL (frame_label), _("<span weight=\"bold\">Instant Messaging Contacts</span>"));
+ GTK_MISC (frame_label)->xalign = 0.0;
+ gtk_box_pack_start (GTK_BOX (frame), frame_label, FALSE, FALSE, 0);
+
+ /* Indent/padding */
+ hbox = gtk_hbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (frame), hbox, FALSE, TRUE, 0);
+ padding_label = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), padding_label, FALSE, FALSE, 0);
+ inner_vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (hbox), inner_vbox, FALSE, FALSE, 0);
+
+ /* Enable Gaim Checkbox */
+ check_gaim = gtk_check_button_new_with_mnemonic (_("Periodically synchronize contact information and images from my _instant messenger"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_gaim), gconf_client_get_bool (target->gconf, GCONF_KEY_ENABLE_GAIM, NULL));
+ g_signal_connect (GTK_TOGGLE_BUTTON (check_gaim), "toggled", G_CALLBACK (enable_gaim_toggled_cb), stuff);
+ gtk_box_pack_start (GTK_BOX (inner_vbox), check_gaim, FALSE, FALSE, 0);
+ stuff->check_gaim = check_gaim;
+
+ /* Synchronize now button. */
+ button = gtk_button_new_with_label (_("Synchronize with _buddy list now"));
+ g_signal_connect (GTK_BUTTON (button), "clicked", G_CALLBACK (synchronize_button_clicked_cb), stuff);
+ gtk_box_pack_start (GTK_BOX (inner_vbox), button, FALSE, FALSE, 0);
+
/* Clean up */
g_signal_connect (page, "destroy", G_CALLBACK (cleanup_cb), stuff);
@@ -335,6 +464,3 @@ cleanup_cb (GObject *o, gpointer data)
g_object_unref (stuff->source_list);
g_free (stuff);
}
-
-
-