comparison src/dialogs.c @ 198:73e9a0bfff62

[gaim-migrate @ 208] Moved all the RVOUS stuff into rvous.c (mostly to reduce the size of dialogs.c). Started trying to implement FILE_GET_UID, without much luck. I'm going to do some dumps of the win client tomorrow to see if I can figure out what's going on a little better. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sun, 30 Apr 2000 10:39:35 +0000
parents 24f0fef56a73
children f3b61c04f44e
comparison
equal deleted inserted replaced
197:24f0fef56a73 198:73e9a0bfff62
38 #include "gtkhtml.h" 38 #include "gtkhtml.h"
39 39
40 static GtkWidget *imdialog = NULL; /*I only want ONE of these :) */ 40 static GtkWidget *imdialog = NULL; /*I only want ONE of these :) */
41 static GList *dialogwindows = NULL; 41 static GList *dialogwindows = NULL;
42 static GtkWidget *linkdialog, *colordialog, *exportdialog, *importdialog, *logdialog; 42 static GtkWidget *linkdialog, *colordialog, *exportdialog, *importdialog, *logdialog;
43
44 static void accept_callback(GtkWidget *widget, struct file_transfer *t);
45 43
46 struct create_away { 44 struct create_away {
47 GtkWidget *window; 45 GtkWidget *window;
48 GtkWidget *entry; 46 GtkWidget *entry;
49 GtkWidget *text; 47 GtkWidget *text;
2190 2188
2191 gtk_widget_show(ca->window); 2189 gtk_widget_show(ca->window);
2192 2190
2193 2191
2194 } 2192 }
2195
2196 /*------------------------------------------------------------------------*/
2197 /* The dialog for file requests */
2198 /*------------------------------------------------------------------------*/
2199
2200
2201 static void cancel_callback(GtkWidget *widget, struct file_transfer *ft)
2202 {
2203 char *send = g_malloc(256);
2204
2205 if (ft->accepted) {
2206 g_free(send);
2207 return;
2208 }
2209
2210 g_snprintf(send, 255, "toc_rvous_cancel %s %s %s", ft->user, ft->cookie, FILE_SEND_UID);
2211 sflap_send(send, strlen(send), TYPE_DATA);
2212 g_free(send);
2213 destroy_dialog(NULL, ft->window);
2214 g_free(ft->user);
2215 if (ft->message)
2216 g_free(ft->message);
2217 g_free(ft->filename);
2218 g_free(ft->cookie);
2219 g_free(ft->ip);
2220 g_free(ft);
2221 }
2222
2223
2224 static void warn_callback(GtkWidget *widget, struct file_transfer *ft)
2225 {
2226 show_warn_dialog(ft->user);
2227 }
2228
2229 static void info_callback(GtkWidget *widget, struct file_transfer *ft)
2230 {
2231 serv_get_info(ft->user);
2232 }
2233
2234 static char *put_16_int(gint i) {
2235 static char tmp[2];
2236 g_snprintf(tmp, 2, "%c%c", i >> 8, i & 0xff);
2237 return tmp;
2238 }
2239
2240 static char *put_32_int(gint i) {
2241 static char tmp[4];
2242 g_snprintf(tmp, 4, "%c%c%c%c", (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff);
2243 return tmp;
2244 }
2245
2246
2247 static int get_16_int(char *text)
2248 {
2249 int tmp = 0;
2250 tmp = ((*text << 8) & 0xff00);
2251 text++;
2252 tmp |= (*text & 0xff);
2253 text++;
2254 return tmp;
2255 }
2256
2257 static int get_32_int(char *text)
2258 {
2259 int tmp = 0;
2260 tmp = ((*text << 24) & 0xff000000);
2261 text++;
2262 tmp |= ((*text << 16) & 0xff0000);
2263 text++;
2264 tmp |= ((*text << 8) & 0xff00);
2265 text++;
2266 tmp |= (*text & 0xff);
2267 text++;
2268 return tmp;
2269 }
2270
2271 static void do_accept(GtkWidget *w, struct file_transfer *ft)
2272 {
2273 char *send = g_malloc(256);
2274 char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(ft->window));
2275 char *buf;
2276 char *header;
2277 short hdrlen;
2278 int read_rv;
2279 char bmagic[7];
2280 struct sockaddr_in sin;
2281 guint32 rcv;
2282 guint32 size;
2283 char *c;
2284 GtkWidget *fw = NULL, *fbar = NULL, *label;
2285
2286 if (!(ft->f = fopen(file,"w"))) {
2287 buf = g_malloc(BUF_LONG);
2288 g_snprintf(buf, BUF_LONG / 2, "Error writing file %s", file);
2289 do_error_dialog(buf, "Error");
2290 g_free(buf);
2291 ft->accepted = 0;
2292 accept_callback(NULL, ft);
2293 return;
2294 }
2295
2296 ft->accepted = 1;
2297
2298 destroy_dialog(NULL, ft->window);
2299 g_snprintf(send, 255, "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID);
2300 sflap_send(send, strlen(send), TYPE_DATA);
2301 g_free(send);
2302
2303
2304
2305 sin.sin_addr.s_addr = inet_addr(ft->ip);
2306 sin.sin_family = AF_INET;
2307 sin.sin_port = htons(ft->port);
2308
2309 ft->fd = socket(AF_INET, SOCK_STREAM, 0);
2310
2311 if (ft->fd <= -1 || connect(ft->fd, (struct sockaddr_in *)&sin, sizeof(sin))) {
2312 return;
2313 }
2314
2315 rcv = 0;
2316 header = g_malloc(6);
2317 while (rcv != 6) {
2318 read_rv = read(ft->fd, header + rcv, 6 - rcv);
2319 if(read_rv < 0) {
2320 close(ft->fd);
2321 g_free(header);
2322 return;
2323 }
2324 rcv += read_rv;
2325 while(gtk_events_pending())
2326 gtk_main_iteration();
2327 }
2328
2329 strncpy(bmagic, header, 6);
2330 bmagic[6] = 0;
2331
2332 hdrlen = get_16_int(&header[4]);
2333 hdrlen -= 6;
2334 sprintf(debug_buff, "my header is %d\n", hdrlen);
2335 debug_print(debug_buff);
2336
2337 hdrlen = 0;
2338 hdrlen = header[4];
2339 hdrlen <<= 8;
2340 hdrlen |= header[5];
2341 hdrlen -= 6;
2342
2343 sprintf(debug_buff, "header length %d\n", hdrlen);
2344 debug_print(debug_buff);
2345
2346 g_free(header);
2347 header = g_malloc(hdrlen);
2348
2349 rcv = 0;
2350
2351 while (rcv != hdrlen) {
2352 read_rv = read(ft->fd, header + rcv, hdrlen - rcv);
2353 if(read_rv < 0) {
2354 close(ft->fd);
2355 g_free(header);
2356 return;
2357 }
2358 rcv += read_rv;
2359 while(gtk_events_pending())
2360 gtk_main_iteration();
2361 }
2362
2363 c = header;
2364
2365 header[0] = 2; header[1] = 2;
2366 memcpy(header + 2, ft->cookie, 8);
2367 memset(header + 62, 0, 32); strcpy(header + 62, "Gaim");
2368 memset(header + 10, 0, 4);
2369 header[18] = 1; header[19] = 0;
2370 header[20] = 1; header[21] = 0;
2371
2372 sprintf(debug_buff, "sending confirmation\n");
2373 debug_print(debug_buff);
2374 write(ft->fd, bmagic, 6);
2375 write(ft->fd, header, hdrlen);
2376
2377 buf = g_malloc(1024);
2378 rcv = 0;
2379
2380 fw = gtk_dialog_new();
2381 buf = g_malloc(2048);
2382 snprintf(buf, 2048, "Receiving %s from %s (%d bytes)", ft->filename,
2383 ft->user, ft->size);
2384 label = gtk_label_new(buf);
2385 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->vbox), label, 0, 0, 5);
2386 gtk_widget_show(label);
2387 fbar = gtk_progress_bar_new();
2388 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fw)->action_area), fbar, 0, 0, 5);
2389 gtk_widget_show(fbar);
2390 gtk_window_set_title(GTK_WINDOW(fw), "File Transfer");
2391 gtk_widget_realize(fw);
2392 aol_icon(fw->window);
2393 gtk_widget_show(fw);
2394
2395 size = get_32_int(header + 22);
2396 sprintf(debug_buff, "Receiving %s from %s (%d bytes)\n", ft->filename,
2397 ft->user, ft->size);
2398 debug_print(debug_buff);
2399
2400 while (rcv != ft->size) {
2401 int i;
2402 int remain = size - rcv > 1024 ? 1024 : size - rcv;
2403 read_rv = read(ft->fd, buf, remain);
2404 if(read_rv < 0) {
2405 fclose(ft->f);
2406 close(ft->fd);
2407 g_free(buf);
2408 g_free(header);
2409 return;
2410 }
2411 rcv += read_rv;
2412 for (i = 0; i < read_rv; i++)
2413 fprintf(ft->f, "%c", buf[i]);
2414 snprintf(buf, 2048, "Receiving %s from %s (%d / %d bytes)",
2415 header + 186, ft->user, rcv, ft->size);
2416 gtk_label_set_text(GTK_LABEL(label), buf);
2417 gtk_progress_bar_update(GTK_PROGRESS_BAR(fbar),
2418 (float)(rcv)/(float)(ft->size));
2419 while(gtk_events_pending())
2420 gtk_main_iteration();
2421 }
2422
2423 fclose(ft->f);
2424 memset(header + 18, 0, 4);
2425 header[94] = 0;
2426 header[1] = 0x04;
2427 memcpy(header+58, header+34, 4);
2428 memcpy(header+54, header+22, 4);
2429 write(ft->fd, bmagic, 6);
2430 write(ft->fd, header, hdrlen);
2431 close(ft->fd);
2432
2433 g_free(buf);
2434 g_free(header);
2435 gtk_widget_destroy(fw);
2436 }
2437
2438
2439 static void accept_callback(GtkWidget *widget, struct file_transfer *ft)
2440 {
2441 char *buf = g_malloc(BUF_LEN);
2442 char *fname = g_malloc(BUF_LEN);
2443 char *c;
2444
2445 c = ft->filename + strlen(ft->filename);
2446
2447 while (c != ft->filename) {
2448 if (*c == '/' || *c == '\\') {
2449 strcpy(fname, c+1);
2450 break;
2451 }
2452 c--;
2453 }
2454
2455 if (c == ft->filename)
2456 strcpy(fname, ft->filename);
2457
2458
2459 destroy_dialog(NULL, ft->window);
2460
2461 ft->window = gtk_file_selection_new("Gaim - Save As...");
2462
2463 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(ft->window));
2464
2465 g_snprintf(buf, BUF_LEN - 1, "%s/%s", getenv("HOME"), fname);
2466
2467 gtk_file_selection_set_filename(GTK_FILE_SELECTION(ft->window), buf);
2468 gtk_signal_connect(GTK_OBJECT(ft->window), "destroy",
2469 GTK_SIGNAL_FUNC(cancel_callback), ft);
2470
2471 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ft->window)->ok_button),
2472 "clicked", GTK_SIGNAL_FUNC(do_accept), ft);
2473 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button),
2474 "clicked", GTK_SIGNAL_FUNC(cancel_callback), ft);
2475
2476 dialogwindows = g_list_prepend(dialogwindows, ft->window);
2477
2478 gtk_widget_show(ft->window);
2479
2480 g_free(buf);
2481 g_free(fname);
2482
2483 }
2484
2485
2486
2487
2488 void accept_file_dialog(struct file_transfer *ft)
2489 {
2490 GtkWidget *accept, *info, *warn, *cancel;
2491 GtkWidget *text = NULL, *sw;
2492 GtkWidget *label;
2493 GtkWidget *vbox, *bbox;
2494 char buf[1024];
2495
2496
2497 ft->window = gtk_window_new(GTK_WINDOW_DIALOG);
2498 dialogwindows = g_list_prepend(dialogwindows, ft->window);
2499
2500 accept = gtk_button_new_with_label("Accept");
2501 info = gtk_button_new_with_label("Info");
2502 warn = gtk_button_new_with_label("Warn");
2503 cancel = gtk_button_new_with_label("Cancel");
2504
2505 bbox = gtk_hbox_new(TRUE, 10);
2506 vbox = gtk_vbox_new(FALSE, 5);
2507
2508 gtk_widget_show(accept);
2509 gtk_widget_show(info);
2510 gtk_widget_show(warn);
2511 gtk_widget_show(cancel);
2512
2513 gtk_box_pack_start(GTK_BOX(bbox), accept, TRUE, TRUE, 10);
2514 gtk_box_pack_start(GTK_BOX(bbox), info, TRUE, TRUE, 10);
2515 gtk_box_pack_start(GTK_BOX(bbox), warn, TRUE, TRUE, 10);
2516 gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 10);
2517
2518 g_snprintf(buf, sizeof(buf), "%s requests you to accept the file: %s (%d bytes)",
2519 ft->user, ft->filename, ft->size);
2520 label = gtk_label_new(buf);
2521 gtk_widget_show(label);
2522 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5);
2523
2524 if (ft->message) {
2525 /* we'll do this later
2526 text = gaim_new_layout();
2527 sw = gtk_scrolled_window_new (NULL, NULL);
2528 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
2529 GTK_POLICY_NEVER,
2530 GTK_POLICY_AUTOMATIC);
2531 gtk_widget_show(sw);
2532 gtk_container_add(GTK_CONTAINER(sw), text);
2533 gtk_widget_show(text);
2534
2535 gtk_layout_set_size(GTK_LAYOUT(text), 250, 100);
2536 GTK_LAYOUT (text)->vadjustment->step_increment = 10.0;
2537 gtk_widget_set_usize(sw, 250, 100);
2538
2539 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 10);
2540 */
2541 }
2542 gtk_box_pack_start(GTK_BOX(vbox), bbox, TRUE, TRUE, 5);
2543
2544 gtk_window_set_title(GTK_WINDOW(ft->window), "Gaim - Accept File?");
2545 gtk_window_set_focus(GTK_WINDOW(ft->window), accept);
2546 gtk_container_add(GTK_CONTAINER(ft->window), vbox);
2547 gtk_container_border_width(GTK_CONTAINER(ft->window), 10);
2548 gtk_widget_show(vbox);
2549 gtk_widget_show(bbox);
2550 gtk_widget_realize(ft->window);
2551 aol_icon(ft->window->window);
2552
2553 gtk_widget_show(ft->window);
2554
2555
2556 gtk_signal_connect(GTK_OBJECT(accept), "clicked",
2557 GTK_SIGNAL_FUNC(accept_callback), ft);
2558 gtk_signal_connect(GTK_OBJECT(cancel), "clicked",
2559 GTK_SIGNAL_FUNC(cancel_callback), ft);
2560 gtk_signal_connect(GTK_OBJECT(warn), "clicked",
2561 GTK_SIGNAL_FUNC(warn_callback), ft);
2562 gtk_signal_connect(GTK_OBJECT(info), "clicked",
2563 GTK_SIGNAL_FUNC(info_callback), ft);
2564
2565
2566 if (ft->message) {
2567 /* we'll do this later
2568 while(gtk_events_pending())
2569 gtk_main_iteration();
2570 html_print(text, ft->message);
2571 */
2572 }
2573
2574
2575
2576 }