=================================================================== RCS file: /cvs/openbsd/OpenBSDTorrents/lib/BT/MetaInfo/Cached.pm,v retrieving revision 1.1 retrieving revision 1.3 diff -u -r1.1 -r1.3 --- openbsd/OpenBSDTorrents/lib/BT/MetaInfo/Cached.pm 2005/05/02 20:37:28 1.1 +++ openbsd/OpenBSDTorrents/lib/BT/MetaInfo/Cached.pm 2005/05/02 22:46:48 1.3 @@ -1,20 +1,70 @@ +# $Id: Cached.pm,v 1.3 2005/05/02 21:46:48 andrew Exp $ +use strict; + package BT::OBTMetaInfo; require 5.6.0; -use strict; +use vars qw( $VERSION @ISA ); +use Digest::SHA1 qw(sha1); +use Fcntl ':flock'; # import LOCK_* constants + use BT::MetaInfo; +use base 'BT::MetaInfo'; -$VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +use OpenBSDTorrents; +use Data::Dumper; + +$VERSION = do { my @r = (q$Id: Cached.pm,v 1.3 2005/05/02 21:46:48 andrew Exp $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + sub new { my $classname = shift; - my $pass = shift; - - my $self = $classname->SUPER::new(@_); + return $classname->SUPER::new(@_); } -sub info_hash { return(sha1(bencode($_[0]->info))); } +sub info_hash_cached +{ + my $self = shift; + my $torrent = shift; + return $self->SUPER::info_hash unless $torrent; + + my $meta_file = $torrent; + $meta_file =~ s/\.torrent$/.$OBT->{META_EXT}/; + + my $hash = undef; + + if (-e $meta_file) { + #print "Reading meta file: $meta_file\n"; + open my $meta, $meta_file or die "Couldn't open $meta_file: $!"; + flock($meta, LOCK_SH); + binmode $meta; + + $hash = do { local $/; <$meta> }; + + flock($meta, LOCK_UN); + close $meta; + } else { + $hash = $self->SUPER::info_hash; + #print "Writing meta file: $meta_file\n"; + open my $meta, '>', $meta_file + or die "Couldn't open $meta_file: $!"; + flock($meta, LOCK_EX); + binmode $meta; + + print $meta $hash; + + flock($meta, LOCK_UN); + close $meta; + + } + #my $text_hash = unpack("H*", $hash); + #print "INFO_HASH: $text_hash\n"; + + return $hash; +} + +1