# This is an example of a search PDU from the LDAP protocol

use Convert::ASN1;
use Data::Dumper;

my %scope = qw(base  0 one    1 single 1 sub    2 subtree 2);
my %deref = qw(never 0 search 1 find   2 always 3);

my $search_pdu = Convert::ASN1->new;
$search_pdu->prepare(q(
  SEQUENCE {
    mesgid INTEGER,
    [APPLICATION 3] SEQUENCE {
      base      STRING,
      scope     ENUM,
      deref     ENUM,
      sizeLimit INTEGER,
      timeLimit INTEGER,
      typesOnly BOOLEAN,
      filter    STRING, -- for test, should be ANY and the var should hold
			-- a pre-encoded filter
      attrs SEQUENCE OF STRING
    }
    control [0] SEQUENCE OF SEQUENCE { -- this should be optional but we cannot do that inline
      type     STRING,
      critical BOOLEAN,
      value    STRING OPTIONAL
    }
  }
)) or die $search_pdu->error;

$buf = $search_pdu->encode(
  mesgid => 3,
  base   => "cn=base",
  scope  => $scope{one},
  deref  => $deref{find},
  sizeLimit => 0,
  timeLimit => 0,
  typesOnly => 0,
  filter    => "A filter",
  attrs     => [qw(cn postalAddress)],
  control   => [
    {
      type => "1.2.3.4",
      critical => 1
    },
    {
      type => "9.8.7.6",
      critical => 0,
      value => "abc"
    }
  ]
);

$Data::Dumper::Indent = 1;
print Dumper( $search_pdu->decode($buf));

$h = unpack("H*",$buf);
$h =~ s/(..)/$1 /g;
$h =~ s/(.{47}\s)/$1\n/g;
print $h,"\n";