1 package SL::SessionFile;
 
   5 use parent qw(Rose::Object);
 
   8 use File::Path qw(mkpath rmtree);
 
   9 use English qw(-no_match_vars);
 
  11 use POSIX qw(strftime);
 
  13 use Rose::Object::MakeMethods::Generic
 
  15  scalar => [ qw(fh file_name) ],
 
  19   my ($class, $file_name, %params) = @_;
 
  21   my $self   = $class->SUPER::new;
 
  23   my $path   = $self->prepare_path;
 
  24   $file_name =~ s:.*/::g;
 
  25   $file_name =  "${path}/${file_name}";
 
  27   $self->file_name($file_name);
 
  30     my $mode = $params{mode};
 
  32     if ($params{encoding}) {
 
  33       $params{encoding} =~ s/[^a-z0-9\-]//gi;
 
  34       $mode .= ':encoding(' . $params{encoding} . ')';
 
  37     $self->fh(IO::File->new($file_name, $mode));
 
  44   my ($self, $mode) = @_;
 
  45   return $self->fh(IO::File->new($self->file_name, $mode));
 
  50   return -f $self->file_name;
 
  55   return -s $self->file_name;
 
  58 sub displayable_mtime {
 
  60   return '' unless $self->exists;
 
  62   my @mtime = localtime((stat $self->file_name)[9]);
 
  63   return $::locale->format_date(\%::myconfig, $mtime[5] + 1900, $mtime[4] + 1, $mtime[3]) . ' ' . strftime('%H:%M:%S', @mtime);
 
  67   die "No session ID" unless $::auth->get_session_id;
 
  68   return "users/session_files/" . $::auth->get_session_id;
 
  72   my $path = get_path();
 
  73   return $path if -d $path;
 
  75   die "Creating ${path} failed" unless -d $path;
 
  80   my ($class, $session_id) = @_;
 
  82   $session_id =~ s/[^a-z0-9]//gi;
 
  83   rmtree "users/session_files/$session_id" if $session_id;
 
  95 SL::SessionFile - Create files that are removed when the session is
 
 102   # Create a session file named "customer.csv" (relative names only)
 
 103   my $sfile = SL::SessionFile->new('customer.csv', mode => 'w');
 
 104   $sfile->fh->print("col1;col2;col3\n" .
 
 105                     "value1;value2;value3\n");
 
 108   # Does temporary file exist?
 
 109   my $sfile = SL::SessionFile->new("customer.csv");
 
 110   if ($sfile->exists) {
 
 111     print "file exists; size " . $sfile->size . " bytes; mtime " . $sfile->displayable_mtime . "\n";
 
 114 A small class that wraps around files that only exist as long as the
 
 115 user's session exists. The session expiration mechanism will delete
 
 116 all session files when the session itself is removed due to expiry or
 
 117 the user logging out.
 
 119 Files are stored in session-specific folders in
 
 120 C<users/session_files/SESSIONID>.
 
 122 =head1 MEMBER FUNCTIONS
 
 126 =item C<new $file_name, [%params]>
 
 128 Create a new instance. C<$file_name> is a relative file name (path
 
 129 components are stripped) to the session-specific temporary directory.
 
 131 If C<$params{mode}> is given then try to open the file as an instance
 
 132 of C<IO::File>. C<${mode}> is passed through to C<IO::File::new>.
 
 134 If C<$params{encoding}> is given then the file is opened with the
 
 135 appropriate encoding layer.
 
 139 Returns the instance of C<IO::File> associated with the file.
 
 143 Returns the full relative file name associated with this instance. If
 
 144 it has been created for "customer.csv" then the value returned might
 
 145 be C<users/session_files/e8789b98721347/customer.csv>.
 
 147 =item C<open, %params]>
 
 149 Opens the file_name given at creation with the given parameters.
 
 153 Returns trueish if the file exists.
 
 157 Returns the file's size in bytes.
 
 159 =item C<displayable_mtime>
 
 161 Returns the modification time suitable for display (e.g. date
 
 162 formatted according to the user's date format), e.g.
 
 163 C<22.01.2011 14:12:22>.
 
 167 =head1 OBJECT FUNCTIONS
 
 173 Returns the name of the session-specific directory used for file
 
 174 storage relative to the Lx-Office installation folder.
 
 176 =item C<prepare_path>
 
 178 Creates all directories in C<get_path> if they do not exist. Returns
 
 179 the same as C<get_path>.
 
 181 =item C<destroy_session $id>
 
 183 Removes all files and the directory belonging to the session C<$id>.
 
 193 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>