/usr/local/CPAN/Video-PlaybackMachine/Video/PlaybackMachine/ScheduleView.pm
package Video::PlaybackMachine::ScheduleView;
####
#### Video::PlaybackMachine::ScheduleView
####
#### $Revision: 257 $
####
#### Translates between the times listed in a schedule
#### and the current time.
####
use strict;
use warnings;
use Carp;
use Log::Log4perl;
############################# Class Constants #############################
############################## Class Methods ##############################
##
## new()
##
## Arguments:
##
## SCHEDULE_TABLE: Video::PlaybackMachine::ScheduleTable
## OFFSET: int -- Difference between schedule time and real ( s - r )
##
sub new {
my $type = shift;
@_ == 2 or croak "${type}::new(): arguments are SCHEDULE_TABLE and OFFSET; stopped";
my ($schedule_table, $offset) = @_;
defined $offset or $offset = 0;
my $self = {
schedule_table => $schedule_table,
offset => $offset,
logger => Log::Log4perl->get_logger('Video.PlaybackMachine.ScheduleView')
};
bless $self, $type;
}
############################# Object Methods ##############################
##
## Returns the given time corrected with the schedule
## offset. If no arguments, returns the current time
## corrected for schedule offset.
##
# Note: Currently the offset is positive for the past, negative for
# the future.
sub real_to_schedule {
my $self = shift;
my ($real_time) = @_;
defined $real_time or $real_time = CORE::time();
return $real_time - $self->{offset};
}
sub schedule_to_real {
my $self = shift;
my ($schedule_time) = @_;
defined $schedule_time or return CORE::time();
return $schedule_time + $self->{'offset'};
}
##
## Returns the offset value.
##
sub get_offset {
return $_[0]->{offset};
}
##
## Returns the schedule table.
##
sub get_schedule_table {
return $_[0]->{schedule_table};
}
##
## get_next_entry()
##
## Returns the next entry appearing on our Schedule Table.
##
sub get_next_entry {
my $self = shift;
my ($real_time, $num_entries) = @_;
defined $real_time or $real_time = time();
return $self->_do_get_next_entry($real_time, $num_entries);
}
sub _do_get_next_entry {
my $self = shift;
my ($real_time, $num_entries) = @_;
return scalar($self->{schedule_table}
->get_entries_after(
$self->real_to_schedule($real_time + 1),
$num_entries
)
);
}
##
## Returns the amount of time until the next scheduled entry.
## Returns empty if no scheduled entry remains.
##
sub get_time_to_next {
my $self = shift;
my $real_time = time();
my $next_entry = $self->_do_get_next_entry($real_time)
or return;
return $next_entry->get_start_time() - $self->real_to_schedule($real_time);
}
##
## Returns the seek time for a given schedule entry.
##
sub get_seek {
my $self = shift;
my $entry = shift;
my $seek = time() - $self->schedule_to_real($entry->get_start_time());
return ($seek > 0) ? $seek : 0;
}
1;