Skip to content

Commit

Permalink
[#596 state:resolved] Applied the diff(erence) to the code from MT5's…
Browse files Browse the repository at this point in the history
… current mplementation.
  • Loading branch information
tima committed Dec 4, 2010
1 parent cf60cfe commit ae0a7d7
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions lib/MT/Serialize.pm
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
package MT::Serialize;

use strict;
our $VERSION = 4;
our $VERSION = 5;

{
my %Types = (
Storable => [ \&_freeze_storable, \&_thaw_storable ],
JSON => [ \&_freeze_json, \&_thaw_json ],
MT => [ \&_freeze_mt_2, \&_thaw_mt ],
MT => [ \&_freeze_mt_5, \&_thaw_mt ],
MT2 => [ \&_freeze_mt_2, \&_thaw_mt ],
MTS => [ \&_freeze_mt_storable, \&_thaw_mt ],
MTJ => [ \&_freeze_mt_json, \&_thaw_mt ],
Expand Down Expand Up @@ -74,6 +74,7 @@ sub _freeze_mt_1 {
}

sub _macrofreeze {
use bytes;
my $value = shift;
my $ref_cnt = 1; # for compatibility with the existing algorithm
my %refs;
Expand Down Expand Up @@ -124,8 +125,7 @@ sub _macrofreeze {
}
elsif ( $ref eq 'HASH' ) {
$frozen .= 'H' . pack( 'N', scalar( keys %$value ) );
push( @stack, [ 'HASH' => %$value ] )
if scalar keys %$value;
push( @stack, [ 'HASH' => %$value ] ) if keys %$value;
}
else {
die "Unexpected type '$ref' in _macrofreeze\n";
Expand Down Expand Up @@ -176,6 +176,18 @@ sub no_utf8 {
}
}

sub _freeze_mt_5 {
my $enc = MT->config('PublishCharset') || 'UTF-8';
no warnings 'redefine';
local *no_utf8 = sub {
for (@_) {
next if ref;
$_ = Encode::encode( $enc, $_ ) if Encode::is_utf8($_);
}
};
_freeze_mt_2(@_);
}

sub _thaw_mt {
my ($frozen) = @_;
return \{} unless $frozen && substr( $frozen, 0, 4 ) eq 'SERG';
Expand Down Expand Up @@ -216,11 +228,13 @@ sub _thaw_mt_1 {
}

sub _macrowave {
use bytes;
@_ == 2 or die "_macrowave expects: \$frozen, \$pos\n";
my ( $frozen, $pos ) = @_;
my $refs = [undef];
my $len = length $frozen;
my ( @stack, $value );
my $enc = MT->app->config('PublishCharset') || 'UTF-8';
while ( $pos < $len ) {
my $type = substr( $frozen, $pos, 1 );
$pos++;
Expand All @@ -246,6 +260,8 @@ sub _macrowave {
: $type eq 'S' ? do { # scalarref
my $slen = unpack 'N', substr( $frozen, $pos, 4 );
my $col_val = substr( $frozen, $pos + 4, $slen );
$col_val = Encode::decode( $enc, $col_val )
if !( Encode::is_utf8($col_val) );
$pos += 4 + $slen;
push @$refs, \$col_val;
\$col_val;
Expand All @@ -259,6 +275,8 @@ sub _macrowave {
: $type eq '-' ? do { # scalar value
my $slen = unpack 'N', substr( $frozen, $pos, 4 );
my $col_val = substr( $frozen, $pos + 4, $slen );
$col_val = Encode::decode( $enc, $col_val )
if !( Encode::is_utf8($col_val) );
$pos += 4 + $slen;
$col_val;
}
Expand Down

0 comments on commit ae0a7d7

Please sign in to comment.