# LEAVE_SRC did not work before Encode-2.0901
my $copy = $$content_ref;
$content_ref = \$copy;
$content_ref_iscopy++;
}
$content_ref = \Encode::decode($charset, $$content_ref,
($opt{charset_strict} ? Encode::FB_CROAK() : 0) | Encode::LEAVE_SRC());
}
}
};
if ($@) {
Carp::croak($@) if $opt{raise_error};
return undef;
}
return $opt{ref} ? $content_ref : $$content_ref;
}
sub decodable
{
# should match the Content-Encoding values that decoded_content can deal with
my $self = shift;
my @enc;
# XXX preferably we should deterine if the modules are available without loading
# them here
eval {
require Compress::Zlib;
push(@enc, "gzip", "x-gzip", "deflate");
};
eval {
require Compress::Bzip2;
push(@enc, "x-bzip2");
};
# we don't care about announcing the 'base64' and 'quoted-printable' stuff
return wantarray ? @enc : join(", ", @enc);
}
sub decode
{
my $self = shift;
return 1 unless $self->header("Content-Encoding");
if (defined(my $content = $self->decoded_content(charset => "none"))) {
$self->remove_header("Content-Encoding");
$self->content($content);
return 1;
}
return 0;
}
sub encode
{
my($self, @enc) = @_;
Carp::croak("Can't encode multipart/* messages") if $self->content_type =~ m,^multipart/,;
Carp::croak("Can't encode message/* messages") if $self->content_type =~ m,^message/,;
return 1 unless @enc; # nothing to do
my $content = $self->content;
for my $encoding (@enc) {
if ($encoding eq "identity") {
# noting to do
}
elsif ($encoding eq "base64") {
require MIME::Base64;
$content = MIME::Base64::encode($content);
}
elsif ($encoding eq "gzip" || $encoding eq "x-gzip") {
require Compress::Zlib;
$content = Compress::Zlib::memGzip($content);
}
elsif ($encoding eq "deflate") {
require Compress::Zlib;
$content = Compress::Zlib::compress($content);
}
elsif ($encoding eq "x-bzip2") {
require Compress::Bzip2;
$content = Compress::Bzip2::memGzip($content);
}
elsif ($encoding eq "rot13") { # for the fun of it
$content =~ tr/A-Za-z/N-ZA-Mn-za-m/;
}
else {
return 0;
}
}
my $h = $self->header("Content-Encoding");
unshift(@enc, $h) if $h;
$self->header("Content-Encoding", join(", ", @enc));
$self->content($content);
return 1;
}
sub as_string
{
my($self, $eol) = @_;
=4= |