diff -r 608f67c22514 -r 896e9dbc5f19 internetradio2.0/cenrep/generate_cenrep_inifile.pl --- a/internetradio2.0/cenrep/generate_cenrep_inifile.pl Tue Jul 06 14:07:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1478 +0,0 @@ -# -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of "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: -# -###################################### -# Run with -h to get help -###################################### -use strict; -use lib "."; -use open OUT => ':raw'; -use Win32::OLE qw(in with); -use Win32::OLE::Const 'Microsoft Excel'; -use Cwd; -use Getopt::Long; -use File::Copy; -use Storable qw(fd_retrieve); -use excel_support; # Own perl module that contains the reading of memory-sheets -use cenrep_keys; # Own perl module that contains the reading of memory-sheets - - -use Data::Dumper; - -# this is the bit mask that is put into the metadata in the ini-file, when -# backup is set on. -my $globalBackupValue = 0x01000000; - -########################################################################### -########################################################################### -sub printStr -{ - my $to = shift; - my $str = shift; - - for (my $i = 0; $i < length($str); $i++) - { - printf $to "%s\0", substr($str,$i, 1); - } -} - -########################################################################### -########################################################################### -sub printNewLine -{ - my $to = shift; - my $fileName = shift; - - print $to "\x0D\x00\x0A\x00"; - - return; -} -# # We need to close the file temporarely so that we can -# # write a new line into it differently. It seems that -# # unicode file name writing is somehow wrong in the -# # used perl versio (ActivePerl 5.8.4) - -# close $to; -# # Writing the new line into the end of the line -# open $to,">>$fileName"; -# binmode OUT; -# print OUT chr(13); -# print OUT chr(0); -# print OUT chr(10); -# print OUT chr(0); -# close OUT; - -# # Opening the file again to -# # open(OUT,">>:encoding(UTF-16LE)",$fileName) || die "unable to open $fileName"; -# open(OUT,">>$fileName") || die "unable to open $fileName"; -# } - -########################################################################### -# Function that gets a dir as parameter and reads the list of excel files from the -# given directory. -# -# Params: a directory name -# -# Return value: a reference to a list of filenames. -########################################################################### -sub getExcelFilesFromDir -{ - my $dir = shift; - - # the given dir should be relative to the dir, where the script is executed. - if($dir !~ /^[\\\/]/ && $dir !~ /^[A-Za-z]:/) - { - $dir = cwd . "\\$dir"; - } - my @files; - @files = <$dir\\*.xls >; - - return \@files; -} - - -################################################### -# Function that reads the file names from the given file. -# THe information is read from Column A and 1st empty row indicates -# end of input. -# -# Params: fileNameRead, refToExcelApp -################################################### -sub getExcelFilesFromFile -{ - my $file = shift; - - my @fileList; - # ---------------------------------------------------------------- - # Open the file - # ---------------------------------------------------------------- - open(IN,$file) || die "Unable to open: $file"; - - #------------------------------------------------------------ - # Read file line by line - #------------------------------------------------------------ - while() - { - my $fileWithPath = $_; - chomp($fileWithPath); - - if(! -f $fileWithPath) - { - print STDERR "Warning: input file not found: $fileWithPath\n"; - } - else - { - push(@fileList,$fileWithPath); - } - } - - return \@fileList; -} - -################################################### -################################################### -sub isRemoved -{ - my $platId = shift; - my $platRel = shift; - my $removed = shift; - - # If not defined => not removed - if(! defined($removed)) - { - return 0; - } - - if($removed =~ /$platId\s+([0-9]+\.[0-9]+)/i) - { - my $rel = $1; - if($rel <= $platRel) - { - return 1; - } - } - return 0; -} -################################################### -# returns the official capa name from internal name. -# this is implemented since the capa names in cenrep keys -# migth not be the same as official names in the ini-file. -################################################### -sub getCapaValue -{ - my $formatNbr = shift; # not used at the moment. - my $refToCapaList = shift; - - ######################### - # official way, caps as strings - ######################### - -# my $retVal = ""; -# my $isFirst = 1; -# foreach my $capa (@$refToCapaList) -# { -# next if($capa =~ /^\s*$/); -# if(!$isFirst) -# { -# $retVal .= ","; -# } -# $retVal .= $capa; - -# $isFirst = 0; -# } - - ######################### - # Caps as strings - ######################### - my $retVal = ""; - my @capaList; - foreach my $capa (@$refToCapaList) - { - next if($capa =~ /^\s*$/); - - if( $capa =~ /ReadUserData/) - { - push(@capaList,"ReadUserData"); - } - elsif($capa =~ /WriteUserData/) - { - push(@capaList,"WriteUserData"); - } - elsif( $capa =~ /ReadDeviceData/) - { - push(@capaList,"ReadDeviceData"); - } - elsif($capa =~ /WriteDeviceData/) - { - push(@capaList,"WriteDeviceData"); - } - elsif($capa =~ /NetworkControl/) - { - push(@capaList,"NetworkControl"); - } - elsif($capa =~ /NetworkServices/) - { - push(@capaList,"NetworkServices"); - } - elsif($capa =~ /Local Services/) - { - push(@capaList,"LocalServices"); - } - elsif($capa =~ /Location/) - { - push(@capaList,"Location"); - } - elsif($capa =~ /ProtServ/) - { - push(@capaList,"ProtServ"); - } - elsif($capa =~ /DRM/) - { - push(@capaList,"DRM"); - } - elsif($capa =~ /SwEvent/) - { - push(@capaList,"SwEvent"); - } - elsif($capa =~ /PowerMgmt/) - { - push(@capaList,"PowerMgmt"); - } - elsif($capa =~ /AllFiles/) - { - push(@capaList,"AllFiles"); - } - elsif($capa =~ /DiskAdmin/) - { - push(@capaList,"DiskAdmin"); - } - elsif($capa =~ /MultiMediaDD/) - { - push(@capaList,"MultimediaDD"); - } - elsif($capa =~ /CommDD/) - { - push(@capaList,"CommDD"); - } - elsif($capa =~ /TrustedUI/) - { - push(@capaList,"TrustedUI"); - } - elsif($capa =~ /TCB/) - { - push(@capaList,"TCB"); - } - elsif($capa =~ /AlwaysPass/ || $capa =~ /None/) - { - push(@capaList,"alwayspass"); - } - elsif($capa =~ /UserEnvironment/) - { - push(@capaList,"UserEnvironment"); - } - elsif($capa =~ /SurroundingsDD/) - { - push(@capaList,"SurroundingsDD"); - } - } - - return join(",",@capaList); - -} -################################################### -# 3rd param syntax: -# -# => { -# "R" => (,) -# "W" => (,) -# "value" => -# "rfs" => <0/1> -# "backup" => <0/1> -# } -# -################################################### -sub getConfig -{ - my $platId = shift; - my $platRel = shift; - my $refToHash = shift; - - my $currRel = "0"; - my $currRef = undef; - foreach my $plat (sort keys %$refToHash) - { - if($plat =~ /$platId\s+([0-9]+\.[0-9]+)/i) - { - my $tentativeRel = $1; - if($tentativeRel > $currRel && $tentativeRel <= $platRel) - { - $currRel = $tentativeRel; - $currRef = $$refToHash{$plat}; - } - } - } -# if($currRel > 0) -# { -# print $$refToHash{$currRel}, "a\n"; -# return $$refToHash{$currRel}; -# } - return $currRef; -} - -########################################################################### -# Main function, -########################################################################### -sub readConfig -{ - my $refToExcelFiles = shift; - my $refToExcel = shift; - - my %reshHash; - my $refToWorkSheet; - - # Loop through each found excel sheet. This will open one file after each other - # and parse information into the hashes defined above. - foreach my $file ( @{$refToExcelFiles} ) - { - print " Reading: $file\n"; - - # ---------------------------------------------------------------- - # Open the file - # ---------------------------------------------------------------- - my $refToWb = openWorkbook( $file,$refToExcel); - - # ---------------------------------------------------------------- - # Check, that the template version is the one we support. If not - # the file is skipped and warning is written to user. - # ---------------------------------------------------------------- -# if( isSupported($refToWb) == 0) -# { -# # "delete" the workbooks, this closes the excel application -# undef $$refToWb; -# undef $refToWb; -# print STDERR "Warning: Unsupported template version in file: $file\n"; -# next; -# } - - - # ---------------------------------------------------------------- - # Read the information from the worksheets - # ---------------------------------------------------------------- - for( my $i = 0; $i < $$refToWb->Worksheets->Count; $i++) - { - my $workSheet = $$refToWb->WorkSheets($i + 1); - $refToWorkSheet = getWorkSheet( $refToWb,$workSheet->Name); - readCentrepKeyInfo( $refToWorkSheet,\%reshHash); - } - # "delete" the workbooks, this closes the excel application - $$refToWb->Close(0); - undef $$refToWb; - undef $refToWb; - } - return \%reshHash; -} -########################################################################### -########################################################################### -sub getKeyType -{ - my $key = shift; - - return "string" if($key =~ /str/i); - return "int" if($key =~ /int/i); - return "real" if($key =~ /real/i); - return "binary" if($key =~ /bin/i); - - return "unknown_type"; -} - - -########################################################################### -# Prints the Key and key type into the given output. -# The format in which the key is printed is format specific. -########################################################################### -sub printKey -{ - my $to = shift; - my $formatNbr = shift; - my $key = shift; - my $keyType = shift; - - $key =~ s/0x(0*)/0x/g; - # Add 0 if the key value is "0x" (cases, where the id == 0) - $key .= "0" if $key =~ /0x\s*$/; - printStr $to, $key . " " . $keyType . " "; - - return; -} - -########################################################################### -# Prints the capabilities into the given output. -# The format in which the capabilities are printed is format specific. -########################################################################### -sub printCapa -{ - my $to = shift; - my $formatNbr = shift; - my $refToCapaList = shift; - my $prefix = shift; - my $alwaysFail = shift; - - if($formatNbr > 1) - { - if($alwaysFail && $formatNbr > 3) - { - printStr \*OUT, " $prefix=alwaysfail"; - } - elsif(defined($refToCapaList) && scalar(@$refToCapaList) > 0) - { - my $capaStr = getCapaValue($formatNbr,$refToCapaList); - printStr \*OUT, " $prefix=$capaStr" if($capaStr); - } - } -} - -########################################################################### -# Prints the Sid capabilities into the given output. -# The format in which the capabilities are printed is format specific. -########################################################################### -sub printSidCapa -{ - my $to = shift; - my $formatNbr = shift; - my $refToCapaList = shift; - my $prefix = shift; - - if($formatNbr > 1) - { - if(defined($refToCapaList) && scalar(@$refToCapaList) > 0) - { - # Only 1 SID is allowed - printStr \*OUT, " $prefix=$$refToCapaList[0]"; - } - } -} - -########################################################################### -# Prints the information about ranges -########################################################################### -sub printPlatSec -{ - my $to = shift; - my $formatNbr = shift; - my $refToUidSpecificHash = shift; - my $refToRangesHash = shift; - my $fileName = shift; - my $addDefCaps = shift; - - #------------------------------- - # UID specific (default capabilities) - #------------------------------- - # we need to know if write / read was specified. - # if not and addDefCaps is defined => then be add the - # default alwayspass to the file - my $readSpecified = 0; - my $writeSpecified = 0; - - ############################### - # RSid-capa writing (format specific) - ############################### - my $refToCapaList = $$refToUidSpecificHash{"RSid"}; - printSidCapa($to,$formatNbr,$refToCapaList,"sid_rd"); - $readSpecified += scalar(@$refToCapaList) if defined($refToCapaList); - - ############################### - # R-capa writing (format specific) - ############################### - $refToCapaList = $$refToUidSpecificHash{"R"}; - printCapa($to,$formatNbr,$refToCapaList,"cap_rd",0); - $readSpecified = scalar(@$refToCapaList) if defined($refToCapaList); - - # Add def caps if no caps were defined - if($addDefCaps > 0 && $readSpecified < 1) - { - printStr \*OUT, " cap_rd=alwayspass"; - - } - - ############################### - # WSid-capa writing (format specific) - ############################### - $refToCapaList = $$refToUidSpecificHash{"WSid"}; - printSidCapa($to,$formatNbr,$refToCapaList,"sid_wr"); - $writeSpecified += scalar(@$refToCapaList) if defined($refToCapaList); - - ############################### - # W-capa writing (format specific) - ############################### - $refToCapaList = $$refToUidSpecificHash{"W"}; - printCapa($to,$formatNbr,$refToCapaList,"cap_wr",0); - $writeSpecified = scalar(@$refToCapaList) if defined($refToCapaList); - - # Add def caps if no caps were defined - if($addDefCaps > 0 && $writeSpecified < 1) - { - printStr \*OUT, " cap_wr=alwayspass"; - - } - - printNewLine($to,$fileName); - - #------------------------------- - # Ranges - #------------------------------- - foreach my $rangeFrom (keys %$refToRangesHash) - { - my $refToRangeFromHash = $$refToRangesHash{$rangeFrom}; - - foreach my $rangeTo (keys %$refToRangeFromHash) - { - my $refToRangeToHash = $$refToRangeFromHash{$rangeTo}; - - printStr $to, $rangeFrom . " " .$rangeTo; - - ############################### - # RSid-capa writing (format specific) - ############################### - $refToCapaList = $$refToRangeToHash{"RSid"}; - printSidCapa($to,$formatNbr,$refToCapaList,"sid_rd"); - - ############################### - # R-capa writing (format specific) - ############################### - $refToCapaList = $$refToRangeToHash{"R"}; - printCapa($to,$formatNbr,$refToCapaList,"cap_rd",0); - - ############################### - # WSid-capa writing (format specific) - ############################### - $refToCapaList = $$refToRangeToHash{"WSid"}; - printSidCapa($to,$formatNbr,$refToCapaList,"sid_wr"); - - ############################### - # W-capa writing (format specific) - ############################### - $refToCapaList = $$refToRangeToHash{"W"}; - printCapa($to,$formatNbr,$refToCapaList,"cap_wr",0); - - printNewLine($to,$fileName); - } - } -} - -########################################################################### -# Prints the information about metadata -########################################################################### -sub printMetadata -{ - my $to = shift; - my $formatNbr = shift; - my $refToUidSpecificHash = shift; - my $refToRangesHash = shift; - my $fileName = shift; - - #------------------------------- - # UID specific metadata - #------------------------------- - - my $metaData = 0; - if($$refToUidSpecificHash{"backup"}) - { - $metaData += $globalBackupValue; - } - printStr $to, " $metaData"; - printNewLine($to,$fileName); - - - #------------------------------- - # Ranges - #------------------------------- - foreach my $rangeFrom (keys %$refToRangesHash) - { - my $refToRangeFromHash = $$refToRangesHash{$rangeFrom}; - - foreach my $rangeTo (keys %$refToRangeFromHash) - { - my $refToRangeToHash = $$refToRangeFromHash{$rangeTo}; - - printStr $to, $rangeFrom . " " .$rangeTo; - - my $metaData2 = 0; - if($$refToRangeToHash{"backup"}) - { - $metaData2 += $globalBackupValue; - } - printStr $to, " $metaData2"; - printNewLine($to,$fileName); - } - } -} - -########################################################################### -# Function that generates a text file for the Restore factory settings. -# This file -########################################################################### -sub generateRfsFile -{ - my $reshHash = shift; - my $rfsFileWithPath = shift; - - open(OUT,">$rfsFileWithPath") || die "unable to open $rfsFileWithPath for writing"; - print OUT "\xFF\xFE"; - - foreach my $uid (keys %$reshHash) - { - my $refToUidHash = $$reshHash{$uid}; - $uid =~ s/^0x0*//g; - $uid = 0 if $uid =~ /^$/; - my $refToUidSpecificHash = $$refToUidHash{"uid_specific"}; - - # Uid specific rfs overwrites the key specific values - # Thus if this is set to yes => we can skip key specific values - if($$refToUidSpecificHash{"rfs"}) - { - printStr \*OUT, "CR $uid"; - printNewLine(\*OUT,$rfsFileWithPath); - next; - } - - # If we get here => uid was not set to yes for RFS. - # now we loop through each ke - ######################## - # print each key into the file. - ######################## - my $refToKeysHash = $$refToUidHash{"keys"}; - my $isFirstInUid = 1; - foreach my $key (sort keys %$refToKeysHash) - { - my $refToKeyHash = $$refToKeysHash{$key}; - - # Check, if the key was restored in RFS. - if($$refToKeyHash{"rfs"}) - { - # If this is the 1st key for this UI, then - # we print the keyword (CR) and the uid into the - # file. - if($isFirstInUid) - { - $isFirstInUid = 0; - printStr \*OUT, "CR $uid"; - - } - - # print the key into the file (after some modifications) - $key =~ s/^0x0*//g; - $key = 0 if $key =~ /^$/; - printStr \*OUT, " $key"; - } - } - # Print a newline if (and only if) there was keys that had rfs-flag - # on. - if(! $isFirstInUid) - { - printNewLine(\*OUT,$rfsFileWithPath); - } - } - close OUT; -} - -########################################################################### -# Function that generates all the ini (txt)-files for the central repository. -# There are multiple formats, which are supported at the moment, since the -# development in ongoing and syntax is still a little but unknown. -########################################################################### -sub generateIniFiles -{ - my $reshHash = shift; - my $dirname = shift; - my $formatNbr = shift; - my $addDefCaps = shift; - - my $iniFileCount = 0; - my $keyCount = 0; - - foreach my $uid (keys %$reshHash) - { - my $refToHash = $$reshHash{$uid}; - $refToHash = $$refToHash{"keys"}; - my $refToRangeHash = $$refToHash{"ranges"}; - if(scalar(keys %$refToHash) < 1 && scalar(keys %$refToRangeHash)) - { - # Skip uid, if no keys and ranges - next; - } - $iniFileCount++; - - ################################## - # Filename syntax is "uid.txt" without the 0x in the begining - ################################## - my $fileName = "$uid.txt"; - $fileName =~ s/^0x//i; - - # Add dir name into the filename. - if($dirname !~ /^\s*$/) - { - my $tmpFileName = $fileName; - $fileName = $dirname; - if($dirname !~ /[\\\/]$/) - { - $fileName .= "\\"; - } - $fileName .= $tmpFileName; - } - - ######################## - # Copy the start of the file into the new name - # (note that this migth become format specific, - # but is not at the moment). - ######################## - my $templateName = "cenrep_start.ini"; - - copy($templateName,$fileName) or die "Copy failed: $! : $fileName"; - open(OUT,">>$fileName") || die "unable to open $fileName"; - ######################## - # Print the [owner] section - ######################## - if($formatNbr > 2) - { - my $refToUidHash = $$reshHash{$uid}; - my $refToUidSpecificHash = $$refToUidHash{"uid_specific"}; - - if($$refToUidSpecificHash{"owner"} !~ /^\s*$/) - { - printStr \*OUT, "[owner]"; - printNewLine(\*OUT,$fileName); - printStr \*OUT, $$refToUidSpecificHash{"owner"}; - printNewLine(\*OUT,$fileName); - } - } - - ######################## - # Print the [defaultmeta] section - # Note that depending on the format - # nbr the metadata has to be before or after - # platsec-section. - ######################## - if($formatNbr > 3 ) - { - printStr \*OUT, "[defaultmeta]"; - printNewLine(\*OUT,$fileName); - - my $refToUidHash = $$reshHash{$uid}; - printMetadata(\*OUT,$formatNbr,$$refToUidHash{"uid_specific"}, - $$refToUidHash{"ranges"},$fileName); - } - - ######################## - # Print the [PlatSec] section - ######################## - if($formatNbr > 1) - { - printStr \*OUT, "[platsec]"; - printNewLine(\*OUT,$fileName); - - my $refToUidHash = $$reshHash{$uid}; - printPlatSec(\*OUT,$formatNbr,$$refToUidHash{"uid_specific"}, - $$refToUidHash{"ranges"},$fileName,$addDefCaps); - } - ######################## - # Print the [metadata] section - ######################## - if($formatNbr eq 3) - { - printStr \*OUT, "[metadata]"; - printNewLine(\*OUT,$fileName); - - my $refToUidHash = $$reshHash{$uid}; - printMetadata(\*OUT,$formatNbr,$$refToUidHash{"uid_specific"}, - $$refToUidHash{"ranges"},$fileName); - } - - ######################## - # Print the [Main] section - ######################## - if($formatNbr > 0) - { - printStr \*OUT, "[Main]"; - printNewLine(\*OUT,$fileName); - } - - ######################## - # print each key into the file. - ######################## - foreach my $key (sort keys %$refToHash) - { - $keyCount++; - my $refToHash2 = $$refToHash{$key}; - - ############################### - # Writing the key and key type. - # This is format specific. - ############################### - printKey(\*OUT,$formatNbr,$key,getKeyType($$refToHash2{"key type"})); - - ############################### - # Write the value into the file - ############################### - - # Strings are always enclosed with \". Also empty binary value is also enclosed - # such way - if($$refToHash2{"key type"} =~ /str/i ) - { - printStr \*OUT, "\""; - } - printStr \*OUT, $$refToHash2{"value"}; - if($$refToHash2{"key type"} =~ /str/i) - { - printStr \*OUT, "\""; - } - - if ($$refToHash2{"key type"} =~ /bin/i && $$refToHash2{"value"} =~ /^\s*$/) - { - printStr \*OUT, "00"; - } - - ############################### - # Generating the metadata and adding it into the file - ############################### - my $metaData = 0; - if($$refToHash2{"backup"}) - { - $metaData += $globalBackupValue; - } - printStr \*OUT, " $metaData"; - - # Note, according to the cenrep specification, then read access has to be - # before the write access. - - ############################### - # RSid-capa writing (format specific) - ############################### - my $refToCapaList = $$refToHash2{"RSid"}; - printSidCapa(\*OUT,$formatNbr,$refToCapaList,"sid_rd"); - - ############################### - # R-capa writing (format specific) - ############################### - $refToCapaList = $$refToHash2{"R"}; - printCapa(\*OUT,$formatNbr,$refToCapaList,"cap_rd",0); - - ############################### - # WSid-capa writing (format specific) - ############################### - $refToCapaList = $$refToHash2{"WSid"}; - printSidCapa(\*OUT,$formatNbr,$refToCapaList,"sid_wr"); - - ############################### - # W-capa writing (format specific) - ############################### - $refToCapaList = $$refToHash2{"W"}; - printCapa(\*OUT,$formatNbr,$refToCapaList,"cap_wr",$$refToHash2{"read-only"}); - - ########################################## - ########################################## - ########################################## - ########################################## - printNewLine(\*OUT,$fileName); - } - close OUT; - } - - print "Ini file count = $iniFileCount\n"; - print "Key count = $keyCount\n"; -} - -########################################################################### -# Shows help. -# -# Params: - -# -# Return: - -# -########################################################################### -sub usage -{ - $0 =~ /([0-9a-zA-Z\_\.]+)$/; - my $filename = $1; - print "\n"; - print "\n"; - print "\n"; - print "This script is intended to be used to generate ini-files for Central Repository\n"; - print "based on the information in the cenrep key excel-sheet(s). These sheets define\n"; - print "the content of the ini-files.\n"; - print "\n"; - print "Rough discruption on how the values for the ini-files are determinated:\n"; - print "1) Content of sheets identified by -d or -s are read.\n"; - print " (alternatively -b can be used a storable file, where the sheet info\n"; - print " is already in binary format)\n"; - print "2) From sheets read in step 1 the information is parsed based on the\n"; - print " information specified by -p, -r and -v\n"; - print "3) [optional] Default values specified by the steps 1 and 2 can be\n"; - print " overriden by defining information in other sheets, specified by parameters\n"; - print " -vd,-vs,-vb and -vv, \n"; - print "\n"; - print "\n"; - print "Usage:\n"; - print " $filename [-h|-help] [-fh]\n"; - print " [-p ] -r [-v | -s | -b )\n"; - print " [ -rd ]\n"; - print " [ (-vd | -vs | -vb )\n"; - print " [-vv ]]\n"; - print " [-f ]\n"; - print " [-dc ]\n"; - print " [-rfs [-noini]]\n"; - print "\n"; - print "Options:\n"; - print " -h : Show this help\n"; - print " -help : Show this help\n"; - print " -fh : Show the help about supported formats.\n"; - print " -p : The identifier specifying platform. Optional. Default value: S60\n"; - print " to the directory where the mem-sheets exist.\n"; - print " -r : The platform number. For example: 3.0\n"; - print " -rd : The path, where the generated ini-files are written.\n"; - print " Default: current directory\n"; - print " -v : The variant name. Optional. Default value: \"\" == no variant.\n"; - print " The names are not fixed in the script. The same names has to be\n"; - print " used as supported by the excel sheet.\n"; - print " -d : The dir, which contains the sheets, which are read. Relative path to the\n"; - print " current dir or absoluth path. NOTE: the dir name can't contain any spaces.\n"; - print " -s : The text filename, which contains sheet name with absoluth\n"; - print " path names (1/row)\n"; - print " -b : the storable file name, which contains the same information as the\n"; - print " key sheets. ( this can be generated with gather_cenrep_to_storable.pl)\n"; - print " -vd : Same as -d, but for variant information\n"; - print " (see rough description above) Optional.\n"; - print " -vs : Same as -s, but for variant information\n"; - print " (see rough description above) Optional.\n"; - print " -vb : the storable file name, which contains the same information as the\n"; - print " variant key sheets.\n"; - print " -vv : Same as -v, but for variant information\n"; - print " (see rough description above) Optional.\n"; - print " -f : the format type that is generated. (see list of formats with -fh)\n"; - print " -dc : adds alwayspass as default capabilities for UID namespace if non \n"; - print " specified (also applies to certain formats)\n"; - print " -rfs : The dir to which cenrep.txt-file is generated. This file\n"; - print " contains info for Restore Factory Settings\n"; - print " -noini : used only with -rfs-option. If specified, only RFS file generated,\n"; - print " no ini-files.\n"; - print "\n"; - print "\n"; - print "You have specify either -d or -s, but not both at the same time.\n"; - print "You can specify either -vd or -vs, but not both at the same time.\n"; - print "\n"; - print "\n"; -} - - -########################################################################### -# Shows format help. -# -# Params: - -# -# Return: - -# -########################################################################### -sub formatHelp -{ - $0 =~ /([0-9a-zA-Z\_\.]+)$/; - my $filename = $1; - print "\n"; - print "\n"; - print "Supported formats (default format is 4):\n"; - print " 0 : Format, where there are no capabilities generated for the keys.\n"; - print " Supported is key (as hex), type, value and metadata.\n"; - print " No \"[Main]\"-tag is included into the ini-file.\n"; - print " (a temporary fix so that testing can continue).\n"; - print " 1 : Format 0 + \"[Main]\"-tag is included into the ini-file.\n"; - print " (Symbian w48 and earlier builds).\n"; - print "\n"; - print " 2 : Format 1 + in addition capabilities are written in text format.\n"; - print " Supported is key (as hex), type, value, metadata and read/write capabilities in text format.\n"; - print " (Symbian w50 and later builds).\n"; - print "\n"; - print " 3 : Format 3 + in addition owner and metadata are written in text format.\n"; - print " Supported is key (as hex), type, value, metadata and read/write capabilities in text format.\n"; - print " (Symbian w?? and later builds).\n"; - print "\n"; - print " 4 : Format 4 + in addition alwaysfail-keyword used in ini-file.\n"; - print " (Symbian w10 and later builds).\n"; - print "\n"; - print "\n"; - print "\n"; - -} -########################################################################### -# Parses the command line parameters from ARGV -# -# Params: - -# -# Return: - -# -########################################################################### -sub parseCmdLine -{ - my $platId = "S60"; - my $platRel = ""; - my $varName = ""; - my $sheetDirname = ""; - my $sheetFilename = ""; - my $storableFilename = ""; - my $resultDirname = ""; - my $varNameVariant = ""; - my $sheetDirnameVariant = ""; - my $sheetFilenameVariant = ""; - my $storableFilenameVariant = ""; - my $formatNbr = -1; - my $addDefCaps = 0; - my $rfsDir = ""; - my $noIni = 0; - my $showHelp = 0; - my $showFormatHelp = 0; - - if( ! GetOptions('p:s' => \$platId, - 'r:s' => \$platRel, - 'v:s' => \$varName, - 'd:s' => \$sheetDirname, - 's:s' => \$sheetFilename, - 'b:s' => \$storableFilename, - 'rd:s' => \$resultDirname, - 'vv:s' => \$varNameVariant, - 'vd:s' => \$sheetDirnameVariant, - 'vs:s' => \$sheetFilenameVariant, - 'vb:s' => \$storableFilenameVariant, - 'f:i' => \$formatNbr, - 'dc' => \$addDefCaps, - 'rfs:s' => \$rfsDir, - 'noini' => \$noIni, - 'h' => \$showHelp, - 'help' => \$showHelp, - 'fh' => \$showFormatHelp, - '<>' => \&usage)) - { - usage(); - exit(1); - } - - - #################################### - # Format number handling. - #################################### - # Set default format number, if not specified. - if( $formatNbr < 0) - { - $formatNbr = 4; - } - elsif( $formatNbr > 4) - { - print "\nError: Invalid format number: $formatNbr.\n"; - $showFormatHelp = 1; - } - - if($showFormatHelp) - { - formatHelp(); - exit(1); - } - if($showHelp) - { - usage(); - exit(1); - } - - - - #################################### - # Checking other parameters - #################################### - my $error = 0; - if( ($sheetDirname ne "" and $sheetFilename ne "") - or ($sheetDirname ne "" and -b $storableFilename ne "") - or ($sheetFilename ne "" and -b $storableFilename ne "")) - { - print "\nError: The -s, -d and -b arguments can't be specified at the same time.\n"; - $error = 1; - } - elsif($sheetDirname eq "" and $sheetFilename eq "" and $storableFilename eq "") - { - print "\n\nError: You have to specify either the -d or -s or -b argument.\n"; - $error = 1; - } - - if( ($sheetDirnameVariant ne "" and $sheetFilenameVariant ne "") - or ($sheetDirnameVariant ne "" and $storableFilenameVariant ne "") - or ($storableFilenameVariant ne "" and $sheetFilenameVariant ne "") - ) - { - print "\nError: The -vs and -vd and -vb arguments can't be specified at the same time.\n"; - $error = 1; - } - - if($platRel eq "") - { - print "\nError: You have to specify -r parameter.\n"; - $error = 1; - } - - if($error) - { - usage(); - exit(1); - } - elsif($showHelp) - { - usage(); - } - - return ($platId,$platRel,$varName,$sheetDirname,$sheetFilename,$storableFilename, - $resultDirname,$varNameVariant, - $sheetDirnameVariant,$sheetFilenameVariant,$storableFilenameVariant,$formatNbr, - $addDefCaps,$rfsDir,$noIni); -} - -########################################################################### -# -# The format of the returned hash is: -# NOTE: Still one bug, onge a range/key has been defined it can't be removed -# { -# => -# { -# "uid_specific" -# = > { -# "R" => (,) -# "W" => (,) -# "RSid" => () -# "WSid" => () -# "owner" => -# "rfs" => <0/1> -# "backup" => <0/1> -# } -# "ranges" -# = > { -# -# => { -# -# => { -# "R" => (,) -# "W" => (,) -# "RSid" => () -# "WSid" => () -# "rfs" => <0/1> -# "backup" => <0/1> -# } -# } -# } -# "keys" => { -# -# => { -# "read-only" => <0/1> -# "key type" => -# "R" => (,) -# "W" => (,) -# "RSid" => () -# "WSid" => () -# "value" => -# "rfs" => <0/1> -# "backup" => <0/1> -# } -# } # keys -########################################################################### -sub generateConfig -{ - my $refToResHash = shift; # The generated configuration - my $reftoConfigHash = shift; # from where the configuration is generated from - my $platId = shift; - my $platRel = shift; - my $varName = shift; - - if($varName =~ /^\s*$/) - { - # same as in cenrep_keys.pm - $varName = "default"; - } - - # See syntax of reftoConfigHash from the documentation of - # readCentrepKeyInfo - my $refToHash; - foreach my $uid (keys %$reftoConfigHash) - { - my $tmpUidResHash = addHash($uid,$refToResHash); - my $refToUidConfigHash = $$reftoConfigHash{$uid}; - - ########################################## - # Adding UID information - ########################################## - my $refToUidSpecificResHash = addHash("uid_specific",$tmpUidResHash); - - my $refToUidSpecificConfigHash = $$refToUidConfigHash{"uid_specific"}; - my $refToUidSpecificVariantConfigHash = undef; - - #-------------------------------------------------- - # now check, if there is variant specific configuration - #-------------------------------------------------- - if(defined($$refToUidSpecificConfigHash{$varName})) - { - $refToUidSpecificVariantConfigHash - = getConfig($platId,$platRel, - $$refToUidSpecificConfigHash{$varName}); - } - #-------------------------------------------------- - # if not found, then try to get default configuration - #-------------------------------------------------- - if(!defined($refToUidSpecificVariantConfigHash) && $varName ne "default") - { - $refToUidSpecificVariantConfigHash - = getConfig($platId,$platRel, - $$refToUidSpecificConfigHash{"default"}); - } - #-------------------------------------------------- - # if we found configuration then add it to the hash - #-------------------------------------------------- - if(defined($refToUidSpecificVariantConfigHash)) - { - $$refToUidSpecificResHash{"rfs"} = $$refToUidSpecificVariantConfigHash{"rfs"}; - $$refToUidSpecificResHash{"backup"} = $$refToUidSpecificVariantConfigHash{"backup"}; - $$refToUidSpecificResHash{"R"} = $$refToUidSpecificVariantConfigHash{"R"}; - $$refToUidSpecificResHash{"W"} = $$refToUidSpecificVariantConfigHash{"W"}; - $$refToUidSpecificResHash{"RSid"} = $$refToUidSpecificVariantConfigHash{"RSid"}; - $$refToUidSpecificResHash{"WSid"} = $$refToUidSpecificVariantConfigHash{"WSid"}; - $$refToUidSpecificResHash{"owner"} = $$refToUidSpecificVariantConfigHash{"owner"}; - } - ########################################## - # Adding range information - ########################################## - my $refToRangesResHash = addHash("ranges",$tmpUidResHash); - - my $refToRangesConfigHash = $$refToUidConfigHash{"ranges"}; - foreach my $rangeFrom (keys %$refToRangesConfigHash) - { - my $refToRangeCommonConfigHash = ${$$refToRangesConfigHash{$rangeFrom}}{"common"}; - # 1st check, if the key belongs to this release - if(isRemoved($platId,$platRel,$$refToRangeCommonConfigHash{"removed"})) - { - next; - } - - my $refToRangesToConfigHash = ${$$refToRangesConfigHash{$rangeFrom}}{"to"}; - foreach my $rangeTo (keys %$refToRangesToConfigHash) - { - my $refToSingleRangeToConfigHash - = $$refToRangesToConfigHash{$rangeTo}; - my $refToRangeToVariantConfigHash = undef; - #-------------------------------------------------- - # now check, if there is variant specific configuration - #-------------------------------------------------- - if(defined($$refToSingleRangeToConfigHash{$varName})) - { - $refToRangeToVariantConfigHash - = getConfig($platId,$platRel, - $$refToSingleRangeToConfigHash{$varName}); - } - #-------------------------------------------------- - # if not found, then try to get default configuration - #-------------------------------------------------- - if(!defined($refToRangeToVariantConfigHash) && $varName ne "default") - { - $refToRangeToVariantConfigHash - = getConfig($platId,$platRel, - $$refToSingleRangeToConfigHash{"default"}); - } - #-------------------------------------------------- - # if we found configuration then add it to the hash - #-------------------------------------------------- - if(defined($refToRangeToVariantConfigHash)) - { - my $refRangeVariantResHash = addHash($rangeFrom,$refToRangesResHash); - $refRangeVariantResHash = addHash($rangeTo,$refRangeVariantResHash); - $$refRangeVariantResHash{"rfs"} = $$refToRangeToVariantConfigHash{"rfs"}; - $$refRangeVariantResHash{"backup"} = $$refToRangeToVariantConfigHash{"backup"}; - $$refRangeVariantResHash{"R"} = $$refToRangeToVariantConfigHash{"R"}; - $$refRangeVariantResHash{"W"} = $$refToRangeToVariantConfigHash{"W"}; - $$refRangeVariantResHash{"RSid"} = $$refToRangeToVariantConfigHash{"RSid"}; - $$refRangeVariantResHash{"WSid"} = $$refToRangeToVariantConfigHash{"WSid"}; - } - } - } - ########################################## - # Adding key values - ########################################## - my $tmpKeysResHash = addHash("keys",$tmpUidResHash); - - $refToHash = $$reftoConfigHash{$uid}; - $refToHash = $$refToHash{"keys"}; - foreach my $key (keys %$refToHash) - { - my $refToCommonHash = ${$$refToHash{$key}}{"common"}; - # 1st check, if the key belongs to this release - if(isRemoved($platId,$platRel,$$refToCommonHash{"removed"})) - { - next; - } - #-------------------------------------------------- - # now check, if there is variant specific configuration - #-------------------------------------------------- - my $refToRelHash = ${$$refToHash{$key}}{"release"}; - my $refToKeyConfigHash; - if(defined($$refToRelHash{$varName})) - { - $refToKeyConfigHash = getConfig($platId,$platRel, - $$refToRelHash{$varName}); - } - #-------------------------------------------------- - # if not found, then try to get default configuration - #-------------------------------------------------- - if(!defined($refToKeyConfigHash) && $varName ne "default") - { - $refToKeyConfigHash - = getConfig($platId,$platRel, - $$refToRelHash{"default"}); - } - #-------------------------------------------------- - # if we found configuration then add it to the hash - #-------------------------------------------------- - if(defined($refToKeyConfigHash)) - { - my $keyResHash = addHash($key,$tmpKeysResHash); - $$keyResHash{"read-only"} = $$refToCommonHash{"read-only"}; - $$keyResHash{"key type"} = $$refToCommonHash{"key type"}; - $$keyResHash{"value"} = $$refToKeyConfigHash{"value"}; - $$keyResHash{"rfs"} = $$refToKeyConfigHash{"rfs"}; - $$keyResHash{"backup"} = $$refToKeyConfigHash{"backup"}; - $$keyResHash{"R"} = $$refToKeyConfigHash{"R"}; - $$keyResHash{"W"} = $$refToKeyConfigHash{"W"}; - $$keyResHash{"RSid"} = $$refToKeyConfigHash{"RSid"}; - $$keyResHash{"WSid"} = $$refToKeyConfigHash{"WSid"}; - } - } - } -} - -########################################################################### -# reads either default config or variant config into the result hash. -# Note that the variant hash can't delete any keys, just override them. -########################################################################### -sub readSingleConfig -{ - my $refToExcel = shift; - my $sheetDirname = shift; - my $sheetFilename = shift; - my $storableFilename = shift; - my $refToResultHash = shift; - my $platId = shift; - my $platRel = shift; - my $varName = shift; - - #----------------------------------------------------------------- - # There are 2 options how the user can give the if-sheet names handled: - # 1) He gives the directory where all files are located - # 2) He gives an excel sheet, which contains all the files in column A. - #----------------------------------------------------------------- - my $refToExcelFilesList; - - if($sheetDirname !~ /^\s*$/) - { - # Read the filenames from the directory given - $refToExcelFilesList = getExcelFilesFromDir $sheetDirname; - } - elsif($sheetFilename !~ /^\s*$/) - { - # Read the filenames from the excel file given - $refToExcelFilesList = getExcelFilesFromFile $sheetFilename; - } - elsif($storableFilename =~ /^\s*$/) - { - # nothing to do, just exit function - return; - } - #----------------------------------------------------------------- - # The main function that parses the information from sheets - #----------------------------------------------------------------- - my $refToDefHash; - if($storableFilename !~ /^\s*$/) - { - # read mem sheets info - open(STORABLE_IN ,$storableFilename) || die "Unable to open: $storableFilename"; - $refToDefHash = fd_retrieve(\*STORABLE_IN); - close STORABLE_IN; - } - else - { - $refToDefHash = readConfig($refToExcelFilesList,$refToExcel); - } -#For testing to get the generated config printed to terminal -# $Data::Dumper::Indent = 1; -# print Dumper($refToDefHash); -# exit 1; - - #----------------------------------------------------------------- - # Determinate the default configuration - #----------------------------------------------------------------- - generateConfig($refToResultHash,$refToDefHash,$platId,$platRel,$varName); - $refToDefHash = undef; - -# #For testing to get the generated config printed to terminal -# $Data::Dumper::Indent = 1; -# print Dumper($refToResultHash); -# exit 1; - -} - -################################################### -# Actual program -################################################### -my($platId,$platRel,$varName,$sheetDirname,$sheetFilename,$storableFilename,$resultDirname, - $varNameVariant,$sheetDirnameVariant,$storableFilenameVariant,$sheetFilenameVariant,$formatNbr, - $addDefCaps,$rfsDir,$noIni) = parseCmdLine; - -# ---------------------------------------------------------------- -# Get excel application -# ---------------------------------------------------------------- -my $refToExcel = getExcelApp(); - -#----------------------------------------------------------------- -# read the default configuration hash -#----------------------------------------------------------------- -my %resultHash; -readSingleConfig($refToExcel,$sheetDirname,$sheetFilename,$storableFilename,\%resultHash, - $platId,$platRel,$varName); - -#----------------------------------------------------------------- -# read the overriding variant configuration hash -#----------------------------------------------------------------- -readSingleConfig($refToExcel,$sheetDirnameVariant,$sheetFilenameVariant,$storableFilenameVariant, - \%resultHash,$platId,$platRel,$varNameVariant); - -#----------------------------------------------------------------- -# quit excel and "delete" the instances. -#----------------------------------------------------------------- -quitExcelApp($refToExcel); - -#----------------------------------------------------------------- -# Generate the ini-files -#----------------------------------------------------------------- -if(! $noIni) -{ - generateIniFiles(\%resultHash,$resultDirname,$formatNbr,$addDefCaps); -} - -#----------------------------------------------------------------- -# Generate the RFS file (if wanted) -#----------------------------------------------------------------- -if($rfsDir !~ /^\s*$/) -{ - $rfsDir =~ s/[\/\\]$//g; - $rfsDir .= "/cenrep_rfs.txt"; - generateRfsFile(\%resultHash,$rfsDir); -} -