Mon, 01 May 2000 17:49:22 +0000
[gaim-migrate @ 218]
Changed spellchk.c so it was compatible with Torrey's changes.
| 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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
42 | static void toggle(GtkWidget *w, int *m) |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
43 | { |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
44 | *m = !(*m); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
45 | } |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
46 | |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
47 | static void free_ft(struct file_transfer *ft) |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
48 | { |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
49 | if (ft->window) { gtk_widget_destroy(ft->window); ft->window = NULL; } |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
50 | if (ft->filename) g_free(ft->filename); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
51 | if (ft->user) g_free(ft->user); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
52 | if (ft->message) g_free(ft->message); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
53 | if (ft->ip) g_free(ft->ip); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
54 | if (ft->cookie) g_free(ft->cookie); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
55 | g_free(ft); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
56 | } |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
151 | int cont = 1; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
259 | button = gtk_button_new_with_label("Cancel"); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
260 | gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->action_area), button, 0, 0, 5); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
261 | gtk_widget_show(button); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
295 | fclose(ft->f); |
|
201
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
296 | gtk_widget_destroy(fw); |
|
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
297 | fw = NULL; |
| 198 | 298 | |
|
200
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
299 | if (!cont) { |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
300 | char *tmp = frombase64(ft->cookie); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
301 | sprintf(buf, "toc_rvous_cancel %s %s %s", ft->user, tmp, ft->UID); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
302 | sflap_send(buf, strlen(buf), TYPE_DATA); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
303 | close(ft->fd); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
304 | free_ft(ft); |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
305 | return; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
306 | } |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
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; | |
|
203
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
331 | char *c; |
| 198 | 332 | struct stat st; |
|
204
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
333 | struct tm *fortime; |
| 198 | 334 | |
| 335 | stat(file, &st); | |
| 336 | if (!(ft->f = fopen(file, "r"))) { | |
| 337 | buf = g_malloc(BUF_LONG); | |
| 338 | g_snprintf(buf, BUF_LONG / 2, "Error reading file %s", file); | |
| 339 | do_error_dialog(buf, "Error"); | |
| 340 | g_free(buf); | |
| 341 | ft->accepted = 0; | |
| 342 | accept_callback(NULL, ft); | |
| 343 | return; | |
| 344 | } | |
| 345 | ||
| 346 | ft->accepted = 1; | |
| 347 | ||
| 348 | gtk_widget_destroy(ft->window); | |
| 349 | ft->window = NULL; | |
| 350 | g_snprintf(send, 255, "toc_rvous_accept %s %s %s", normalize(ft->user), | |
| 351 | ft->cookie, ft->UID); | |
| 352 | sflap_send(send, strlen(send), TYPE_DATA); | |
| 353 | g_free(send); | |
| 354 | ||
| 355 | ||
| 356 | ||
| 357 | sin.sin_addr.s_addr = inet_addr(ft->ip); | |
| 358 | sin.sin_family = AF_INET; | |
| 359 | sin.sin_port = htons(ft->port); | |
| 360 | ||
| 361 | ft->fd = socket(AF_INET, SOCK_STREAM, 0); | |
| 362 | ||
| 363 | if (ft->fd <= -1 || connect(ft->fd, (struct sockaddr_in *)&sin, sizeof(sin))) { | |
| 364 | return; | |
| 365 | } | |
| 366 | ||
| 367 | /* here's where we differ from do_get_file */ | |
| 368 | /* 1. build/send header | |
| 369 | * 2. receive header | |
|
201
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
370 | * 3. send listing file |
|
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
371 | * 4. receive header |
|
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
372 | * |
|
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
373 | * then we need to wait to actually send the file. |
| 198 | 374 | */ |
| 375 | ||
| 376 | /* 1. build/send header */ | |
|
203
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
377 | c = file + strlen(file); |
|
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
378 | while (*(c - 1) != '/') c--; |
| 198 | 379 | buf = frombase64(ft->cookie); |
|
200
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
380 | sprintf(debug_buff, "Building header to send %s (cookie: %s)\n", file, buf); |
| 198 | 381 | debug_print(debug_buff); |
|
200
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
382 | fhdr->hdrtype = 0x1108; |
|
202
6481695fa116
[gaim-migrate @ 212]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
201
diff
changeset
|
383 | snprintf(fhdr->bcookie, 8, "%s", buf); |
| 198 | 384 | g_free(buf); |
|
200
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
385 | fhdr->encrypt = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
386 | fhdr->compress = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
387 | fhdr->totfiles = 1; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
388 | fhdr->filesleft = 1; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
389 | fhdr->totparts = 1; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
390 | fhdr->partsleft = 1; |
|
205
ffd19b9c170d
[gaim-migrate @ 215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
204
diff
changeset
|
391 | fhdr->totsize = (long)st.st_size; /* total size of all available files */ |
|
203
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
392 | /* size = 10 (date) + 1 + 5 (time) + 1 + 8 (size) + 1 + name + 2 = 30 + name */ |
|
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
393 | fhdr->size = 30 + strlen(c); /* size of listing.txt */ |
|
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
394 | fhdr->modtime = time(NULL); /* time since UNIX epoch */ |
|
205
ffd19b9c170d
[gaim-migrate @ 215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
204
diff
changeset
|
395 | fhdr->checksum = 0x10110000; /* ? */ |
|
200
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
396 | fhdr->rfrcsum = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
397 | fhdr->rfsize = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
398 | fhdr->cretime = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
399 | fhdr->rfcsum = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
400 | fhdr->nrecvd = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
401 | fhdr->recvcsum = 0; |
| 198 | 402 | snprintf(fhdr->idstring, 32, "Gaim"); |
|
205
ffd19b9c170d
[gaim-migrate @ 215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
204
diff
changeset
|
403 | fhdr->flags = 0x02; /* don't ask me why */ |
|
202
6481695fa116
[gaim-migrate @ 212]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
201
diff
changeset
|
404 | fhdr->lnameoffset = 0x1A; /* ? still no clue */ |
|
6481695fa116
[gaim-migrate @ 212]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
201
diff
changeset
|
405 | fhdr->lsizeoffset = 0x10; /* whatever */ |
|
205
ffd19b9c170d
[gaim-migrate @ 215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
204
diff
changeset
|
406 | memset(fhdr->dummy, 0, 69); |
|
ffd19b9c170d
[gaim-migrate @ 215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
204
diff
changeset
|
407 | memset(fhdr->macfileinfo, 0, 16); |
|
200
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
408 | fhdr->nencode = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
409 | fhdr->nlanguage = 0; |
|
aa9fbd9e68a3
[gaim-migrate @ 210]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
198
diff
changeset
|
410 | snprintf(fhdr->name, 64, "listing.txt"); |
|
205
ffd19b9c170d
[gaim-migrate @ 215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
204
diff
changeset
|
411 | snprintf(bmagic, 6, "TFT1\001"); |
| 198 | 412 | read_rv = write(ft->fd, bmagic, 6); |
| 413 | if (read_rv <= -1) { | |
| 414 | sprintf(debug_buff, "Couldn't write opening header \n"); | |
| 415 | debug_print(debug_buff); | |
| 416 | close(ft->fd); | |
| 417 | return; | |
| 418 | } | |
| 419 | read_rv = write(ft->fd, fhdr, 250); | |
| 420 | if (read_rv <= -1) { | |
| 421 | sprintf(debug_buff, "Couldn't write opening header 2\n"); | |
| 422 | debug_print(debug_buff); | |
| 423 | close(ft->fd); | |
| 424 | return; | |
| 425 | } | |
| 426 | ||
| 427 | /* 2. receive header */ | |
| 428 | sprintf(debug_buff, "Receiving header\n"); | |
| 429 | debug_print(debug_buff); | |
| 430 | read_rv = read(ft->fd, bmagic, 6); | |
| 431 | if (read_rv <= -1) { | |
| 432 | sprintf(debug_buff, "Couldn't read header\n"); | |
| 433 | debug_print(debug_buff); | |
| 434 | close(ft->fd); | |
| 435 | return; | |
| 436 | } | |
| 437 | read_rv = read(ft->fd, fhdr, *(short *)&bmagic[4]); | |
| 438 | if (read_rv <= -1) { | |
| 439 | sprintf(debug_buff, "Couldn't read header 2\n"); | |
| 440 | debug_print(debug_buff); | |
| 441 | close(ft->fd); | |
| 442 | return; | |
| 443 | } | |
| 444 | ||
|
201
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
445 | /* 3. send listing file */ |
|
203
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
446 | /* mm/dd/yyyy hh:mm sizesize name.ext\r\n */ |
|
1729c7c5d9a7
[gaim-migrate @ 213]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
202
diff
changeset
|
447 | /* creation date ^ */ |
| 198 | 448 | sprintf(debug_buff, "Sending file\n"); |
| 449 | debug_print(debug_buff); | |
| 450 | rcv = 0; | |
|
204
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
451 | buf = g_malloc(ft->size + 1); |
|
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
452 | fortime = localtime(&st.st_ctime); |
|
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
453 | snprintf(buf, ft->size + 1, "%2d/%2d/%4d %2d:%2d %8ld %s\r\n", |
|
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
454 | fortime->tm_mon + 1, fortime->tm_mday, fortime->tm_year + 1900, |
|
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
455 | fortime->tm_hour + 1, fortime->tm_min + 1, |
|
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
456 | st.st_size, c); |
|
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
457 | sprintf(debug_buff, "Sending listing.txt to %s\n", ft->user); |
| 198 | 458 | debug_print(debug_buff); |
| 459 | ||
|
204
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
460 | while (rcv != ft->size) { |
| 198 | 461 | int remain = st.st_size - rcv > 1024 ? 1024 : st.st_size - rcv; |
|
204
a44e64a5c440
[gaim-migrate @ 214]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
203
diff
changeset
|
462 | read_rv = write(ft->fd, buf + rcv, remain); |
| 198 | 463 | if (read_rv <= -1) { |
| 464 | sprintf(debug_buff, "Could not send file, wrote %d\n", rcv); | |
| 465 | debug_print(debug_buff); | |
| 466 | close(ft->fd); | |
| 467 | return; | |
| 468 | } | |
| 469 | rcv += read_rv; | |
| 470 | while(gtk_events_pending()) | |
| 471 | gtk_main_iteration(); | |
| 472 | } | |
| 473 | ||
|
201
2b705bc127e8
[gaim-migrate @ 211]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
200
diff
changeset
|
474 | /* 4. receive header */ |
| 198 | 475 | sprintf(debug_buff, "Receiving closing header\n"); |
| 476 | debug_print(debug_buff); | |
| 477 | read_rv = read(ft->fd, bmagic, 6); | |
| 478 | if (read_rv <= -1) { | |
| 479 | sprintf(debug_buff, "Couldn't read closing header\n"); | |
| 480 | debug_print(debug_buff); | |
| 481 | close(ft->fd); | |
| 482 | return; | |
| 483 | } | |
| 484 | read_rv = read(ft->fd, fhdr, *(short *)&bmagic[4]); | |
| 485 | if (read_rv <= -1) { | |
| 486 | sprintf(debug_buff, "Couldn't read closing header 2\n"); | |
| 487 | debug_print(debug_buff); | |
| 488 | close(ft->fd); | |
| 489 | return; | |
| 490 | } | |
| 491 | ||
| 492 | fclose(ft->f); | |
| 493 | close(ft->fd); | |
| 494 | g_free(fhdr); | |
| 495 | } | |
| 496 | ||
| 497 | void accept_file_dialog(struct file_transfer *ft) | |
| 498 | { | |
| 499 | GtkWidget *accept, *info, *warn, *cancel; | |
| 500 | GtkWidget *text = NULL, *sw; | |
| 501 | GtkWidget *label; | |
| 502 | GtkWidget *vbox, *bbox; | |
| 503 | char buf[1024]; | |
| 504 | ||
| 505 | ||
| 506 | ft->window = gtk_window_new(GTK_WINDOW_DIALOG); | |
| 507 | ||
| 508 | accept = gtk_button_new_with_label("Accept"); | |
| 509 | info = gtk_button_new_with_label("Info"); | |
| 510 | warn = gtk_button_new_with_label("Warn"); | |
| 511 | cancel = gtk_button_new_with_label("Cancel"); | |
| 512 | ||
| 513 | bbox = gtk_hbox_new(TRUE, 10); | |
| 514 | vbox = gtk_vbox_new(FALSE, 5); | |
| 515 | ||
| 516 | gtk_widget_show(accept); | |
| 517 | gtk_widget_show(info); | |
| 518 | gtk_widget_show(warn); | |
| 519 | gtk_widget_show(cancel); | |
| 520 | ||
| 521 | gtk_box_pack_start(GTK_BOX(bbox), accept, TRUE, TRUE, 10); | |
| 522 | gtk_box_pack_start(GTK_BOX(bbox), info, TRUE, TRUE, 10); | |
| 523 | gtk_box_pack_start(GTK_BOX(bbox), warn, TRUE, TRUE, 10); | |
| 524 | gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 10); | |
| 525 | ||
| 526 | if (!strcmp(ft->UID, FILE_SEND_UID)) { | |
| 527 | g_snprintf(buf, sizeof(buf), "%s requests you to accept the file: %s (%d bytes)", | |
| 528 | ft->user, ft->filename, ft->size); | |
| 529 | } else { | |
| 530 | g_snprintf(buf, sizeof(buf), "%s requests you to send them a file", | |
| 531 | ft->user); | |
| 532 | } | |
| 533 | label = gtk_label_new(buf); | |
| 534 | gtk_widget_show(label); | |
| 535 | gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); | |
| 536 | ||
| 537 | if (ft->message) { | |
| 538 | /* we'll do this later | |
| 539 | text = gaim_new_layout(); | |
| 540 | sw = gtk_scrolled_window_new (NULL, NULL); | |
| 541 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), | |
| 542 | GTK_POLICY_NEVER, | |
| 543 | GTK_POLICY_AUTOMATIC); | |
| 544 | gtk_widget_show(sw); | |
| 545 | gtk_container_add(GTK_CONTAINER(sw), text); | |
| 546 | gtk_widget_show(text); | |
| 547 | ||
| 548 | gtk_layout_set_size(GTK_LAYOUT(text), 250, 100); | |
| 549 | GTK_LAYOUT (text)->vadjustment->step_increment = 10.0; | |
| 550 | gtk_widget_set_usize(sw, 250, 100); | |
| 551 | ||
| 552 | gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 10); | |
| 553 | */ | |
| 554 | } | |
| 555 | gtk_box_pack_start(GTK_BOX(vbox), bbox, TRUE, TRUE, 5); | |
| 556 | ||
| 557 | gtk_window_set_title(GTK_WINDOW(ft->window), "Gaim - File Transfer?"); | |
| 558 | gtk_window_set_focus(GTK_WINDOW(ft->window), accept); | |
| 559 | gtk_container_add(GTK_CONTAINER(ft->window), vbox); | |
| 560 | gtk_container_border_width(GTK_CONTAINER(ft->window), 10); | |
| 561 | gtk_widget_show(vbox); | |
| 562 | gtk_widget_show(bbox); | |
| 563 | gtk_widget_realize(ft->window); | |
| 564 | aol_icon(ft->window->window); | |
| 565 | ||
| 566 | gtk_widget_show(ft->window); | |
| 567 | ||
| 568 | ||
| 569 | gtk_signal_connect(GTK_OBJECT(accept), "clicked", | |
| 570 | GTK_SIGNAL_FUNC(accept_callback), ft); | |
| 571 | gtk_signal_connect(GTK_OBJECT(cancel), "clicked", | |
| 572 | GTK_SIGNAL_FUNC(cancel_callback), ft); | |
| 573 | gtk_signal_connect(GTK_OBJECT(warn), "clicked", | |
| 574 | GTK_SIGNAL_FUNC(warn_callback), ft); | |
| 575 | gtk_signal_connect(GTK_OBJECT(info), "clicked", | |
| 576 | GTK_SIGNAL_FUNC(info_callback), ft); | |
| 577 | ||
| 578 | ||
| 579 | if (ft->message) { | |
| 580 | /* we'll do this later | |
| 581 | while(gtk_events_pending()) | |
| 582 | gtk_main_iteration(); | |
| 583 | html_print(text, ft->message); | |
| 584 | */ | |
| 585 | } | |
| 586 | } |