You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/ksirc/puke/dcc_status.pm

526 lines
13 KiB

#use lib "/opt/kde/share/apps/ksirc";
&docommand("/load pbase.pm");
&docommand("/load pwidget.pm");
&docommand("/load pframe.pm");
&docommand("/load ptablevw.pm");
&docommand("/load plistbox.pm");
&docommand("/load pbutton.pm");;
&docommand("/load pboxtqlayout.pm");
&docommand("/load plabel.pm");
&docommand("/load pbutton.pm");
&docommand("/load ppushbt.pm");
&docommand("/load plined.pm");
&docommand("/load pkfiledialog.pm");
&docommand("/load ppopmenu.pm");
&docommand("/load dcc_progress.pm");
&docommand("/load plined.pm");
&docommand("/load pprogress.pm");
use POSIX qw(getcwd);
use strict;
package DCCSendDialog;
use vars qw(@ISA);
@ISA = qw(PFrame);
sub new {
my $class = shift;
my $self = $class->SUPER::new($class, @_);
$self->create();
my $gm_main = new PBoxLayout($self, $PBoxLayout::TopToBottom, 5);
my $gm_to = new PBoxLayout($PBoxLayout::LeftToRight, 5);
$gm_main->addLayout($gm_to);
my $label_to = new PLabel($self);
$label_to->setText("To Nick:");
$label_to->setMaximumSize(1000,30);
$label_to->setMinimumSize(50,30);
$gm_to->addWidget($label_to, 0, $PBoxLayout::AlignCenter);
my $line_to = new PLineEdit($self);
$gm_to->addWidget($line_to, 5, $PBoxLayout::AlignCenter);
my $gm_file = new PBoxLayout($PBoxLayout::LeftToRight, 5);
$gm_main->addLayout($gm_file);
my $label_file = new PLabel($self);
$label_file->setText("Filename:");
$label_file->setMaximumSize(1000,30);
$label_file->setMinimumSize(50,30);
$gm_file->addWidget($label_file, 0, $PBoxLayout::AlignCenter);
my $line_file = new PLineEdit($self);
$gm_file->addWidget($line_file, 5, $PBoxLayout::AlignLeft);
my $button_file = new PPushButton($self);
$button_file->setText("&Browse");
$button_file->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->browseClicked});
$gm_file->addWidget($button_file, 2, $PBoxLayout::AlignRight);
my $button_send = new PPushButton($self);
$button_send->setText("&Send");
$button_send->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->sendClicked});
$gm_main->addWidget($button_send, 4, $PBoxLayout::AlignRight);
@$self{'gm_main', 'gm_to', 'gm_file', 'label_to', 'line_to', 'label_file', 'line_file', 'button_file', 'button_send'}
= ($gm_main, $gm_to, $gm_file, $label_to, $line_to, $label_file, $line_file, $button_file, $button_send);
print "*I* Finished creating DCCSend\n";
$self->{fileDialog} = new PKFileDialog();
my $dlg = $self->{fileDialog};
$dlg->setDir(POSIX::getcwd());
$dlg->installHandler($::PUKE_KBFD_FILE_SELECTED_ACK, sub{$self->fileSelected(shift())});
$self->setMinimumSize(450, 110);
$self->setMaximumSize(2000, 2000);
$self->resize(450, 110);
return $self;
}
sub browseClicked {
my $self = shift;
$self->{fileDialog}->show();
}
sub fileSelected {
my $self = shift;
my $hargs = shift;
$self->{fileDialog}->hide();
my $file = $hargs->{'cArg'};
if($file ne ''){
$self->{'line_file'}->setText($file);
}
}
sub sendClicked {
my $self = shift;
my $to_nick = $self->{'line_to'}->text();
my $to_file = $self->{'line_file'}->text();
if($to_nick eq '' || $to_file eq ''){
return;
}
&::docommand("dcc send $to_nick $to_file");
$self->hide();
}
use vars qw(@ISA $KSIRC_DCC %KSIRC_DCC);
package DCCStatus;
use vars qw(@ISA);
@ISA = qw(PFrame);
sub new {
my $class = shift;
my $self = $class->SUPER::new($class, @_);
$self->create();
my $gm_main = new PBoxLayout($self, $PBoxLayout::TopToBottom, 5);
my $label = new PLabel($self);
$label->setText("Pending DCC");
$label->setMaximumSize(1000,20);
$gm_main->addWidget($label, 5, $PBoxLayout::AlignCenter);
my $lb = new PListBox($self);
$gm_main->addWidget($lb, 5, $PBoxLayout::AlignCenter);
my $gm_but1 = new PBoxLayout($PBoxLayout::LeftToRight, 5);
$gm_main->addLayout($gm_but1);
my $button_get = new PPushButton($self);
$button_get->setText("&Open Connection");
$button_get->setMaximumSize(1000,30);
$button_get->setMinimumSize(10,30);
$button_get->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->openClicked});
$gm_but1->addWidget($button_get, 5);
my $button_forget = new PPushButton($self);
$button_forget->setText("&Forget Connection");
$button_forget->setMaximumSize(1000,30);
$button_forget->setMinimumSize(10,30);
$button_forget->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->forgetClicked});
$gm_but1->addWidget($button_forget, 5);
my $gm_but2 = new PBoxLayout($PBoxLayout::LeftToRight, 5);
$gm_main->addLayout($gm_but2);
my $button_send = new PPushButton($self);
$button_send->setText("&Send File");
$button_send->setMaximumSize(1000,30);
$button_send->setMinimumSize(10,30);
$button_send->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->sendClicked});
$gm_but2->addWidget($button_send, 5);
$gm_main->activate();
$self->setMinimumSize(400, 275);
$self->setMaximumSize(2000, 2000);
$self->resize(400, 275);
@$self{'gm_main', 'label1', 'lb', 'button_get', 'button_chat', 'button_forget', 'gm_but1', 'gm_but2', 'button_send' }
= ( $gm_main, $label, $lb, $button_get, $button_send, $button_forget, $gm_but1, $gm_but2, $button_send );
print "*I* Finished creating DCCStatus\n";
return $self;
}
sub addItem {
my $self = shift;
my %hargs = @_;
my $line = $hargs{'line'};
if($self->{'lines'}->{$line}){
return -1;
}
$self->{'lines'}->{$line}->{'OpenCode'} = $hargs{'open'};
$self->{'lines'}->{$line}->{'ForgetCode'} = $hargs{'forget'};
$self->{'lb'}->insertText($line, -1);
if($self->{'lb'}->currentText() eq ''){
$self->{'lb'}->setCurrentItem(0);
}
return 0;
}
sub openClicked {
my $self = shift;
my $line = $self->{'lb'}->currentText();
if($line eq ''){
return;
}
&{$self->{'lines'}->{$line}->{'OpenCode'}};
$self->{'lb'}->removeItem($self->{'lb'}->current());
if($self->{'lb'}->{count} == 0){
$self->hide();
}
delete $self->{'lines'}->{$line};
}
sub forgetClicked {
my $self = shift;
my $line = $self->{'lb'}->currentText();
if($line eq ''){
return;
}
&{$self->{'lines'}->{$line}->{'ForgetCode'}};
$self->{'lb'}->removeItem($self->{'lb'}->current());
if($self->{'lb'}->{count} == 0){
$self->hide();
}
delete $self->{'lines'}->{$line};
}
sub sendClicked {
my $self = shift;
if(!$self->{sendDialog}){
my $dlg = new DCCSendDialog();
if($dlg == undef){
&print("*E* Could not load DCCSendDialog");
return;
}
$self->{sendDialog} = $dlg;
}
$self->{sendDialog}->show();
}
sub DESTROY {
print "*E* Destroying dcc status widget\n";
shift()->close();
}
sub close {
my $self = shift;
$self->sendMessage('iCommand' => $::PUKE_WIDGET_DELETE,
'CallBack' => sub {},
'WaitFor' => 1);
# $self->{'gm_main'}->DESTROY;
#elete $self->{'gm_main'};
}
package DCCPopupMenu;
use vars qw(@ISA);
@ISA = qw(PPopupMenu);
sub new {
my $class = shift;
my $self = $class->SUPER::new($class, @_);
$self->create();
return $self;
}
sub insertText {
my $self = shift;
my $id = $self->SUPER::insertText(@_);
my @arr;
if(ref($self->{'Ids'}) ne 'ARRAY'){
$self->{'Ids'} = \@arr;
}
@arr = @{$self->{'Ids'}};
$arr[$#arr+1] = $id;
$self->{'Ids'} = \@arr;
return $id;
}
sub DESTROY {
my $self = shift;
my @arr = @{$self->{'Ids'}};
my $id;
foreach $id (@arr) {
$self->removeItem($id);
}
$self->sendMessage('iCommand' => $::PUKE_RELEASEWIDGET,
'CallBack' => sub {});
}
package main;
use vars qw($KSIRC_DCC %KSIRC_DCC $who $KSIRC_DCCSTATUS $silent $nick $KSIRC_POPSC $KSIRC_POPDOCK);
sub hook_ksirc_dcc_request {
my($type) = shift;
my($machine) = shift;
my($port) = shift;
my($file) = shift;
my($size) = shift;
my($mwho) = $who;
if($KSIRC_DCCSTATUS == undef){
$KSIRC_DCCSTATUS = new DCCStatus;
$KSIRC_DCCSTATUS->resize(400, 275);
}
if($type eq 'SEND'){
my $open = sub {
&docommand("/dcc get $mwho $file");
};
my $forget = sub {
&docommand("/dcc close get $mwho $file");
};
$::KSIRC_FILE_SIZES{$file} = $size;
$KSIRC_DCCSTATUS->addItem('line' => "SEND: $who offered $file at size $size",
'open' => $open,
'forget' => $forget);
}
elsif($type eq 'CHAT'){
$KSIRC_DCCSTATUS->addItem('line' => "CHAT: $who",
'open' => sub { &docommand("/dcc chat $mwho"); },
'forget' => sub { &docommand("/dcc close chat $mwho"); });
}
$KSIRC_DCCSTATUS->show;
}
&addhook("dcc_request", "ksirc_dcc_request");
sub hook_ksirc_dcc_send {
my $nick = shift;
my $file = shift;
my $size = shift;
my $fh = shift;
# print "*I* Starting dcc into with: $nick, $file, $size, $fh\n";
my($window) = new DCCProgress;
$size = 10240 if $size == 0;
$window->setRange(0, $size);
$window->setCaption("$file=>$nick");
$window->setTopText("Sending: $file Size: $size");
$window->setBotText("Status: pending");
$window->setCancel("dcc close send $nick $file");
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
$window->show;
}
&addhook("dcc_send", "ksirc_dcc_send");
sub hook_ksirc_dcc_send_status {
my $file = shift;
my $bytes = shift;
my $fh = shift;
my $window = $KSIRC_DCC{$fh}{$file}{'Window'};
if($window == undef){
my($window) = new DCCProgress;
$window->setRange(0, 1);
$window->setCaption("$file=>$nick");
$window->setTopText("Sending: $file Size: Unkown");
$window->setCancel("dcc close send $nick $file");
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
$window->show;
}
$window->setBotText("BPS: " . int($bytes/(time() - $KSIRC_DCC{$fh}{$file}{'StartTime'})));
$window->setValue($bytes);
}
&addhook("dcc_send_status", "ksirc_dcc_send_status");
sub hook_ksirc_dcc_get {
my $nick = shift;
my $file = shift;
my $fh = shift;
my $size = $::KSIRC_FILE_SIZES{$file};
#print "*I* Starting dcc into with: $nick, $file, $size, $fh\n";
if($KSIRC_DCC{$fh}{$file}{'Window'} == undef){
my($window) = new DCCProgress;
$size = 10240 if $size == 0;
$window->setRange(0, $size);
$window->setCaption("$file<=$nick");
$window->setTopText("Receiver: $file Size: $size");
$window->setBotText("Status: pending");
$window->setCancel("dcc close get $nick $file");
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
$window->show;
}
}
&addhook("dcc_get", "ksirc_dcc_get");
sub hook_ksirc_dcc_get_status {
my $file = shift;
my $bytes = shift;
my $fh = shift;
my $window = $KSIRC_DCC{$fh}{$file}{'Window'};
if($window == undef){
my($window) = new DCCProgress;
$window->setRange(0, 1);
$window->setCaption("$file<=$nick");
$window->setTopText("Receiver: $file Size: Unkown");
$window->setBotText("Status: pending");
$window->setCancel("dcc close get $nick $file");
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
$window->show;
}
$window->setBotText("BPS: " . int($bytes/(time() - $KSIRC_DCC{$fh}{$file}{'StartTime'})));
$window->setValue($bytes);
}
&addhook("dcc_get_status", "ksirc_dcc_get_status");
sub hook_ksirc_dcc_disconnect {
my $nick = shift;
my $file = shift;
my $bytes = shift;
my $time = shift;
my $fh = shift;
if($fh){
my $window = $KSIRC_DCC{$fh}{$file}{'Window'};
$window->close();
delete $KSIRC_DCC{$fh}{$file};
delete $KSIRC_DCC{$fh};
print "*D* DCC transfer with $nick ($file) terminated; $bytes transferred in $time seconds (" . int(($bytes/($time+1))/1024) . "KBps)";
$silent = 1;
}
}
addhook("dcc_disconnect", "ksirc_dcc_disconnect");
&print("*I* Done DCC Status");
#$::test = new DCCStatus;
#$::test->resize(400, 275);
#$::test->show();
sub popup_dccstatus{
if($KSIRC_DCCSTATUS == undef){
$KSIRC_DCCSTATUS = new DCCStatus;
$KSIRC_DCCSTATUS->resize(400, 275);
}
$KSIRC_DCCSTATUS->show();
}
sub popup_dccsend{
if($KSIRC_DCCSTATUS == undef){
$KSIRC_DCCSTATUS = new DCCStatus;
$KSIRC_DCCSTATUS->resize(400, 275);
}
$KSIRC_DCCSTATUS->sendClicked();
}
=cut
if(!$KSIRC_POPSC){
$KSIRC_POPSC = new DCCPopupMenu();
if($KSIRC_POPSC->fetchWidget("servercontroller_menu_file") >= 0){
my $id_control = $KSIRC_POPSC->insertText("Show DCC Control ($::server)");
my $id_send = $KSIRC_POPSC->insertText("Show DCC Send ($::server)");
$KSIRC_POPSC->installMenu($id_control, sub{&popup_dccstatus();});
$KSIRC_POPSC->installMenu($id_send, sub{&popup_dccsend();});
}
}
if(!$KSIRC_POPDOCK){
$KSIRC_POPDOCK = new DCCPopupMenu();
if($KSIRC_POPDOCK->fetchWidget("dockServerController_menu_pop") >= 0){
my $id_control = $KSIRC_POPDOCK->insertText("Show DCC Control ($::server)");
my $id_send = $KSIRC_POPDOCK->insertText("Show DCC Send ($::server)");
$KSIRC_POPDOCK->installMenu($id_control, sub { &popup_dccstatus(); } );
$KSIRC_POPDOCK->installMenu($id_send, sub { &popup_dccsend(); } );
}
}
=cut
sub hook_quit_release {
$KSIRC_POPDOCK->DESTROY();
$KSIRC_POPSC->DESTROY();
}
&addhook("quit", "quit_release");
1;