GDPR-IAB-TCFv2
view release on metacpan or search on metacpan
lib/GDPR/IAB/TCFv2/RangeSection.pm view on Meta::CPAN
}
return $next_offset;
}
my $vendor_id;
( $vendor_id, $next_offset ) = get_uint16( $data, $next_offset );
croak
"bit $offset range entry exclusion vendor $vendor_id, but only vendors [1, $max_id] are valid"
if 1 > $vendor_id || $vendor_id > $max_id;
push @{ $self->{ranges} }, [ $vendor_id, $vendor_id ];
$self->{cache}->{$vendor_id} = delete( $prefetch->{$vendor_id} )
if exists $prefetch->{$vendor_id};
return $next_offset;
}
sub max_id {
my $self = shift;
return $self->{max_id};
}
sub contains {
my ( $self, $id ) = @_;
croak "invalid vendor id $id: must be positive integer bigger than 0"
if $id < 1;
return $self->{cache}->{$id} if exists $self->{cache}->{$id};
return if $id > $self->{max_id};
foreach my $range ( @{ $self->{ranges} } ) {
return 1 if $range->[0] <= $id && $id <= $range->[1];
}
return 0;
}
sub all {
my $self = shift;
my @vendors;
foreach my $range ( @{ $self->{ranges} } ) {
push @vendors, $range->[0] .. $range->[1];
}
return \@vendors;
}
sub TO_JSON {
my $self = shift;
return $self->all if !!$self->{options}->{json}->{compact};
my ( $false, $true ) = @{ $self->{options}->{json}->{boolean_values} };
my %map;
if ( !!$self->{options}->{json}->{verbose} ) {
%map = map { $_ => $false } 1 .. $self->{max_id};
}
foreach my $range ( @{ $self->{ranges} } ) {
%map = ( %map, map { $_ => $true } $range->[0] .. $range->[1] );
}
return \%map;
}
1;
__END__
=head1 NAME
GDPR::IAB::TCFv2::RangeSection - Transparency & Consent String version 2 range section parser
=head1 SYNOPSIS
my $data = unpack "B*", decode_base64url('tcf v2 consent string base64 encoded');
my $max_id_consent = << get 16 bits from $data offset 213 >>
my ($range_section, $next_offset) = GDPR::IAB::TCFv2::RangeSection->Parse(
data => $data,
data_size => length($data),
offset => 230, # offset for vendor ranges
max_id => $max_id_consent,
prefetch => 284, # will cache the result of vendor id 284
);
say "range section contains id 284" if $range_section->contains(284);
=head1 CONSTRUCTOR
Constructor C<Parse> receives an hash parameters:
=over
=item *
Key C<data> is the binary data
=item *
Key C<data_size> is the original binary data size
=item *
Key C<offset> is the binary data offset. Can be 0.
=item *
Key C<max_id> is the max id (used to validate the ranges if all data is between 1 and C<max_id>)
=item *
( run in 0.894 second using v1.01-cache-2.11-cpan-39bf76dae61 )