Mercurial > pidgin
annotate src/rvous.c @ 200:bc117fbcf527
[gaim-migrate @ 210]
Made the receive non-blocking, added a cancel button, and a few other updates.
No, sending a file to someone does not work yet. Be patient.
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Sun, 30 Apr 2000 21:47:04 +0000 |
| parents | 73e9a0bfff62 |
| children | d9a5f7b1d500 |
| 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); |
| 198 | 296 |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
297 if (!cont) { |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
298 char *tmp = frombase64(ft->cookie); |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
299 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
|
300 sflap_send(buf, strlen(buf), TYPE_DATA); |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
301 gtk_widget_destroy(fw); |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
302 fw = NULL; |
|
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 char *header; | |
| 327 short hdrlen; | |
| 328 int read_rv; | |
| 329 char bmagic[7]; | |
| 330 struct file_header *fhdr = g_new0(struct file_header, 1); | |
| 331 struct sockaddr_in sin; | |
| 332 guint32 rcv; | |
| 333 char *c; | |
| 334 GtkWidget *fw = NULL, *fbar = NULL, *label; | |
| 335 struct stat st; | |
| 336 | |
| 337 stat(file, &st); | |
| 338 if (!(ft->f = fopen(file, "r"))) { | |
| 339 buf = g_malloc(BUF_LONG); | |
| 340 g_snprintf(buf, BUF_LONG / 2, "Error reading file %s", file); | |
| 341 do_error_dialog(buf, "Error"); | |
| 342 g_free(buf); | |
| 343 ft->accepted = 0; | |
| 344 accept_callback(NULL, ft); | |
| 345 return; | |
| 346 } | |
| 347 | |
| 348 ft->accepted = 1; | |
| 349 | |
| 350 gtk_widget_destroy(ft->window); | |
| 351 ft->window = NULL; | |
| 352 g_snprintf(send, 255, "toc_rvous_accept %s %s %s", normalize(ft->user), | |
| 353 ft->cookie, ft->UID); | |
| 354 sflap_send(send, strlen(send), TYPE_DATA); | |
| 355 g_free(send); | |
| 356 | |
| 357 | |
| 358 | |
| 359 sin.sin_addr.s_addr = inet_addr(ft->ip); | |
| 360 sin.sin_family = AF_INET; | |
| 361 sin.sin_port = htons(ft->port); | |
| 362 | |
| 363 ft->fd = socket(AF_INET, SOCK_STREAM, 0); | |
| 364 | |
| 365 if (ft->fd <= -1 || connect(ft->fd, (struct sockaddr_in *)&sin, sizeof(sin))) { | |
| 366 return; | |
| 367 } | |
| 368 | |
| 369 /* here's where we differ from do_get_file */ | |
| 370 /* 1. build/send header | |
| 371 * 2. receive header | |
| 372 * 3. send header again | |
| 373 * 4. send file | |
| 374 * 5. receive header | |
| 375 */ | |
| 376 | |
| 377 /* 1. build/send header */ | |
| 378 buf = frombase64(ft->cookie); | |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
379 sprintf(debug_buff, "Building header to send %s (cookie: %s)\n", file, buf); |
| 198 | 380 debug_print(debug_buff); |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
381 fhdr->hdrtype = 0x1108; |
| 198 | 382 snprintf(fhdr->bcookie, 9, "%s", buf); |
| 383 g_free(buf); | |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
384 fhdr->encrypt = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
385 fhdr->compress = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
386 fhdr->totfiles = 1; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
387 fhdr->filesleft = 1; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
388 fhdr->totparts = 1; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
389 fhdr->partsleft = 1; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
390 fhdr->totsize = (long)st.st_size; |
| 198 | 391 fhdr->size = htonl((long)(st.st_size)); |
| 392 fhdr->modtime = htonl(0); | |
| 393 fhdr->checksum = htonl(0); /* FIXME? */ | |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
394 fhdr->rfrcsum = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
395 fhdr->rfsize = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
396 fhdr->cretime = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
397 fhdr->rfcsum = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
398 fhdr->nrecvd = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
399 fhdr->recvcsum = 0; |
| 198 | 400 snprintf(fhdr->idstring, 32, "Gaim"); |
| 401 fhdr->flags = 0x20; /* don't ask me why */ | |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
402 fhdr->lnameoffset = 0x1A; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
403 fhdr->lsizeoffset = 0x10; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
404 fhdr->dummy[0] = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
405 fhdr->macfileinfo[0] = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
406 fhdr->nencode = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
407 fhdr->nlanguage = 0; |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
408 snprintf(fhdr->name, 64, "listing.txt"); |
|
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
409 snprintf(bmagic, 7, "OFT2\001\000"); |
| 198 | 410 read_rv = write(ft->fd, bmagic, 6); |
| 411 if (read_rv <= -1) { | |
| 412 sprintf(debug_buff, "Couldn't write opening header \n"); | |
| 413 debug_print(debug_buff); | |
| 414 close(ft->fd); | |
| 415 return; | |
| 416 } | |
| 417 read_rv = write(ft->fd, fhdr, 250); | |
| 418 if (read_rv <= -1) { | |
| 419 sprintf(debug_buff, "Couldn't write opening header 2\n"); | |
| 420 debug_print(debug_buff); | |
| 421 close(ft->fd); | |
| 422 return; | |
| 423 } | |
| 424 | |
| 425 /* 2. receive header */ | |
| 426 sprintf(debug_buff, "Receiving header\n"); | |
| 427 debug_print(debug_buff); | |
| 428 read_rv = read(ft->fd, bmagic, 6); | |
| 429 if (read_rv <= -1) { | |
| 430 sprintf(debug_buff, "Couldn't read header\n"); | |
| 431 debug_print(debug_buff); | |
| 432 close(ft->fd); | |
| 433 return; | |
| 434 } | |
| 435 read_rv = read(ft->fd, fhdr, *(short *)&bmagic[4]); | |
| 436 if (read_rv <= -1) { | |
| 437 sprintf(debug_buff, "Couldn't read header 2\n"); | |
| 438 debug_print(debug_buff); | |
| 439 close(ft->fd); | |
| 440 return; | |
| 441 } | |
| 442 | |
| 443 /* 3. send header again */ | |
| 444 fhdr->hdrtype = 0x303; | |
| 445 fhdr->encrypt = htons(0); | |
| 446 fhdr->compress = htons(0); | |
| 447 snprintf(fhdr->idstring, 32, "Gaim"); | |
| 448 read_rv = write(ft->fd, bmagic, 6); | |
| 449 if (read_rv <= -1) { | |
| 450 sprintf(debug_buff, "Couldn't write ack header\n"); | |
| 451 debug_print(debug_buff); | |
| 452 close(ft->fd); | |
| 453 return; | |
| 454 } | |
| 455 read_rv = write(ft->fd, fhdr, 250); | |
| 456 if (read_rv <= -1) { | |
| 457 sprintf(debug_buff, "Couldn't write ack header 2\n"); | |
| 458 debug_print(debug_buff); | |
| 459 close(ft->fd); | |
| 460 return; | |
| 461 } | |
| 462 | |
| 463 /* 4. send file */ | |
| 464 sprintf(debug_buff, "Sending file\n"); | |
| 465 debug_print(debug_buff); | |
| 466 rcv = 0; | |
| 467 buf = g_malloc(2048); | |
| 468 fw = gtk_dialog_new(); | |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
469 snprintf(buf, 2048, "Sendin %s to %s (%ld bytes)", fhdr->name, |
| 198 | 470 ft->user, fhdr->size); |
| 471 label = gtk_label_new(buf); | |
| 472 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->vbox), label, 0, 0, 5); | |
| 473 gtk_widget_show(label); | |
| 474 fbar = gtk_progress_bar_new(); | |
| 475 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->action_area), fbar, 0, 0, 5); | |
| 476 gtk_widget_show(fbar); | |
| 477 gtk_window_set_title(GTK_WINDOW(fw), "File Transfer"); | |
| 478 gtk_widget_realize(fw); | |
| 479 aol_icon(fw->window); | |
| 480 gtk_widget_show(fw); | |
| 481 | |
| 482 sprintf(debug_buff, "Sending %s to %s (%d bytes)\n", fhdr->name, | |
| 483 ft->user, ntohl(fhdr->size)); | |
| 484 debug_print(debug_buff); | |
| 485 | |
| 486 while (rcv != st.st_size) { | |
| 487 int i; | |
| 488 int remain = st.st_size - rcv > 1024 ? 1024 : st.st_size - rcv; | |
| 489 for (i = 0; i < remain; i++) | |
| 490 fscanf(ft->f, "%c", &buf[i]); | |
| 491 read_rv = write(ft->fd, buf, remain); | |
| 492 if (read_rv <= -1) { | |
| 493 sprintf(debug_buff, "Could not send file, wrote %d\n", rcv); | |
| 494 debug_print(debug_buff); | |
| 495 close(ft->fd); | |
| 496 gtk_widget_destroy(fw); | |
| 497 return; | |
| 498 } | |
| 499 rcv += read_rv; | |
|
200
bc117fbcf527
[gaim-migrate @ 210]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
198
diff
changeset
|
500 snprintf(buf, 2048, "Sending %s to %s (%d / %ld bytes)", |
| 198 | 501 fhdr->name, ft->user, rcv, st.st_size); |
| 502 gtk_label_set_text(GTK_LABEL(label), buf); | |
| 503 gtk_progress_bar_update(GTK_PROGRESS_BAR(fbar), | |
| 504 (float)(rcv)/(float)(ft->size)); | |
| 505 while(gtk_events_pending()) | |
| 506 gtk_main_iteration(); | |
| 507 } | |
| 508 gtk_widget_destroy(fw); | |
| 509 | |
| 510 /* 5. receive header */ | |
| 511 sprintf(debug_buff, "Receiving closing header\n"); | |
| 512 debug_print(debug_buff); | |
| 513 read_rv = read(ft->fd, bmagic, 6); | |
| 514 if (read_rv <= -1) { | |
| 515 sprintf(debug_buff, "Couldn't read closing header\n"); | |
| 516 debug_print(debug_buff); | |
| 517 close(ft->fd); | |
| 518 return; | |
| 519 } | |
| 520 read_rv = read(ft->fd, fhdr, *(short *)&bmagic[4]); | |
| 521 if (read_rv <= -1) { | |
| 522 sprintf(debug_buff, "Couldn't read closing header 2\n"); | |
| 523 debug_print(debug_buff); | |
| 524 close(ft->fd); | |
| 525 return; | |
| 526 } | |
| 527 | |
| 528 fclose(ft->f); | |
| 529 close(ft->fd); | |
| 530 g_free(fhdr); | |
| 531 } | |
| 532 | |
| 533 void accept_file_dialog(struct file_transfer *ft) | |
| 534 { | |
| 535 GtkWidget *accept, *info, *warn, *cancel; | |
| 536 GtkWidget *text = NULL, *sw; | |
| 537 GtkWidget *label; | |
| 538 GtkWidget *vbox, *bbox; | |
| 539 char buf[1024]; | |
| 540 | |
| 541 | |
| 542 ft->window = gtk_window_new(GTK_WINDOW_DIALOG); | |
| 543 | |
| 544 accept = gtk_button_new_with_label("Accept"); | |
| 545 info = gtk_button_new_with_label("Info"); | |
| 546 warn = gtk_button_new_with_label("Warn"); | |
| 547 cancel = gtk_button_new_with_label("Cancel"); | |
| 548 | |
| 549 bbox = gtk_hbox_new(TRUE, 10); | |
| 550 vbox = gtk_vbox_new(FALSE, 5); | |
| 551 | |
| 552 gtk_widget_show(accept); | |
| 553 gtk_widget_show(info); | |
| 554 gtk_widget_show(warn); | |
| 555 gtk_widget_show(cancel); | |
| 556 | |
| 557 gtk_box_pack_start(GTK_BOX(bbox), accept, TRUE, TRUE, 10); | |
| 558 gtk_box_pack_start(GTK_BOX(bbox), info, TRUE, TRUE, 10); | |
| 559 gtk_box_pack_start(GTK_BOX(bbox), warn, TRUE, TRUE, 10); | |
| 560 gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 10); | |
| 561 | |
| 562 if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
| 563 g_snprintf(buf, sizeof(buf), "%s requests you to accept the file: %s (%d bytes)", | |
| 564 ft->user, ft->filename, ft->size); | |
| 565 } else { | |
| 566 g_snprintf(buf, sizeof(buf), "%s requests you to send them a file", | |
| 567 ft->user); | |
| 568 } | |
| 569 label = gtk_label_new(buf); | |
| 570 gtk_widget_show(label); | |
| 571 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); | |
| 572 | |
| 573 if (ft->message) { | |
| 574 /* we'll do this later | |
| 575 text = gaim_new_layout(); | |
| 576 sw = gtk_scrolled_window_new (NULL, NULL); | |
| 577 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), | |
| 578 GTK_POLICY_NEVER, | |
| 579 GTK_POLICY_AUTOMATIC); | |
| 580 gtk_widget_show(sw); | |
| 581 gtk_container_add(GTK_CONTAINER(sw), text); | |
| 582 gtk_widget_show(text); | |
| 583 | |
| 584 gtk_layout_set_size(GTK_LAYOUT(text), 250, 100); | |
| 585 GTK_LAYOUT (text)->vadjustment->step_increment = 10.0; | |
| 586 gtk_widget_set_usize(sw, 250, 100); | |
| 587 | |
| 588 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 10); | |
| 589 */ | |
| 590 } | |
| 591 gtk_box_pack_start(GTK_BOX(vbox), bbox, TRUE, TRUE, 5); | |
| 592 | |
| 593 gtk_window_set_title(GTK_WINDOW(ft->window), "Gaim - File Transfer?"); | |
| 594 gtk_window_set_focus(GTK_WINDOW(ft->window), accept); | |
| 595 gtk_container_add(GTK_CONTAINER(ft->window), vbox); | |
| 596 gtk_container_border_width(GTK_CONTAINER(ft->window), 10); | |
| 597 gtk_widget_show(vbox); | |
| 598 gtk_widget_show(bbox); | |
| 599 gtk_widget_realize(ft->window); | |
| 600 aol_icon(ft->window->window); | |
| 601 | |
| 602 gtk_widget_show(ft->window); | |
| 603 | |
| 604 | |
| 605 gtk_signal_connect(GTK_OBJECT(accept), "clicked", | |
| 606 GTK_SIGNAL_FUNC(accept_callback), ft); | |
| 607 gtk_signal_connect(GTK_OBJECT(cancel), "clicked", | |
| 608 GTK_SIGNAL_FUNC(cancel_callback), ft); | |
| 609 gtk_signal_connect(GTK_OBJECT(warn), "clicked", | |
| 610 GTK_SIGNAL_FUNC(warn_callback), ft); | |
| 611 gtk_signal_connect(GTK_OBJECT(info), "clicked", | |
| 612 GTK_SIGNAL_FUNC(info_callback), ft); | |
| 613 | |
| 614 | |
| 615 if (ft->message) { | |
| 616 /* we'll do this later | |
| 617 while(gtk_events_pending()) | |
| 618 gtk_main_iteration(); | |
| 619 html_print(text, ft->message); | |
| 620 */ | |
| 621 } | |
| 622 } |
