Imported Upstream version 2.0207
[platform/upstream/perl-XML-LibXML.git] / lib / XML / LibXML / SAX.pm
1 # $Id$
2 #
3 # This is free software, you may use it and distribute it under the same terms as
4 # Perl itself.
5 #
6 # Copyright 2001-2003 AxKit.com Ltd., 2002-2006 Christian Glahn, 2006-2009 Petr Pajas
7 #
8 #
9
10 package XML::LibXML::SAX;
11
12 use strict;
13 use warnings;
14
15 use vars qw($VERSION @ISA);
16
17 $VERSION = "2.0207"; # VERSION TEMPLATE: DO NOT CHANGE
18
19 use XML::LibXML;
20 use XML::SAX::Base;
21
22 use parent qw(XML::SAX::Base);
23
24 use Carp;
25 use IO::File;
26
27 sub CLONE_SKIP {
28   return $XML::LibXML::__threads_shared ? 0 : 1;
29 }
30
31 sub set_feature {
32         my ($self, $feat, $val) = @_;
33
34         if ($feat eq 'http://xmlns.perl.org/sax/join-character-data') {
35                 $self->{JOIN_CHARACTERS} = $val;
36                 return 1;
37         }
38
39         shift(@_);
40         return $self->SUPER::set_feature(@_);
41 }
42
43 sub _parse_characterstream {
44     my ( $self, $fh ) = @_;
45     # this my catch the xml decl, so the parser won't get confused about
46     # a possibly wrong encoding.
47     croak( "not implemented yet" );
48 }
49
50 # See:
51 # https://rt.cpan.org/Public/Bug/Display.html?id=132759
52 sub _calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc
53 {
54     return XML::LibXML->new( expand_entities => 1, );
55 }
56
57 sub _parse_bytestream {
58     my ( $self, $fh ) = @_;
59     $self->{ParserOptions}{LibParser}      = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
60     $self->{ParserOptions}{ParseFunc}      = \&XML::LibXML::parse_fh;
61     $self->{ParserOptions}{ParseFuncParam} = $fh;
62     $self->_parse;
63     return $self->end_document({});
64 }
65
66 sub _parse_string {
67     my ( $self, $string ) = @_;
68     $self->{ParserOptions}{LibParser}      = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
69     $self->{ParserOptions}{ParseFunc}      = \&XML::LibXML::parse_string;
70     $self->{ParserOptions}{ParseFuncParam} = $string;
71     $self->_parse;
72     return $self->end_document({});
73 }
74
75 sub _parse_systemid {
76     my $self = shift;
77     $self->{ParserOptions}{LibParser}      = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
78     $self->{ParserOptions}{ParseFunc}      = \&XML::LibXML::parse_file;
79     $self->{ParserOptions}{ParseFuncParam} = shift;
80     $self->_parse;
81     return $self->end_document({});
82 }
83
84 sub parse_chunk {
85     my ( $self, $chunk ) = @_;
86     $self->{ParserOptions}{LibParser}      = $self->_calc_new_XML_LibXML_parser_for_compatibility_with_XML_Simple_etc() unless defined $self->{ParserOptions}{LibParser};
87     $self->{ParserOptions}{ParseFunc}      = \&XML::LibXML::parse_xml_chunk;
88     $self->{ParserOptions}{LibParser}->{IS_FILTER}=1; # a hack to prevent parse_xml_chunk from issuing end_document
89     $self->{ParserOptions}{ParseFuncParam} = $chunk;
90     $self->_parse;
91     return;
92 }
93
94 sub _parse {
95     my $self = shift;
96     my $args = bless $self->{ParserOptions}, ref($self);
97
98     if (defined($self->{JOIN_CHARACTERS})) {
99         $args->{LibParser}->{JOIN_CHARACTERS} = $self->{JOIN_CHARACTERS};
100     } else {
101         $args->{LibParser}->{JOIN_CHARACTERS} = 0;
102     }
103
104     $args->{LibParser}->set_handler( $self );
105     eval {
106       $args->{ParseFunc}->($args->{LibParser}, $args->{ParseFuncParam});
107     };
108
109     if ( $args->{LibParser}->{SAX}->{State} == 1 ) {
110         croak( "SAX Exception not implemented, yet; Data ended before document ended\n" );
111     }
112
113     # break a possible circular reference
114     $args->{LibParser}->set_handler( undef );
115     if ( $@ ) {
116         croak $@;
117     }
118     return;
119 }
120
121 1;
122