3 #################################################################################################
4 #################################################################################################
5 #################################################################################################
17 #################################################################################################
18 #################################################################################################
19 #################################################################################################
32 #################################################################################################
33 #################################################################################################
34 #################################################################################################
36 #################################################################################################
37 #################################################################################################
38 #################################################################################################
43 # Working path of hxsp (loaded from config)
46 # Interface language (loaded from config)
49 # Port to use for hxsp (loaded from config)
52 # Use complete command description on syntax error if ON (loaded from config)
55 # Include XIncludes on the fly if ON (loaded from config)
58 # Max Depth of the DOM tree while parsing
61 # Message sent when hxsp was called without commands (loaded from message.##)
64 # Message sent when hxsp was called with the help command (loaded from message.##)
67 # Message sent when a stylesheet is added (loaded from message.##)
70 # Message sent when a stylesheet is reloaded (loaded from message.##)
73 # Message sent when a stylesheet is removed (loaded from message.##)
76 # Message to print the stylesheet status for list command (loaded from message.##)
79 # Message sent when the list command was called
80 # and there is no stylesheet loaded (loaded from message.##)
83 # Message sent after "home_message" when hxsp was called without commands
84 # and sent after "help_message" when hxsp was called with the help command
85 # and after all syntax errors if "all_usage_synerr" is set ON (loaded from message.##)
88 # All the following syntax errors messages are used #only# if "all_usage_synerr" is set OFF
90 # Message sent on help syntax errors (loaded from message.##)
93 # Message sent on add syntax errors (loaded from message.##)
96 # Message sent on remove syntax errors (loaded from message.##)
99 # Message sent on list syntax errors (loaded from message.##)
102 # Message sent on reload syntax errors (loaded from message.##)
105 # Message sent on apply syntax errors (loaded from message.##)
108 # The error hash contains the error messages to call in case of syntax
109 # or operative errors, the keys are defined by the left value of each line in error##
115 # load operror template
118 # load synerror template
121 # This is the data structure to store the loaded stylesheets (hash of array)
122 # [0] :Styleseet URI , [1] : Loaded styleseet
125 # This is a hash for fast duplicate uri detection
128 #################################################################################################
129 #################################################################################################
130 #################################################################################################
131 # Starting Operations
132 #################################################################################################
133 #################################################################################################
134 #################################################################################################
136 # chdir to the directory of this perl script
142 # initialize the objects to use LibXML and LibXSLT
143 my $parser = XML::LibXML->new();
144 my $xslt = XML::LibXSLT->new();
146 # initialize the LibXML callbacks to load uri's
147 XML::LibXML->callbacks(\&match_uri,\&open_uri,\&read_uri,\&close_uri);
149 # include XIncludes on the fly if required
150 if ($expand_xinc eq "ON") { $parser->expand_xinclude( 1 ); }
152 # initialize the hxsp as HTTP::Daemon
153 my $d = new HTTP::Daemon LocalPort => $port;
155 # get the complete working url of hxsp
156 my $puwobo_url = $d->url().$working_path;
158 # set the working path to be comparable with url->path
159 $working_path = "/". $working_path;
170 # print starting information on console
172 hxsp v$ver active at: <URL:$puwobo_url>
173 Language is $language
174 On syntax error usage of every command is $all_usage_synerr
175 Include XIncludes on the fly is $expand_xinc;
178 #################################################################################################
179 #################################################################################################
180 # HTTP::Daemon Operations
181 #################################################################################################
182 #################################################################################################
184 # do not accumulate defunct processes
185 $SIG{CHLD} = "IGNORE";
186 $SIG{USR1} = \&listen; # sent by the child to make the parent read the pipe
188 pipe LIST_CHILD, TELL_PARENT;
189 pipe LIST_PARENT, TELL_CHILD;
190 TELL_PARENT->autoflush(1);
191 TELL_CHILD->autoflush(1);
196 my $query = <LIST_CHILD>;
197 if ($query =~ /^add /) {
202 elsif ($query =~ /^reload /) {
203 $query =~ s/^reload //;
205 $res = reload($query);
207 elsif ($query =~ /^remove /) {
208 $query =~ s/^remove //;
210 $res = remove($query);
212 print TELL_CHILD "$res\n";
213 print TELL_CHILD "____\n"; # end of response
216 while (my $c = $d->accept) #connect
218 if (fork() == 0) #start new concurrent process
220 while (my $r = $c->get_request) #get http request
222 if ($r->method eq 'GET' &&
223 ($r->url->path eq $working_path or $r->url->path eq $working_path."/"))#start dir
225 my $response = new HTTP::Response;
226 $response->header('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
227 $response->content(home($r->url->query));
228 $c->send_response($response);
230 elsif ($r->method eq 'GET' && $r->url->path eq $working_path."/help")#usage
232 my $response = new HTTP::Response;
233 $response->header('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
234 $response->content(help($r->url->query));
235 $c->send_response($response);
237 elsif ($r->method eq 'GET' && $r->url->path eq $working_path."/add")#add
239 my $response = new HTTP::Response;
240 kill(USR1,getppid()); # ask the parent to read the pipe
241 my $qs = $r->url->query;
242 print TELL_PARENT "add $qs\n";
244 while (($in = <LIST_PARENT>) ne "____\n") {
248 $response->header('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
249 $response->content($res);
250 $c->send_response($response);
252 elsif ($r->method eq 'GET' && $r->url->path eq $working_path."/remove")#remove
254 my $response = new HTTP::Response;
255 kill(USR1,getppid()); # ask the parent to read the pipe
256 my $qs = $r->url->query;
257 print TELL_PARENT "remove $qs\n";
260 while (($in = <LIST_PARENT>) ne "____\n") {
264 $response->content($res);
265 $response->header('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
266 $c->send_response($response);
268 elsif ($r->method eq 'GET' && $r->url->path eq $working_path."/reload")#reload
270 my $response = new HTTP::Response;
271 kill(USR1,getppid()); # ask the parent to read the pipe
272 my $qs = $r->url->query;
273 print TELL_PARENT "reload $qs\n";
276 while (($in = <LIST_PARENT>) ne "____\n") {
280 $response->content($res);
281 $response->header('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
282 $c->send_response($response);
284 elsif ($r->method eq 'GET' && $r->url->path eq $working_path."/list")#list
286 my $response = new HTTP::Response;
287 $response->header('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
288 $response->content(list($r->url->query));
289 $c->send_response($response);
291 elsif ($r->method eq 'GET' && $r->url->path eq $working_path."/apply")#apply
294 my $response = new HTTP::Response;
295 $response->content(apply($r->url->query,\%headers));
296 $response->header(%headers);
297 $c->send_response($response);
299 else #wrong command or not working_path
301 $c->send_error(RC_FORBIDDEN)
310 #################################################################################################
311 #################################################################################################
312 #################################################################################################
313 # Stylesheet hash check subrutines
314 #################################################################################################
315 #################################################################################################
316 #################################################################################################
318 #################################################################################################
320 # Usage: addcheckvalues($key,$uri);
321 # Returns: error message or 0 if no errors found
322 # Do: check if key and uri are already loaded
325 #################################################################################################
328 my $ac_key = shift(@_);
329 my $ac_uri = shift(@_);
330 if (exists $stylesheet_hash{$ac_key})
332 return err_replace($error{"add_dup_key"},$ac_key,$ac_uri,"");
334 elsif (exists $by_name{$ac_uri})
336 return err_replace($error{"add_dup_value"},$ac_key,$ac_uri,$by_name{$ac_key});
340 #################################################################################################
342 #################################################################################################
344 # Usage: recheckvalues($key);
345 # Returns: error message or 0 if no errors found
346 # Do: check if key are loaded
347 # Used by: remove, reloadvalues
349 #################################################################################################
352 my $re_key = shift(@_);
353 if (not exists $stylesheet_hash{$re_key})
355 return err_replace($error{"re_inv_key"},$re_key,"","");
359 #################################################################################################
361 #################################################################################################
362 # sub applycheckvalues
363 # Usage: applycheckvalues(\@keys);
364 # Returns: error message or 0 if no errors found
365 # Do: check if keys in @keys are loaded
366 # Used by: remove, reloadvalues
368 #################################################################################################
371 my $applykeys_ptr = shift(@_);
372 foreach $applykey (@$applykeys_ptr)
374 if (not exists $stylesheet_hash{$applykey})
376 return err_replace($error{"apply_inv_key"},$applykey,"","");
381 #################################################################################################
383 #################################################################################################
384 #################################################################################################
385 #################################################################################################
386 # Stylesheet hash modify subrutines
387 #################################################################################################
388 #################################################################################################
389 #################################################################################################
391 #################################################################################################
393 # Usage: if add_halt_on_errors is ON addvalues($key,$uri,@added);
394 # else addvalues($key,$uri)
395 # Returns: error message or 0 on success,
396 # if add_halt_on_errors is ON return all the added keys on @added
397 # Do: add the values to the stylesheet hash
399 # Uses : addcheckvalues, loadstyle
400 #################################################################################################
403 my $av_key = shift(@_);
404 my $av_uri = shift(@_);
405 my $av_stylesheet; #parsed stylesheet to be placed in hash
406 if (my $err = addcheckvalues($av_key,$av_uri)) { return $err; }
407 elsif (my $err = loadstyle($av_key, $av_uri, $av_stylesheet)) { return $err; }
410 $stylesheet_hash{$av_key}[0]=$av_uri;
411 $stylesheet_hash{$av_key}[1]=$av_stylesheet;
412 $by_name{$av_uri}=$av_key;
416 #################################################################################################
418 #################################################################################################
420 # Usage: removevalues($key);
422 # Do: remove the key specified and relative values from the stylesheet hash
423 # Used by: remove, do_remove
425 #################################################################################################
428 my $cr_key = shift(@_);
429 my $cr_uri = $stylesheet_hash{$cr_key}[0];
430 delete $stylesheet_hash{$cr_key};
431 delete $by_name{$cr_uri};
432 return ok_replace("$s_remove\n",$cr_key,$cr_uri);
434 #################################################################################################
436 #################################################################################################
438 # Usage: if add_halt_on_errors is ON reloadvalues($key.\%reloaded);
439 # else reloadvalues($key);
440 # Returns: error message or 0 on success,
441 # if add_halt_on_errors is ON return the old stylesheets in %reloaded
442 # Do: reload the stlylesheet with the key specified
444 # Uses : recheckvalues, loadstyle
445 #################################################################################################
448 my $rv_key = shift(@_);
449 my $rv_uri = $stylesheet_hash{$rv_key}[0];
450 my $rv_stylesheet; #parsed stylesheet to be placed in hash
451 if (my $err = recheckvalues($rv_key)) { return $err; }
452 elsif (my $err = loadstyle($rv_key, $rv_uri, $rv_stylesheet)) { return $err; }
455 $stylesheet_hash{$rv_key}[1] = $rv_stylesheet;
459 #################################################################################################
461 #################################################################################################
462 #################################################################################################
463 #################################################################################################
464 # LibXML LIBXSLT access subrutines
465 #################################################################################################
466 #################################################################################################
467 #################################################################################################
469 #################################################################################################
471 # Usage: loadstyle($key,$uri,$stylesheet);
472 # Returns: error message or 0 on success,
473 # parsed stylesheet in $stylesheet
474 # Do: parse the stylesheet at the given uri
475 # Used by: addvalues , reloadvalues
476 # Uses : err_replace, parser_error_replace
477 #################################################################################################
480 my $ls_key= shift(@_);
481 my $ls_uri= shift(@_);
486 STDERR->autoflush(1);
487 eval { $style_doc = $parser->parse_file($ls_uri); };
488 print STDERR "____\n";
489 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
492 if ($@ or $uncatched ne "")
494 return err_replace($error{"add_xml_error"},$ls_key,$ls_uri,parser_error_replace($@.$uncatched));
499 STDERR->autoflush(1);
502 eval { $_[0] = $xslt->parse_stylesheet($style_doc); };
503 print STDERR "____\n";
504 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
506 if ($@ or $uncatched ne "")
508 return err_replace($error{"add_xslt_error"},$ls_key,$ls_uri,parser_error_replace($@.$uncatched));
516 my $xmluri = shift(@_);
520 STDERR->autoflush(1);
521 eval { $_[0] = $parser->parse_file($xmluri); };
522 print STDERR "____\n";
523 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
525 if ($@ or $uncatched ne "")
527 return err_replace($error{"apply_xml_error"},"",$xmluri,parser_error_replace($@.$uncatched));
535 my $params_ptr = shift(@_);
536 my %params = XML::LibXSLT::xpath_to_string(%$params_ptr);
541 STDERR->autoflush(1);
542 XML::LibXSLT->max_depth($max_depth);
543 eval { $_[0] = $stylesheet_hash{$k}[1]->transform($_[0],%params); };
544 print STDERR "____\n";
545 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
547 if ($@ or $uncatched ne "")
549 my $e_r = parser_error_replace($@.$uncatched);
550 return err_replace($error{"apply_xslt_error"},$k,$stylesheet_hash{$k}[0],$e_r);
557 my $results = shift(@_);
562 STDERR->autoflush(1);
563 eval { $retval = $stylesheet_hash{$k}[1]->output_string($results); };
564 print STDERR "____\n";
565 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
567 if ($@ or $uncatched ne "")
569 my $e_r = parser_error_replace($@.$uncatched);
570 return operror_print(err_replace($error{"apply_xslt_out_error"},"","",$e_r));
572 else { return $retval; }
576 my $result = shift(@_);
581 STDERR->autoflush(1);
582 eval { $retval = $result->toString; };
583 print STDERR "____\n";
584 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
586 if ($@ or $uncatched ne "")
588 my $e_r = parser_error_replace($@.$uncatched);
589 return operror_print(err_replace($error{"apply_xslt_out_error"},"","",$e_r));
591 else { return $retval; }
596 my $result = shift(@_);
601 STDERR->autoflush(1);
602 eval { $retval = $result->toStringHTML();};
603 print STDERR "____\n";
604 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
606 if ($@ or $uncatched ne "")
608 my $e_r = parser_error_replace($@.$uncatched);
609 return operror_print(err_replace($error{"apply_xslt_out_error"},"","",$e_r));
611 else { return $retval; }
616 my $result = shift(@_);
622 STDERR->autoflush(1);
623 eval { $retval = decodeFromUTF8($enc, $result);};
624 print STDERR "____\n";
625 while(($line = <P>) ne "____\n") { $uncatched .= $line; }
627 if ($@ or $uncatched ne "")
629 my $e_r = parser_error_replace($@.$uncatched);
630 return operror_print(err_replace($error{"apply_xslt_out_error"},"","",$e_r));
632 else { return $retval; }
634 #################################################################################################
636 #################################################################################################
637 #################################################################################################
638 #################################################################################################
639 # Commands subrutines
640 #################################################################################################
641 #################################################################################################
642 #################################################################################################
644 #################################################################################################
646 # Usage: add($http_query);
647 # Returns: values for HTTP::Response
648 # Do: add stylesheet(s) to hash
650 # Uses : addparsequery, addvalues, ok_replace,
651 # ok_print, synerror_print, operror_print
652 #################################################################################################
655 my $http_query = shift(@_); # querystring
656 my $cont =""; # return value
657 my @binds; #values of binds passed via querystring
658 my $err; # error string
659 if ($err = addparsequery($http_query,\@binds)) { return synerror_print($err,$add_usage); }
662 foreach my $bind (@binds)
664 my ($a_key , $e_uri) = split(/,/,$bind,2);
665 my $une_uri = uri_unescape($e_uri);
666 if ($err = addvalues($a_key,$une_uri)) { $cont .= "$err\n"; }
667 else { $cont .= ok_replace("$s_add\n",$a_key,$une_uri); }
669 return ok_print($cont);
672 #################################################################################################
674 #################################################################################################
676 # Usage: remove($http_query);
677 # Returns: values for HTTP::Response
678 # Do: remove stylesheet(s) from hash
680 # Uses : reparsequery, getkeys, recheckvalues, removevalues,
681 # ok_print, synerror_print, operror_print
682 #################################################################################################
685 my $http_query = shift(@_); # querystring
689 if ($http_query eq "")
692 foreach my $rem_key (keys %stylesheet_hash)
694 $cont .= removevalues($rem_key);
697 if ($i==0) { return operror_print($error{"re_no_sl"}); }
699 elsif ($err = reparsequery($http_query,$rem_keys)){return synerror_print($err,$remove_usage);}
702 foreach my $rem_key (split (/,/,$rem_keys))
704 if (my $err = recheckvalues($rem_key)) { $cont .= "$err\n"; }
705 else { $cont .= removevalues($rem_key); }
708 return ok_print($cont);
710 #################################################################################################
712 #################################################################################################
714 # Usage: remove($http_query);
715 # Returns: values for HTTP::Response
716 # Do: remove stylesheet(s) from hash
718 # Uses : reparsequery, getkeys, recheckvalues, removevalues,
719 # ok_print, synerror_print, operror_print
720 #################################################################################################
721 sub reload #reload stylesheet(s) from hash
723 my $http_query = shift(@_);
727 if ($http_query eq "")
730 foreach my $key (keys %stylesheet_hash)
732 if (my $err = reloadvalues($key)) { return $dr_cont .= $err; }
733 else {$dr_cont .= ok_replace("$s_reload\n",$key,$stylesheet_hash{$key}[0]);}
736 if ($i==0) { return operror_print($error{"re_no_sl"}); }
738 elsif ($err = reparsequery($http_query,$rel_keys)){return synerror_print($err,$reload_usage);}
741 foreach my $key (split (/,/,$rel_keys))
743 if (my $err = reloadvalues($key)) { return $dr_cont .= $err; }
744 else {$dr_cont .= ok_replace("$s_reload\n",$key,$stylesheet_hash{$key}[0]);}
747 return ok_print($dr_cont);
749 #################################################################################################
751 sub apply #apply stylesheets
753 my $http_query = shift(@_);
754 my $headers_ptr = shift(@_);
763 if (my $err=applyparsequery($http_query,\@applykeys,\%app_param,\%app_prop,$xmluri))
765 return synerror_print($err,$apply_usage);
767 elsif (my $err=applycheckvalues(\@applykeys)) { return operror_print($err); }
768 elsif (my $err=load_xml_doc($xmluri,$results)) { return operror_print($err); }
770 foreach my $applykey (@applykeys)
773 if (my $err=apply_style($applykey,\%{$app_param{$applykey}},$results))
775 return operror_print($err);
779 while (my ($n, $v) = each %app_prop)
781 if (($n eq "method") or ($n eq "METHOD"))
783 if ($v eq 'html') { $headers_ptr->{'Content-Type'}='text/html'; }
784 elsif ($v eq 'text') { $headers_ptr->{'Content-Type'}='text/plain'; }
785 else { $headers_ptr->{'Content-Type'}='text/xml'; }
787 if (($n eq "encoding") or ($n eq "ENCODING"))
789 $headers_ptr->{'Content-Encoding'}=$v;
790 if ($v ne "UTF-8") { $enc = $v; }
792 if (($n eq "media-type") or ($n eq "MEDIA_TYPE") or ($n eq "MEDIA-TYPE"))
794 $headers_ptr->{'Content-Type'}=$v;
800 %$headers_ptr= ('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
801 return get_results($lastkey,$results);
806 $headers_ptr->{'Cache-Control'} = 'no-cache';
807 $headers_ptr->{'Pragma'} = "no-cache";
808 $headers_ptr->{'Expires'} = '0';
809 if ($headers_ptr->{'Content-Type'} eq 'text/html')
811 $result = get_results_html($results);
815 $result = get_results_prop($results);
818 $result = decode($result,$enc);
825 sub list #list all the stylesheet loaded
829 foreach $key (keys %stylesheet_hash)
831 $cont .= ok_replace("$list\n",$key,$stylesheet_hash{$key}[0]);
834 if ($ind > 0) { return ok_print($cont); }
835 else { return ok_print($empty); }
838 sub home #return Dispay active
840 if ($_[0] ne "") { return synerror_print($error{"home_qs"},$all_usage); }
842 return ok_print($home_message.$all_usage);
846 sub help #return html help
848 if ($_[0] ne "") { return synerror_print($error{"help_qs"},$help_usage); }
849 return ok_print($help_message.$all_usage);
852 #################################################################################################
853 #################################################################################################
854 # Subrutines to get parameters for commands from Query String (query string parsing)
855 #################################################################################################
856 #################################################################################################
858 sub add_comma_analysis
860 my $bind = shift(@_);
861 my ($l , $r) = split(/,/,$bind,2);
862 if (index($bind ,",") == -1) { return $error{"add_no_sep"}; }
863 elsif (index($r ,",") != -1) { return $error{"add_many_sep"}; }
864 elsif (($l eq "") or ($r eq "")) { return $error{"add_null_bind"}; }
869 #addparsequery($querystring,\@binds)
873 my $query = shift(@_);
874 my $value_ptr = shift(@_);
875 if ($query eq "") { return $error{"add_no_bind"}; }
878 foreach my $params (split(/&/,$query))
880 my ($k , $v) = split(/=/,$params,2);
882 if ($k ne "bind") { return $error{"add_oth"}; }
883 elsif ($v eq "") { return $error{"add_null_bind"}; }
884 elsif (my $err=add_comma_analysis($v)) { return $err; }
885 else { push @$value_ptr,$v;}
893 my $query = shift(@_);
897 if (index($query, "&") == -1)
899 ($k , $v) = split(/=/,$query,2);
901 if ($k ne "keys") { return $error{"re_oth"}; }
902 elsif ($v eq "") { return $error{"re_null_keys"}; }
903 elsif ((index($v,",")==0) or (index($v,",,")!=-1) or (substr($v,-1) eq ","))
905 return $error{"re_null_keys"};
907 else { $_[0] = $v; return 0; }
909 else { return $error{"re_many"}; }
914 my $arr_ptr = shift(@_);
915 my $xmluri_found = 0;
917 foreach my $el (@$arr_ptr)
919 my ($k , $v) = split(/=/,$el,2);
921 if ($k eq "param") { return $error{"apply_no_dots_param"}; }
922 elsif ($k eq "prop") { return $error{"apply_no_dots_prop"}; }
923 elsif ($k eq "xmluri")
925 if ($xmluri_found) { return $error{"apply_many_uri"}; }
928 if ($v eq "") { return $error{"apply_null_uri"}; }
929 else { $_[0] = $v; $xmluri_found = 1; }
934 if ($keys_found) { return $error{"apply_many_keys"}; }
937 if ($v eq "") { return $error{"apply_null_keys"}; }
938 elsif ((index($v,",")==0) or (index($v,",,")!=-1) or (substr($v,-1) eq ","))
940 return $error{"apply_null_keys"};
942 else { $_[1] = $v; $keys_found = 1; }
945 else { return $error{"apply_oth"}; }
946 }#foreach my $el (@$arr_ptr)
947 if ((!$xmluri_found or !$keys_found)) { return $error{"apply_few_pars"}; }
953 my $query = shift(@_);
954 my $apply_keys_ptr = shift(@_);
955 my $keyparshoh = shift(@_);
956 my $proph_ptr = shift(@_);
963 if ($query eq "") { return $error{"apply_few_pars"}; }
964 if (index($query, "&") == -1) { return $error{"apply_few_pars"}; }
965 foreach my $param (split(/&/,$query))
967 my ($k , $v) = split(/=/,$param,2);
969 if (index($k, ".") == -1) { push @nodots,$param; }
972 my ($l , $r) = split(/\./,$k,2);
975 if (($r eq "") or ($v eq "")) { return $error{"apply_null_prop"}; }
976 elsif (index($r, ".") > -1) { return $error{"apply_dots_prop"}; }
977 else { $prop_h{$r} = $v; }
979 elsif ($l eq "param")
981 if (($r eq "") or ($v eq "")) { return $error{"apply_null_param"}; }
982 elsif (index($r, ".") == -1) { $genparam_h{$r} = $v; }
985 my ($kk , $va) = split(/\./,$r,2);
986 if (index($va, ".") > -1) { return $error{"apply_dots_param"}; }
987 elsif (($kk eq "") or ($va eq "")) { return $error{"apply_null_param"}; }
988 else { $keyparam_h{$kk}{$va}=$v; }
991 else { return $error{"apply_oth"}; }
995 if (my $err = get_req(\@nodots,$_[0],$applykeys)) { return $err; }
996 while (my ($gn, $gv) = each %prop_h)
998 $proph_ptr->{$gn} = $gv;
1000 foreach my $pkey ( keys %keyparam_h )
1003 foreach my $verkey (split (/,/,$applykeys))
1005 if ($pkey eq $verkey) { $k_found = 1; }
1007 if (! $k_found) { return $error{"apply_inv_param"}; }
1010 foreach my $applykey (split (/,/,$applykeys))
1012 while (my ($gn, $gv) = each %genparam_h)
1014 $keyparshoh->{$applykey}{$gn} = $gv;
1016 while (my ($kn, $kv) = each %{ $keyparam_h{$applykey} } )
1018 $keyparshoh->{$applykey}{$kn} = $kv;
1020 push @$apply_keys_ptr, $applykey;
1025 #################################################################################################
1026 #################################################################################################
1027 #################################################################################################
1028 # Subrutines to replace values between {} on loaded templates
1029 #################################################################################################
1030 #################################################################################################
1031 #################################################################################################
1035 my $message = shift(@_);
1036 $message =~ s/(\n)/<br>\1/g;
1037 my $retval = $ok_tpl;
1038 $retval =~ s/\{MESSAGE\}/$message/g;
1044 my $message = shift(@_);
1045 $message =~ s/(\n)/<br>\1/g;
1046 my $retval = $operror_tpl;
1047 $retval =~ s/\{ERROR\}/$message/g;
1053 my $message = shift(@_);
1055 $message =~ s/(\n)/<br>\1/g;
1056 my $retval = $synerror_tpl;
1057 $retval =~ s/\{ERROR\}/$message/g;
1058 $retval =~ s/\{USAGE\}/$us/g;
1062 #################################################################################################
1063 #################################################################################################
1064 #################################################################################################
1065 # Subrutines to replace values between {} on loaded messages
1066 #################################################################################################
1067 #################################################################################################
1068 #################################################################################################
1072 my $message = shift(@_);
1073 my $key = shift(@_);
1074 my $s_uri = shift(@_);
1075 $message =~ s/\{KEY\}/$key/g;
1076 $message =~ s/\{URI\}/$s_uri/g;
1082 my $message = shift(@_);
1083 my $key = shift(@_);
1084 my $s_uri = shift(@_);
1085 my $errr = shift(@_);
1086 $message =~ s/\{KEY\}/$key/g;
1087 $message =~ s/\{URI\}/$s_uri/g;
1088 $message =~ s/\{ERROR\}/$errr/g;
1089 $message =~ s/\{OLDKEY\}/$errr/g;
1093 sub parser_error_replace
1095 my $no_at = shift(@_);
1096 $no_at =~ s/(.*)\sat\s(.*)/\1/g;
1097 $no_at =~ s/</</g;
1098 $no_at =~ s/>/>/g;
1102 #################################################################################################
1103 #################################################################################################
1104 #################################################################################################
1105 # Subrutines to load config files and templates
1106 #################################################################################################
1107 #################################################################################################
1108 #################################################################################################
1112 if ($language eq "IT")
1114 open(MESSAGE, "./msg/message.it") || die "Can't open config file '/msg/message.it' : $!";
1118 open(MESSAGE, "./msg/message.en") || die "Can't open config file '/msg/message.en' : $!";
1120 while(my $line = <MESSAGE>) {
1121 # ignore comments and full line comments
1123 next unless $line =~ /\S/;
1124 $line =~ s/\{URL\}/$puwobo_url/g;
1125 $line =~ s/\{VER\}/$ver/g;
1126 if ($line =~ /^(home_message)\s*=\s*(.*)$/) {$home_message = $2; }
1127 if ($line =~ /^(help_message)\s*=\s*(.*)$/) {$help_message = $2; }
1128 if ($line =~ /^(s_add)\s*=\s*(.*)$/) {$s_add = $2; }
1129 if ($line =~ /^(s_reload)\s*=\s*(.*)$/) {$s_reload = $2; }
1130 if ($line =~ /^(s_remove)\s*=\s*(.*)$/) {$s_remove = $2; }
1131 if ($line =~ /^(list)\s*=\s*(.*)$/) {$list = $2; }
1132 if ($line =~ /^(empty)\s*=\s*(.*)$/) {$empty = $2; }
1133 if ($line =~ /^(all_usage)\s*=\s*(.*)$/) {$all_usage = $2; }
1134 if ($all_usage_synerr eq "ON")
1136 $help_usage=$add_usage=$remove_usage=$list_usage=$reload_usage=$apply_usage=$all_usage;
1140 if ($line =~ /^(help_usage)\s*=\s*(.*)$/) {$help_usage = $2; }
1141 if ($line =~ /^(add_usage)\s*=\s*(.*)$/) {$add_usage = $2; }
1142 if ($line =~ /^(remove_usage)\s*=\s*(.*)$/) {$remove_usage = $2; }
1143 if ($line =~ /^(list_usage)\s*=\s*(.*)$/) {$list_usage = $2; }
1144 if ($line =~ /^(reload_usage)\s*=\s*(.*)$/) {$reload_usage = $2; }
1145 if ($line =~ /^(apply_usage)\s*=\s*(.*)$/) {$apply_usage = $2; }
1153 open(CONFIG, "./config") || die "Can't open config file 'config' : $!";
1154 while(my $line = <CONFIG>) {
1155 # ignore comments and full line comments
1157 next unless $line =~ /\S/;
1158 if ($line =~ /^(working_path)\s*=\s*(.*)$/) {$working_path = $2; }
1159 if ($line =~ /^(language)\s*=\s*(.*)$/) {$language = $2; }
1160 if ($line =~ /^(port)\s*=\s*(.*)$/) {$port = $2; }
1161 if ($line =~ /^(all_usage_synerr)\s*=\s*(.*)$/) {$all_usage_synerr = $2; }
1162 if ($line =~ /^(expand_xinc)\s*=\s*(.*)$/) {$expand_xinc = $2; }
1163 if ($line =~ /^(max_depth)\s*=\s*(.*)$/) {$max_depth = $2; }
1170 if ($language eq "IT")
1172 open(ERRO, "./msg/error.it") || die "Can't open config file '/msg/error.it' : $!";
1176 open(ERRO, "./msg/error.en") || die "Can't open config file '/msg/error.en' : $!";
1178 while(my $line = <ERRO>)
1180 # ignore comments and full line comments
1182 next unless $line =~ /\S/;
1183 if ($line =~ /^(.*?)\s*=\s*(.*)$/) {$error{$1} = $2; }
1191 open(OK_TPL, "./tpl/ok.tpl")
1192 || die "Can't open template file '/tpl/ok.tpl' : $!";
1193 while(my $line = <OK_TPL>) {$ok_tpl .= $line; }
1196 # load operror template
1197 open(OPERROR_TPL, "./tpl/operror.tpl")
1198 || die "Can't open template file '/tpl/operror.tpl' : $!";
1199 while(my $line = <OPERROR_TPL>) {$operror_tpl .= $line; }
1202 # load synerror template
1203 open(SYNERROR_TPL, "./tpl/synerror.tpl")
1204 || die "Can't open template file '/tpl/synerror.tpl' : $!";
1205 while(my $line = <SYNERROR_TPL>) {$synerror_tpl .= $line; }
1209 #################################################################################################
1210 #################################################################################################
1211 #################################################################################################
1212 # the LibXML callbacks follow
1213 # these callbacks are used for both the original parse AND the XInclude (if set)
1214 #################################################################################################
1215 #################################################################################################
1216 #################################################################################################
1220 return $uri !~ /:\/\// ? 1 : 0; # we handle only files
1226 my $handler = new IO::File;
1227 if ( not $handler->open( "<$uri" ) ){
1235 my $handler = shift;
1239 $handler->read( $rv , $length );
1245 my $handler = shift;