our @EXPORT = qw/unbro/;
our @EXPORT_OK = @EXPORT;
-our $VERSION = '0.001001';
+our $VERSION = '0.004_002';
require XSLoader;
XSLoader::load('IO::Compress::Brotli', $VERSION);
-sub create {
- my ($class) = @_;
- my $state = BrotliCreateState();
- bless \$state, $class
-}
-
-sub DESTROY {
- my ($self) = @_;
- BrotliDestroyState($$self)
-}
-
-sub decompress {
- my ($self, $data) = @_;
- BrotliDecompressStream($$self, $data)
-}
-
-# Untested, probably not working
-sub set_dictionary {
- my ($self, $dict) = @_;
- BrotliSetCustomDictionary($$self, $dict)
+# 0.004001 has unbro with prototype $$
+# 0.004_002 renames it to unbro_given_size, and provides unbro with
+# prototype $;$ which calls:
+# * unbro_given_size when called with two arguments
+# * the OO interface when called with one argument
+sub unbro ($;$) {
+ my ($buffer, $decoded_size) = @_;
+ if (defined $decoded_size) {
+ return unbro_given_size($buffer, $decoded_size)
+ } else {
+ my $bro = IO::Uncompress::Brotli->create;
+ return $bro->decompress($buffer);
+ }
}
1;
use IO::Uncompress::Brotli;
- # uncompress a buffer
- my $decoded = unbro $encoded;
+ # uncompress a buffer (yielding at most 10MB)
+ my $decoded = unbro $encoded, 10_000_000;
# uncompress a stream
my $bro = IO::Uncompress::Brotli->create;
=over
-=item B<unbro>(I<$input>)
+=item B<unbro>(I<$input>, I<$maximum_decoded_size>)
Takes a whole compressed buffer as input and returns the decompressed
-data. This function relies on the BrotliDecompressedSize function. In
-other words, it only works if the buffer has a single meta block or
-two meta-blocks where the first is uncompressed and the second is
-empty.
+data. It allocates a buffer of size I<$maximum_decoded_size> to store
+the decompressed data, if this is not sufficient (or there is another
+error) this function will croak.
+
+As of version 0.004_002, the I<$maximum_decoded_size> argument is
+optional. If not provided, B<unbro> uses the streaming interface
+described in the next section to decompress the buffer in blocks of
+one megabyte. The decompressed blocks are concatenated and returned.
Exported by default.
=head1 SEE ALSO
-Brotli Compressed Data Format Internet-Draft:
-L<https://www.ietf.org/id/draft-alakuijala-brotli-08.txt>
+RFC 7392 Brotli Compressed Data Format:
+L<https://tools.ietf.org/html/rfc7932>
Brotli source code: L<https://github.com/google/brotli/>
Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
+The encoder bindings, modernisation of the decoder bindings and a
+clean up of the overall project were contributed by:
+
+=over
+
+=item Quim Rovira, E<lt>quim@rovira.catE<gt>
+
+=item Ævar Arnfjörð Bjarmason, E<lt>avarab@gmail.comE<gt>
+
+=item Marcell Szathmári
+
+=item Mattia Barbon, E<lt>mattia@barbon.orgE<gt>
+
+=back
+
+POD fix by Mark Zabaro, E<lt>markzabaro@gmail.comE<gt>.
+
=head1 COPYRIGHT AND LICENSE
-Copyright (C) 2015 by Marius Gavrilescu
+Copyright (C) 2015-2018 by Marius Gavrilescu
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.20.2 or,