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 >
Wrap
C/C++ Source or Header
|
1998-05-01
|
5KB
|
166 lines
/*
gui_dcc.c : User interface for DCC
Copyright (C) 1998 Timo Sirainen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include "dcc.h"
#include "irc.h"
#include "gui.h"
/* signal: dcc window closed */
static int dcc_delete_event(GtkWidget *window, GtkWidget *t, DCC_REC *dcc)
{
if (dcc->handle != -1)
{
/* transfer still going - abort */
dcc_abort(dcc);
}
gui_dcc_force_close(dcc);
g_free(dcc);
return 0;
}
/* Create DCC transfer window */
void gui_dcc_init(DCC_REC *dcc)
{
GtkWidget *window;
GtkWidget *label;
GtkWidget *vbox;
char *tmp;
g_return_if_fail(dcc != NULL);
dcc->gui = (GUI_DCC_REC *) g_malloc(sizeof(GUI_DCC_REC));
dcc->gui->mainwin = window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
GTK_SIGNAL_FUNC(dcc_delete_event),
dcc);
tmp = (char *) g_malloc(strlen(dcc->nick)+PROGRAM_TITLE_SIZE+20);
sprintf(tmp, "DCC %s %s - "PROGRAM_TITLE,
dcc->type == DCC_TYPE_SEND ? "SEND" : "GET", dcc->nick);
gtk_window_set_title(GTK_WINDOW(window), tmp);
gtk_container_border_width(GTK_CONTAINER(window), 20);
g_free(tmp);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show(vbox);
label = gtk_label_new(dcc->arg);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
dcc->gui->progbar = gtk_progress_bar_new();
gtk_box_pack_start(GTK_BOX(vbox), dcc->gui->progbar, FALSE, FALSE, 10);
gtk_widget_show(dcc->gui->progbar);
dcc->gui->infotext = gtk_label_new("(waiting for connection)");
gtk_box_pack_start(GTK_BOX(vbox), dcc->gui->infotext, FALSE, FALSE, 0);
gtk_widget_show(dcc->gui->infotext);
gtk_widget_show(window);
}
/* Update DCC transfer window */
void gui_dcc_update(DCC_REC *dcc)
{
char tmp[100];
long secs;
static int lastsecs = 0;
g_return_if_fail(dcc != NULL);
secs = time(NULL)-dcc->starttime;
if (secs == lastsecs) return;
lastsecs = secs;
if (secs <= 0) secs = 1;
sprintf(tmp, "%lu of %lu bytes %s - avg %0.2fkB/sec", dcc->transfd, dcc->size,
dcc->type == DCC_TYPE_SEND ? "sent" : "received",
(double) dcc->transfd/secs/1024);
gtk_label_set(GTK_LABEL(dcc->gui->infotext), tmp);
gtk_progress_bar_update(GTK_PROGRESS_BAR(dcc->gui->progbar), (gfloat) dcc->transfd/dcc->size);
}
/* Close DCC transfer window */
void gui_dcc_close(DCC_REC *dcc)
{
char tmp[100];
long secs;
g_return_if_fail(dcc != NULL);
g_return_if_fail(dcc->gui != NULL);
secs = time(NULL)-dcc->starttime;
if (dcc->transfd == dcc->size)
{
gtk_progress_bar_update(GTK_PROGRESS_BAR(dcc->gui->progbar), 1);
strcpy(tmp, "transfer complete - all");
}
else
strcpy(tmp, "transfer aborted -");
if (secs <= 0) secs = 1;
sprintf(tmp+strlen(tmp), " %lu bytes %s - avg %0.2fkB/sec", dcc->transfd,
dcc->type == DCC_TYPE_SEND ? "sent" : "received",
(double) dcc->transfd/secs/1024);
gtk_label_set(GTK_LABEL(dcc->gui->infotext), tmp);
}
/* Destroy DCC transfer window */
void gui_dcc_force_close(DCC_REC *dcc)
{
g_return_if_fail(dcc != NULL);
g_return_if_fail(dcc->gui != NULL);
gtk_widget_destroy(dcc->gui->mainwin);
g_free(dcc->gui);
}
/* DCC chat connection established - do something.. */
void gui_dcc_chat_init(DCC_REC *dcc)
{
g_return_if_fail(dcc != NULL);
}
/* Text received from DCC chat - write to screen */
void gui_dcc_chat_write(DCC_REC *dcc, char *str)
{
CHAN_REC *chan;
char *tmp;
g_return_if_fail(dcc != NULL);
g_return_if_fail(str != NULL);
tmp = (char *) g_malloc(strlen(dcc->nick)+2);
sprintf(tmp, "=%s", dcc->nick);
chan = channel_joined(NULL, tmp);
g_free(tmp);
drawtext(chan != NULL ? chan->window : curwin, TXT_TYPE_DEFAULT,
"[%3%s%n(%4dcc%n)]%n %s\n", dcc->nick, str);
}