home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / yagirc-0.51.tar.gz / yagirc-0.51.tar / yagirc-0.51 / gui_dcc.c < prev    next >
C/C++ Source or Header  |  1998-05-01  |  5KB  |  166 lines

  1. /*
  2.  
  3.  gui_dcc.c : User interface for DCC
  4.  
  5.     Copyright (C) 1998 Timo Sirainen
  6.  
  7.     This program is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation; either version 2 of the License, or
  10.     (at your option) any later version.
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24.  
  25. #include <gtk/gtk.h>
  26.  
  27. #include "dcc.h"
  28. #include "irc.h"
  29. #include "gui.h"
  30.  
  31. /* signal: dcc window closed */
  32. static int dcc_delete_event(GtkWidget *window, GtkWidget *t, DCC_REC *dcc)
  33. {
  34.     if (dcc->handle != -1)
  35.     {
  36.         /* transfer still going - abort */
  37.         dcc_abort(dcc);
  38.     }
  39.     gui_dcc_force_close(dcc);
  40.     g_free(dcc);
  41.  
  42.     return 0;
  43. }
  44.  
  45. /* Create DCC transfer window */
  46. void gui_dcc_init(DCC_REC *dcc)
  47. {
  48.     GtkWidget *window;
  49.     GtkWidget *label;
  50.     GtkWidget *vbox;
  51.     char *tmp;
  52.  
  53.     g_return_if_fail(dcc != NULL);
  54.  
  55.     dcc->gui = (GUI_DCC_REC *) g_malloc(sizeof(GUI_DCC_REC));
  56.  
  57.     dcc->gui->mainwin = window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  58.     gtk_signal_connect (GTK_OBJECT (window), "delete_event",
  59.                         GTK_SIGNAL_FUNC(dcc_delete_event),
  60.                         dcc);
  61.  
  62.     tmp = (char *) g_malloc(strlen(dcc->nick)+PROGRAM_TITLE_SIZE+20);
  63.     sprintf(tmp, "DCC %s %s - "PROGRAM_TITLE,
  64.             dcc->type == DCC_TYPE_SEND ? "SEND" : "GET", dcc->nick);
  65.     gtk_window_set_title(GTK_WINDOW(window), tmp);
  66.     gtk_container_border_width(GTK_CONTAINER(window), 20);
  67.     g_free(tmp);
  68.  
  69.     vbox = gtk_vbox_new(FALSE, 0);
  70.     gtk_container_add(GTK_CONTAINER(window), vbox);
  71.     gtk_widget_show(vbox);
  72.  
  73.     label = gtk_label_new(dcc->arg);
  74.     gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  75.     gtk_widget_show(label);
  76.  
  77.     dcc->gui->progbar = gtk_progress_bar_new();
  78.     gtk_box_pack_start(GTK_BOX(vbox), dcc->gui->progbar, FALSE, FALSE, 10);
  79.     gtk_widget_show(dcc->gui->progbar);
  80.  
  81.     dcc->gui->infotext = gtk_label_new("(waiting for connection)");
  82.     gtk_box_pack_start(GTK_BOX(vbox), dcc->gui->infotext, FALSE, FALSE, 0);
  83.     gtk_widget_show(dcc->gui->infotext);
  84.  
  85.     gtk_widget_show(window);
  86. }
  87.  
  88. /* Update DCC transfer window */
  89. void gui_dcc_update(DCC_REC *dcc)
  90. {
  91.     char tmp[100];
  92.     long secs;
  93.     static int lastsecs = 0;
  94.  
  95.     g_return_if_fail(dcc != NULL);
  96.  
  97.     secs = time(NULL)-dcc->starttime;
  98.     if (secs == lastsecs) return;
  99.  
  100.     lastsecs = secs;
  101.     if (secs <= 0) secs = 1;
  102.     sprintf(tmp, "%lu of %lu bytes %s - avg %0.2fkB/sec", dcc->transfd, dcc->size,
  103.             dcc->type == DCC_TYPE_SEND ? "sent" : "received",
  104.             (double) dcc->transfd/secs/1024);
  105.     gtk_label_set(GTK_LABEL(dcc->gui->infotext), tmp);
  106.     gtk_progress_bar_update(GTK_PROGRESS_BAR(dcc->gui->progbar), (gfloat) dcc->transfd/dcc->size);
  107. }
  108.  
  109. /* Close DCC transfer window */
  110. void gui_dcc_close(DCC_REC *dcc)
  111. {
  112.     char tmp[100];
  113.     long secs;
  114.  
  115.     g_return_if_fail(dcc != NULL);
  116.     g_return_if_fail(dcc->gui != NULL);
  117.  
  118.     secs = time(NULL)-dcc->starttime;
  119.     if (dcc->transfd == dcc->size)
  120.     {
  121.         gtk_progress_bar_update(GTK_PROGRESS_BAR(dcc->gui->progbar), 1);
  122.         strcpy(tmp, "transfer complete - all");
  123.     }
  124.     else
  125.         strcpy(tmp, "transfer aborted -");
  126.  
  127.     if (secs <= 0) secs = 1;
  128.     sprintf(tmp+strlen(tmp), " %lu bytes %s - avg %0.2fkB/sec", dcc->transfd,
  129.             dcc->type == DCC_TYPE_SEND ? "sent" : "received",
  130.             (double) dcc->transfd/secs/1024);
  131.     gtk_label_set(GTK_LABEL(dcc->gui->infotext), tmp);
  132. }
  133.  
  134. /* Destroy DCC transfer window */
  135. void gui_dcc_force_close(DCC_REC *dcc)
  136. {
  137.     g_return_if_fail(dcc != NULL);
  138.     g_return_if_fail(dcc->gui != NULL);
  139.  
  140.     gtk_widget_destroy(dcc->gui->mainwin);
  141.     g_free(dcc->gui);
  142. }
  143.  
  144. /* DCC chat connection established - do something.. */
  145. void gui_dcc_chat_init(DCC_REC *dcc)
  146. {
  147.     g_return_if_fail(dcc != NULL);
  148. }
  149.  
  150. /* Text received from DCC chat - write to screen */
  151. void gui_dcc_chat_write(DCC_REC *dcc, char *str)
  152. {
  153.     CHAN_REC *chan;
  154.     char *tmp;
  155.  
  156.     g_return_if_fail(dcc != NULL);
  157.     g_return_if_fail(str != NULL);
  158.  
  159.     tmp = (char *) g_malloc(strlen(dcc->nick)+2);
  160.     sprintf(tmp, "=%s", dcc->nick);
  161.     chan = channel_joined(NULL, tmp);
  162.     g_free(tmp);
  163.     drawtext(chan != NULL ? chan->window : curwin, TXT_TYPE_DEFAULT,
  164.              "[%3%s%n(%4dcc%n)]%n %s\n", dcc->nick, str);
  165. }
  166.