--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/featureregistry.pm Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,224 @@
+#
+# Copyright (c) 2007-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:
+#
+
+# This package contains routines to read the information from the Feature registry XML file.
+package featureregistry; # Derived class implementation for feature registry xml file
+
+BEGIN {
+ @ISA = qw(featureparser); # Derived from featureparser
+ require featureparser;
+};
+
+# Parse the featureregistry XML file and generate the maps and counts
+#
+#feature hash map:
+# {<uid1>}{name}<name>
+# {installable}<true\false> - optional
+#
+
+#
+# Class constructor
+#
+sub new
+{
+ my $class = shift;
+ my $object = $class->SUPER::new();
+
+ # Class members
+ $object->{_OBJNAME} = "FeatureRegistry";
+ $object->{_FEAT_MAP} = {}; # Feature Info Hash map
+ $object->{_FEAT_NAME_UID_MAP} = {}; # Hash map of feature name and uid
+ return $object;
+}
+
+#
+# Private methods
+#
+
+# Private method to Get/Set the _FEAT_MAP member value of this class
+# @param : Feature Info Hash map (optional for GET)
+#
+my $featureHashMap = sub
+{
+ my $object = shift;
+ return 0 if(!&featureparser::ISREF($object,"featureHashMap"));
+
+ if (@_)
+ {
+ $object->{_FEAT_MAP} = shift;
+ }
+ return $object->{_FEAT_MAP};
+};
+
+#
+# Public methods
+#
+
+# Get/Set the _FEAT_NAME_UID_MAP member value of this class
+# @param : Hash map of feature name and uid (optional for GET)
+#
+sub featureNameUidMap
+{
+ my $object = shift;
+ return 0 if(!&featureparser::ISREF($object,"featureNameUidMap"));
+
+ if (@_)
+ {
+ $object->{_FEAT_NAME_UID_MAP} = shift;
+ }
+ return $object->{_FEAT_NAME_UID_MAP};
+};
+
+
+# Return the feature uid for the given feature name.
+# @param : Feature Name
+#
+sub getFeatureUID
+{
+ my $object = shift;
+ return 0 if(!&featureparser::ISREF($object,"getFeatureUID"));
+
+ my $feature = shift;
+
+ my $featureNameUidMap = $object->featureNameUidMap();
+ $feature = lc($feature);
+ if(exists $featureNameUidMap->{$feature}){
+ return $featureNameUidMap->{$feature};
+ }else{
+ return undef;
+ }
+}
+
+# Get the details of feature with given featureuid and other parameters
+# This function only consider the feature UID only and that UID should be in decimal
+# @param : Feature UID value
+#
+sub getFeatureInfo
+{
+ my $object = shift;
+ return 0 if(!&featureparser::ISREF($object,"getFeatureInfo"));
+
+ my $uid = shift;
+ my $featureMap = $object->$featureHashMap();
+ if(exists $featureMap->{$uid}) {
+ return \%{$featureMap->{$uid}};
+ }
+ else {
+ return undef;
+ }
+}
+
+#
+# Utility functions
+#
+
+# Update the feature hash map with the values from the xml feature registry file
+#
+sub createFeatureMap
+{
+ my $object = shift;
+ return 0 if(!&featureparser::ISREF($object,"createFeatureMap"));
+
+ return 0 if($object->rootElement() < 0);
+
+ # Get all <feature> Elements to @featureList
+ my @featureList = &featureparser::getnodefromTree($object->rootElement(), "features", "feature");
+
+ if(@featureList)
+ {
+ my $featureNameUidMap = $object->featureNameUidMap();
+ my $featureMap = $object->$featureHashMap();
+ foreach my $node (@featureList)
+ {
+ # Define local variables to hold attribute names and values for each $node
+ my $uid_value = &featureparser::getattrValue($node, "uid");
+ my $name_value = &featureparser::getattrValue($node, "name");
+
+ # Validate Name
+ if(!$name_value) {
+ &featureparser::ERROR("Feature name attribute is empty");
+ return 0;
+ }
+
+ # Validate UID
+ if(&featureparser::IsValidNum($uid_value)) {
+ $uid_value = &featureparser::ConvertHexToDecimal($uid_value);
+ }
+ else {
+ &featureparser::ERROR("Valid hexadecimal or decimal value expected in UID entry for \"$name_value\"");
+ return 0;
+ }
+
+ # Check the duplicate entry of feature
+ if(exists $featureNameUidMap->{$name_value}) {
+ &featureparser::ERROR("Feature entry \"".$name_value."\" already exists");
+ return 0;
+ }
+ if(exists $featureMap->{$uid_value}) {
+ &featureparser::ERROR("UID entry for \"".$name_value."\" already exists");
+ return 0;
+ }
+
+ my $install_value = &featureparser::getattrValue($node, "installable");
+ if ($install_value eq undef) {
+ $install_value = "false";
+ }
+
+ # Store all key=values to global %featureHashMap & %featureNameUidMap
+ $featureNameUidMap->{$name_value} = $uid_value;
+ $featureMap->{$uid_value}{"name"} = &featureparser::getattrValue($node, "name",1);
+ $featureMap->{$uid_value}{"installable"} = $install_value;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+# Read the <defaultfeaturerange> element
+#
+sub createDefaultRangeMap
+{
+ my $object = shift;
+ return 0 if(!&featureparser::ISREF($object,"createDefaultRangeMap"));
+
+ # Return error if the rootelement reference is NULL
+ return 0 if($object->rootElement() < 0);
+
+ # Get all the <defaultfeaturerange> elements
+ my @attrSet = &featureparser::getnodefromTree($object->rootElement(), "default", "range");
+
+ # Add the defaultfeaturerange elements into the object
+ return &featureparser::createDefaultRangeMap($object,@attrSet);
+}
+
+sub readRangeAttributes
+{
+ my ($object, $currNode, $range) = @_;
+ return 0 if(!&featureparser::ISREF($object,"readRangeAttributes"));
+
+ #Get the lower and higher uids
+ $range->{min} = &featureparser::getattrValue($currNode, "min");
+ $range->{max} = &featureparser::getattrValue($currNode, "max");
+
+ #Read the support keyword
+ $range->{support} = &featureparser::getattrValue($currNode, "support");
+
+ #Read the installable element
+ $range->{installable} = &featureparser::getattrValue($currNode, "installable");
+}
+
+1;
\ No newline at end of file