]> git.p6c8.net - selfforum.git/blobdiff - selfforum-cgi/shared/Template/Posting.pm
added version checks
[selfforum.git] / selfforum-cgi / shared / Template / Posting.pm
index 5081a1a9a8b182e7ace6c793bfac89d73775b606..4cae38d2c8754da3ec53e0da2837d9c4cb80f8bc 100644 (file)
@@ -24,6 +24,7 @@ use Posting::_lib qw(
   parse_xml_file
   hr_time
 );
+use Posting::Cache;
 use Template;
 use Template::_conf;
 use Template::_query;
@@ -55,102 +56,142 @@ sub print_posting_as_HTML ($$$) {
   my ($threadpath, $tempfile, $param) = @_;
 
   my $template = new Template $tempfile;
+  my $assign = $param -> {assign};
 
-  # Datei sperren... (eigentlich)
   my $view = get_view_params ({
     adminDefault => $param -> {adminDefault}
   });
 
-  my $xml = parse_xml_file ($threadpath.'t'.$param -> {thread}.'.xml');
-
-  my ($mnode, $tnode) = get_message_node ($xml, 't'.$param -> {thread}, 'm'.$param -> {posting});
-  my $pnode = $mnode -> getParentNode;
-  my $header = get_message_header ($mnode);
-  my $msg = parse_single_thread ($tnode, $param -> {showDeleted}, $view -> {sortedMsg});
-  my $pheader = ($pnode -> getNodeName eq 'Message')?get_message_header ($pnode):{};
-
-  my $assign = $param -> {assign};
-  my $formdata = $param -> {form} -> {data};
-  my $formact = $param -> {form} -> {action};
-
-  my $body = get_message_body ($xml, 'm'.$param -> {posting});
-
-  my $text = message_field (
-    $body,
-    { quoteChars => plain($view -> {quoteChars}),
-      quoting    => 1,
-      startCite  => ${$template -> scrap ($assign -> {startCite})},
-      endCite    => ${$template -> scrap ($assign -> {endCite})}
+  my ($xmlfile, $locked, $xml) = ($threadpath.'t'.$param -> {thread}.'.xml', 0);
+
+  unless (($locked = lock_file ($xmlfile)) and ($xml = parse_xml_file ($xmlfile))) {
+    violent_unlock_file ($xmlfile);
+    print ${$template -> scrap (
+      $assign -> {errorDoc},
+      { $assign -> {errorText} => $template -> insert (
+          $assign -> {(defined $locked)
+            ? 'occupied'
+            : 'notAvailable'
+          })
+      }
+    )};
+  }
+  else {
+    violent_unlock_file ($xmlfile) unless (unlock_file($xmlfile));
+
+    my ($mnode, $tnode) = get_message_node ($xml, 't'.$param -> {thread}, 'm'.$param -> {posting});
+
+    unless ($mnode and not $mnode->getAttribute('invisible')) {
+      print ${$template -> scrap (
+        $assign -> {errorDoc},
+        { $assign -> {errorText} => $template -> insert ($assign -> {'notAvailable'}) }
+      )};
     }
-  );
-
-  my $area = answer_field (
-    $body,
-    { quoteArea  => 1,
-      quoteChars => plain($view -> {quoteChars}),
-      messages   => $param -> {messages}
+    else {
+      my $pnode = $mnode -> getParentNode;
+      my $header = get_message_header ($mnode);
+      my $msg = parse_single_thread ($tnode, $param -> {showDeleted}, $view -> {sortedMsg});
+      my $pheader = ($pnode -> getNodeName eq 'Message')?get_message_header ($pnode):{};
+
+      my $formdata = $param -> {form} -> {data};
+      my $formact = $param -> {form} -> {action};
+
+      my $body = get_message_body ($xml, 'm'.$param -> {posting});
+
+      my $text = message_field (
+        $body,
+        { quoteChars => plain($view -> {quoteChars}),
+          quoting    => $view -> {quoting},
+          startCite  => ${$template -> scrap ($assign -> {startCite})},
+          endCite    => ${$template -> scrap ($assign -> {endCite})}
+        }
+      );
+
+      my $area = answer_field (
+        $body,
+        { quoteArea  => 1,
+          quoteChars => plain($view -> {quoteChars}),
+          messages   => $param -> {messages}
+        }
+      );
+
+      my $pars = {};
+
+      $pars -> {$formdata -> {$_} -> {assign} -> {name}} = plain($formdata -> {$_} -> {name})
+        for (qw(
+          posterBody
+          uniqueID
+          followUp
+          quoteChar
+          userID
+          posterName
+          posterEmail
+          posterURL
+          posterImage
+          )
+        );
+
+      my $cgi = $param -> {cgi};
+
+      my $tpar = {
+        thread   => $param -> {thread},
+        template => $param -> {tree},
+        start    => $param -> {posting},
+        cgi      => $cgi
+      };
+
+      my $parent_pars;
+
+      $parent_pars = {
+        $assign->{parentTitle} => plain(defined $pheader->{subject}  ? $pheader->{subject}  : ''),
+        $assign->{parentCat}   => plain(defined $pheader->{category} ? $pheader->{category} : ''),
+        $assign->{parentName}  => plain(defined $pheader->{name}     ? $pheader->{name}     : ''),
+        $assign->{parentTime}  => plain(hr_time($pheader->{time})),
+        $assign->{parentLink}  => query_string (
+          { $cgi -> {thread} => $param -> {thread},
+            $cgi -> {posting} => ($pnode -> getAttribute ('id') =~ /(\d+)/)[0]
+          })
+      } if (%$pheader);
+
+      print ${$template -> scrap (
+        $assign->{mainDoc},
+        { $assign->{name}                            => plain(defined $header->{name}  ? $header->{name}  : ''),
+          $assign->{email}                           => plain(defined $header->{email} ? $header->{email} : ''),
+          $assign->{home}                            => plain(defined $header->{home}  ? $header->{home}  : ''),
+          $assign->{image}                           => plain(defined $header->{image} ? $header->{image} : ''),
+          $assign->{time}                            => plain(hr_time($header->{time})),
+          $assign->{message}                         => $text,
+          $assign->{messageTitle}                    => plain(defined $header->{subject}  ? $header->{subject}  : ''),
+          $assign->{messageCat}                      => plain(defined $header->{category} ? $header->{category} : ''),
+          $param->{tree}->{main}                     => html_thread ($msg, $template, $tpar),
+          $formact->{post}->{assign}                 => $formact->{post}->{url},
+          $formact->{vote}->{assign}                 => $formact->{vote}->{url},
+          $formdata->{posterBody}->{assign}->{value} => $area,
+          $formdata->{uniqueID}  ->{assign}->{value} => plain(unique_id),
+          $formdata->{followUp}  ->{assign}->{value} => plain($param -> {thread}.';'.$param -> {posting}),
+          $formdata->{quoteChar} ->{assign}->{value} => "ÿ".plain(defined $view -> {quoteChars} ? $view -> {quoteChars} : ''),
+          $formdata->{userID}    ->{assign}->{value} => '',
+          $assign->{firsttime}                       => $param->{firsttime} ? $param->{firsttime} : '',
+          $assign->{voted}                           => $param->{voted} ? $param->{voted} : ''
+        },
+        $pars,
+        $parent_pars
+      )};
+
+      # all output done
+      #
+      close STDOUT;
+
+      if ($param->{firsttime}) {
+        my $cache = new Posting::Cache ($param->{cachepath});
+        $cache -> add_view (
+          { thread  => $param -> {thread},
+            posting => $param -> {posting}
+          }
+        );
+      }
     }
-  );
-
-  my $pars = {};
-
-  $pars -> {$formdata -> {$_} -> {assign} -> {name}} = plain($formdata -> {$_} -> {name})
-    for (qw(
-      posterBody
-      uniqueID
-      followUp
-      quoteChar
-      userID
-      posterName
-      posterEmail
-      posterURL
-      posterImage
-      ));
-
-  my $cgi = $param -> {cgi};
-
-  my $tpar = {
-    thread   => $param -> {thread},
-    template => $param -> {tree},
-    start    => $param -> {posting},
-    cgi      => $cgi
-  };
-
-  my $parent_pars;
-
-  $parent_pars = {
-    $assign->{parentTitle} => plain($pheader->{subject}),
-    $assign->{parentCat}   => plain($pheader->{category}),
-    $assign->{parentName}  => plain($pheader->{name}),
-    $assign->{parentTime}  => plain(hr_time($pheader->{time})),
-    $assign->{parentLink}  => query_string (
-      { $cgi -> {thread} => $param -> {thread},
-        $cgi -> {posting} => ($pnode -> getAttribute ('id') =~ /(\d+)/)[0]
-      })
-  } if (%$pheader);
-
-  print ${$template -> scrap (
-    $assign->{mainDoc},
-    { $assign->{name}                            => plain($header->{name}),
-      $assign->{email}                           => plain($header->{email}),
-      $assign->{home}                            => plain($header->{home}),
-      $assign->{image}                           => plain($header->{image}),
-      $assign->{time}                            => plain(hr_time($header->{time})),
-      $assign->{message}                         => $text,
-      $assign->{messageTitle}                    => plain($header->{subject}),
-      $assign->{messageCat}                      => plain($header->{category}),
-      $param->{tree}->{main}                     => html_thread ($msg, $template, $tpar),
-      $formact->{post}->{assign}                 => $formact->{post}->{url},
-      $formact->{vote}->{assign}                 => $formact->{vote}->{url},
-      $formdata->{posterBody}->{assign}->{value} => $area,
-      $formdata->{uniqueID}  ->{assign}->{value} => plain(unique_id),
-      $formdata->{followUp}  ->{assign}->{value} => plain($param -> {thread}.';'.$param -> {posting}),
-      $formdata->{quoteChar} ->{assign}->{value} => "ÿ".plain($view -> {quoteChars}),
-      $formdata->{userID}    ->{assign}->{value} => ''
-    },
-    $pars,
-    $parent_pars
-  )};
+  }
 
   return;
 }
@@ -190,5 +231,4 @@ sub message_as_HTML ($$$) {
 
 #
 #
-### end of Template::Posting ###################################################
-
+### end of Template::Posting ###################################################
\ No newline at end of file

patrick-canterino.de