home *** CD-ROM | disk | FTP | other *** search
- package PPM::Installer::Remote;
- @PPM::Installer::Remote::ISA = qw(PPM::Installer);
-
- use strict;
- use Data::Dumper;
- use PPM::PPD;
- use PPM::Result qw(Ok Warning Error List);
-
- sub new {
- my $class = shift;
- my $targ = shift;
- my $name = shift;
- my $inst = bless {
- name => $name,
- host => $targ->{host},
- type => $targ->{type},
- port => $targ->{port},
- }, $class;
- return $inst;
- }
-
- sub init {
- my $inst = shift;
- my $ok = $inst->connect_to($inst->{host}, $inst->{port});
- die $ok->msg unless $ok->ok;
- $ok;
- }
-
- sub ckeys {
- my $o = shift;
- ($o->SUPER::ckeys,
- qw(host),
- );
- }
-
- sub host {
- my $o = shift;
- $o->{host};
- }
-
- sub pkginit {
- my $o = shift;
- my $package = shift;
- $o->sendmsg($o->encode_record('PKGINIT', $package));
- my @msg = $o->decode_record($o->recvmsg);
- return Error($msg[1]) unless $msg[0] eq 'OK';
- Ok();
- }
-
- sub pkgfini {
- my $o = shift;
- my $package = shift;
- $o->sendmsg($o->encode_record('PKGFINI', $package));
- my @msg = $o->decode_record($o->recvmsg);
- return Error($msg[1]) unless $msg[0] eq 'OK';
- Ok();
- }
-
- sub transmit {
- my $o = shift;
- my $package = shift;
- my $file = shift;
-
- open (my $FILE, $file) or return Error("can't open $file: $!");
- binmode($FILE);
-
- # Let the other side know we're coming:
- $o->sendmsg($o->encode_record('TRANSMIT', $package, $file));
- my @msg = $o->decode_record($o->recvmsg);
- return Error($msg[1])
- unless $msg[0] eq 'OK';
-
- # The size of individual packets is up to negotiation, but it makes some
- # sense to pick a power of 2. I'm using 16384 bytes, or 16KB.
- my $n;
- my $dat;
- while ($n = read($FILE, $dat, 16384)) {
- $dat = $o->encode_record('DATA', $dat);
- $o->sendmsg($dat);
- }
-
- # Tell them we're done:
- $o->sendmsg('EOT');
-
- @msg = $o->decode_record($o->recvmsg);
- return Error($msg[1]) unless $msg[0] eq 'OK';
- Ok();
- }
-
- 1;
-