comparison src/html.c @ 2369:117e9f0950b6

[gaim-migrate @ 2382] gaimrc.c doesn't need gtk. html.c can live without gtk. plus this is a better implementation. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Thu, 27 Sep 2001 09:02:07 +0000
parents b66aca8e8dce
children 2927c2c26fe6
comparison
equal deleted inserted replaced
2368:84823e04dcf7 2369:117e9f0950b6
25 #include <string.h> 25 #include <string.h>
26 #include <stdio.h> 26 #include <stdio.h>
27 #include <stdlib.h> 27 #include <stdlib.h>
28 #include <sys/time.h> 28 #include <sys/time.h>
29 #include <unistd.h> 29 #include <unistd.h>
30 #include <gtk/gtk.h>
31 #include <gdk/gdkprivate.h>
32 #include <gdk/gdkx.h>
33 #include "gaim.h" 30 #include "gaim.h"
34 #include <sys/types.h> 31 #include <sys/types.h>
35 #include <sys/socket.h> 32 #include <sys/socket.h>
36 #include <netdb.h> 33 #include <netdb.h>
37 #include <netinet/in.h> 34 #include <netinet/in.h>
112 struct grab_url_data { 109 struct grab_url_data {
113 void (*callback)(gpointer, char *); 110 void (*callback)(gpointer, char *);
114 gpointer data; 111 gpointer data;
115 struct g_url website; 112 struct g_url website;
116 char *url; 113 char *url;
114
115 int inpa;
116
117 gboolean sentreq;
118 char *webdata;
119 int len;
120 gboolean startsaving;
117 }; 121 };
118 122
119 static void grab_url_callback(gpointer dat, gint sock, GdkInputCondition cond) 123 static void grab_url_callback(gpointer dat, gint sock, GaimInputCondition cond)
120 { 124 {
121 struct grab_url_data *gunk = dat; 125 struct grab_url_data *gunk = dat;
122 char *webdata = NULL;
123 int len;
124 int read_rv;
125 int datalen = 0;
126 char buf[256];
127 char data; 126 char data;
128 int startsaving = 0;
129 GtkWidget *pw = NULL, *pbar = NULL, *label;
130 127
131 if (sock == -1) { 128 if (sock == -1) {
132 gunk->callback(gunk->data, NULL); 129 gunk->callback(gunk->data, NULL);
133 g_free(gunk->url); 130 g_free(gunk->url);
134 g_free(gunk); 131 g_free(gunk);
135 return; 132 return;
136 } 133 }
137 134
138 g_snprintf(buf, sizeof(buf), "GET /%s HTTP/1.0\r\n\r\n", gunk->website.page); 135 if (!gunk->sentreq) {
139 debug_printf("Request: %s\n", buf); 136 char buf[256];
140 write(sock, buf, strlen(buf)); 137 g_snprintf(buf, sizeof(buf), "GET /%s HTTP/1.0\r\n\r\n", gunk->website.page);
141 fcntl(sock, F_SETFL, O_NONBLOCK); 138 debug_printf("Request: %s\n", buf);
142 139 write(sock, buf, strlen(buf));
143 webdata = NULL; 140 fcntl(sock, F_SETFL, O_NONBLOCK);
144 len = 0; 141 gunk->sentreq = TRUE;
145 142 gunk->inpa = gaim_input_add(sock, GAIM_INPUT_READ, grab_url_callback, dat);
146 /* 143 return;
147 * avoid fgetc(), it causes problems on solaris 144 }
148 while ((data = fgetc(sockfile)) != EOF) { 145
149 */ 146 if (read(sock, &data, 1) > 0 || errno == EWOULDBLOCK) {
150 /* read_rv will be 0 on EOF and < 0 on error, so this should be fine */
151 while ((read_rv = read(sock, &data, 1)) > 0 || errno == EWOULDBLOCK) {
152 if (errno == EWOULDBLOCK) { 147 if (errno == EWOULDBLOCK) {
153 errno = 0; 148 errno = 0;
154 continue; 149 return;
155 } 150 }
156 151
157 if (!data) 152 if (!gunk->startsaving && data == '<') {
158 continue; 153 if (gunk->webdata)
159 154 g_free(gunk->webdata);
160 if (!startsaving && data == '<') { 155 gunk->webdata = NULL;
161 #ifdef HAVE_STRSTR 156 gunk->len = 0;
162 char *cs = strstr(webdata, "Content-Length"); 157 gunk->startsaving = 1;
163 if (cs) { 158 }
164 char tmpbuf[1024]; 159
165 sscanf(cs, "Content-Length: %d", &datalen); 160 gunk->len++;
166 161 gunk->webdata = g_realloc(gunk->webdata, gunk->len);
167 g_snprintf(tmpbuf, 1024, _("Getting %d bytes from %s"), 162 gunk->webdata[gunk->len - 1] = data;
168 datalen, gunk->url); 163 } else if (errno != ETIMEDOUT) {
169 pw = gtk_dialog_new(); 164
170 165 gunk->webdata = g_realloc(gunk->webdata, gunk->len + 1);
171 label = gtk_label_new(tmpbuf); 166 gunk->webdata[gunk->len] = 0;
172 gtk_widget_show(label); 167
173 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pw)->vbox), 168 debug_printf(_("Receieved: '%s'\n"), gunk->webdata);
174 label, FALSE, FALSE, 5); 169
175 170 gaim_input_remove(gunk->inpa);
176 pbar = gtk_progress_bar_new(); 171 close(sock);
177 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pw)->action_area), 172 gunk->callback(gunk->data, gunk->webdata);
178 pbar, FALSE, FALSE, 5); 173 if (gunk->webdata)
179 gtk_widget_show(pbar); 174 g_free(gunk->webdata);
180 175 g_free(gunk->url);
181 gtk_window_set_title(GTK_WINDOW(pw), _("Getting Data")); 176 g_free(gunk);
182 177 } else {
183 gtk_widget_realize(pw); 178 gaim_input_remove(gunk->inpa);
184 aol_icon(pw->window); 179 close(sock);
185 180 gunk->callback(gunk->data, NULL);
186 gtk_widget_show(pw); 181 if (gunk->webdata)
187 } else 182 g_free(gunk->webdata);
188 datalen = 0; 183 g_free(gunk->url);
189 #else 184 g_free(gunk);
190 datalen = 0; 185 }
191 #endif
192 g_free(webdata);
193 webdata = NULL;
194 len = 0;
195 startsaving = 1;
196 }
197
198 len++;
199 webdata = g_realloc(webdata, len);
200 webdata[len - 1] = data;
201
202 if (pbar)
203 gtk_progress_bar_update(GTK_PROGRESS_BAR(pbar), ((100 * len) / datalen) / 100.0);
204
205 while (gtk_events_pending())
206 gtk_main_iteration();
207 }
208
209 webdata = g_realloc(webdata, len + 1);
210 webdata[len] = 0;
211
212
213 debug_printf(_("Receieved: '%s'\n"), webdata);
214
215 if (pw)
216 gtk_widget_destroy(pw);
217
218 close(sock);
219 gunk->callback(gunk->data, webdata);
220 g_free(gunk->url);
221 g_free(gunk);
222 } 186 }
223 187
224 void grab_url(char *url, void (*callback)(gpointer, char *), gpointer data) 188 void grab_url(char *url, void (*callback)(gpointer, char *), gpointer data)
225 { 189 {
226 int sock; 190 int sock;