Projekt

Allgemein

Profil

Herunterladen (2,96 KB) Statistiken
| Zweig: | Markierung: | Revision:
package SL::Webdav::Object;

use strict;
use parent qw(Rose::Object);

use DateTime;

use Rose::Object::MakeMethods::Generic (
scalar => [ qw(filename webdav) ],
'scalar --get_set_init' => [ qw(version basename extension) ],
);

sub init_basename {
($_[0]->parse_filename)[0];
}

sub init_version {
($_[0]->parse_filename)[1];
}

sub init_extension {
($_[0]->parse_filename)[2];
}

sub parse_filename {
my ($self) = @_;

my $name = $self->filename;
my $version_re = $self->webdav->version_scheme->extract_regexp;
my $sep = $self->webdav->version_scheme->separator;

my $extension = $name =~ s/\.(\w+?)$// ? $1 : '';
my $version = $name =~ s/\Q$sep\E($version_re)$// ? $1 : '';
my $basename = $name;

return ($basename, $version, $extension);
}

sub full_filedescriptor {
my ($self) = @_;

File::Spec->catfile($self->webdav->webdav_path, $self->filename);
}

sub size {
($_[0]->stat)[7];
}

sub atime {
DateTime->from_epoch(epoch => ($_[0]->stat)[8]);
}

sub mtime {
DateTime->from_epoch(epoch => ($_[0]->stat)[9]);
}

sub data {
my ($self) = @_;

open my $fh, '<:raw', $self->full_filedescriptor or die "could not open " . $self->filename . ": $!";

local $/ = undef;

my $data = <$fh>;

close $fh;

return \$data;
}

sub stat {
my $file = $_[0]->full_filedescriptor;
stat($file);
}

sub href {
my ($self) = @_;

my $base_path = $ENV{'SCRIPT_NAME'};
$base_path =~ s|[^/]+$||;

my $file = $self->filename;
my $path = $self->webdav->webdav_path;
my $is_directory = -d "$path/$file";

$file = join('/', map { $::form->escape($_) } grep { $_ } split m|/+|, "$path/$file");
$file .= '/' if ($is_directory);

return "$base_path/$file";
}

1;

__END__

=encoding utf-8

=head1 NAME

SL::Webdav::Object - Webdav object wrapper

=head1 SYNOPSIS

use SL::Webdav::Object;

my $object = SL::Webdav::Object->new(filename => $filename, webdav => $webdav);

my $data_ref = $object->data;
my $mtime = $object->mtime;

my $basename = $object->basename;
my $version = $object->version;
my $extension = $object->extension;

my $link = $object->href;

=head1 DESCRIPTION

This is a wrapper around a single object in the webdav. These objects are
thought about as immutable, and all manipulation will instead happen in the
associated L<SL::Webdav::File>.

=head1 FUNCTIONS

=over 4

=item C<basename>

Returns the basename with version and extension stripped.

=item C<version>

Returns the version string.

=item C<extension>

Returns the extension.

=item C<size>

wrapped stat[7]

=item C<atime>

L<DateTime> wrapped stat[8]

=item C<mtime>

L<DateTime> wrapped stat[9]

=item C<data>

Ref to the actual data in raw encoding.

=item C<href>

URL relative to the web base dir for download.

=item C<full_filedescriptor>

Fully qualified path to file.

=back

=head1 SEE ALSO

L<SL::Webdav>, L<SL::Webdav::File>

=head1 BUGS

None yet :)

=head1 AUTHOR

Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>

=cut
(2-2/2)