changeset 2421:95b4ec08abec

[gaim-migrate @ 2434] stuff committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 03 Oct 2001 20:36:33 +0000
parents 938a432173b4
children e5f76dc2c8d1
files src/buddy_chat.c src/conversation.c src/protocols/oscar/aim.h src/protocols/oscar/aim_internal.h src/protocols/oscar/buddylist.c src/protocols/oscar/chat.c src/protocols/oscar/ft.c src/protocols/oscar/im.c src/protocols/oscar/info.c src/protocols/oscar/login.c src/protocols/oscar/oscar.c src/protocols/oscar/tlv.c
diffstat 12 files changed, 148 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/src/buddy_chat.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/buddy_chat.c	Wed Oct 03 20:36:33 2001 +0000
@@ -1384,6 +1384,9 @@
 					   GTK_SIGNAL_FUNC(invite_callback), c);
 			gtk_signal_connect(GTK_OBJECT(c->whisper), "clicked",
 					   GTK_SIGNAL_FUNC(whisper_callback), c);
+
+			update_buttons_by_protocol(c);
+
 			bcs = bcs->next;
 		}
 		C = C->next;
--- a/src/conversation.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/conversation.c	Wed Oct 03 20:36:33 2001 +0000
@@ -760,7 +760,7 @@
 		gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event");
 	} else if (((!c->is_chat && (im_options & OPT_IM_ONE_WINDOW)) ||
 		    (c->is_chat && (chat_options & OPT_CHAT_ONE_WINDOW))) &&
-		   (event->state & GDK_MOD1_MASK) && isdigit(event->keyval) && (event->keyval > '0')) {
+		   (event->state & GDK_MOD1_MASK) && (event->keyval > '0') && (event->keyval <= '9')) {
 		GtkWidget *notebook = (c->is_chat ? chat_notebook : convo_notebook);
 		gtk_notebook_set_page(GTK_NOTEBOOK(notebook), event->keyval - '1');
 		gtk_signal_emit_stop_by_name(GTK_OBJECT(entry), "key_press_event");
--- a/src/protocols/oscar/aim.h	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/aim.h	Wed Oct 03 20:36:33 2001 +0000
@@ -375,21 +375,31 @@
 /*
  * AIM User Info, Standard Form.
  */
-struct aim_userinfo_s {
+typedef struct {
 	char sn[MAXSNLEN+1];
 	fu16_t warnlevel;
 	fu16_t idletime;
 	fu16_t flags;
 	fu32_t membersince;
 	fu32_t onlinesince;
-	fu32_t sessionlen;  
+	fu32_t sessionlen; 
+	int capspresent;
 	fu16_t capabilities;
 	struct {
 		fu16_t status;
 		fu32_t ipaddr;
 		fu8_t crap[0x25]; /* until we figure it out... */
 	} icqinfo;
-};
+} aim_userinfo_t;
+
+faim_export const char *aim_userinfo_sn(aim_userinfo_t *ui);
+faim_export fu16_t aim_userinfo_flags(aim_userinfo_t *ui);
+faim_export fu16_t aim_userinfo_idle(aim_userinfo_t *ui);
+faim_export float aim_userinfo_warnlevel(aim_userinfo_t *ui);
+faim_export time_t aim_userinfo_membersince(aim_userinfo_t *ui);
+faim_export time_t aim_userinfo_onlinesince(aim_userinfo_t *ui);
+faim_export fu32_t aim_userinfo_sessionlen(aim_userinfo_t *ui);
+faim_export int aim_userinfo_hascap(aim_userinfo_t *ui, fu16_t cap);
 
 #define AIM_FLAG_UNCONFIRMED 	0x0001 /* "damned transients" */
 #define AIM_FLAG_ADMINISTRATOR	0x0002
@@ -449,7 +459,7 @@
 faim_internal int aim_addtlvtochain_raw(aim_tlvlist_t **list, const fu16_t t, const fu16_t l, const fu8_t *v);
 faim_internal int aim_addtlvtochain_caps(aim_tlvlist_t **list, const fu16_t t, const fu16_t caps);
 faim_internal int aim_addtlvtochain_noval(aim_tlvlist_t **list, const fu16_t type);
-faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, struct aim_userinfo_s *ui);
+faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, aim_userinfo_t *ui);
 faim_internal int aim_addtlvtochain_frozentlvlist(aim_tlvlist_t **list, fu16_t type, aim_tlvlist_t **tl);
 faim_internal int aim_counttlvchain(aim_tlvlist_t **list);
 faim_internal int aim_sizetlvchain(aim_tlvlist_t **list);
@@ -835,7 +845,7 @@
 faim_export aim_conn_t *aim_accepttransfer(aim_session_t *sess, aim_conn_t *conn, const char *sn, const fu8_t *cookie, const fu8_t *ip, fu16_t listingfiles, fu16_t listingtotsize, fu16_t listingsize, fu32_t listingchecksum, fu16_t rendid);
 
 faim_export int aim_getinfo(aim_session_t *, aim_conn_t *, const char *, unsigned short);
-faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *info);
+faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info);
 faim_export int aim_sendbuddyoffgoing(aim_session_t *sess, aim_conn_t *conn, const char *sn);
 
 #define AIM_IMPARAM_FLAG_CHANMSGS_ALLOWED	0x00000001
--- a/src/protocols/oscar/aim_internal.h	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/aim_internal.h	Wed Oct 03 20:36:33 2001 +0000
@@ -160,8 +160,8 @@
 faim_internal int aim_msgcookie_gettype(int reqclass);
 faim_internal int aim_cookie_free(aim_session_t *sess, aim_msgcookie_t *cookie);
 
-faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, struct aim_userinfo_s *);
-faim_internal int aim_putuserinfo(aim_bstream_t *bs, struct aim_userinfo_s *info);
+faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, aim_userinfo_t *);
+faim_internal int aim_putuserinfo(aim_bstream_t *bs, aim_userinfo_t *info);
 
 faim_internal int aim_chat_readroominfo(aim_bstream_t *bs, struct aim_chat_roominfo *outinfo);
 
--- a/src/protocols/oscar/buddylist.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/buddylist.c	Wed Oct 03 20:36:33 2001 +0000
@@ -13,7 +13,7 @@
  */
 static int buddychange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
 {
-	struct aim_userinfo_s userinfo;
+	aim_userinfo_t userinfo;
 	aim_rxcallback_t userfunc;
 
 	aim_extractuserinfo(sess, bs, &userinfo);
--- a/src/protocols/oscar/chat.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/chat.c	Wed Oct 03 20:36:33 2001 +0000
@@ -389,7 +389,7 @@
  */
 static int infoupdate(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
 {
-	struct aim_userinfo_s *userinfo = NULL;
+	aim_userinfo_t *userinfo = NULL;
 	aim_rxcallback_t userfunc;
 	int ret = 0;
 	int usercount = 0;
@@ -443,7 +443,7 @@
 		tmptlv = aim_gettlv(tlvlist, 0x0073, 1);
 
 		/* Allocate enough userinfo structs for all occupants */
-		userinfo = calloc(usercount, sizeof(struct aim_userinfo_s));
+		userinfo = calloc(usercount, sizeof(aim_userinfo_t));
 
 		aim_bstream_init(&occbs, tmptlv->value, tmptlv->length);
 
@@ -551,13 +551,13 @@
 
 static int userlistchange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
 {
-	struct aim_userinfo_s *userinfo = NULL;
+	aim_userinfo_t *userinfo = NULL;
 	aim_rxcallback_t userfunc;
 	int curcount = 0, ret = 0;
 
 	while (aim_bstream_empty(bs)) {
 		curcount++;
-		userinfo = realloc(userinfo, curcount * sizeof(struct aim_userinfo_s));
+		userinfo = realloc(userinfo, curcount * sizeof(aim_userinfo_t));
 		aim_extractuserinfo(sess, bs, &userinfo[curcount-1]);
 	}
 
@@ -594,7 +594,7 @@
  */
 static int incomingmsg(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
 {
-	struct aim_userinfo_s userinfo;
+	aim_userinfo_t userinfo;
 	aim_rxcallback_t userfunc;	
 	int ret = 0;
 	fu8_t *cookie;
@@ -603,7 +603,7 @@
 	char *msg = NULL;
 	aim_msgcookie_t *ck;
 
-	memset(&userinfo, 0, sizeof(struct aim_userinfo_s));
+	memset(&userinfo, 0, sizeof(aim_userinfo_t));
 
 	/*
 	 * ICBM Cookie.  Uncache it.
--- a/src/protocols/oscar/ft.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/ft.c	Wed Oct 03 20:36:33 2001 +0000
@@ -825,7 +825,7 @@
 		return -1;
 	}
 
-	if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on) != 0)) {
+	if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) {
 		perror("setsockopt(listenfd)");
 		close(listenfd);
 		return -1;
--- a/src/protocols/oscar/im.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/im.c	Wed Oct 03 20:36:33 2001 +0000
@@ -794,7 +794,7 @@
  * 		0101 000b 0000 0000 3c2f 4854 4d4c 3e   another ASCII part
  *
  */
-static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, struct aim_userinfo_s *userinfo, aim_bstream_t *bs, fu8_t *cookie)
+static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_bstream_t *bs, fu8_t *cookie)
 {
 	fu16_t type, length;
 	aim_rxcallback_t userfunc;
@@ -893,7 +893,7 @@
 	return ret;
 }
 
-static int incomingim_ch2_buddylist(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_buddylist(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 	aim_rxcallback_t userfunc;
 	int ret = 0;
@@ -955,7 +955,7 @@
 	return ret;
 }
 
-static int incomingim_ch2_buddyicon(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_buddyicon(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 	aim_rxcallback_t userfunc;
 	int ret = 0;
@@ -979,7 +979,7 @@
 	return ret;
 }
 
-static int incomingim_ch2_voice(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_voice(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 	aim_msgcookie_t *cachedcook;
 	int ret = 0;
@@ -1005,7 +1005,7 @@
 	return ret;
 }
 
-static int incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 	aim_tlv_t *miscinfo;
 	aim_bstream_t tbs;
@@ -1038,7 +1038,7 @@
 	return ret;
 }
 
-static int incomingim_ch2_getfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_getfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 	char ip[30];
 	aim_msgcookie_t *cachedcook;
@@ -1083,7 +1083,7 @@
 	return ret;
 }
 
-static int incomingim_ch2_sendfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_sendfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 #if 0
 	char ip[30];
@@ -1145,7 +1145,7 @@
 	return 0;
 }
 
-static int incomingim_ch2_imimage(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
+static int incomingim_ch2_imimage(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_tlvlist_t *list2)
 {
 	aim_rxcallback_t userfunc;
 	int ret = 0;
@@ -1204,7 +1204,7 @@
 }
 
 /* XXX Ugh.  I think its obvious. */
-static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, struct aim_userinfo_s *userinfo, aim_tlvlist_t *tlvlist, fu8_t *cookie)
+static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, fu8_t *cookie)
 {
 	aim_tlv_t *block1;
 	aim_tlvlist_t *list2;
@@ -1357,9 +1357,9 @@
 	int i, ret = 0;
 	fu8_t cookie[8];
 	fu16_t channel;
-	struct aim_userinfo_s userinfo;
+	aim_userinfo_t userinfo;
 
-	memset(&userinfo, 0x00, sizeof(struct aim_userinfo_s));
+	memset(&userinfo, 0x00, sizeof(aim_userinfo_t));
 
 	/*
 	 * Read ICBM Cookie.  And throw away.
@@ -1542,7 +1542,7 @@
 	int ret = 0;
 	aim_rxcallback_t userfunc;
 	fu16_t channel, nummissed, reason;
-	struct aim_userinfo_s userinfo;
+	aim_userinfo_t userinfo;
 
 	while (aim_bstream_empty(bs)) {	
 
--- a/src/protocols/oscar/info.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/info.c	Wed Oct 03 20:36:33 2001 +0000
@@ -43,6 +43,79 @@
 	return 0;
 }
 
+faim_export const char *aim_userinfo_sn(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return NULL;
+
+	return ui->sn;
+}
+
+faim_export fu16_t aim_userinfo_flags(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return 0;
+
+	return ui->flags;
+}
+
+faim_export fu16_t aim_userinfo_idle(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return 0;
+
+	return ui->idletime;
+}
+
+faim_export float aim_userinfo_warnlevel(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return 0.00;
+
+	return (ui->warnlevel / 10);
+}
+
+faim_export time_t aim_userinfo_membersince(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return 0;
+
+	return (time_t)ui->membersince;
+}
+
+faim_export time_t aim_userinfo_onlinesince(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return 0;
+
+	return (time_t)ui->onlinesince;
+}
+
+faim_export fu32_t aim_userinfo_sessionlen(aim_userinfo_t *ui)
+{
+
+	if (!ui)
+		return 0;
+
+	return ui->sessionlen;
+}
+
+faim_export int aim_userinfo_hascap(aim_userinfo_t *ui, fu16_t cap)
+{
+
+	if (!ui || !ui->capspresent)
+		return -1;
+
+	return !!(ui->capabilities & cap);
+}
+
+
 /*
  * Capability blocks.  
  */
@@ -158,7 +231,7 @@
  * AIM is fairly regular about providing user info.  This is a generic 
  * routine to extract it in its standard form.
  */
-faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, struct aim_userinfo_s *outinfo)
+faim_internal int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, aim_userinfo_t *outinfo)
 {
 	int curtlv, tlvcnt;
 	fu8_t snlen;
@@ -167,7 +240,7 @@
 		return -EINVAL;
 
 	/* Clear out old data first */
-	memset(outinfo, 0x00, sizeof(struct aim_userinfo_s));
+	memset(outinfo, 0x00, sizeof(aim_userinfo_t));
 
 	/*
 	 * Screen name.  Stored as an unterminated string prepended with a 
@@ -283,6 +356,7 @@
 			 *
 			 */
 			outinfo->capabilities = aim_getcap(sess, bs, length);
+			outinfo->capspresent = 1;
 
 		} else if (type == 0x000e) {
 			/*
@@ -337,7 +411,7 @@
 /*
  * Inverse of aim_extractuserinfo()
  */
-faim_internal int aim_putuserinfo(aim_bstream_t *bs, struct aim_userinfo_s *info)
+faim_internal int aim_putuserinfo(aim_bstream_t *bs, aim_userinfo_t *info)
 {
 	aim_tlvlist_t *tlvlist = NULL;
 
@@ -373,7 +447,7 @@
 	return 0;
 }
 
-faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *info)
+faim_export int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info)
 {
 	aim_frame_t *fr;
 	aim_snacid_t snacid;
@@ -469,7 +543,7 @@
 
 static int userinfo(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
 {
-	struct aim_userinfo_s userinfo;
+	aim_userinfo_t userinfo;
 	char *text_encoding = NULL, *text = NULL;
 	aim_rxcallback_t userfunc;
 	aim_tlvlist_t *tlvlist;
--- a/src/protocols/oscar/login.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/login.c	Wed Oct 03 20:36:33 2001 +0000
@@ -617,9 +617,9 @@
 {
 	aim_rxcallback_t userfunc;
 	fu16_t newevil;
-	struct aim_userinfo_s userinfo;
+	aim_userinfo_t userinfo;
 
-	memset(&userinfo, 0, sizeof(struct aim_userinfo_s));
+	memset(&userinfo, 0, sizeof(aim_userinfo_t));
 	
 	newevil = aimbs_get16(bs);
 
--- a/src/protocols/oscar/oscar.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/oscar.c	Wed Oct 03 20:36:33 2001 +0000
@@ -1121,7 +1121,7 @@
 }
 
 static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) {
-	struct aim_userinfo_s *info;
+	aim_userinfo_t *info;
 	time_t time_idle;
 	int type = 0;
 	struct gaim_connection *gc = sess->aux_data;
@@ -1129,7 +1129,7 @@
 
 	va_list ap;
 	va_start(ap, fr);
-	info = va_arg(ap, struct aim_userinfo_s *);
+	info = va_arg(ap, aim_userinfo_t *);
 	va_end(ap);
 
 	if (info->flags & AIM_FLAG_ACTIVEBUDDY)
@@ -1163,12 +1163,12 @@
 }
 
 static int gaim_parse_offgoing(aim_session_t *sess, aim_frame_t *fr, ...) {
-	struct aim_userinfo_s *info;
+	aim_userinfo_t *info;
 	va_list ap;
 	struct gaim_connection *gc = sess->aux_data;
 
 	va_start(ap, fr);
-	info = va_arg(ap, struct aim_userinfo_s *);
+	info = va_arg(ap, aim_userinfo_t *);
 	va_end(ap);
 
 	serv_got_update(gc, info->sn, 0, 0, 0, 0, 0, 0);
@@ -1267,7 +1267,7 @@
 	return TRUE;
 }
 
-static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch1_args *args) {
+static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) {
 	char *tmp = g_malloc(BUF_LONG);
 	struct gaim_connection *gc = sess->aux_data;
 	int flags = 0;
@@ -1351,7 +1351,7 @@
 	return 1;
 }
 
-static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args) {
+static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args) {
 	struct gaim_connection *gc = sess->aux_data;
 
 	if (args->reqclass & AIM_CAPS_CHAT) {
@@ -1398,12 +1398,12 @@
 
 static int gaim_parse_incoming_im(aim_session_t *sess, aim_frame_t *fr, ...) {
 	int channel, ret = 0;
-	struct aim_userinfo_s *userinfo;
+	aim_userinfo_t *userinfo;
 	va_list ap;
 
 	va_start(ap, fr);
 	channel = va_arg(ap, int);
-	userinfo = va_arg(ap, struct aim_userinfo_s *);
+	userinfo = va_arg(ap, aim_userinfo_t *);
 
 	/* channel 1: standard message */
 	if (channel == 1) {
@@ -1429,12 +1429,12 @@
 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) {
 	va_list ap;
 	fu16_t chan, nummissed, reason;
-	struct aim_userinfo_s *userinfo;
+	aim_userinfo_t *userinfo;
 	char buf[1024];
 
 	va_start(ap, fr);
 	chan = (fu16_t)va_arg(ap, unsigned int);
-	userinfo = va_arg(ap, struct aim_userinfo_s *);
+	userinfo = va_arg(ap, aim_userinfo_t *);
 	nummissed = (fu16_t)va_arg(ap, unsigned int);
 	reason = (fu16_t)va_arg(ap, unsigned int);
 	va_end(ap);
@@ -1562,7 +1562,7 @@
 }
 
 static int gaim_parse_user_info(aim_session_t *sess, aim_frame_t *fr, ...) {
-	struct aim_userinfo_s *info;
+	aim_userinfo_t *info;
 	char *prof_enc = NULL, *prof = NULL;
 	fu16_t infotype;
 	char buf[BUF_LONG];
@@ -1572,7 +1572,7 @@
 	char *asc;
 
 	va_start(ap, fr);
-	info = va_arg(ap, struct aim_userinfo_s *);
+	info = va_arg(ap, aim_userinfo_t *);
 	prof_enc = va_arg(ap, char *);
 	prof = va_arg(ap, char *);
 	infotype = (fu16_t)va_arg(ap, unsigned int);
@@ -1712,14 +1712,14 @@
 static int gaim_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) {
 	va_list ap;
 	int count, i;
-	struct aim_userinfo_s *info;
+	aim_userinfo_t *info;
 	struct gaim_connection *g = sess->aux_data;
 
 	struct chat_connection *c = NULL;
 
 	va_start(ap, fr);
 	count = va_arg(ap, int);
-	info  = va_arg(ap, struct aim_userinfo_s *);
+	info  = va_arg(ap, aim_userinfo_t *);
 	va_end(ap);
 
 	c = find_oscar_chat_by_conn(g, fr->conn);
@@ -1735,14 +1735,14 @@
 static int gaim_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) {
 	va_list ap;
 	int count, i;
-	struct aim_userinfo_s *info;
+	aim_userinfo_t *info;
 	struct gaim_connection *g = sess->aux_data;
 
 	struct chat_connection *c = NULL;
 
 	va_start(ap, fr);
 	count = va_arg(ap, int);
-	info  = va_arg(ap, struct aim_userinfo_s *);
+	info  = va_arg(ap, aim_userinfo_t *);
 	va_end(ap);
 
 	c = find_oscar_chat_by_conn(g, fr->conn);
@@ -1757,7 +1757,7 @@
 
 static int gaim_chat_info_update(aim_session_t *sess, aim_frame_t *fr, ...) {
 	va_list ap;
-	struct aim_userinfo_s *userinfo;
+	aim_userinfo_t *userinfo;
 	struct aim_chat_roominfo *roominfo;
 	char *roomname;
 	int usercount;
@@ -1771,7 +1771,7 @@
 	roominfo = va_arg(ap, struct aim_chat_roominfo *);
 	roomname = va_arg(ap, char *);
 	usercount= va_arg(ap, int);
-	userinfo = va_arg(ap, struct aim_userinfo_s *);
+	userinfo = va_arg(ap, aim_userinfo_t *);
 	roomdesc = va_arg(ap, char *);
 	unknown_c9 = (fu16_t)va_arg(ap, int);
 	creationtime = (fu32_t)va_arg(ap, unsigned long);
@@ -1792,14 +1792,14 @@
 
 static int gaim_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) {
 	va_list ap;
-	struct aim_userinfo_s *info;
+	aim_userinfo_t *info;
 	char *msg;
 	struct gaim_connection *gc = sess->aux_data;
 	struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn);
 	char *tmp;
 
 	va_start(ap, fr);
-	info = va_arg(ap, struct aim_userinfo_s *);
+	info = va_arg(ap, aim_userinfo_t *);
 	msg  = va_arg(ap, char *);
 
 	tmp = g_malloc(BUF_LONG);
@@ -1879,12 +1879,12 @@
 static int gaim_parse_evilnotify(aim_session_t *sess, aim_frame_t *fr, ...) {
 	va_list ap;
 	fu16_t newevil;
-	struct aim_userinfo_s *userinfo;
+	aim_userinfo_t *userinfo;
 	struct gaim_connection *gc = sess->aux_data;
 
 	va_start(ap, fr);
 	newevil = (fu16_t)va_arg(ap, unsigned int);
-	userinfo = va_arg(ap, struct aim_userinfo_s *);
+	userinfo = va_arg(ap, aim_userinfo_t *);
 	va_end(ap);
 
 	serv_got_eviled(gc, (userinfo && userinfo->sn[0]) ? userinfo->sn : NULL, newevil / 10);
--- a/src/protocols/oscar/tlv.c	Wed Oct 03 19:42:31 2001 +0000
+++ b/src/protocols/oscar/tlv.c	Wed Oct 03 20:36:33 2001 +0000
@@ -266,6 +266,9 @@
 	fu8_t buf[16*16]; /* icky fixed length buffer */
 	aim_bstream_t bs;
 
+	if (!caps)
+		return 0; /* nothing there anyway */
+
 	aim_bstream_init(&bs, buf, sizeof(buf));
 
 	aim_putcap(&bs, caps);
@@ -273,7 +276,7 @@
 	return aim_addtlvtochain_raw(list, t, aim_bstream_curpos(&bs), buf);
 }
 
-faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, struct aim_userinfo_s *ui)
+faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, aim_userinfo_t *ui)
 {
 	fu8_t buf[1024]; /* bleh */
 	aim_bstream_t bs;