1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
// file : examples/cxx/tree/compression/compressed-input-source.hxx
// copyright : not copyrighted - public domain
#ifndef COMPRESSED_INPUT_SOURCE_HXX
#define COMPRESSED_INPUT_SOURCE_HXX
#include <zlib.h>
#include <iosfwd>
#include <string>
#include <cstddef> // std::size_t
#include <exception>
#include <xercesc/sax/InputSource.hpp>
#include <xercesc/util/BinInputStream.hpp>
struct decompression_failure: std::exception
{
explicit
decompression_failure (int code)
: code_ (code)
{
}
int
code () const
{
return code_;
}
const char*
message () const
{
return zError (code_);
}
virtual const char*
what () const throw ();
private:
int code_;
};
// Xerces-C++ InputSource interface implementation with on-the-fly, zlib-
// based decompression.
//
class compressed_input_source: public xercesc::InputSource
{
public:
enum compression_type
{
raw,
zlib,
gzip
};
compressed_input_source (std::istream&, compression_type);
compressed_input_source (std::istream&,
compression_type,
const std::string& system_id);
compressed_input_source (std::istream&,
compression_type,
const std::string& system_id,
const std::string& public_id);
struct copy {};
// Throws the copy exception if this function is called more than once.
//
virtual xercesc::BinInputStream*
makeStream () const;
private:
mutable std::istream* is_;
compression_type type_;
};
// Xerces-C++ BinInputStream interface implementation with on-the-fly, zlib-
// based decompression.
//
class compressed_input_stream: public xercesc::BinInputStream
{
public:
enum compression_type
{
raw,
zlib,
gzip
};
compressed_input_stream (std::istream&, compression_type);
virtual
~compressed_input_stream ();
virtual XMLFilePos
curPos () const;
virtual XMLSize_t
readBytes (XMLByte* const buf, const XMLSize_t size);
virtual const XMLCh*
getContentType () const;
private:
std::size_t
read ();
private:
std::istream& is_;
z_stream zs_;
bool end_;
static const std::size_t buf_size_ = 65536;
char in_[buf_size_];
std::size_t pos_; // Current decompressed stream position.
};
#endif // COMPRESSED_INPUT_SOURCE_HXX
|