diff src/oscar.c @ 243:3414ff74cb0f

[gaim-migrate @ 253] Sat May 20 09:56:16 UTC 2000 EWarmenhoven - That 2 second delay in updates is gone, and I think it's actually faster than the TOC code now. - I figured out why it was segfaulting. I'm stupid sometimes. - I figured out why the idle times were appearing bizarrely. Once again, I'm stupid sometimes. - You can now be idle - You can now get a user's info (sort of - use the debug window) (still no away messages though....) - You can now be away - You can now set your info (but not your dir info - yet) - I think it's almost at a point where it's ready for use. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sat, 20 May 2000 10:03:16 +0000
parents 14fc16f579c8
children f6e8ea29b24f
line wrap: on
line diff
--- a/src/oscar.c	Sat May 20 07:58:50 2000 +0000
+++ b/src/oscar.c	Sat May 20 10:03:16 2000 +0000
@@ -51,9 +51,12 @@
 static int gaim_parse_incoming_im(struct aim_session_t *, struct command_rx_struct *, ...);
 static int gaim_parse_misses     (struct aim_session_t *, struct command_rx_struct *, ...);
 static int gaim_parse_user_info  (struct aim_session_t *, struct command_rx_struct *, ...);
-static int gaim_parse_unknown    (struct aim_session_t *, struct command_rx_struct *, ...);
 static int gaim_parse_motd       (struct aim_session_t *, struct command_rx_struct *, ...);
 static int gaim_chatnav_info     (struct aim_session_t *, struct command_rx_struct *, ...);
+static int gaim_chat_join        (struct aim_session_t *, struct command_rx_struct *, ...);
+static int gaim_chat_leave       (struct aim_session_t *, struct command_rx_struct *, ...);
+static int gaim_chat_info_update (struct aim_session_t *, struct command_rx_struct *, ...);
+static int gaim_chat_incoming_msg(struct aim_session_t *, struct command_rx_struct *, ...);
 
 static void oscar_callback(gpointer data, gint source,
 				GdkInputCondition condition) {
@@ -62,11 +65,7 @@
 	struct timeval tv;
 	int selstat;
 
-	/* FIXME : There's gotta be a better way of getting this to not
-	 * either hang until a message is received or only update every
-	 * 2 seconds. If someone can tell me what it is, let me know. */
-	tv.tv_sec = 2;
-	tv.tv_usec = 0;
+	tv.tv_sec = 0; tv.tv_usec = 0;
 	conn = aim_select(sess, &tv, &selstat);
 
 	switch(selstat) {
@@ -89,9 +88,13 @@
 			aim_tx_flushqueue(sess);
 			break;
 		case 2: /* incoming data pending */
-			if (aim_get_command(sess, conn) < 0)
+			if (aim_get_command(sess, conn) < 0) {
 				debug_print("connection error!\n");
-			else
+				signoff();
+				hide_login_progress("Disconnected.");
+				aim_logoff(sess);
+				gdk_input_remove(inpa);
+			} else
 				aim_rxdispatch(sess);
 			break;
 	}
@@ -145,6 +148,7 @@
 				gaim_auth_server_ready, 0);
 	aim_send_login(sess, conn, username, password, &info);
 
+	gaim_conn = conn;
 	inpa = gdk_input_add(conn->fd,
 				GDK_INPUT_READ | GDK_INPUT_EXCEPTION,
 				oscar_callback, sess);
@@ -244,8 +248,8 @@
 	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_misses, 0);
 	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_misses, 0);
 	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0);
-	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_CTN, AIM_CB_CTN_DEFAULT, gaim_parse_unknown, 0);
-	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEFAULT, gaim_parse_unknown, 0);
+	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_CTN, AIM_CB_CTN_DEFAULT, aim_parse_unknown, 0);
+	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEFAULT, aim_parse_unknown, 0);
 	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, gaim_parse_motd, 0);
 
 	aim_auth_sendcookie(sess, bosconn, sess->logininfo.cookie);
@@ -282,7 +286,13 @@
 		aim_chatnav_reqrights(sess, command->conn);
 		break;
 	case AIM_CONN_TYPE_CHAT:
-		/* FIXME */
+		aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, gaim_chat_join, 0);
+		aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, gaim_chat_leave, 0);
+		aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, gaim_chat_info_update, 0);
+		aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, gaim_chat_incoming_msg, 0);
+		aim_bos_reqrate(sess, command->conn);
+		aim_bos_ackrateresp(sess, command->conn);
+		aim_chat_clientready(sess, command->conn);
 		break;
 	default: /* huh? */
 		break;
@@ -361,7 +371,17 @@
 		debug_print("chatnav: connected\n");
 		break;
 	case 0xe: /* Chat */
-		/* FIXME */
+		{
+		struct aim_conn_t *tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, ip);
+		char *roomname = va_arg(ap, char *);
+		if (tstconn == NULL || tstconn->status >= AIM_CONN_STATUS_RESOLVERR) {
+			debug_print("unable to connect to chat server\n");
+			return 1;
+		}
+		aim_chat_attachname(tstconn, roomname);
+		aim_conn_addhandler(sess, tstconn, 0x0001, 0x0003, gaim_server_ready, 0);
+		aim_auth_sendcookie(sess, tstconn, cookie);
+		}
 		break;
 	default: /* huh? */
 		sprintf(debug_buff, "got redirect for unknown service 0x%04x\n",
@@ -378,6 +398,7 @@
 int gaim_parse_oncoming(struct aim_session_t *sess,
 			struct command_rx_struct *command, ...) {
 	struct aim_userinfo_s *info;
+	time_t time_idle;
 	int type = 0;
 
 	va_list ap;
@@ -394,8 +415,14 @@
 	if (info->class & AIM_CLASS_AWAY)
 		type |= UC_UNAVAILABLE;
 
+	if (info->idletime) {
+		time(&time_idle);
+		time_idle -= info->idletime*60;
+	} else
+		time_idle = 0;
+
 	serv_got_update(info->sn, 1, info->warnlevel, info->onlinesince,
-			info->idletime, type);
+			time_idle, type);
 
 	return 1;
 }
@@ -445,19 +472,78 @@
 
 int gaim_parse_misses(struct aim_session_t *sess,
 		      struct command_rx_struct *command, ...) {
-	/* FIXME */
+	u_short family;
+	u_short subtype;
+
+	char buf[2048], buf2[256];
+	sprintf(buf2, "Gaim - Error");
+	buf[0] = 0;
+
+	family  = aimutil_get16(command->data+0);
+	subtype = aimutil_get16(command->data+2);
+
+	switch (family) {
+/*	case 0x0001:
+		if (subtype == 0x000a)
+			sprintf(buf, "You are sending messages too fast.");
+		break;
+*/	case 0x0002:
+		if (subtype == 0x0001)
+			sprintf(buf, "Unknown SNAC error (I'm hungry)");
+		break;
+	case 0x0004:
+		if (subtype == 0x0001)
+			sprintf(buf, "User is not online.");
+		else if (subtype == 0x000a)
+			sprintf(buf, "A message has been dropped.");
+		break;
+	}
+
+	if (buf[0] != 0)
+		do_error_dialog(buf, buf2);
+
 	return 1;
 }
 
 int gaim_parse_user_info(struct aim_session_t *sess,
 			 struct command_rx_struct *command, ...) {
-	/* FIXME */
-	return 1;
-}
+	struct aim_userinfo_s *info;
+	char *prof_enc = NULL, *prof = NULL;
 
-int gaim_parse_unknown(struct aim_session_t *sess,
-		       struct command_rx_struct *command, ...) {
-	/* FIXME */
+	va_list ap;
+	va_start(ap, command);
+	info = va_arg(ap, struct aim_userinfo_s *);
+	prof_enc = va_arg(ap, char *);
+	prof = va_arg(ap, char *);
+	va_end(ap);
+	sprintf(debug_buff, "userinfo: sn: %s\n", info->sn);
+	debug_print(debug_buff);
+	sprintf(debug_buff, "userinfo: warnings: %d\n", info->warnlevel);
+	debug_print(debug_buff);
+	sprintf(debug_buff, "userinfo: class: ");
+	debug_print(debug_buff);
+	if (info->class & 0x0001)
+		debug_print("TRIAL ");
+	if (info->class & 0x0002)
+		debug_print("HUH? ");
+	if (info->class & 0x0004)
+		debug_print("AOL ");
+	if (info->class & 0x0008)
+		debug_print("HUH? ");
+	if (info->class & 0x0010)
+		debug_print("FREE");
+	debug_print("\n");
+	sprintf(debug_buff, "userinfo: member since: %lu\n", info->membersince);
+	debug_print(debug_buff);
+	sprintf(debug_buff, "userinfo: online since: %lu\n", info->onlinesince);
+	debug_print(debug_buff);
+	sprintf(debug_buff, "userinfo: idle time: %d\n", info->idletime);
+	debug_print(debug_buff);
+	sprintf(debug_buff, "userinfo: profile encoding: %s\n", prof_enc ?
+						prof_enc : "[none]");
+	debug_print(debug_buff);
+	sprintf(debug_buff, "userinfo: profile: %s\n", prof ? prof : "[none]");
+	debug_print(debug_buff);
 	return 1;
 }
 
@@ -483,4 +569,29 @@
 	/* FIXME */
 	return 1;
 }
+
+int gaim_chat_join(struct aim_session_t *sess,
+		   struct command_rx_struct *command, ...) {
+	/* FIXME */
+	return 1;
+}
+
+int gaim_chat_leave(struct aim_session_t *sess,
+		    struct command_rx_struct *command, ...) {
+	/* FIXME */
+	return 1;
+}
+
+int gaim_chat_info_update(struct aim_session_t *sess,
+			  struct command_rx_struct *command, ...) {
+	/* FIXME */
+	return 1;
+}
+
+int gaim_chat_incoming_msg(struct aim_session_t *sess,
+			   struct command_rx_struct *command, ...) {
+	/* FIXME */
+	return 1;
+}
+
 #endif /* USE_OSCAR */