diff src/toc.c @ 1840:00aef397a1fe

[gaim-migrate @ 1850] reworked some of the proxy stuff so that it's non-blocking now. next thing to do is to get IRC, MSN, Napster, and Jabber to use the new proxy_connect code. After that, Oscar and Yahoo (maybe Zephyr too? not likely) committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sat, 12 May 2001 01:38:04 +0000
parents bb115612a2ed
children 1d137dde946f
line wrap: on
line diff
--- a/src/toc.c	Fri May 11 21:54:27 2001 +0000
+++ b/src/toc.c	Sat May 12 01:38:04 2001 +0000
@@ -115,13 +115,14 @@
 /* constants to identify proto_opts */
 #define USEROPT_AUTH      0
 #define USEROPT_AUTHPORT  1
-#define USEROPT_SOCKSHOST 2
-#define USEROPT_SOCKSPORT 3
+#define USEROPT_PROXYHOST 2
+#define USEROPT_PROXYPORT 3
 #define USEROPT_PROXYTYPE 4
 
 static GtkWidget *join_chat_spin = NULL;
 static GtkWidget *join_chat_entry = NULL;
 
+static void toc_login_callback(gpointer, gint, GdkInputCondition);
 static void toc_callback(gpointer, gint, GdkInputCondition);
 static unsigned char *roast_password(char *);
 static void accept_file_dialog(struct ft_request *);
@@ -140,28 +141,41 @@
 
 	g_snprintf(buf, sizeof buf, "Looking up %s",
 		   user->proto_opt[USEROPT_AUTH][0] ? user->proto_opt[USEROPT_AUTH] : TOC_HOST);
-	/* this is such a hack */
 	set_login_progress(gc, 1, buf);
-	while (gtk_events_pending())
-		gtk_main_iteration();
-	if (!g_slist_find(connections, gc))
-		return;
 
+	debug_printf("* Client connects to TOC\n");
 	tdt->toc_fd =
 	    proxy_connect(user->proto_opt[USEROPT_AUTH][0] ? user->proto_opt[USEROPT_AUTH] : TOC_HOST,
-			  user->proto_opt[USEROPT_AUTHPORT][0] ? atoi(user->
-								      proto_opt[USEROPT_AUTHPORT]) :
-			  TOC_PORT, user->proto_opt[USEROPT_SOCKSHOST],
-			  atoi(user->proto_opt[USEROPT_SOCKSPORT]),
-			  atoi(user->proto_opt[USEROPT_PROXYTYPE]));
+			  user->proto_opt[USEROPT_AUTHPORT][0] ?
+				  atoi(user->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT,
+			  user->proto_opt[USEROPT_PROXYHOST],
+			  atoi(user->proto_opt[USEROPT_PROXYPORT]),
+			  atoi(user->proto_opt[USEROPT_PROXYTYPE]),
+			  toc_login_callback, gc);
 
-	debug_printf("* Client connects to TOC\n");
 	if (tdt->toc_fd < 0) {
 		g_snprintf(buf, sizeof(buf), "Connect to %s failed", user->proto_opt[USEROPT_AUTH]);
 		hide_login_progress(gc, buf);
 		signoff(gc);
 		return;
 	}
+}
+
+static void toc_login_callback(gpointer data, gint source, GdkInputCondition cond)
+{
+	struct gaim_connection *gc = data;
+	struct toc_data *tdt = gc->proto_data;
+	char buf[80];
+
+	if (source == -1) {
+		/* we didn't successfully connect. tdt->toc_fd is valid here */
+		hide_login_progress(gc, "Unable to connect.");
+		signoff(gc);
+		return;
+	}
+
+	if (tdt->toc_fd == 0)
+		tdt->toc_fd = source;
 
 	debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n");
 	if (write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) {
@@ -280,6 +294,14 @@
 	return rp;
 }
 
+static void toc_got_info(gpointer data, char *url_text)
+{
+	if (!url_text)
+		return;
+
+	g_show_info_text(url_text);
+}
+
 static void toc_callback(gpointer data, gint source, GdkInputCondition condition)
 {
 	struct gaim_connection *gc = (struct gaim_connection *)data;
@@ -557,8 +579,13 @@
 		name = strtok(NULL, ":");
 		url = strtok(NULL, ":");
 
-		g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", TOC_HOST, TOC_PORT, url);
-		g_show_info(gc->user, tmp);
+		g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s",
+				gc->user->proto_opt[USEROPT_AUTH][0] ?
+					gc->user->proto_opt[USEROPT_AUTH] : TOC_HOST,
+				gc->user->proto_opt[USEROPT_AUTHPORT][0] ?
+					atoi(gc->user->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT,
+				url);
+		grab_url(gc->user, tmp, toc_got_info, NULL);
 	} else if (!strcasecmp(c, "DIR_STATUS")) {
 	} else if (!strcasecmp(c, "ADMIN_NICK_STATUS")) {
 	} else if (!strcasecmp(c, "ADMIN_PASSWD_STATUS")) {
@@ -993,12 +1020,12 @@
 	} else if (entrynum == USEROPT_AUTHPORT) {
 		g_snprintf(user->proto_opt[USEROPT_AUTHPORT],
 			   sizeof(user->proto_opt[USEROPT_AUTHPORT]), "%s", gtk_entry_get_text(entry));
-	} else if (entrynum == USEROPT_SOCKSHOST) {
-		g_snprintf(user->proto_opt[USEROPT_SOCKSHOST],
-			   sizeof(user->proto_opt[USEROPT_SOCKSHOST]), "%s", gtk_entry_get_text(entry));
-	} else if (entrynum == USEROPT_SOCKSPORT) {
-		g_snprintf(user->proto_opt[USEROPT_SOCKSPORT],
-			   sizeof(user->proto_opt[USEROPT_SOCKSPORT]), "%s", gtk_entry_get_text(entry));
+	} else if (entrynum == USEROPT_PROXYHOST) {
+		g_snprintf(user->proto_opt[USEROPT_PROXYHOST],
+			   sizeof(user->proto_opt[USEROPT_PROXYHOST]), "%s", gtk_entry_get_text(entry));
+	} else if (entrynum == USEROPT_PROXYPORT) {
+		g_snprintf(user->proto_opt[USEROPT_PROXYPORT],
+			   sizeof(user->proto_opt[USEROPT_PROXYPORT]), "%s", gtk_entry_get_text(entry));
 	}
 }
 
@@ -1078,11 +1105,11 @@
 
 	entry = gtk_entry_new();
 	gtk_box_pack_end(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
-	gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_SOCKSHOST);
+	gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_PROXYHOST);
 	gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(toc_print_option), user);
-	if (user->proto_opt[USEROPT_SOCKSHOST][0]) {
-		debug_printf("setting text %s\n", user->proto_opt[USEROPT_SOCKSHOST]);
-		gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_SOCKSHOST]);
+	if (user->proto_opt[USEROPT_PROXYHOST][0]) {
+		debug_printf("setting text %s\n", user->proto_opt[USEROPT_PROXYHOST]);
+		gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_PROXYHOST]);
 	}
 	gtk_widget_show(entry);
 
@@ -1097,11 +1124,11 @@
 
 	entry = gtk_entry_new();
 	gtk_box_pack_end(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
-	gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_SOCKSPORT);
+	gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_PROXYPORT);
 	gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(toc_print_option), user);
-	if (user->proto_opt[USEROPT_SOCKSPORT][0]) {
-		debug_printf("setting text %s\n", user->proto_opt[USEROPT_SOCKSPORT]);
-		gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_SOCKSPORT]);
+	if (user->proto_opt[USEROPT_PROXYPORT][0]) {
+		debug_printf("setting text %s\n", user->proto_opt[USEROPT_PROXYPORT]);
+		gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_PROXYPORT]);
 	}
 	gtk_widget_show(entry);
 
@@ -1375,6 +1402,7 @@
 	char *ip;
 	int port;
 	long size;
+	struct stat st;
 
 	GtkWidget *window;
 	int files;
@@ -1521,6 +1549,23 @@
 	}
 }
 
+static void toc_send_file_connect(gpointer data, gint src, GdkInputCondition cond)
+{
+	struct file_transfer *ft = data;
+
+	if (src == -1) {
+		do_error_dialog(_("Could not connect for transfer!"), _("Error"));
+		g_free(ft->filename);
+		g_free(ft->cookie);
+		g_free(ft->user);
+		g_free(ft->ip);
+		g_free(ft);
+		return;
+	}
+
+	ft->inpa = gdk_input_add(src, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_send_file_callback, ft);
+}
+
 static void toc_send_file(gpointer a, struct file_transfer *old_ft)
 {
 	struct file_transfer *ft;
@@ -1550,9 +1595,10 @@
 
 	fd =
 	    proxy_connect(ft->ip, ft->port,
-			  user->proto_opt[USEROPT_SOCKSHOST],
-			  atoi(user->proto_opt[USEROPT_SOCKSPORT]),
-			  atoi(user->proto_opt[USEROPT_PROXYTYPE]));
+			  user->proto_opt[USEROPT_PROXYHOST],
+			  atoi(user->proto_opt[USEROPT_PROXYPORT]),
+			  atoi(user->proto_opt[USEROPT_PROXYTYPE]),
+			  toc_send_file_connect, ft);
 	if (fd < 0) {
 		do_error_dialog(_("Could not connect for transfer!"), _("Error"));
 		g_free(ft->filename);
@@ -1562,8 +1608,6 @@
 		g_free(ft);
 		return;
 	}
-
-	ft->inpa = gdk_input_add(fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_send_file_callback, ft);
 }
 
 static void toc_get_file_callback(gpointer data, gint source, GdkInputCondition cond)
@@ -1683,15 +1727,63 @@
 	}
 }
 
+static void toc_get_file_connect(gpointer data, gint src, GdkInputCondition cond)
+{
+	struct file_transfer *ft = data;
+	struct file_header *hdr;
+	char *buf;
+
+	if (src == -1) {
+		do_error_dialog(_("Could not connect for transfer!"), _("Error"));
+		fclose(ft->file);
+		g_free(ft->filename);
+		g_free(ft->cookie);
+		g_free(ft->user);
+		g_free(ft->ip);
+		g_free(ft);
+		return;
+	}
+
+	hdr = (struct file_header *)ft;
+	hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2';
+	hdr->hdrlen = htons(256);
+	hdr->hdrtype = htons(0x1108);
+	buf = frombase64(ft->cookie);
+	g_snprintf(hdr->bcookie, 8, "%s", buf);
+	g_free(buf);
+	hdr->totfiles = htons(1); hdr->filesleft = htons(1);
+	hdr->totparts = htons(1); hdr->partsleft = htons(1);
+	hdr->totsize = htonl((long)ft->st.st_size); /* combined size of all files */
+	/* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */
+	hdr->size = htonl(28 + strlen(g_basename(ft->filename))); /* size of listing.txt */
+	hdr->modtime = htonl(ft->st.st_mtime);
+	hdr->checksum = htonl(0x89f70000); /* uh... */
+	g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32");
+	hdr->flags = 0x02;
+	hdr->lnameoffset = 0x1A;
+	hdr->lsizeoffset = 0x10;
+	g_snprintf(hdr->name, 64, "listing.txt");
+	if (write(src, hdr, 256) < 0) {
+		do_error_dialog(_("Could not write file header!"), _("Error"));
+		fclose(ft->file);
+		g_free(ft->filename);
+		g_free(ft->cookie);
+		g_free(ft->user);
+		g_free(ft->ip);
+		g_free(ft);
+		return;
+	}
+
+	ft->inpa = gdk_input_add(src, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_get_file_callback, ft);
+}
+
 static void toc_get_file(gpointer a, struct file_transfer *old_ft)
 {
 	struct file_transfer *ft;
-	struct file_header *hdr;
 	char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window));
 	int fd;
 	struct aim_user *user;
 	char *buf, buf2[BUF_LEN * 2];
-	struct stat st;
 
 	if (file_is_dir(dirname, old_ft->window))
 		return;
@@ -1706,7 +1798,7 @@
 		g_free(ft);
 		return;
 	}
-	if (stat(dirname, &st)) {
+	if (stat(dirname, &ft->st)) {
 		buf = g_strdup_printf("Unable to examine %s!", dirname);
 		do_error_dialog(buf, "Error");
 		g_free(buf);
@@ -1727,9 +1819,10 @@
 
 	fd =
 	    proxy_connect(ft->ip, ft->port,
-			  user->proto_opt[USEROPT_SOCKSHOST],
-			  atoi(user->proto_opt[USEROPT_SOCKSPORT]),
-			  atoi(user->proto_opt[USEROPT_PROXYTYPE]));
+			  user->proto_opt[USEROPT_PROXYHOST],
+			  atoi(user->proto_opt[USEROPT_PROXYPORT]),
+			  atoi(user->proto_opt[USEROPT_PROXYTYPE]),
+			  toc_get_file_connect, ft);
 	if (fd < 0) {
 		do_error_dialog(_("Could not connect for transfer!"), _("Error"));
 		fclose(ft->file);
@@ -1740,38 +1833,6 @@
 		g_free(ft);
 		return;
 	}
-
-	hdr = (struct file_header *)ft;
-	hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2';
-	hdr->hdrlen = htons(256);
-	hdr->hdrtype = htons(0x1108);
-	buf = frombase64(ft->cookie);
-	g_snprintf(hdr->bcookie, 8, "%s", buf);
-	g_free(buf);
-	hdr->totfiles = htons(1); hdr->filesleft = htons(1);
-	hdr->totparts = htons(1); hdr->partsleft = htons(1);
-	hdr->totsize = htonl((long)st.st_size); /* combined size of all files */
-	/* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */
-	hdr->size = htonl(28 + strlen(g_basename(ft->filename))); /* size of listing.txt */
-	hdr->modtime = htonl(st.st_mtime);
-	hdr->checksum = htonl(0x89f70000); /* uh... */
-	g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32");
-	hdr->flags = 0x02;
-	hdr->lnameoffset = 0x1A;
-	hdr->lsizeoffset = 0x10;
-	g_snprintf(hdr->name, 64, "listing.txt");
-	if (write(fd, hdr, 256) < 0) {
-		do_error_dialog(_("Could not write file header!"), _("Error"));
-		fclose(ft->file);
-		g_free(ft->filename);
-		g_free(ft->cookie);
-		g_free(ft->user);
-		g_free(ft->ip);
-		g_free(ft);
-		return;
-	}
-
-	ft->inpa = gdk_input_add(fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_get_file_callback, ft);
 }
 
 static void cancel_callback(gpointer a, struct file_transfer *ft) {