#############################################################################
#
# Apache::Session::Serialize::SimpleXML
# Serializes session objects using Storable and pack
#
############################################################################

package Apache::Session::Serialize::SimpleXMLISO;

use vars qw($VERSION);
use XML::DumperISO;
use strict;

$VERSION = '0.1';

#################################################
#  Parsea un archivo XML con la limitacion de   #
#       que debe tener un tag por linea.        #
################################################# 
sub semiXMLParse {
   my @xml   = split( "\n", shift );
   my @isarray;
   my $nivel = 0;
   my $data;
   my $eval  = '$data=';
   foreach my $line ( @xml ) {
      $line =~ s/\s*(<.*>)\s*/$1/msg;
      if ( lc( $line ) eq "<hash>" ) {
         $eval .= "{";
         $isarray[++$nivel] = 0;
      }
      if ( lc( $line ) eq "<array>" ) {
         $eval .= "[";
         $isarray[++$nivel] = 1;
      }
      if ( lc( $line ) eq "</hash>" ) {
         $nivel--;
         $eval .= "},";
      }
      if ( lc( $line ) eq "</array>" ) {
         $nivel--;
         $eval .= "],";
      }
      if ( $line =~ /<item key="(.*)">([^<>]*)(<\/item>)?/i ) {
         $eval .= "'" . UnQuoteXMLChars( $1 ) . "'=>"
            if ( not $isarray[$nivel] );
         $eval .= "'" . UnQuoteXMLChars( $2 ) . "',"
            if ( $3 );
      }
   }
   chop $eval;
   $eval .= ";";
   eval $eval;

   return $data;

   ######################################################################
   sub UnQuoteXMLChars {
      my $str = shift;
      $str =~ s/&amp;/&/g;
      $str =~ s/&lt;/</g;
      $str =~ s/&gt;/>/g;
      $str =~ s/&apos;/\\'/g;
      $str =~ s/&quot;/"/g;
      return $str;
   }
}

sub serialize {
    my $session = shift;
    my $dump = new XML::DumperISO;
    $session->{'serialized'} = $dump->pl2xml( $session->{'data'} );
}

sub unserialize {
    my $session = shift;
    $session->{'data'} = semiXMLParse( $session->{'serialized'} );
}


