icq.c

来自「oscar message protocol stack」· C语言 代码 · 共 685 行 · 第 1/2 页

C
685
字号
/* * Family 0x0015 - Encapsulated ICQ. * */#define FAIM_INTERNAL#include <aim.h>faim_export int aim_icq_reqofflinemsgs(aim_session_t *sess){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2 + 4 + 2 + 2;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x003c); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aim_tx_enqueue(sess, fr);	return 0;}faim_export int aim_icq_ackofflinemsgs(aim_session_t *sess){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2 + 4 + 2 + 2;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x003e); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aim_tx_enqueue(sess, fr);	return 0;}faim_export int aim_icq_hideip(aim_session_t *sess){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2+4+2+2+2+4;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aimbs_putle16(&fr->data, 0x0424); /* shrug. */	aimbs_putle16(&fr->data, 0x0001);	aimbs_putle16(&fr->data, 0x0001);	aim_tx_enqueue(sess, fr);	return 0;}/** * Change your ICQ password. * * @param sess The oscar session * @param passwd The new password.  If this is longer than 8 characters it  *        will be truncated. * @return Return 0 if no errors, otherwise return the error number. */faim_export int aim_icq_changepasswd(aim_session_t *sess, const char *passwd){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen, passwdlen;	if (!passwd)		return -EINVAL;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	passwdlen = strlen(passwd);	if (passwdlen > MAXICQPASSLEN)		passwdlen = MAXICQPASSLEN;	bslen = 2+4+2+2+2+2+passwdlen+1;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aimbs_putle16(&fr->data, 0x042e); /* shrug. */	aimbs_putle16(&fr->data, passwdlen+1);	aimbs_putraw(&fr->data, passwd, passwdlen);	aimbs_putle8(&fr->data, '\0');	aim_tx_enqueue(sess, fr);	return 0;}faim_export int aim_icq_getallinfo(aim_session_t *sess, const char *uin){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	struct aim_icq_info *info;	if (!uin || uin[0] < '0' || uin[0] > '9')		return -EINVAL;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2 + 4 + 2 + 2 + 2 + 4;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aimbs_putle16(&fr->data, 0x04b2); /* shrug. */	aimbs_putle32(&fr->data, atoi(uin));	aim_tx_enqueue(sess, fr);	/* Keep track of this request and the ICQ number and request ID */	info = (struct aim_icq_info *)calloc(1, sizeof(struct aim_icq_info));	info->reqid = snacid;	info->uin = atoi(uin);	info->next = sess->icq_info;	sess->icq_info = info;	return 0;}faim_export int aim_icq_getalias(aim_session_t *sess, const char *uin){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	struct aim_icq_info *info;	if (!uin || uin[0] < '0' || uin[0] > '9')		return -EINVAL;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2 + 4 + 2 + 2 + 2 + 4;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aimbs_putle16(&fr->data, 0x04ba); /* shrug. */	aimbs_putle32(&fr->data, atoi(uin));	aim_tx_enqueue(sess, fr);	/* Keep track of this request and the ICQ number and request ID */	info = (struct aim_icq_info *)calloc(1, sizeof(struct aim_icq_info));	info->reqid = snacid;	info->uin = atoi(uin);	info->next = sess->icq_info;	sess->icq_info = info;	return 0;}faim_export int aim_icq_getsimpleinfo(aim_session_t *sess, const char *uin){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	if (!uin || uin[0] < '0' || uin[0] > '9')		return -EINVAL;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2 + 4 + 2 + 2 + 2 + 4;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aimbs_putle16(&fr->data, 0x051f); /* shrug. */	aimbs_putle32(&fr->data, atoi(uin));	aim_tx_enqueue(sess, fr);	return 0;}faim_export int aim_icq_sendxmlreq(aim_session_t *sess, const char *xml){	aim_conn_t *conn;	aim_frame_t *fr;	aim_snacid_t snacid;	int bslen;	if (!xml || !strlen(xml))		return -EINVAL;	if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))		return -EINVAL;	bslen = 2 + 10 + 2 + strlen(xml) + 1;	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))		return -ENOMEM;	snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);	aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);	/* For simplicity, don't bother using a tlvlist */	aimbs_put16(&fr->data, 0x0001);	aimbs_put16(&fr->data, bslen);	aimbs_putle16(&fr->data, bslen - 2);	aimbs_putle32(&fr->data, atoi(sess->sn));	aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */	aimbs_putle16(&fr->data, snacid); /* eh. */	aimbs_putle16(&fr->data, 0x0998); /* shrug. */	aimbs_putle16(&fr->data, strlen(xml) + 1);	aimbs_putraw(&fr->data, xml, strlen(xml) + 1);	aim_tx_enqueue(sess, fr);	return 0;}/* * Send an SMS message.  This is the non-US way.  The US-way is to IM  * their cell phone number (+19195551234). * * We basically construct and send an XML message.  The format is: * <icq_sms_message> *   <destination>full_phone_without_leading_+</destination> *   <text>message</text> *   <codepage>1252</codepage> *   <senders_UIN>self_uin</senders_UIN> *   <senders_name>self_name</senders_name> *   <delivery_receipt>Yes|No</delivery_receipt> *   <time>Wkd, DD Mmm YYYY HH:MM:SS TMZ</time> * </icq_sms_message> * * Yeah hi Peter, whaaaat's happening.  If there's any way to use  * a codepage other than 1252 that would be great.  Thaaaanks. */faim_export int aim_icq_sendsms(aim_session_t *sess, const char *name, const char *msg, const char *alias){	aim_conn_t *conn;

⌨️ 快捷键说明

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