## 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 fileBEGIN { @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;