Mercurial > pidgin.yaz
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 } |