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