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 kivitendo 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>