--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/DistributionPolicy/Reader.pm Fri Jun 25 18:37:20 2010 +0800
@@ -0,0 +1,176 @@
+# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+
+package Symbian::DistributionPolicy::Reader;
+use strict;
+
+use File::Basename;
+use Symbian::DistributionPolicy;
+
+our $cache = {}; # Persistent (private) cache
+
+sub new {
+ return bless {};
+}
+
+# public.
+
+sub ReadPolicyFile {
+ my $self = shift;
+ my $path = shift;
+ my $dir = -d $path ? $path : dirname($path);
+ # look in cache first, retrieve if not already defined
+ return $cache->{$dir} ||= $self->readfile($dir.'\\DISTRIBUTION.POLICY');
+}
+
+# private.
+
+sub readfile {
+ my $self = shift;
+ my $file = shift;
+ my $hasCategory;
+ my $policy = Symbian::DistributionPolicy->new();
+ # default policy applies when the file does not exist
+ return $policy if !-e $file;
+ # attempt to open the policy file
+ open(POLICY, $file) or die "Couldn't open $file: $!\n";
+ # read policy data
+ while (<POLICY>) {
+ s/(?<!\\)#.*$//; # ignore comments
+ s/^\s+|\s+$//g; # trim whitespace
+ next unless /\S/; # skip blank line
+ # parse line
+ if (/^authori[sz]ed\s+(.+?)(?:\s+until\s+(.+?))?$/i) {
+ # licensee specific authorisation
+ if (!$policy->SetAuthorizedUntil($1, $2)) {
+ warn "Invalid Authorized directive in $file\n";
+ }
+ } elsif (/^category\s+([a-z])$/i) {
+ # ipr category
+ if (!$policy->SetCategory($1)) {
+ warn "Invalid Category directive in $file\n";
+ }
+ $hasCategory = 1;
+ } elsif (/^description\s+(.*)$/i) {
+ # free text description
+ $policy->SetDescription($1);
+ } elsif (/^expires\s+(.*)$/i) {
+ # best before date
+ if (!$policy->SetExpires($1)) {
+ warn "Invalid Expires directive in $file\n";
+ }
+ } elsif (/^export\s+(un)?restricted$/i) {
+ # exportable/embargoed?
+ $policy->SetExportRestricted(!defined($1));
+ } elsif (/^osd:\s*(.+?)$/i) {
+ # parse osd info
+ $self->handle_osd($1, $policy);
+ }
+ }
+ close(POLICY);
+
+ if (!$hasCategory) {
+ warn "Warning: \'$file\' does not contain an IPR category\n";
+ }
+
+ return $policy;
+}
+
+sub handle_osd {
+ my $self = shift;
+ local $_ = shift;
+ my $policy = shift;
+ # SGL.PPS246.201DistributionPolicyFileContents.doc
+ if (/^(common|optional)\s+(symbian|replaceable)\s+(.+)$/i) {
+ # set common/optional
+ if (lc($1) eq 'common') {
+ $policy->SetCommon(1);
+ } else {
+ $policy->SetOptional(1);
+ }
+ # set symbian/replaceable
+ if (lc($2) eq 'symbian') {
+ $policy->SetSymbian(1);
+ } else {
+ $policy->SetReplaceable(1);
+ }
+ } elsif (/^(?:reference\/test)\s+(.+)$/i) {
+ # set test
+ $policy->SetTest(1);
+ } elsif (/^(?:test\/reference)\s+(.+)$/i) {
+ # synonym for reference/test
+ $policy->SetTest(1);
+ } else {
+ warn "Invalid OSD directive: '$_' (see SGL.PPS246.201)\n";
+ }
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Symbian::DistributionPolicy::Reader - Caching DISTRIBUTION.POLICY file reader.
+
+=head1 SYNOPSIS
+
+ use Symbian::DistributionPolicy::Reader;
+
+ my $dpr = Symbian::DistributionPolicy::Reader->new();
+
+ my $policy = $dpr->ReadPolicyFile($path);
+
+=head1 DESCRIPTION
+
+This module parses and caches policy data from DISTRIBUTION.POLICY files.
+
+=head1 METHODS
+
+=head2 new()
+
+Creates the reader object.
+
+=head2 ReadPolicyFile($path)
+
+Read the DISTRIBUTION.POLICY file in $path (which can be e.g. a source file, a
+directory or the DISTRIBUTION.POLICY file itself) and return a
+Symbian::DistributionPolicy object containing the policy data. The policy is
+cached to prevent unnecessary re-reading of .POLICY files in subsequent calls.
+
+=head1 SEE ALSO
+
+L<Symbian::DistributionPolicy> to find out what you can do with your $policy
+object.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+ This component and the accompanying materials are made available
+ under the terms of the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+
+=cut