static gboolean ggp_roster_send_update_group_rename(PurpleConnection *gc, ggp_roster_change *change) { PurpleAccount *account = purple_connection_get_account(gc); ggp_roster_content *content = ggp_roster_get_rdata(gc)->content; const char *old_name = change->data.group_rename.old_name; const char *new_name = change->data.group_rename.new_name; PurpleXmlNode *group_node; const char *group_id; g_return_val_if_fail(change->type == GGP_ROSTER_CHANGE_GROUP_RENAME, FALSE); purple_debug_misc("gg", "ggp_roster_send_update_group_rename: " "\"%s\"->\"%s\"\n", old_name, new_name); /* moving to or from default group instead of renaming it */ if (0 == g_strcmp0(old_name, GGP_PURPLEW_GROUP_DEFAULT) || 0 == g_strcmp0(new_name, GGP_PURPLEW_GROUP_DEFAULT)) { PurpleGroup *group; GList *group_buddies; group = purple_blist_find_group(new_name); if (!group) return TRUE; purple_debug_info("gg", "ggp_roster_send_update_group_rename: " "invalidating buddies in default group\n"); group_buddies = ggp_purplew_group_get_buddies(group, account); while (group_buddies) { ggp_roster_set_synchronized(gc, group_buddies->data, FALSE); group_buddies = g_list_remove_link(group_buddies, group_buddies); } return TRUE; } group_id = g_hash_table_lookup(content->group_ids, old_name); if (!group_id) { purple_debug_info("gg", "ggp_roster_send_update_group_rename: " "%s is not present at roster\n", old_name); return TRUE; } group_node = g_hash_table_lookup(content->group_nodes, group_id); if (!group_node) { purple_debug_error("gg", "ggp_roster_send_update_group_rename: " "node for %s not found, id=%s\n", old_name, group_id); g_hash_table_remove(content->group_ids, old_name); return TRUE; } g_hash_table_remove(content->group_ids, old_name); g_hash_table_insert(content->group_ids, g_strdup(new_name), g_strdup(group_id)); g_hash_table_insert(content->group_nodes, g_strdup(group_id), group_node); return ggp_xml_set_string(group_node, "Name", new_name); }
static gpointer nested_group_find_parent(PurpleBlistNode *node) { char *name; PurpleGroup *group; char *sep; PurpleBlistNode *ret, *parent; GntTree *tree; if (!PURPLE_IS_GROUP(node)) return default_manager->find_parent(node); group = PURPLE_GROUP(node); name = g_strdup(purple_group_get_name(group)); if (!(sep = strchr(name, '/'))) { g_free(name); return default_manager->find_parent(node); } tree = finch_blist_get_tree(); parent = NULL; while (sep) { *sep = 0; if (*(sep + 1) && (ret = PURPLE_BLIST_NODE(purple_blist_find_group(name)))) { finch_blist_manager_add_node(ret); parent = ret; } else if (!(ret = g_hash_table_lookup(groups, name))) { ret = g_object_new(FINCH_TYPE_GROUPING_NODE, NULL); g_hash_table_insert(groups, g_strdup(name), ret); gnt_tree_add_row_last(tree, ret, gnt_tree_create_row(tree, name), parent); parent = ret; } *sep = '/'; sep = strchr(sep + 1, '/'); } g_free(name); return ret; }
/* void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) {{{ */ void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) { PurpleBuddy *buddy; PurpleGroup *group; gchar **users_tbl; int i; char *utf8buddylist = ggp_convert_from_cp1250(buddylist); /* Don't limit the number of records in a buddylist. */ users_tbl = g_strsplit(utf8buddylist, "\r\n", -1); for (i = 0; users_tbl[i] != NULL; i++) { gchar **data_tbl; gchar *name, *show, *g; if (!*users_tbl[i]) continue; data_tbl = g_strsplit(users_tbl[i], ";", 8); if (g_strv_length(data_tbl) < 8) { purple_debug_warning("gg", "Something is wrong on line %d of the buddylist. Skipping.\n", i + 1); continue; } show = data_tbl[F_NICKNAME]; name = data_tbl[F_UIN]; if ('\0' == *name || !atol(name)) { purple_debug_warning("gg", "Identifier on line %d of the buddylist is not a number. Skipping.\n", i + 1); continue; } if ('\0' == *show) { show = name; } purple_debug_info("gg", "got buddy: name=%s; show=%s\n", name, show); if (purple_blist_find_buddy(purple_connection_get_account(gc), name)) { g_strfreev(data_tbl); continue; } g = g_strdup("Gadu-Gadu"); if ('\0' != data_tbl[F_GROUP]) { /* XXX: Probably buddy should be added to all the groups. */ /* Hard limit to at most 50 groups */ gchar **group_tbl = g_strsplit(data_tbl[F_GROUP], ",", 50); if (g_strv_length(group_tbl) > 0) { g_free(g); g = g_strdup(group_tbl[0]); } g_strfreev(group_tbl); } buddy = purple_buddy_new(purple_connection_get_account(gc), name, strlen(show) ? show : NULL); if (!(group = purple_blist_find_group(g))) { group = purple_group_new(g); purple_blist_add_group(group, NULL); } purple_blist_add_buddy(buddy, NULL, group, NULL); g_free(g); g_strfreev(data_tbl); } g_strfreev(users_tbl); g_free(utf8buddylist); ggp_buddylist_send(gc); }
static void skypeweb_get_friend_list_cb(SkypeWebAccount *sa, JsonNode *node, gpointer user_data) { JsonObject *obj; JsonArray *contacts; PurpleGroup *group = NULL; GSList *users_to_fetch = NULL; guint index, length; obj = json_node_get_object(node); contacts = json_object_get_array_member(obj, "contacts"); length = json_array_get_length(contacts); for(index = 0; index < length; index++) { JsonObject *contact = json_array_get_object_element(contacts, index); const gchar *id = json_object_get_string_member(contact, "id"); const gchar *display_name = json_object_get_string_member(contact, "display_name"); const gchar *avatar_url = NULL; gboolean authorized = json_object_get_boolean_member(contact, "authorized"); gboolean blocked = json_object_get_boolean_member(contact, "blocked"); const gchar *type = json_object_get_string_member(contact, "type"); JsonObject *name = json_object_get_object_member(contact, "name"); const gchar *firstname = json_object_get_string_member(name, "first"); const gchar *surname = NULL; PurpleBuddy *buddy; //TODO make this work for "pstn" if (!g_str_equal(type, "skype") && !g_str_equal(type, "msn")) continue; if (json_object_has_member(contact, "suggested") && json_object_get_boolean_member(contact, "suggested") && !authorized) { // suggested buddies wtf? some kind of advertising? continue; } buddy = purple_find_buddy(sa->account, id); if (!buddy) { if (!group) { group = purple_blist_find_group("Skype"); if (!group) { group = purple_group_new("Skype"); purple_blist_add_group(group, NULL); } } buddy = purple_buddy_new(sa->account, id, display_name); purple_blist_add_buddy(buddy, NULL, group, NULL); } if (json_object_has_member(name, "surname")) surname = json_object_get_string_member(name, "surname"); // try to free the sbuddy here. no-op if it's not set before, otherwise prevents a leak. skypeweb_buddy_free(buddy); SkypeWebBuddy *sbuddy = g_new0(SkypeWebBuddy, 1); sbuddy->skypename = g_strdup(id); sbuddy->sa = sa; sbuddy->fullname = g_strconcat(firstname, (surname ? " " : NULL), surname, NULL); sbuddy->display_name = g_strdup(display_name); sbuddy->authorized = authorized; sbuddy->blocked = blocked; sbuddy->avatar_url = g_strdup(purple_buddy_icons_get_checksum_for_user(buddy)); sbuddy->buddy = buddy; purple_buddy_set_protocol_data(buddy, sbuddy); purple_serv_got_alias(sa->pc, id, sbuddy->display_name); purple_blist_server_alias_buddy(buddy, sbuddy->fullname); if (json_object_has_member(contact, "avatar_url")) { avatar_url = json_object_get_string_member(contact, "avatar_url"); if (avatar_url && *avatar_url && (!sbuddy->avatar_url || !g_str_equal(sbuddy->avatar_url, avatar_url))) { g_free(sbuddy->avatar_url); sbuddy->avatar_url = g_strdup(avatar_url); skypeweb_get_icon(buddy); } } if (blocked == TRUE) { purple_privacy_deny_add(sa->account, id, TRUE); } else { users_to_fetch = g_slist_prepend(users_to_fetch, sbuddy->skypename); } } if (users_to_fetch) { //skypeweb_get_friend_profiles(sa, users_to_fetch); skypeweb_subscribe_to_contact_status(sa, users_to_fetch); g_slist_free(users_to_fetch); } }
static gboolean ggp_roster_reply_list_read_buddy(PurpleConnection *gc, PurpleXmlNode *node, ggp_roster_content *content, GHashTable *remove_buddies) { gchar *alias, *group_name = NULL; uin_t uin; gboolean succ = TRUE; PurpleXmlNode *group_list, *group_elem; PurpleBuddy *buddy = NULL; PurpleGroup *group = NULL; PurpleGroup *currentGroup; gboolean alias_changed; PurpleAccount *account = purple_connection_get_account(gc); succ &= ggp_xml_get_string(node, "ShowName", &alias); succ &= ggp_xml_get_uint(node, "GGNumber", &uin); group_list = purple_xmlnode_get_child(node, "Groups"); succ &= (group_list != NULL); if (!succ) { g_free(alias); g_return_val_if_reached(FALSE); } g_hash_table_insert(content->contact_nodes, GINT_TO_POINTER(uin), node); /* check, if alias is set */ if (strlen(alias) == 0 || strcmp(alias, ggp_uin_to_str(uin)) == 0) { g_free(alias); alias = NULL; } /* getting (eventually creating) group */ group_elem = purple_xmlnode_get_child(group_list, "GroupId"); while (group_elem != NULL) { gchar *id; gboolean isbot; if (!ggp_xml_get_string(group_elem, NULL, &id)) continue; isbot = (0 == g_strcmp0(id, content->bots_group_id)); group_name = g_hash_table_lookup(content->group_names, id); g_free(id); /* we don't want to import bots; * they are inserted to roster by default */ if (isbot) { g_free(alias); return TRUE; } if (group_name != NULL) break; group_elem = purple_xmlnode_get_next_twin(group_elem); } if (group_name) { group = purple_blist_find_group(group_name); if (!group) { group = purple_group_new(group_name); purple_blist_add_group(group, NULL); } } /* add buddy, if doesn't exists */ buddy = purple_blist_find_buddy(account, ggp_uin_to_str(uin)); g_hash_table_remove(remove_buddies, GINT_TO_POINTER(uin)); if (!buddy) { purple_debug_info("gg", "ggp_roster_reply_list_read_buddy: " "adding %u (%s) to buddy list\n", uin, alias); buddy = purple_buddy_new(account, ggp_uin_to_str(uin), alias); purple_blist_add_buddy(buddy, NULL, group, NULL); ggp_roster_set_synchronized(gc, buddy, TRUE); g_free(alias); return TRUE; } /* buddy exists, but is not synchronized - local list has priority */ if (!ggp_roster_is_synchronized(buddy)) { purple_debug_misc("gg", "ggp_roster_reply_list_read_buddy: " "ignoring not synchronized %u (%s)\n", uin, purple_buddy_get_name(buddy)); g_free(alias); return TRUE; } currentGroup = ggp_purplew_buddy_get_group_only(buddy); alias_changed = (0 != g_strcmp0(alias, purple_buddy_get_alias_only(buddy))); if (currentGroup == group && !alias_changed) { g_free(alias); return TRUE; } purple_debug_misc("gg", "ggp_roster_reply_list_read_buddy: " "updating %u (%s) - alias=\"%s\"->\"%s\", group=%p->%p (%s)\n", uin, purple_buddy_get_name(buddy), purple_buddy_get_alias(buddy), alias, currentGroup, group, group_name); if (alias_changed) purple_buddy_set_local_alias(buddy, alias); if (currentGroup != group) purple_blist_add_buddy(buddy, NULL, group, NULL); g_free(alias); return TRUE; }
static void skypeweb_get_friend_list_cb(SkypeWebAccount *sa, JsonNode *node, gpointer user_data) { JsonArray *friends; PurpleGroup *group = NULL; GSList *users_to_fetch = NULL; gint index, length; friends = json_node_get_array(node); length = json_array_get_length(friends); for(index = 0; index < length; index++) { JsonObject *friend = json_array_get_object_element(friends, index); const gchar *skypename = json_object_get_string_member(friend, "skypename"); const gchar *fullname = json_object_get_string_member(friend, "fullname"); const gchar *display_name = json_object_get_string_member(friend, "display_name"); gboolean authorized = json_object_get_boolean_member(friend, "authorized"); gboolean blocked = json_object_get_boolean_member(friend, "blocked"); PurpleBuddy *buddy; buddy = purple_find_buddy(sa->account, skypename); if (!buddy) { if (!group) { group = purple_blist_find_group("Skype"); if (!group) { group = purple_group_new("Skype"); purple_blist_add_group(group, NULL); } } buddy = purple_buddy_new(sa->account, skypename, display_name); purple_blist_add_buddy(buddy, NULL, group, NULL); } SkypeWebBuddy *sbuddy = g_new0(SkypeWebBuddy, 1); sbuddy->skypename = g_strdup(skypename); sbuddy->sa = sa; sbuddy->fullname = g_strdup(fullname); sbuddy->display_name = g_strdup(display_name); sbuddy->authorized = authorized; sbuddy->blocked = blocked; sbuddy->buddy = buddy; purple_buddy_set_protocol_data(buddy, sbuddy); purple_serv_got_alias(sa->pc, skypename, sbuddy->display_name); purple_blist_server_alias_buddy(buddy, fullname); users_to_fetch = g_slist_prepend(users_to_fetch, sbuddy->skypename); } if (users_to_fetch) { skypeweb_get_friend_profiles(sa, users_to_fetch); skypeweb_subscribe_to_contact_status(sa, users_to_fetch); g_slist_free(users_to_fetch); } }