summaryrefslogtreecommitdiff
path: root/libpurple/buddylist.c
diff options
context:
space:
mode:
authorAnkit Vani <a@nevitus.org>2014-05-04 06:28:56 +0530
committerAnkit Vani <a@nevitus.org>2014-05-04 06:28:56 +0530
commit9c29832d5d384b9b9c3857fdd48ef3b1bd14f159 (patch)
treed2f3a813bed6de9916fcf164515997bb8cc39eae /libpurple/buddylist.c
parent4853d88c813006332727da457a521c1dff7e45c2 (diff)
parentcfe29f717e55c4e17f91274a16ace77d95bb1b83 (diff)
downloadpidgin-9c29832d5d384b9b9c3857fdd48ef3b1bd14f159.tar.gz
Merged default branch
Diffstat (limited to 'libpurple/buddylist.c')
-rw-r--r--libpurple/buddylist.c99
1 files changed, 79 insertions, 20 deletions
diff --git a/libpurple/buddylist.c b/libpurple/buddylist.c
index 64875937de..d7fed7f43d 100644
--- a/libpurple/buddylist.c
+++ b/libpurple/buddylist.c
@@ -63,11 +63,27 @@ static GHashTable *groups_cache = NULL;
static guint save_timer = 0;
static gboolean blist_loaded = FALSE;
+static gchar *localized_default_group_name = NULL;
/*********************************************************************
* Private utility functions *
*********************************************************************/
+static gchar *
+purple_blist_fold_name(const gchar *name)
+{
+ gchar *res, *tmp;
+
+ if (name == NULL)
+ return NULL;
+
+ tmp = g_utf8_casefold(name, -1);
+ res = g_utf8_collate_key(tmp, -1);
+ g_free(tmp);
+
+ return res;
+}
+
static PurpleBlistNode *purple_blist_get_last_sibling(PurpleBlistNode *node)
{
PurpleBlistNode *n = node;
@@ -286,7 +302,8 @@ group_to_xmlnode(PurpleGroup *group)
PurpleBlistNode *cnode;
node = purple_xmlnode_new("group");
- purple_xmlnode_set_attrib(node, "name", purple_group_get_name(group));
+ if (group != purple_blist_get_default_group())
+ purple_xmlnode_set_attrib(node, "name", purple_group_get_name(group));
/* Write settings */
g_hash_table_foreach(purple_blist_node_get_settings(PURPLE_BLIST_NODE(group)),
@@ -346,12 +363,22 @@ blist_to_xmlnode(void)
PurpleXmlNode *node, *child, *grandchild;
PurpleBlistNode *gnode;
GList *cur;
+ const gchar *localized_default;
node = purple_xmlnode_new("purple");
purple_xmlnode_set_attrib(node, "version", "1.0");
/* Write groups */
child = purple_xmlnode_new_child(node, "blist");
+
+ localized_default = localized_default_group_name;
+ if (g_strcmp0(_("Buddies"), "Buddies") != 0)
+ localized_default = _("Buddies");
+ if (localized_default != NULL) {
+ purple_xmlnode_set_attrib(child,
+ "localized-default-group", localized_default);
+ }
+
for (gnode = purplebuddylist->root; gnode != NULL; gnode = gnode->next)
{
if (purple_blist_node_is_transient(gnode))
@@ -584,9 +611,6 @@ parse_group(PurpleXmlNode *groupnode)
PurpleGroup *group;
PurpleXmlNode *cnode;
- if (!name)
- name = _("Buddies");
-
group = purple_group_new(name);
purple_blist_add_group(group,
purple_blist_get_last_sibling(purplebuddylist->root));
@@ -619,10 +643,18 @@ load_blist(void)
blist = purple_xmlnode_get_child(purple, "blist");
if (blist) {
PurpleXmlNode *groupnode;
+
+ localized_default_group_name = g_strdup(
+ purple_xmlnode_get_attrib(blist,
+ "localized-default-group"));
+
for (groupnode = purple_xmlnode_get_child(blist, "group"); groupnode != NULL;
groupnode = purple_xmlnode_get_next_twin(groupnode)) {
parse_group(groupnode);
}
+ } else {
+ g_free(localized_default_group_name);
+ localized_default_group_name = NULL;
}
privacy = purple_xmlnode_get_child(purple, "privacy");
@@ -801,12 +833,14 @@ void purple_blist_update_buddies_cache(PurpleBuddy *buddy, const char *new_name)
void purple_blist_update_groups_cache(PurpleGroup *group, const char *new_name)
{
- gchar* key = g_utf8_collate_key(purple_group_get_name(group), -1);
+ gchar* key;
+
+ key = purple_blist_fold_name(purple_group_get_name(group));
g_hash_table_remove(groups_cache, key);
g_free(key);
- key = g_utf8_collate_key(new_name, -1);
- g_hash_table_insert(groups_cache, key, group);
+ g_hash_table_insert(groups_cache,
+ purple_blist_fold_name(new_name), group);
}
void purple_blist_add_chat(PurpleChat *chat, PurpleGroup *group, PurpleBlistNode *node)
@@ -930,7 +964,7 @@ void purple_blist_add_buddy(PurpleBuddy *buddy, PurpleContact *contact, PurpleGr
} else {
g = group;
if (g == NULL)
- g = purple_group_new(_("Buddies"));
+ g = purple_blist_get_default_group();
/* Add group to blist if isn't already on it. Fixes #2752. */
if (!purple_blist_find_group(purple_group_get_name(g))) {
purple_blist_add_group(g,
@@ -1074,14 +1108,8 @@ void purple_blist_add_contact(PurpleContact *contact, PurpleGroup *group, Purple
g = PURPLE_GROUP(node->parent);
else if (group)
g = group;
- else {
- g = purple_blist_find_group(_("Buddies"));
- if (g == NULL) {
- g = purple_group_new(_("Buddies"));
- purple_blist_add_group(g,
- purple_blist_get_last_sibling(purplebuddylist->root));
- }
- }
+ else
+ g = purple_blist_get_default_group();
gnode = (PurpleBlistNode*)g;
cnode = (PurpleBlistNode*)contact;
@@ -1242,7 +1270,7 @@ void purple_blist_add_group(PurpleGroup *group, PurpleBlistNode *node)
if (gnode->next)
gnode->next->prev = gnode->prev;
} else {
- key = g_utf8_collate_key(purple_group_get_name(group), -1);
+ key = purple_blist_fold_name(purple_group_get_name(group));
g_hash_table_insert(groups_cache, key, group);
}
@@ -1467,6 +1495,9 @@ void purple_blist_remove_group(PurpleGroup *group)
g_return_if_fail(PURPLE_IS_GROUP(group));
+ if (group == purple_blist_get_default_group())
+ purple_debug_warning("buddylist", "cannot remove default group");
+
node = (PurpleBlistNode *)group;
/* Make sure the group is empty */
@@ -1481,7 +1512,7 @@ void purple_blist_remove_group(PurpleGroup *group)
if (node->next)
node->next->prev = node->prev;
- key = g_utf8_collate_key(purple_group_get_name(group), -1);
+ key = purple_blist_fold_name(purple_group_get_name(group));
g_hash_table_remove(groups_cache, key);
g_free(key);
@@ -1600,15 +1631,35 @@ PurpleGroup *purple_blist_find_group(const char *name)
PurpleGroup *group;
g_return_val_if_fail(PURPLE_IS_BUDDY_LIST(purplebuddylist), NULL);
- g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL);
- key = g_utf8_collate_key(name, -1);
+ if (name == NULL || name[0] == '\0')
+ name = PURPLE_BLIST_DEFAULT_GROUP_NAME;
+ if (g_strcmp0(name, "Buddies") == 0)
+ name = PURPLE_BLIST_DEFAULT_GROUP_NAME;
+ if (g_strcmp0(name, localized_default_group_name) == 0)
+ name = PURPLE_BLIST_DEFAULT_GROUP_NAME;
+
+ key = purple_blist_fold_name(name);
group = g_hash_table_lookup(groups_cache, key);
g_free(key);
return group;
}
+PurpleGroup *
+purple_blist_get_default_group(void)
+{
+ PurpleGroup *group;
+
+ group = purple_blist_find_group(PURPLE_BLIST_DEFAULT_GROUP_NAME);
+ if (!group) {
+ group = purple_group_new(PURPLE_BLIST_DEFAULT_GROUP_NAME);
+ purple_blist_add_group(group, NULL);
+ }
+
+ return group;
+}
+
PurpleChat *
purple_blist_find_chat(PurpleAccount *account, const char *name)
{
@@ -1870,6 +1921,11 @@ purple_blist_get_ui_ops(void)
return blist_ui_ops;
}
+const gchar *
+_purple_blist_get_localized_default_group_name(void)
+{
+ return localized_default_group_name;
+}
void *
purple_blist_get_handle(void)
@@ -2010,6 +2066,9 @@ purple_blist_uninit(void)
g_object_unref(purplebuddylist);
purplebuddylist = NULL;
+ g_free(localized_default_group_name);
+ localized_default_group_name = NULL;
+
purple_signals_disconnect_by_handle(purple_blist_get_handle());
purple_signals_unregister_by_instance(purple_blist_get_handle());
}