# Copyright 2008, 2009, 2010, 2011 Kevin Ryde # This file is part of Chart. # # Chart 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 3, or (at your option) any later version. # # Chart 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 Chart. If not, see . package App::Chart::SubprocessMain; use 5.010; use strict; use warnings; use Storable; use IO::Handle; use App::Chart::Download; # set this to 1 for development debugging prints use constant { DEBUG => 0, DEBUG_TTY_FILENAME => '/dev/tty' }; sub main { my ($class) = @_; ## no critic (ProhibitExplicitStdin, ProhibitExit) # subprocess unbuffered and utf8 binmode (STDIN, ':raw') or die; *STDOUT->autoflush(1); *STDERR->autoflush(1); if (DEBUG) { ## no critic (ProhibitBarewordFileHandles RequireBriefOpen) open TTY, '>', DEBUG_TTY_FILENAME or die; print TTY "SubprocessMain\n"; *TTY->autoflush(1); } for (;;) { my $len = ; if (DEBUG) { print "SubprocessMain: length $len\n"; } my $data; my $got = read STDIN, $data, $len; if (! defined $got) { print STDERR "Read error: ",Glib::strerror($!),"\n"; exit 1; } if ($got != $len) { print STDERR "Read $got wanted $len\n"; exit 1; } $data = Storable::thaw ($data); if (DEBUG) { require Data::Dumper; print "SubprocessMain: ",Data::Dumper::Dumper($data); print TTY "SubprocessMain ", Data::Dumper::Dumper($data); } if (! $data) { last; } my ($jobclass, @args) = @$data; # use Module::Load; # Module::Load::load ($jobclass); # $jobclass->run (@args); given ($jobclass) { when ('intraday') { require App::Chart::Intraday; App::Chart::Intraday->command_line_download (\@args); } when ('latest') { require App::Chart::LatestHandler; App::Chart::LatestHandler->download (@args); } when ('download') { require App::Chart::Download; if ($args[0] =~ /^--/p) { my $key = ${^POSTMATCH}; require App::Chart::Gtk2::Symlist; $args[0] = App::Chart::Gtk2::Symlist->new_from_key ($key); } App::Chart::Download->command_line_download ('subprocess', \@args); } when ('vacuum') { require App::Chart::Vacuum; App::Chart::Vacuum::vacuum (@args); } when ('exit') { last; } default { print "Unknown job type $_\n"; } } # App::Chart::Download::status ('Foo'); # sleep (2); App::Chart::Download::status ('Idle'); *STDOUT->flush; } if (DEBUG) { print TTY "SubprocessMain exit\n"; } exit 0; } 1; __END__ =for stopwords subprocesses =head1 NAME App::Chart::SubprocessMain -- main loop for subprocesses =head1 SYNOPSIS use App::Chart::SubprocessMain; App::Chart::SubprocessMain->main (); =cut