def Filter::parse_ber ber
case ber.ber_identifier
when 0xa0
ber.map {|b| Filter::parse_ber(b)}.inject {|memo,obj| memo & obj}
when 0xa1
ber.map {|b| Filter::parse_ber(b)}.inject {|memo,obj| memo | obj}
when 0xa2
~ Filter::parse_ber( ber.first )
when 0xa3
if ber.last == "*"
else
Filter.eq( ber.first, ber.last )
end
when 0xa4
str = ""
final = false
ber.last.each {|b|
case b.ber_identifier
when 0x80
raise "unrecognized substring filter, bad initial" if str.length > 0
str += b
when 0x81
str += "*#{b}"
when 0x82
str += "*#{b}"
final = true
end
}
str += "*" unless final
Filter.eq( ber.first.to_s, str )
when 0xa5
Filter.ge( ber.first.to_s, ber.last.to_s )
when 0xa6
Filter.le( ber.first.to_s, ber.last.to_s )
when 0x87
Filter.pres( ber.to_s )
else
raise "invalid BER tag-value (#{ber.ber_identifier}) in search filter"
end
end