⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buddy_opt.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	len = buf_len;	data = g_newa(guint8, len);	if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {		cursor = data;		read_packet_b(data, &cursor, len, &reply);		if (reply != QQ_REMOVE_BUDDY_REPLY_OK) {			/* there is no reason return from server */			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Remove buddy fails\n");		} else {		/* if reply */			purple_debug(PURPLE_DEBUG_INFO, "QQ", "Remove buddy OK\n");			purple_notify_info(gc, NULL, _("You have successfully removed a buddy"), NULL);		}	} else {		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt remove buddy reply\n");	}}/* process the server reply for my request to remove myself from a buddy */void qq_process_remove_self_reply(guint8 *buf, gint buf_len, PurpleConnection *gc) {	qq_data *qd;	gint len;	guint8 *data, *cursor, reply;	g_return_if_fail(buf != NULL && buf_len != 0);	qd = (qq_data *) gc->proto_data;	len = buf_len;	data = g_newa(guint8, len);	if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {		cursor = data;		read_packet_b(data, &cursor, len, &reply);		if (reply != QQ_REMOVE_SELF_REPLY_OK)			/* there is no reason return from server */			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Remove self fails\n");		else {		/* if reply */			purple_debug(PURPLE_DEBUG_INFO, "QQ", "Remove self from a buddy OK\n");			purple_notify_info(gc, NULL, _("You have successfully removed yourself from a buddy"), NULL);		}	} else {		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt remove self reply\n");	}}void qq_process_add_buddy_reply(guint8 *buf, gint buf_len, guint16 seq, PurpleConnection *gc){	qq_data *qd;	gint len, for_uid;	gchar *msg, **segments, *uid, *reply;	guint8 *data;	GList *list;	PurpleBuddy *b;	gc_and_uid *g;	qq_add_buddy_request *req;	gchar *nombre;	g_return_if_fail(buf != NULL && buf_len != 0);	for_uid = 0;	qd = (qq_data *) gc->proto_data;	len = buf_len;	list = qd->add_buddy_request;	while (list != NULL) {		req = (qq_add_buddy_request *) list->data;		if (req->seq == seq) {	/* reply to this */			for_uid = req->uid;			qd->add_buddy_request = g_list_remove(qd->add_buddy_request, qd->add_buddy_request->data);			g_free(req);			break;		}		list = list->next;	}	if (for_uid == 0) {	/* we have no record for this */		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "We have no record for add buddy reply [%d], discard\n", seq);		return;	} else {		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Add buddy reply [%d] is for id [%d]\n", seq, for_uid);	}	data = g_newa(guint8, len);	if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) {		if (NULL == (segments = split_data(data, len, "\x1f", 2)))			return;		uid = segments[0];		reply = segments[1];		if (strtol(uid, NULL, 10) != qd->uid) {	/* should not happen */			purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Add buddy reply is to [%s], not me!", uid);			g_strfreev(segments);			return;		}		if (strtol(reply, NULL, 10) > 0) {	/* need auth */			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add buddy attempt fails, need authentication\n");			nombre = uid_to_purple_name(for_uid);			b = purple_find_buddy(gc->account, nombre);			if (b != NULL)				purple_blist_remove_buddy(b);			g = g_new0(gc_and_uid, 1);			g->gc = gc;			g->uid = for_uid;			msg = g_strdup_printf(_("User %d needs authentication"), for_uid);			purple_request_input(gc, NULL, msg,					   _("Input request here"), /* TODO: Awkward string to fix post string freeze - standardize auth dialogues? -evands */					   _("Would you be my friend?"),					   TRUE, FALSE, NULL, _("Send"),					   G_CALLBACK					   (_qq_send_packet_add_buddy_auth_with_gc_and_uid),					   _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid),					   purple_connection_get_account(gc), nombre, NULL,					   g);			g_free(msg);			g_free(nombre);		} else {	/* add OK */			qq_add_buddy_by_recv_packet(gc, for_uid, TRUE, TRUE);			msg = g_strdup_printf(_("You have added %d in buddy list"), for_uid);			purple_notify_info(gc, NULL, msg, NULL);			g_free(msg);		}		g_strfreev(segments);	} else {		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt add buddy reply\n");	}}PurpleGroup *qq_get_purple_group(const gchar *group_name){	PurpleGroup *g;	g_return_val_if_fail(group_name != NULL, NULL);	g = purple_find_group(group_name);	if (g == NULL) {		g = purple_group_new(group_name);		purple_blist_add_group(g, NULL);		purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add new group: %s\n", group_name);	}	return g;}/* we add new buddy, if the received packet is from someone not in my list * return the PurpleBuddy that is just created */PurpleBuddy *qq_add_buddy_by_recv_packet(PurpleConnection *gc, guint32 uid, gboolean is_known, gboolean create){	PurpleAccount *a;	PurpleBuddy *b;	PurpleGroup *g;	qq_data *qd;	qq_buddy *q_bud;	gchar *name, *group_name;	a = gc->account;	qd = (qq_data *) gc->proto_data;	g_return_val_if_fail(a != NULL && uid != 0, NULL);	group_name = is_known ?	    g_strdup_printf(PURPLE_GROUP_QQ_FORMAT, purple_account_get_username(a)) : g_strdup(PURPLE_GROUP_QQ_UNKNOWN);	g = qq_get_purple_group(group_name);	name = uid_to_purple_name(uid);	b = purple_find_buddy(gc->account, name);	/* remove old, we can not simply return here	 * because there might be old local copy of this buddy */	if (b != NULL)		purple_blist_remove_buddy(b);	b = purple_buddy_new(a, name, NULL);	if (!create)		b->proto_data = NULL;	else {		q_bud = g_new0(qq_buddy, 1);		q_bud->uid = uid;		b->proto_data = q_bud;		qd->buddies = g_list_append(qd->buddies, q_bud);		qq_send_packet_get_info(gc, q_bud->uid, FALSE);		qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START);	}	purple_blist_add_buddy(b, NULL, g, NULL);	purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add new buddy: [%s]\n", name);	g_free(name);	g_free(group_name);	return b;}/* add a buddy and send packet to QQ server * note that when purple load local cached buddy list into its blist * it also calls this funtion, so we have to  * define qd->logged_in=TRUE AFTER serv_finish_login(gc) */void qq_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group){	qq_data *qd;	guint32 uid;	PurpleBuddy *b;	qd = (qq_data *) gc->proto_data;	if (!qd->logged_in)		return;		/* IMPORTANT ! */	uid = purple_name_to_uid(buddy->name);	if (uid > 0)		_qq_send_packet_add_buddy(gc, uid);	else {		b = purple_find_buddy(gc->account, buddy->name);		if (b != NULL)			purple_blist_remove_buddy(b);		purple_notify_error(gc, NULL,				  _("QQid Error"),				  _("Invalid QQid"));	}}/* remove a buddy and send packet to QQ server accordingly */void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group){	qq_data *qd;	PurpleBuddy *b;	qq_buddy *q_bud;	guint32 uid;	qd = (qq_data *) gc->proto_data;	uid = purple_name_to_uid(buddy->name);	if (!qd->logged_in)		return;	if (uid > 0)		_qq_send_packet_remove_buddy(gc, uid);	b = purple_find_buddy(gc->account, buddy->name);	if (b != NULL) {		q_bud = (qq_buddy *) b->proto_data;		if (q_bud != NULL)			qd->buddies = g_list_remove(qd->buddies, q_bud);		else			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "We have no qq_buddy record for %s\n", buddy->name);		/* remove buddy on blist, this does not trigger qq_remove_buddy again		 * do this only if the request comes from block request,		 * otherwise purple segmentation fault */		if (g_ascii_strcasecmp(group->name, PURPLE_GROUP_QQ_BLOCKED) == 0)			purple_blist_remove_buddy(b);	}}/* free add buddy request queue */void qq_add_buddy_request_free(qq_data *qd){	gint i;	qq_add_buddy_request *p;	i = 0;	while (qd->add_buddy_request) {		p = (qq_add_buddy_request *) (qd->add_buddy_request->data);		qd->add_buddy_request = g_list_remove(qd->add_buddy_request, p);		g_free(p);		i++;	}	purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d add buddy requests are freed!\n", i);}/* free up all qq_buddy */void qq_buddies_list_free(PurpleAccount *account, qq_data *qd){	gint i;	qq_buddy *p;	gchar *name;	PurpleBuddy *b;	i = 0;	while (qd->buddies) {		p = (qq_buddy *) (qd->buddies->data);		qd->buddies = g_list_remove(qd->buddies, p);		name = uid_to_purple_name(p->uid);		b = purple_find_buddy(account, name);   			if(b != NULL) 			b->proto_data = NULL;		else			purple_debug(PURPLE_DEBUG_INFO, "QQ", "qq_buddy %s not found in purple proto_data\n", name);		g_free(name);		g_free(p);		i++;	}	purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d qq_buddy structures are freed!\n", i);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -