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) ],
16 'scalar --get_set_init' => [ qw(session_id) ],
20 my ($class, $file_name, %params) = @_;
22 my $self = $class->SUPER::new;
24 if ($params{session_id}) {
25 $self->session_id($params{session_id})
28 my $path = $self->prepare_path;
29 $file_name =~ s:.*/::g;
30 $file_name = "${path}/${file_name}";
32 $self->file_name($file_name);
35 my $mode = $params{mode};
37 if ($params{encoding}) {
38 $params{encoding} =~ s/[^a-z0-9\-]//gi;
39 $mode .= ':encoding(' . $params{encoding} . ')';
42 $self->fh(IO::File->new($file_name, $mode));
49 my ($self, $mode) = @_;
50 return $self->fh(IO::File->new($self->file_name, $mode));
55 return -f $self->file_name;
60 return -s $self->file_name;
63 sub displayable_mtime {
65 return '' unless $self->exists;
67 my @mtime = localtime((stat $self->file_name)[9]);
68 return $::locale->format_date(\%::myconfig, $mtime[5] + 1900, $mtime[4] + 1, $mtime[3]) . ' ' . strftime('%H:%M:%S', @mtime);
72 die "No session ID" unless $_[0]->session_id;
73 return "users/session_files/" . $_[0]->session_id;
77 my $path = $_[0]->get_path;
78 return $path if -d $path;
80 die "Creating ${path} failed" unless -d $path;
85 $::auth->get_session_id;
89 my ($class, $session_id) = @_;
91 $session_id =~ s/[^a-z0-9]//gi;
92 rmtree "users/session_files/$session_id" if $session_id;
104 SL::SessionFile - Create files that are removed when the session is
111 # Create a session file named "customer.csv" (relative names only)
112 my $sfile = SL::SessionFile->new('customer.csv', mode => 'w');
113 $sfile->fh->print("col1;col2;col3\n" .
114 "value1;value2;value3\n");
117 # Does temporary file exist?
118 my $sfile = SL::SessionFile->new("customer.csv");
119 if ($sfile->exists) {
120 print "file exists; size " . $sfile->size . " bytes; mtime " . $sfile->displayable_mtime . "\n";
123 A small class that wraps around files that only exist as long as the
124 user's session exists. The session expiration mechanism will delete
125 all session files when the session itself is removed due to expiry or
126 the user logging out.
128 Files are stored in session-specific folders in
129 C<users/session_files/SESSIONID>.
131 =head1 MEMBER FUNCTIONS
135 =item C<new $file_name, [%params]>
137 Create a new instance. C<$file_name> is a relative file name (path
138 components are stripped) to the session-specific temporary directory.
140 If C<$params{mode}> is given then try to open the file as an instance
141 of C<IO::File>. C<${mode}> is passed through to C<IO::File::new>.
143 If C<$params{encoding}> is given then the file is opened with the
144 appropriate encoding layer.
148 Returns the instance of C<IO::File> associated with the file.
152 Returns the full relative file name associated with this instance. If
153 it has been created for "customer.csv" then the value returned might
154 be C<users/session_files/e8789b98721347/customer.csv>.
156 =item C<open, %params]>
158 Opens the file_name given at creation with the given parameters.
162 Returns trueish if the file exists.
166 Returns the file's size in bytes.
168 =item C<displayable_mtime>
170 Returns the modification time suitable for display (e.g. date
171 formatted according to the user's date format), e.g.
172 C<22.01.2011 14:12:22>.
176 =head1 OBJECT FUNCTIONS
182 Returns the name of the session-specific directory used for file
183 storage relative to the kivitendo installation folder.
185 =item C<prepare_path>
187 Creates all directories in C<get_path> if they do not exist. Returns
188 the same as C<get_path>.
190 =item C<destroy_session $id>
192 Removes all files and the directory belonging to the session C<$id>.
202 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>