aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/bbdb/ChangeLog8
-rw-r--r--plugins/bbdb/gaimbuddies.c82
2 files changed, 68 insertions, 22 deletions
diff --git a/plugins/bbdb/ChangeLog b/plugins/bbdb/ChangeLog
index ec60ac74a9..18b7b6afbc 100644
--- a/plugins/bbdb/ChangeLog
+++ b/plugins/bbdb/ChangeLog
@@ -1,3 +1,11 @@
+2008-01-10 Milan Crha <mcrha@redhat.com>
+
+ ** Fix for bug #496402
+
+ * gaimbuddies.c: (parse_buddy_group), (get_all_blocked),
+ (bbdb_get_gaim_buddy_list), (free_gaim_body), (free_buddy_list),
+ (parse_buddy_group): Do not synchronize blocked bodies from pidgin.
+
2008-01-02 Milan Crha <mcrha@redhat.com>
** Fix for bug #502914
diff --git a/plugins/bbdb/gaimbuddies.c b/plugins/bbdb/gaimbuddies.c
index e9d69a5cbe..b4d7142f23 100644
--- a/plugins/bbdb/gaimbuddies.c
+++ b/plugins/bbdb/gaimbuddies.c
@@ -69,9 +69,8 @@ static gboolean bbdb_merge_buddy_to_contact (EBook *book, GaimBuddy *b, EContact
static GList *bbdb_get_gaim_buddy_list (void);
static char *get_node_text (xmlNodePtr node);
static char *get_buddy_icon_from_setting (xmlNodePtr setting);
-static char *get_node_text (xmlNodePtr node);
static void free_buddy_list (GList *blist);
-static void parse_buddy_group (xmlNodePtr group, GList **buddies);
+static void parse_buddy_group (xmlNodePtr group, GList **buddies, GSList *blocked);
static EContactField proto_to_contact_field (const char *proto);
void
@@ -293,6 +292,27 @@ proto_to_contact_field (const char *proto)
return E_CONTACT_IM_AIM;
}
+static void
+get_all_blocked (xmlNodePtr node, GSList **blocked)
+{
+ xmlNodePtr child;
+
+ if (!node || !blocked)
+ return;
+
+ for (child = node->children; child; child = child->next) {
+ if (child->children)
+ get_all_blocked (child, blocked);
+
+ if (!strcmp ((const char *)child->name, "block")) {
+ char *name = get_node_text (child);
+
+ if (name)
+ *blocked = g_slist_prepend (*blocked, name);
+ }
+ }
+}
+
static GList *
bbdb_get_gaim_buddy_list (void)
{
@@ -300,6 +320,7 @@ bbdb_get_gaim_buddy_list (void)
xmlDocPtr buddy_xml;
xmlNodePtr root, child, blist;
GList *buddies = NULL;
+ GSList *blocked = NULL;
blist_path = g_build_path ("/", getenv ("HOME"), ".purple/blist.xml", NULL);
@@ -317,6 +338,13 @@ bbdb_get_gaim_buddy_list (void)
return NULL;
}
+ for (child = root->children; child != NULL; child = child->next) {
+ if (! strcmp ((const char *)child->name, "privacy")) {
+ get_all_blocked (child, &blocked);
+ break;
+ }
+ }
+
blist = NULL;
for (child = root->children; child != NULL; child = child->next) {
if (! strcmp ((const char *)child->name, "blist")) {
@@ -332,30 +360,35 @@ bbdb_get_gaim_buddy_list (void)
for (child = blist->children; child != NULL; child = child->next) {
if (! strcmp ((const char *)child->name, "group"))
- parse_buddy_group (child, &buddies);
+ parse_buddy_group (child, &buddies, blocked);
}
xmlFreeDoc (buddy_xml);
+ g_slist_foreach (blocked, (GFunc)g_free, NULL);
+ g_slist_free (blocked);
+
return buddies;
}
static void
-free_buddy_list (GList *blist)
+free_gaim_body (GaimBuddy *gb)
{
- GList *l;
-
- for (l = blist; l != NULL; l = l->next) {
- GaimBuddy *gb = l->data;
+ if (!gb)
+ return;
- g_free (gb->icon);
- g_free (gb->alias);
- g_free (gb->account_name);
- g_free (gb->proto);
- g_free (gb);
- }
+ g_free (gb->icon);
+ g_free (gb->alias);
+ g_free (gb->account_name);
+ g_free (gb->proto);
+ g_free (gb);
+}
- g_list_free (l);
+static void
+free_buddy_list (GList *blist)
+{
+ g_list_foreach (blist, (GFunc)free_gaim_body, NULL);
+ g_list_free (blist);
}
static char *
@@ -387,11 +420,12 @@ get_buddy_icon_from_setting (xmlNodePtr setting)
}
static void
-parse_contact (xmlNodePtr contact, GList **buddies)
+parse_contact (xmlNodePtr contact, GList **buddies, GSList *blocked)
{
xmlNodePtr child;
xmlNodePtr buddy = NULL;
GaimBuddy *gb;
+ gboolean is_blocked = FALSE;
for (child = contact->children; child != NULL; child = child->next) {
if (! strcmp ((const char *)child->name, "buddy")) {
@@ -409,7 +443,7 @@ parse_contact (xmlNodePtr contact, GList **buddies)
gb->proto = e_xml_get_string_prop_by_name (buddy, (const unsigned char *)"proto");
- for (child = buddy->children; child != NULL; child = child->next) {
+ for (child = buddy->children; child != NULL && !is_blocked; child = child->next) {
if (! strcmp ((const char *)child->name, "setting")) {
char *setting_type;
setting_type = e_xml_get_string_prop_by_name (child, (const unsigned char *)"name");
@@ -418,18 +452,22 @@ parse_contact (xmlNodePtr contact, GList **buddies)
gb->icon = get_buddy_icon_from_setting (child);
g_free (setting_type);
- } else if (! strcmp ((const char *)child->name, "name"))
+ } else if (! strcmp ((const char *)child->name, "name")) {
gb->account_name = get_node_text (child);
- else if (! strcmp ((const char *)child->name, "alias"))
+ is_blocked = g_slist_find_custom (blocked, gb->account_name, (GCompareFunc)strcmp) != NULL;
+ } else if (! strcmp ((const char *)child->name, "alias"))
gb->alias = get_node_text (child);
}
- *buddies = g_list_prepend (*buddies, gb);
+ if (is_blocked)
+ free_gaim_body (gb);
+ else
+ *buddies = g_list_prepend (*buddies, gb);
}
static void
-parse_buddy_group (xmlNodePtr group, GList **buddies)
+parse_buddy_group (xmlNodePtr group, GList **buddies, GSList *blocked)
{
xmlNodePtr child;
@@ -437,6 +475,6 @@ parse_buddy_group (xmlNodePtr group, GList **buddies)
if (strcmp ((const char *)child->name, "contact"))
continue;
- parse_contact (child, buddies);
+ parse_contact (child, buddies, blocked);
}
}