diff options
Diffstat (limited to 'ksirc/puke/dcc_status.pm')
-rw-r--r-- | ksirc/puke/dcc_status.pm | 525 |
1 files changed, 525 insertions, 0 deletions
diff --git a/ksirc/puke/dcc_status.pm b/ksirc/puke/dcc_status.pm new file mode 100644 index 00000000..65bc1b07 --- /dev/null +++ b/ksirc/puke/dcc_status.pm @@ -0,0 +1,525 @@ +#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 pboxlayout.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; |