Mercurial > pidgin
annotate src/rvous.c @ 202:bcc54ee34531
[gaim-migrate @ 212]
uh huh
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Sun, 30 Apr 2000 22:25:48 +0000 |
parents | d9a5f7b1d500 |
children | 4fa63e83406b |
rev | line source |
---|---|
198 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 | |
22 #include <string.h> | |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <time.h> | |
26 #include <sys/types.h> | |
27 #include <sys/stat.h> | |
28 #include <fcntl.h> | |
29 #include <sys/socket.h> | |
30 #include <netdb.h> | |
31 #include <netinet/in.h> | |
32 #include <unistd.h> | |
33 #include <netinet/in.h> | |
34 #include <arpa/inet.h> | |
35 | |
36 #include <gtk/gtk.h> | |
37 #include "gaim.h" | |
38 | |
39 static void do_send_file(GtkWidget *, struct file_transfer *); | |
40 static void do_get_file (GtkWidget *, struct file_transfer *); | |
41 | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
42 static void toggle(GtkWidget *w, int *m) |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
43 { |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
44 *m = !(*m); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
45 } |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
46 |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
47 static void free_ft(struct file_transfer *ft) |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
48 { |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
49 if (ft->window) { gtk_widget_destroy(ft->window); ft->window = NULL; } |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
50 if (ft->filename) g_free(ft->filename); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
51 if (ft->user) g_free(ft->user); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
52 if (ft->message) g_free(ft->message); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
53 if (ft->ip) g_free(ft->ip); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
54 if (ft->cookie) g_free(ft->cookie); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
55 g_free(ft); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
56 } |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
57 |
198 | 58 static void warn_callback(GtkWidget *widget, struct file_transfer *ft) |
59 { | |
60 show_warn_dialog(ft->user); | |
61 } | |
62 | |
63 static void info_callback(GtkWidget *widget, struct file_transfer *ft) | |
64 { | |
65 serv_get_info(ft->user); | |
66 } | |
67 | |
68 static void cancel_callback(GtkWidget *widget, struct file_transfer *ft) | |
69 { | |
70 char *send = g_malloc(256); | |
71 | |
72 if (ft->accepted) { | |
73 g_free(send); | |
74 return; | |
75 } | |
76 | |
77 g_snprintf(send, 255, "toc_rvous_cancel %s %s %s", normalize(ft->user), | |
78 ft->cookie, ft->UID); | |
79 sflap_send(send, strlen(send), TYPE_DATA); | |
80 g_free(send); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
81 free_ft(ft); |
198 | 82 } |
83 | |
84 static void accept_callback(GtkWidget *widget, struct file_transfer *ft) | |
85 { | |
86 char *buf = g_malloc(BUF_LEN); | |
87 char *fname = g_malloc(BUF_LEN); | |
88 char *c; | |
89 | |
90 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
91 c = ft->filename + strlen(ft->filename); | |
92 | |
93 while (c != ft->filename) { | |
94 if (*c == '/' || *c == '\\') { | |
95 strcpy(fname, c+1); | |
96 break; | |
97 } | |
98 c--; | |
99 } | |
100 | |
101 if (c == ft->filename) | |
102 strcpy(fname, ft->filename); | |
103 } | |
104 | |
105 gtk_widget_destroy(ft->window); | |
106 ft->window = NULL; | |
107 | |
108 ft->window = gtk_file_selection_new("Gaim - Save As..."); | |
109 | |
110 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(ft->window)); | |
111 | |
112 if (!strcmp(ft->UID, FILE_SEND_UID)) | |
113 g_snprintf(buf, BUF_LEN - 1, "%s/%s", getenv("HOME"), fname); | |
114 else | |
115 g_snprintf(buf, BUF_LEN - 1, "%s/", getenv("HOME")); | |
116 gtk_file_selection_set_filename(GTK_FILE_SELECTION(ft->window), buf); | |
117 | |
118 gtk_signal_connect(GTK_OBJECT(ft->window), "destroy", | |
119 GTK_SIGNAL_FUNC(cancel_callback), ft); | |
120 | |
121 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
122 gtk_signal_connect(GTK_OBJECT( | |
123 GTK_FILE_SELECTION(ft->window)->ok_button), | |
124 "clicked", GTK_SIGNAL_FUNC(do_get_file), ft); | |
125 } else { | |
126 gtk_signal_connect(GTK_OBJECT( | |
127 GTK_FILE_SELECTION(ft->window)->ok_button), | |
128 "clicked", GTK_SIGNAL_FUNC(do_send_file), ft); | |
129 } | |
130 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button), | |
131 "clicked", GTK_SIGNAL_FUNC(cancel_callback), ft); | |
132 | |
133 gtk_widget_show(ft->window); | |
134 | |
135 g_free(buf); | |
136 g_free(fname); | |
137 } | |
138 | |
139 static void do_get_file(GtkWidget *w, struct file_transfer *ft) | |
140 { | |
141 char *send = g_malloc(256); | |
142 char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(ft->window)); | |
143 char *buf; | |
144 char *header; | |
145 short hdrlen; | |
146 int read_rv; | |
147 char bmagic[7]; | |
148 struct sockaddr_in sin; | |
149 guint32 rcv; | |
150 char *c; | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
151 int cont = 1; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
152 GtkWidget *fw = NULL, *fbar = NULL, *label = NULL, *button = NULL; |
198 | 153 |
154 if (!(ft->f = fopen(file,"w"))) { | |
155 buf = g_malloc(BUF_LONG); | |
156 g_snprintf(buf, BUF_LONG / 2, "Error writing file %s", file); | |
157 do_error_dialog(buf, "Error"); | |
158 g_free(buf); | |
159 ft->accepted = 0; | |
160 accept_callback(NULL, ft); | |
161 return; | |
162 } | |
163 | |
164 ft->accepted = 1; | |
165 | |
166 gtk_widget_destroy(ft->window); | |
167 ft->window = NULL; | |
168 g_snprintf(send, 255, "toc_rvous_accept %s %s %s", normalize(ft->user), | |
169 ft->cookie, ft->UID); | |
170 sflap_send(send, strlen(send), TYPE_DATA); | |
171 g_free(send); | |
172 | |
173 | |
174 | |
175 sin.sin_addr.s_addr = inet_addr(ft->ip); | |
176 sin.sin_family = AF_INET; | |
177 sin.sin_port = htons(ft->port); | |
178 | |
179 ft->fd = socket(AF_INET, SOCK_STREAM, 0); | |
180 | |
181 if (ft->fd <= -1 || connect(ft->fd, (struct sockaddr_in *)&sin, sizeof(sin))) { | |
182 return; | |
183 } | |
184 | |
185 rcv = 0; | |
186 header = g_malloc(6); | |
187 while (rcv != 6) { | |
188 read_rv = read(ft->fd, header + rcv, 6 - rcv); | |
189 if(read_rv < 0) { | |
190 close(ft->fd); | |
191 g_free(header); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
192 free_ft(ft); |
198 | 193 return; |
194 } | |
195 rcv += read_rv; | |
196 while(gtk_events_pending()) | |
197 gtk_main_iteration(); | |
198 } | |
199 | |
200 strncpy(bmagic, header, 6); | |
201 bmagic[6] = 0; | |
202 | |
203 hdrlen = 0; | |
204 hdrlen |= (header[4] << 8) & 0xff00; | |
205 hdrlen |= (header[5] << 0) & 0x00ff; | |
206 hdrlen -= 6; | |
207 | |
208 sprintf(debug_buff, "header length %d\n", hdrlen); | |
209 debug_print(debug_buff); | |
210 | |
211 g_free(header); | |
212 header = g_malloc(hdrlen); | |
213 | |
214 rcv = 0; | |
215 | |
216 while (rcv != hdrlen) { | |
217 read_rv = read(ft->fd, header + rcv, hdrlen - rcv); | |
218 if(read_rv < 0) { | |
219 close(ft->fd); | |
220 g_free(header); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
221 free_ft(ft); |
198 | 222 return; |
223 } | |
224 rcv += read_rv; | |
225 while(gtk_events_pending()) | |
226 gtk_main_iteration(); | |
227 } | |
228 | |
229 c = header; | |
230 | |
231 header[0] = 2; header[1] = 2; | |
232 | |
233 buf = frombase64(ft->cookie); | |
234 memcpy(header + 2, buf, 8); | |
235 g_free(buf); | |
236 memset(header + 62, 0, 32); strcpy(header + 62, "Gaim"); | |
237 memset(header + 10, 0, 4); | |
238 header[18] = 1; header[19] = 0; | |
239 header[20] = 1; header[21] = 0; | |
240 | |
241 sprintf(debug_buff, "sending confirmation\n"); | |
242 debug_print(debug_buff); | |
243 write(ft->fd, bmagic, 6); | |
244 write(ft->fd, header, hdrlen); | |
245 | |
246 buf = g_malloc(1024); | |
247 rcv = 0; | |
248 | |
249 fw = gtk_dialog_new(); | |
250 buf = g_malloc(2048); | |
251 snprintf(buf, 2048, "Receiving %s from %s (%d bytes)", ft->filename, | |
252 ft->user, ft->size); | |
253 label = gtk_label_new(buf); | |
254 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->vbox), label, 0, 0, 5); | |
255 gtk_widget_show(label); | |
256 fbar = gtk_progress_bar_new(); | |
257 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->action_area), fbar, 0, 0, 5); | |
258 gtk_widget_show(fbar); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
259 button = gtk_button_new_with_label("Cancel"); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
260 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->action_area), button, 0, 0, 5); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
261 gtk_widget_show(button); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
262 gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc)toggle, &cont); |
198 | 263 gtk_window_set_title(GTK_WINDOW(fw), "File Transfer"); |
264 gtk_widget_realize(fw); | |
265 aol_icon(fw->window); | |
266 gtk_widget_show(fw); | |
267 | |
268 sprintf(debug_buff, "Receiving %s from %s (%d bytes)\n", ft->filename, | |
269 ft->user, ft->size); | |
270 debug_print(debug_buff); | |
271 | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
272 while (rcv != ft->size && cont) { |
198 | 273 int i; |
274 int remain = ft->size - rcv > 1024 ? 1024 : ft->size - rcv; | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
275 read_rv = recv(ft->fd, buf, remain, O_NONBLOCK); |
198 | 276 if(read_rv < 0) { |
277 fclose(ft->f); | |
278 close(ft->fd); | |
279 g_free(buf); | |
280 g_free(header); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
281 free_ft(ft); |
198 | 282 return; |
283 } | |
284 rcv += read_rv; | |
285 for (i = 0; i < read_rv; i++) | |
286 fprintf(ft->f, "%c", buf[i]); | |
287 snprintf(buf, 2048, "Receiving %s from %s (%d / %d bytes)", | |
288 header + 186, ft->user, rcv, ft->size); | |
289 gtk_label_set_text(GTK_LABEL(label), buf); | |
290 gtk_progress_bar_update(GTK_PROGRESS_BAR(fbar), | |
291 (float)(rcv)/(float)(ft->size)); | |
292 while(gtk_events_pending()) | |
293 gtk_main_iteration(); | |
294 } | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
295 fclose(ft->f); |
201
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
296 gtk_widget_destroy(fw); |
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
297 fw = NULL; |
198 | 298 |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
299 if (!cont) { |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
300 char *tmp = frombase64(ft->cookie); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
301 sprintf(buf, "toc_rvous_cancel %s %s %s", ft->user, tmp, ft->UID); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
302 sflap_send(buf, strlen(buf), TYPE_DATA); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
303 close(ft->fd); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
304 free_ft(ft); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
305 return; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
306 } |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
307 |
198 | 308 memset(header + 18, 0, 4); |
309 header[94] = 0; | |
310 header[1] = 0x04; | |
311 memcpy(header+58, header+34, 4); | |
312 memcpy(header+54, header+22, 4); | |
313 write(ft->fd, bmagic, 6); | |
314 write(ft->fd, header, hdrlen); | |
315 close(ft->fd); | |
316 | |
317 g_free(buf); | |
318 g_free(header); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
319 free_ft(ft); |
198 | 320 } |
321 | |
322 static void do_send_file(GtkWidget *w, struct file_transfer *ft) { | |
323 char *send = g_malloc(256); | |
324 char *file = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(ft->window))); | |
325 char *buf; | |
326 int read_rv; | |
327 char bmagic[7]; | |
328 struct file_header *fhdr = g_new0(struct file_header, 1); | |
329 struct sockaddr_in sin; | |
330 guint32 rcv; | |
331 GtkWidget *fw = NULL, *fbar = NULL, *label; | |
332 struct stat st; | |
333 | |
334 stat(file, &st); | |
335 if (!(ft->f = fopen(file, "r"))) { | |
336 buf = g_malloc(BUF_LONG); | |
337 g_snprintf(buf, BUF_LONG / 2, "Error reading file %s", file); | |
338 do_error_dialog(buf, "Error"); | |
339 g_free(buf); | |
340 ft->accepted = 0; | |
341 accept_callback(NULL, ft); | |
342 return; | |
343 } | |
344 | |
345 ft->accepted = 1; | |
346 | |
347 gtk_widget_destroy(ft->window); | |
348 ft->window = NULL; | |
349 g_snprintf(send, 255, "toc_rvous_accept %s %s %s", normalize(ft->user), | |
350 ft->cookie, ft->UID); | |
351 sflap_send(send, strlen(send), TYPE_DATA); | |
352 g_free(send); | |
353 | |
354 | |
355 | |
356 sin.sin_addr.s_addr = inet_addr(ft->ip); | |
357 sin.sin_family = AF_INET; | |
358 sin.sin_port = htons(ft->port); | |
359 | |
360 ft->fd = socket(AF_INET, SOCK_STREAM, 0); | |
361 | |
362 if (ft->fd <= -1 || connect(ft->fd, (struct sockaddr_in *)&sin, sizeof(sin))) { | |
363 return; | |
364 } | |
365 | |
366 /* here's where we differ from do_get_file */ | |
367 /* 1. build/send header | |
368 * 2. receive header | |
201
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
369 * 3. send listing file |
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
370 * 4. receive header |
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
371 * |
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
372 * then we need to wait to actually send the file. |
198 | 373 */ |
374 | |
375 /* 1. build/send header */ | |
376 buf = frombase64(ft->cookie); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
377 sprintf(debug_buff, "Building header to send %s (cookie: %s)\n", file, buf); |
202
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
378 printf("%s", buf); fflush(stdout); |
198 | 379 debug_print(debug_buff); |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
380 fhdr->hdrtype = 0x1108; |
202
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
381 snprintf(fhdr->bcookie, 8, "%s", buf); |
198 | 382 g_free(buf); |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
383 fhdr->encrypt = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
384 fhdr->compress = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
385 fhdr->totfiles = 1; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
386 fhdr->filesleft = 1; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
387 fhdr->totparts = 1; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
388 fhdr->partsleft = 1; |
202
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
389 fhdr->totsize = (long)st.st_size; /* ? */ |
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
390 fhdr->size = (long)st.st_size; /* size of listing.txt */ /* FIXME */ |
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
391 fhdr->modtime = 0; /* time since UNIX epoch */ /* FIXME */ |
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
392 fhdr->checksum = 0; /* ? */ |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
393 fhdr->rfrcsum = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
394 fhdr->rfsize = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
395 fhdr->cretime = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
396 fhdr->rfcsum = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
397 fhdr->nrecvd = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
398 fhdr->recvcsum = 0; |
198 | 399 snprintf(fhdr->idstring, 32, "Gaim"); |
202
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
400 fhdr->flags = 0x20; /* don't ask me why */ |
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
401 fhdr->lnameoffset = 0x1A; /* ? still no clue */ |
bcc54ee34531
[gaim-migrate @ 212]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
201
diff
changeset
|
402 fhdr->lsizeoffset = 0x10; /* whatever */ |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
403 fhdr->dummy[0] = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
404 fhdr->macfileinfo[0] = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
405 fhdr->nencode = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
406 fhdr->nlanguage = 0; |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
407 snprintf(fhdr->name, 64, "listing.txt"); |
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
408 snprintf(bmagic, 7, "OFT2\001\000"); |
198 | 409 read_rv = write(ft->fd, bmagic, 6); |
410 if (read_rv <= -1) { | |
411 sprintf(debug_buff, "Couldn't write opening header \n"); | |
412 debug_print(debug_buff); | |
413 close(ft->fd); | |
414 return; | |
415 } | |
416 read_rv = write(ft->fd, fhdr, 250); | |
417 if (read_rv <= -1) { | |
418 sprintf(debug_buff, "Couldn't write opening header 2\n"); | |
419 debug_print(debug_buff); | |
420 close(ft->fd); | |
421 return; | |
422 } | |
423 | |
424 /* 2. receive header */ | |
425 sprintf(debug_buff, "Receiving header\n"); | |
426 debug_print(debug_buff); | |
427 read_rv = read(ft->fd, bmagic, 6); | |
428 if (read_rv <= -1) { | |
429 sprintf(debug_buff, "Couldn't read header\n"); | |
430 debug_print(debug_buff); | |
431 close(ft->fd); | |
432 return; | |
433 } | |
434 read_rv = read(ft->fd, fhdr, *(short *)&bmagic[4]); | |
435 if (read_rv <= -1) { | |
436 sprintf(debug_buff, "Couldn't read header 2\n"); | |
437 debug_print(debug_buff); | |
438 close(ft->fd); | |
439 return; | |
440 } | |
441 | |
201
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
442 /* 3. send listing file */ |
198 | 443 sprintf(debug_buff, "Sending file\n"); |
444 debug_print(debug_buff); | |
445 rcv = 0; | |
446 buf = g_malloc(2048); | |
447 fw = gtk_dialog_new(); | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
448 snprintf(buf, 2048, "Sendin %s to %s (%ld bytes)", fhdr->name, |
198 | 449 ft->user, fhdr->size); |
450 label = gtk_label_new(buf); | |
451 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->vbox), label, 0, 0, 5); | |
452 gtk_widget_show(label); | |
453 fbar = gtk_progress_bar_new(); | |
454 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->action_area), fbar, 0, 0, 5); | |
455 gtk_widget_show(fbar); | |
456 gtk_window_set_title(GTK_WINDOW(fw), "File Transfer"); | |
457 gtk_widget_realize(fw); | |
458 aol_icon(fw->window); | |
459 gtk_widget_show(fw); | |
460 | |
461 sprintf(debug_buff, "Sending %s to %s (%d bytes)\n", fhdr->name, | |
462 ft->user, ntohl(fhdr->size)); | |
463 debug_print(debug_buff); | |
464 | |
465 while (rcv != st.st_size) { | |
466 int i; | |
467 int remain = st.st_size - rcv > 1024 ? 1024 : st.st_size - rcv; | |
468 for (i = 0; i < remain; i++) | |
469 fscanf(ft->f, "%c", &buf[i]); | |
470 read_rv = write(ft->fd, buf, remain); | |
471 if (read_rv <= -1) { | |
472 sprintf(debug_buff, "Could not send file, wrote %d\n", rcv); | |
473 debug_print(debug_buff); | |
474 close(ft->fd); | |
475 gtk_widget_destroy(fw); | |
476 return; | |
477 } | |
478 rcv += read_rv; | |
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
479 snprintf(buf, 2048, "Sending %s to %s (%d / %ld bytes)", |
198 | 480 fhdr->name, ft->user, rcv, st.st_size); |
481 gtk_label_set_text(GTK_LABEL(label), buf); | |
482 gtk_progress_bar_update(GTK_PROGRESS_BAR(fbar), | |
483 (float)(rcv)/(float)(ft->size)); | |
484 while(gtk_events_pending()) | |
485 gtk_main_iteration(); | |
486 } | |
487 gtk_widget_destroy(fw); | |
488 | |
201
d9a5f7b1d500
[gaim-migrate @ 211]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
200
diff
changeset
|
489 /* 4. receive header */ |
198 | 490 sprintf(debug_buff, "Receiving closing header\n"); |
491 debug_print(debug_buff); | |
492 read_rv = read(ft->fd, bmagic, 6); | |
493 if (read_rv <= -1) { | |
494 sprintf(debug_buff, "Couldn't read closing header\n"); | |
495 debug_print(debug_buff); | |
496 close(ft->fd); | |
497 return; | |
498 } | |
499 read_rv = read(ft->fd, fhdr, *(short *)&bmagic[4]); | |
500 if (read_rv <= -1) { | |
501 sprintf(debug_buff, "Couldn't read closing header 2\n"); | |
502 debug_print(debug_buff); | |
503 close(ft->fd); | |
504 return; | |
505 } | |
506 | |
507 fclose(ft->f); | |
508 close(ft->fd); | |
509 g_free(fhdr); | |
510 } | |
511 | |
512 void accept_file_dialog(struct file_transfer *ft) | |
513 { | |
514 GtkWidget *accept, *info, *warn, *cancel; | |
515 GtkWidget *text = NULL, *sw; | |
516 GtkWidget *label; | |
517 GtkWidget *vbox, *bbox; | |
518 char buf[1024]; | |
519 | |
520 | |
521 ft->window = gtk_window_new(GTK_WINDOW_DIALOG); | |
522 | |
523 accept = gtk_button_new_with_label("Accept"); | |
524 info = gtk_button_new_with_label("Info"); | |
525 warn = gtk_button_new_with_label("Warn"); | |
526 cancel = gtk_button_new_with_label("Cancel"); | |
527 | |
528 bbox = gtk_hbox_new(TRUE, 10); | |
529 vbox = gtk_vbox_new(FALSE, 5); | |
530 | |
531 gtk_widget_show(accept); | |
532 gtk_widget_show(info); | |
533 gtk_widget_show(warn); | |
534 gtk_widget_show(cancel); | |
535 | |
536 gtk_box_pack_start(GTK_BOX(bbox), accept, TRUE, TRUE, 10); | |
537 gtk_box_pack_start(GTK_BOX(bbox), info, TRUE, TRUE, 10); | |
538 gtk_box_pack_start(GTK_BOX(bbox), warn, TRUE, TRUE, 10); | |
539 gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 10); | |
540 | |
541 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
542 g_snprintf(buf, sizeof(buf), "%s requests you to accept the file: %s (%d bytes)", | |
543 ft->user, ft->filename, ft->size); | |
544 } else { | |
545 g_snprintf(buf, sizeof(buf), "%s requests you to send them a file", | |
546 ft->user); | |
547 } | |
548 label = gtk_label_new(buf); | |
549 gtk_widget_show(label); | |
550 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); | |
551 | |
552 if (ft->message) { | |
553 /* we'll do this later | |
554 text = gaim_new_layout(); | |
555 sw = gtk_scrolled_window_new (NULL, NULL); | |
556 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), | |
557 GTK_POLICY_NEVER, | |
558 GTK_POLICY_AUTOMATIC); | |
559 gtk_widget_show(sw); | |
560 gtk_container_add(GTK_CONTAINER(sw), text); | |
561 gtk_widget_show(text); | |
562 | |
563 gtk_layout_set_size(GTK_LAYOUT(text), 250, 100); | |
564 GTK_LAYOUT (text)->vadjustment->step_increment = 10.0; | |
565 gtk_widget_set_usize(sw, 250, 100); | |
566 | |
567 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 10); | |
568 */ | |
569 } | |
570 gtk_box_pack_start(GTK_BOX(vbox), bbox, TRUE, TRUE, 5); | |
571 | |
572 gtk_window_set_title(GTK_WINDOW(ft->window), "Gaim - File Transfer?"); | |
573 gtk_window_set_focus(GTK_WINDOW(ft->window), accept); | |
574 gtk_container_add(GTK_CONTAINER(ft->window), vbox); | |
575 gtk_container_border_width(GTK_CONTAINER(ft->window), 10); | |
576 gtk_widget_show(vbox); | |
577 gtk_widget_show(bbox); | |
578 gtk_widget_realize(ft->window); | |
579 aol_icon(ft->window->window); | |
580 | |
581 gtk_widget_show(ft->window); | |
582 | |
583 | |
584 gtk_signal_connect(GTK_OBJECT(accept), "clicked", | |
585 GTK_SIGNAL_FUNC(accept_callback), ft); | |
586 gtk_signal_connect(GTK_OBJECT(cancel), "clicked", | |
587 GTK_SIGNAL_FUNC(cancel_callback), ft); | |
588 gtk_signal_connect(GTK_OBJECT(warn), "clicked", | |
589 GTK_SIGNAL_FUNC(warn_callback), ft); | |
590 gtk_signal_connect(GTK_OBJECT(info), "clicked", | |
591 GTK_SIGNAL_FUNC(info_callback), ft); | |
592 | |
593 | |
594 if (ft->message) { | |
595 /* we'll do this later | |
596 while(gtk_events_pending()) | |
597 gtk_main_iteration(); | |
598 html_print(text, ft->message); | |
599 */ | |
600 } | |
601 } |