#!/usr/bin/perl
package BBSFileHeader;
use strict;
use IO::Handle;
use Data::Dumper;

use fields qw/dir fh cache/;

sub TIEHASH
{
    my($class, $dir) = @_;
    my $self = fields::new($class);

    open $self->{fh}, "<$dir/.DIR";
    return undef if( !$self->{fh} );

    $self->{dir} = $dir;
    return $self;
}

sub FETCH
{   
    my($self, $k) = @_;

    return $self->{dir} if( $k eq 'dir' );
    return ((-s "$self->{dir}/.DIR") / 128) if( $k eq 'num' );

    my($num, $key) = $k =~ /(.*)\.(.*)/;
    my($t, %h);

    $num += $self->FETCH('num')	if( $num < 0 );

    return $self->{cache}{$num}{$key} if( $self->{cache}{$num}{$key} );

    seek($self->{fh}, $num * 128, 0);
    $self->{fh}->read($t, 128);

    if( $key eq 'isdir' ){
	my $fn = "$self->{dir}/" . $self->FETCH("$num.filename");
	return (-d $fn);
    }
    elsif( $key eq 'content' ){
	my $fn = "$self->{dir}/" . $self->FETCH("$num.filename");
	my($c, $fh);
	open $fh, "<$fn" || return '';
	$fh->read($c, (-s $fn));
	return $c;
    }
    else{
	($h{filename}, $h{recommend}, $h{owner}, $h{date}, $h{title},
	 $h{money}, undef, $h{filemode}) =
	    unpack('Z33cZ14Z6Z65iCC', $t);
	$h{title} = substr($h{title}, 3);
	$self->{cache}{$num}{$_} = $h{$_}
	    foreach( 'filename', 'owner', 'date',
		     'title', 'money', 'filemode' );
	return $h{$key};
    }
}

1;
