def PHPPHP..do_unserializedo_unserialize(string, classmap, assoc)
val = nil
type = string.read(2)[0,1]
case type
when 'a'
count = string.read_until('{').to_i
val = vals = Array.new
count.times do |i|
vals << [do_unserialize(string, classmap, assoc), do_unserialize(string, classmap, assoc)]
end
string.read(1)
unless assoc
array = true
i = 0
vals.each do |key,value|
if key != i
array = false
break
end
i += 1
end
if array
vals.collect! do |key,value|
value
end
else
val = Hash.new
vals.each do |key,value|
val[key] = value
end
end
end
when 'O'
len = string.read_until(':').to_i + 3
klass = string.read(len)[1...-2].capitalize.intern
attrs = []
len = string.read_until('{').to_i
len.times do
attr = (do_unserialize(string, classmap, assoc))
attrs << [attr.intern, (attr << '=').intern, do_unserialize(string, classmap, assoc)]
end
string.read(1)
val = nil
if classmap.has_key?(klass)
val = classmap[klass].new
elsif Struct.const_defined?(klass)
classmap[klass] = val = Struct.const_get(klass)
val = val.new
else
begin
classmap[klass] = val = Module.const_get(klass)
val = val.new
rescue NameError
classmap[klass] = val = Struct.new(klass.to_s, *attrs.collect { |v| v[0].to_s })
end
end
attrs.each do |attr,attrassign,v|
val.__send__(attrassign, v)
end
when 's'
len = string.read_until(':').to_i + 3
val = string.read(len)[1...-2]
when 'i'
val = string.read_until(';').to_i
when 'd'
val = string.read_until(';').to_f
when 'N'
val = nil
when 'b'
val = (string.read(2)[0] == ?1 ? true : false)
else
raise TypeError, "Unable to unserialize type '#{type}'"
end
val
end