static void fetion_unsubscribe(char *name, struct fetion_buddy *buddy, struct fetion_account_data *sip) { if (buddy->dialog) { purple_debug_info("fetion", "Unsubscribing from %s\n", name); fetion_subscribe_exp(sip, buddy); } }
gboolean AddBuddy_cb(struct fetion_account_data *sip, struct sipmsg *msg, struct transaction *tc) { xmlnode *root,*item; const gchar *uri, *name ,*group_id; struct group_attr *g_attr; gchar *buddy_name; PurpleBuddy *b; PurpleGroup *g = NULL; struct fetion_buddy *bs; if(msg->response != 522) { root = xmlnode_from_str(msg->body, msg->bodylen); item = xmlnode_get_child(root,"contacts/buddies/buddy"); g_return_val_if_fail(item!=NULL,FALSE); uri = xmlnode_get_attrib(item, "uri"); name = xmlnode_get_attrib(item, "local-name"); group_id = xmlnode_get_attrib(item, "buddy-lists"); buddy_name = g_strdup_printf("%s", uri); g_attr = g_hash_table_lookup(sip->group,group_id); if(g_attr==NULL) { g = purple_find_group("未分组"); if(!g) g = purple_group_new("未分组"); } else { g = purple_find_group(g_attr->name); if(!g) g = purple_group_new(g_attr->name); } b = purple_find_buddy(sip->account, buddy_name); if(!b){ b = purple_buddy_new(sip->account, buddy_name, NULL); } g_free(buddy_name); purple_blist_add_buddy(b, NULL, g, NULL); if(name!=NULL && *name!='\0') purple_blist_alias_buddy(b, name); bs = g_new0(struct fetion_buddy, 1); bs->name = g_strdup(b->name); g_hash_table_insert(sip->buddies, bs->name, bs); fetion_subscribe_exp(sip,bs); }
gboolean GetContactList_cb(struct fetion_account_data *sip, struct sipmsg *msg, struct transaction *tc) { xmlnode *item, *group, *isc; const gchar *name_group, *group_id; PurpleBuddy *b; PurpleGroup *g = NULL; struct fetion_buddy *bs; struct group_attr *g_attr; gint len = msg->bodylen; purple_debug(PURPLE_DEBUG_MISC, "fetion", "in process GetContactList response response: %d\n", msg->response); switch (msg->response) { case 200: /*Convert the contact from XML to Purple Buddies */ isc = xmlnode_from_str(msg->body, len); purple_debug_info("fetion:", "after xmlnode to str\n"); group = xmlnode_get_child(isc, "contacts/buddy-lists"); g_return_val_if_fail(group != NULL, FALSE); /* ToDo. Find for all groups */ sip->GetContactFlag = 1; for ((group = xmlnode_get_child(group, "buddy-list")); group; group = xmlnode_get_next_twin(group)) { purple_debug_info("fetion:", "buddy-list\n"); name_group = xmlnode_get_attrib(group, "name"); group_id = xmlnode_get_attrib(group, "id"); g_return_val_if_fail(name_group != NULL, FALSE); purple_debug_info("fetion", "name_group->%s\n", name_group); g = purple_find_group(name_group); if (!g) { g = purple_group_new(name_group); } g_attr = g_new0(struct group_attr, 1); g_attr->name = g_strdup(name_group); g_attr->id = g_strdup(group_id); g_hash_table_insert(sip->group, g_attr->id, g_attr); g_hash_table_insert(sip->group2id, g_attr->name, g_attr); } group = xmlnode_get_child(isc, "contacts/buddies"); g_return_val_if_fail(group != NULL, FALSE); for (item = xmlnode_get_child(group, "buddy"); item; item = xmlnode_get_next_twin(item)) { const gchar *uri, *name; char *buddy_name; const gchar *g_id; uri = xmlnode_get_attrib(item, "uri"); name = xmlnode_get_attrib(item, "local-name"); g_id = xmlnode_get_attrib(item, "buddy-lists"); buddy_name = g_strdup_printf("%s", uri); if ((g_id == NULL) || (*g_id == '\0') || strlen(g_id) > 1) { g = purple_find_group("未分组"); if (!g) g = purple_group_new("未分组"); } else { g_attr = g_hash_table_lookup(sip->group, g_id); g_return_val_if_fail(g_attr != NULL, FALSE); g = purple_find_group(g_attr->name); if (!g) g = purple_group_new(g_attr->name); } b = purple_find_buddy(sip->account, buddy_name); if (!b) { b = purple_buddy_new(sip->account, buddy_name, NULL); } g_free(buddy_name); purple_blist_add_buddy(b, NULL, g, NULL); if (name != NULL && *name != '\0') purple_blist_alias_buddy(b, name); bs = g_new0(struct fetion_buddy, 1); bs->name = g_strdup(b->name); g_hash_table_insert(sip->buddies, bs->name, bs); purple_prpl_got_user_status(sip->account, uri, "mobile", NULL); } group = xmlnode_get_child(isc, "contacts/mobile-buddies"); g_return_val_if_fail(group != NULL, FALSE); for (item = xmlnode_get_child(group, "mobile-buddy"); item; item = xmlnode_get_next_twin(item)) { const gchar *uri, *name; gchar *buddy_name; const gchar *g_id; uri = xmlnode_get_attrib(item, "uri"); name = xmlnode_get_attrib(item, "local-name"); g_id = xmlnode_get_attrib(item, "buddy-lists"); buddy_name = g_strdup_printf("%s", uri); if ((g_id == NULL) || (*g_id == '\0') || strlen(g_id) > 1) { g = purple_find_group("未分组"); if (!g) g = purple_group_new("未分组"); } else { g_attr = g_hash_table_lookup(sip->group, g_id); //g_return_val_if_fail(g_attr!=NULL,FALSE); if (g_attr == NULL) continue; g = purple_find_group(g_attr->name); if (!g) g = purple_group_new(g_attr->name); } b = purple_find_buddy(sip->account, buddy_name); if (!b) { b = purple_buddy_new(sip->account, buddy_name, uri); } g_free(buddy_name); purple_blist_add_buddy(b, NULL, g, NULL); if (name != NULL && *name != '\0') purple_blist_alias_buddy(b, name); else purple_blist_alias_buddy(b, uri); bs = g_new0(struct fetion_buddy, 1); bs->name = g_strdup(b->name); g_hash_table_insert(sip->buddies, bs->name, bs); purple_prpl_got_user_status(sip->account, uri, "mobile", NULL); } fetion_subscribe_exp(sip, NULL); //Add youself b = purple_find_buddy(sip->account, sip->uri); if (!b) { b = purple_buddy_new(sip->account, sip->uri, NULL); } purple_blist_add_buddy(b, NULL, g, NULL); purple_blist_alias_buddy(b, "轰炸自己"); bs = g_new0(struct fetion_buddy, 1); bs->name = g_strdup(b->name); g_hash_table_insert(sip->buddies, bs->name, bs); purple_prpl_got_user_status(sip->account, sip->uri, "mobile", NULL); xmlnode_free(isc); break; default: GetContactList(sip); break; } return TRUE; }