widgettools/wrtwidgetpreinstaller/src/installwidgets.pl
branchRCL_3
changeset 32 fe49e33862e2
parent 31 b685c59de105
child 33 04b7640f6fb5
--- a/widgettools/wrtwidgetpreinstaller/src/installwidgets.pl	Thu Aug 19 09:43:47 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2156 +0,0 @@
-#
-# Copyright (c) 2010 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: 
-#
-
-use strict;
-use warnings;
-use File::Spec::Functions;
-use Getopt::Long;
-use Pod::Usage;
-
-# Version of the script - just use the date
-$main::VERSION = '12-July-2010';
-
-# New getopt::long provides this - but old version doesn't?
-sub version
-  {
-  print sprintf("$0: $main::VERSION\n$^X: %vd\nos: $^O", $^V);
-  exit;
-  }
-
-# Get arguments
-my ( $help, $version, $verbose, $debug, $epocroot, $l10n );
-GetOptions( "help" => \$help, "version|ver" => \$version,
-      "verbose|v" => \$verbose,  "debug" => \$debug,
-      "epocroot|e=s" => \$epocroot, "localization|l=s" => \$l10n )
-  or pod2usage('Invalid parameters');
-
-# Handle help and version
-pod2usage({ verbose => 1, exitval => 0}) if $help;
-version() if $version;
-
-# Interpret arguments
-$verbose = 1 if $debug;
-$verbose = $verbose ? '-v' : '';
-$epocroot = $ENV{EPOCROOT} if !$epocroot;
-
-# Interpret localization l10n argument
-
-# There are two modes.  In one mode you specify the location of a
-# lproj.xml file and the code computes l10n files for all languages so
-# that runtime locale selection should work.  In the other mode you
-# specify a language code (example, fr for French) and the code
-# computes l10n just for that language.
-$l10n = '' if !$l10n;
-my $lproj = '';
-if ($l10n =~ /lproj\.xml$/i)
-  {
-  $lproj = $l10n;
-  $l10n = '';
-  }
-
-my ($configini, @unnecessary) = @ARGV;
-
-if ($configini)
-  {
-  # There shouldn't be any need for any other arguments
-  pod2usage('Unnecessary arguments supplied.') if @unnecessary;
-
-  # Now do the installation
-  my $installer = WidgetInstaller->new('verbose' => $verbose, 'debug' => $debug, 'epocroot' => $epocroot, 'lproj' => $lproj, 'l10n' => $l10n);
-  $installer->installConfig($configini);
-  }
-else
-  {
-  pod2usage('Missing config.ini argument.');
-  }
-
-# ***
-# Package for installing Widgets
-#
-
-package WidgetInstaller;
-
-use File::Spec::Functions;
-use File::Path;
-use File::Basename;
-use Unicode::String qw(utf8 utf16);
-use File::Temp qw/tempdir/;
-use File::Copy;
-use XML::Parser;
-use Data::Dumper;
-use XML::Simple;
-
-# CONSTANTS
-use constant ICON_SIZES => "88,32,24";      # Size of icons to generate in the MBM file
-#use constant INTERNAL_UID_LOWER => 0x2000DAD2; # Lower UID bound for midlets installed to internal drives and rom
-#use constant EXTERNAL_UID_LOWER => 0x2000DCC6; # Lower UID bound for midlets installed to removable cards
-use constant INTERNAL_UID_LOWER_WRT => 0x2000DAD2;  # Lower UID bound for WRT widgets installed to internal drives and rom
-use constant INTERNAL_UID_LOWER_CWRT => 0x2000DBCC; # Lower UID bound for CWRT widgets installed to internal drives and rom
-use constant EXTERNAL_UID_LOWER_WRT => 0x2000DCC6;  # Lower UID bound for WRT widgets installed to removable cards
-use constant EXTERNAL_UID_LOWER_CWRT => 0x2000DDC0; # Lower UID bound for CWRT widgets installed to removable cards
-use constant WIDGET_UI_UID => 0x10282822;   # UID of the widget app
-use constant CWRT_WIDGET_UI_UID => 0x200267C0;    # UID of the cwrt widget app
-use constant SWIDGET_UI_UID => 0x102829A0;	# UID of the securewidget app
-use constant CWRT_WIDGET_UI_NON_NOKIA_UID => 0x200267D6;    # UID of the cwrt widget app
-
-# Folder paths
-use constant DESTINATION => 'private/10003a3f/import/apps/NonNative/Resource';
-use constant ROM_DEST => 'epoc32/release/winscw/udeb/Z/';
-use constant DRIVE_DEST => 'epoc32/winscw/%s';
-use constant WIDGET_REGISTRY => 'private/10282f06/WidgetEntryStore.xml';
-use constant CWRT_WIDGET_REGISTRY => 'private/10282f06/CWRTWidgetEntryStore.xml';
-use constant CWRT_WEBAPP_REGISTRY => 'private/200267D9/webapp_registry.db';
-use constant CWRT_ACCESS_POLICY_PATH => 'browser_access_policy.xml';
-use constant WIDGET_NAME => 'en-gb/widget/name';
-use constant WIDGET_PROCESSUID => 'processUid';
-use constant WIDGET_ID => 'widget/id';
-use constant WIDGET_VERSION => 'widget/version';
-use constant WIDGET_CONTENT => 'widget/content';
-use constant WIDGET_FEATURE => 'widget/feature/';
-use constant WIDGET_FEATURE_PARAM => '/param/';
-use constant WIDGET_ACCESS => 'widget/access/';
-use constant WIDGET_HEIGHT => 'widget/height';
-use constant WIDGET_WIDTH => 'widget/width';
-use constant WIDGET_NOKIA_SHAREDLIB => 'widget/NOKIA:sharedlibrary';
-use constant WIDGET_NOKIA_SHAREDLIB_FOLDER => 'widget/NOKIA:sharedlibrary/NOKIA:folder';
-use constant WIDGET_NOKIA_SHAREDLIB_WIDGET => 'widget/NOKIA:sharedlibrary/NOKIA:widget';
-use constant WIDGET_NOKIA_SHAREDLIB_ICON => 'widget/NOKIA:sharedlibrary/NOKIA:icon';
-use constant KEY_VALUE_SEPERATOR => ',';
-use constant KEY_VALUE_PAIR_SEPERATOR => ';';
-use constant KEY_ATTR_SEPERATOR => ':';
-
-our $w3c_widget = 0 ;
-our $hashval;
-our $non_nokia_widget = 0;
-our ($isSharedLibrary, $sharedFolderName ,$isSharedWidget, $isSharedIcon)= (0,'',0,0);
-our (@staticUidWrtIntList,@staticUidCwrtIntList,@staticUidWrtExtList,@staticUidCwrtExtList) = ({},{},{},{});
-our $isSecureWidget = 0;
-
-# Create a new object
-sub new
-  {
-  my $invocant = shift;
-  my $self = bless({}, ref $invocant || $invocant);
-
-  my %args = @_;
-  $self->{'args'} = \%args;
-  $self->{'args'}->{'verbose'} = $self->{'args'}->{'verbose'} ? '-v' : '';
-
-  $self->{'installedFiles'} = ();
-  $self->{'freeuidwrtint'} = INTERNAL_UID_LOWER_WRT;
-  $self->{'freeuidwrtext'} = EXTERNAL_UID_LOWER_WRT;
-  $self->{'freeuidcwrtint'} = INTERNAL_UID_LOWER_CWRT;
-  $self->{'freeuidcwrtext'} = EXTERNAL_UID_LOWER_CWRT;
-  $self->{'langmapping'} = $self->getLangMapping($self->{'args'}->{'lproj'}) unless $self->{'args'}->{'l10n'};
-  
-  #Check if localisation argument is land number ID; If true, get the lang Name using langmapping file - Widget_lproj.xml 
-  if ($l10n =~ /\d+$/)
-  {
-    print "\nLANG ID given as localisation argument :: $l10n \n";
-    $self->{'langmapping'} = $self->getLangMapping();
-    
-    if($self->{'langmapping'})
-    {
-      # Iterate through all the languages we know about
-      for(my $i = 0; $i < scalar(@{ $self->{'langmapping'}->{LangID} }); $i++)
-      {
-        my ( $langid, $langname ) = ( $self->{'langmapping'}->{LangID}->[$i], $self->{'langmapping'}->{LangDir}->[$i] );
-        if($l10n == $langid)
-        {
-          print "Setting argument to LangName - $langname \n";
-          $self->{'args'}->{'l10n'} = lc($langname);
-          last;
-        }
-      }
-    }
-  }
-
-  return $self;
-  }
-  
-# Gets the language mapping from the Widget_lproj.xml file
-sub getLangMapping
-  {
-  my ( $self, $lproj ) = @_;
-
-  # Get the LPROJ file which specifies lang id mappings
-  if (!$lproj)
-    {
-    (my $EPOCROOT = $ENV{EPOCROOT}) =~ s/[\/\\]+$//;
-    $lproj = WidgetInstaller::fixFilename("${epocroot}epoc32/winscw/c/private/10282f06/Widget_lproj.xml");
-    $lproj = WidgetInstaller::fixFilename("$EPOCROOT/epoc32/winscw/c/private/10282f06/Widget_lproj.xml") if !-e $lproj;
-    $lproj = WidgetInstaller::fixFilename("${epocroot}epoc32/data/Z/private/10282f06/Widget_lproj.xml") if !-e $lproj;
-    $lproj = WidgetInstaller::fixFilename("$EPOCROOT/epoc32/data/Z/private/10282f06/Widget_lproj.xml") if !-e $lproj;
-    $lproj = WidgetInstaller::fixFilename("${epocroot}S60/mw/web/WebEngine/WidgetRegistry/Data/Widget_lproj.xml") if !-e $lproj;
-    $lproj = WidgetInstaller::fixFilename("$EPOCROOT/S60/mw/web/WebEngine/WidgetRegistry/Data/Widget_lproj.xml") if !-e $lproj;
-    $lproj = WidgetInstaller::findCmd('Widget_lproj.xml') if !-e $lproj;
-    $lproj = WidgetInstaller::findCmd('internal/Widget_lproj.xml') if !-e $lproj;
-    undef $lproj if !-e $lproj;
-
-    # Display a warning if localisation can't be performed
-    warn "WARNING: Can't find Widget_lproj.xml - localisation is disabled.\n" if !$lproj;
-    }
-
-  # Load the mapping file
-  if ($lproj)
-    {
-    die "Can't find $lproj file." if !-e $lproj;
-    print "Localisation support enabled using config: $lproj\n" if $verbose;
-    my $mapping = XMLin($lproj);
-    print "Found ", scalar(@{ $mapping->{'LangID'} }), " language mappings.\n" if $verbose;
-    return $mapping;
-    }
-  }
-
-# Install Widgets listed in config file
-# Format is as follows where "drive-z" specifies widgets for drive z: etc...
-# Comments are okay - they start with a # character
-# If the file doesn't exist as given then EPOCROOT is prepended to the filename to try and find it
-#
-# You can specify whether a widget is intended for the homescreen by adding the text [HomeScreen] after the filename
-# This will set the BlanketPermissionGranted attribute in the registry.
-# Widgets intended for the homescreen must have the MiniViewEnabled attribute set in its PLIST file otherwise an error is generated.
-#
-# You can specify commands to run before exit after a [run-commands] or [homescreen-processor] 
-#
-# [drive-z]
-# \path\widget1.wgz
-# widget2.wdgt.zip [HomeScreen]
-#
-# [drive-e]
-# widget3.wgz
-#
-# [run-commands]
-# dostuff.pl
-#
-
-sub installConfig
-  {
-  my ( $self, $file ) = @_;
-  $self->{'installedFiles'} = ();
-
-  my ( %installData, $sectionName );
-  open CONFIG, $file or die "Failed to open config file $file: $!";
-  
-  # Loop for gathering STATIC UIDs allocated for widgets in config INI file
-  while(my $line = <CONFIG>)
-  {
-    # Ignore comments
-    $line =~ s/\#.*$//;
-    
-    if ($line =~ /^\[([^\]]+)\]/)
-      {
-      $sectionName = lc $1;
-      next;
-      }
-
-    # Process sections after this point
-    next if !$sectionName;
-    chomp $line;
-
-    # Have we found a list of widgets?
-    if ($sectionName =~ /^drive-([a-z])/)
-    {
-      my $drive = uc($1);
-      #Assuming Static UID given in ini are within int/ext/wgt/wgz specified ranges
-      # Add Static UID to the respective list
-      if ($line =~ /^(.+?\.(?:wdgt\.zip|wgz|wgt))\s*(\[HomeScreen\])?\s*(0x[a-fA-F0-9]{8})?\s*(\[Operator\])?\s*$/i)
-      {
-        if ($3)
-        {
-          my $uid = hex($3);
-          
-          if ($drive =~ /^[zcZC]/)
-          {
-            if(($uid >= INTERNAL_UID_LOWER_WRT) && ($uid < INTERNAL_UID_LOWER_CWRT))
-            {
-              push(@staticUidWrtIntList,$uid) ;
-            }
-            else
-            {
-              push(@staticUidCwrtIntList,$uid);
-            }
-          }
-          else
-          {
-            if(($uid >= EXTERNAL_UID_LOWER_WRT) && ($uid < EXTERNAL_UID_LOWER_CWRT))
-            {
-              push(@staticUidWrtExtList,$uid) ;
-            }
-            else
-            {
-              push(@staticUidCwrtExtList,$uid) ;
-            }
-          }
-        }
-      }
-    }
-  }
-  close CONFIG;
-  @staticUidWrtIntList = sort(@staticUidWrtIntList);
-  print "SORTED WRT INTERNAL STATIC UID  @staticUidWrtIntList \n";
-  @staticUidCwrtIntList = sort(@staticUidCwrtIntList);
-  print "SORTED CWRT INTERNAL STATIC UID  @staticUidCwrtIntList \n";
-  @staticUidWrtExtList = sort(@staticUidWrtExtList);
-  print "SORTED WRT EXTERNAL STATIC UID @staticUidWrtExtList \n";
-  @staticUidCwrtExtList = sort(@staticUidCwrtExtList);
-  print "SORTED CWRT EXTERNAL STATIC UID @staticUidCwrtExtList \n";
-  
-  open CONFIG, $file or die "Failed to open config file $file: $!";
-  # Main loop which reads the config INI line by line and installs widgets[wgz/wgt] in respective drives
-  while(my $line = <CONFIG>)
-    {
-    # Ignore comments
-    $line =~ s/\#.*$//;
-
-    if ($line =~ /^\[([^\]]+)\]/)
-      {
-      $sectionName = lc $1;
-      
-      # Remember destination if any specified
-      if ($sectionName =~ /^drive-([a-z])=(.+)$/)
-        {
-        $self->{'destination'}->{uc($1)} = $2;
-        }
-      next;
-      }
-
-    # Process sections after this point
-    next if !$sectionName;
-    chomp $line;
-
-    # Have we found a list of widgets?
-    if ($sectionName =~ /^drive-([a-z])/)
-      {
-      my $drive = uc($1);
-      
-      # Add to the list of Widget files
-      if ($line =~ /^(.+?\.(?:wdgt\.zip|wgz|wgt))\s*(\[HomeScreen\])?\s*(0x[a-fA-F0-9]{8})?\s*(\[Operator\])?\s*$/i)
-        {
-        my $widget = $1;
-        $widget = fixFilename(catfile($self->{'args'}->{'epocroot'}, $1)) if !-e $widget;
-        die "Can't find widget $widget" if !-e $widget;
-        $self->{'homescreen'}{lc $widget} = 1 if $2; # Intended for the homescreen?
-        $self->{'staticUID'}{lc $widget} = hex($3) if $3;
-        $self->{'secure'}{lc $widget} = 0;
-        $self->{'operator'}{lc $widget} = 1 if $4;
-        print "Widget for drive $drive: $widget\n" if $self->{'args'}->{'verbose'};
-        push @{ $installData{"$drive:"} }, $widget;
-        }
-      elsif ($line =~ /^(.+?\.(?:wdgt\.zip|wgz))\s*(\[Secure\])?\s*(0x[a-fA-F0-9]{8})?\s*$/i)
-        {
-          my $widget = $1;
-          $widget = fixFilename(catfile($self->{'args'}->{'epocroot'}, $1)) if !-e $widget;
-          die "Can't find widget $widget" if !-e $widget;
-          $self->{'secure'}{lc $widget} = 1 if $2; # Intended for a secure widget handling?
-          $self->{'staticUID'}{lc $widget} = hex($3) if $3;
-          print "Widget for drive $drive: $widget\n" if $self->{'args'}->{'verbose'};
-          push @{ $installData{"$drive:"} }, $widget;
-        }
-      else
-      	{
-      		my $widget = $1;
-      		$self->{'secure'}{lc $widget} = 0;
-        }	
-      }
-    # Retrieve the command to execute before exit
-    elsif ($sectionName =~ /^(run-commands|homescreen-processor)$/i && $line)
-      {
-      push @{ $self->{'exitcmds'} }, $line;
-      }
-    }
-  close CONFIG;
-
-  # Now intall the widgets for each drive specified in the config file
-  foreach my $drive ( keys %installData )
-    {
-    $self->installFiles($drive, $installData{$drive} );
-    $self->makeIBY($drive);
-    $self->makeIBY($drive, 'localised') unless $self->{'args'}->{'l10n'};
-    }
-  
-  # Exit commands at the end of the process
-  if ($self->{'exitcmds'})
-    {
-    foreach my $cmd ( @{ $self->{'exitcmds'} } )
-      {
-      print "Executing: $cmd\n" if $self->{'args'}->{'verbose'};
-      warn "WARNING: error running $cmd" if system($cmd) != 0;
-      }
-    }
-  }
-
-# ***
-# Installs files to a drive
-#
-sub installFiles
-  {
-  my ( $self, $drive, $fileList ) = @_;
-  my $startsrc ;
-    my $iconsrc ;
-  
-   $isSharedLibrary = 0;
-   $isSharedWidget = 0;
-   $isSharedIcon = 0;
-   $sharedFolderName ='';
-   $isSecureWidget = 0;
-    
-  print "Installing files for drive $drive\n" if $self->{'args'}->{'verbose'};
-
-  # Unregister any existing widgets as otherwise when the registry is rewritten their icons will appear in the emulator but they won't work
-  $self->unregisterWidgets($drive);
-
-  print "\n			INSTALLING FILES FOR DRIVE $drive				\n"; 
-  # Process each widget in turn
-  my ( @installedProps );
-  my ( @installedCWRTProps );
-  foreach my $filename ( @$fileList )
-    {
-    # Check the file exists
-    die "Can't find $filename" if !-e $filename;
-
-    # Create a temporary folder
-    print "\nInstalling $filename\n";
-    my $tempdir = tempdir ( DIR => '.', CLEANUP => !$self->{args}->{'debug'});
-
-    # Prefer to use 7zip rather than unzip because it's better behaved wrt Unicode
-    if (findCmd('7z.exe'))
-      {
-      $self->un7zipWidget($filename, $tempdir);
-      }
-    else
-      {
-      $self->unzipWidget($filename, $tempdir);
-      }
-        my $widgetdata ;
-        
-        $isSharedLibrary = 0;
-        $isSharedWidget = 0;
-        $isSharedIcon = 0;
-        $sharedFolderName ='';
-    
-    my ( $root, $extracted, $size ) = $self->getFiles($tempdir);
-    die "No files extracted from $filename" if !@$extracted;
-    
-    if ($self->{'operator'}{lc $filename})
-		{
-    	print "\n NON NOKIA WGT \n";
-    	$non_nokia_widget = 1;
-    }
-    else
-    {
-    	print "\n NOKIA WGT \n";
-    	$non_nokia_widget = 0;
-    }
-    
-    
-    if (($filename =~ /.wgz/ )&& (my $plist = catfile($tempdir, $root, 'Info.plist')))
-      {
-          print ("S60 widget \n");
-          
-          $w3c_widget = 0;
-          # Parse the XML file into a hash
-              $widgetdata = parsePList($plist);
-      }
-    elsif (($filename =~ /.wgt/ ) && ( my $confxml = catfile($tempdir, $root, 'config.xml')))
-      {
-        print (" W3C widget \n"); 
-      
-          # Parse the XML file into a hash
-            $widgetdata = parseConfXml($confxml,$self->{'args'}->{'l10n'});
-            $w3c_widget = 1;
-      }
-    else
-      {
-      die "Can't find $root/Info.plist , $root/config.xml file";
-      }       
-		
-	  if ($self->{'secure'}{lc $filename}){
-		$isSecureWidget = 1;
-	  } else {
-	  	$isSecureWidget = 0;
-	  }
-
-    if( $w3c_widget )
-    { 
-      if( $widgetdata->{'MainHTML'} )
-        {
-        $startsrc = $widgetdata->{'MainHTML'};
-        }
-      else
-        {
-        $startsrc = 'index.html';
-        }
-      if( $widgetdata->{'IconPath'} )
-        {
-        $iconsrc = $widgetdata->{'IconPath'};
-        }
-      else
-        {
-        $iconsrc = 'icon.png';   
-        }
-        
-  		if($non_nokia_widget)
-  		{
-  			$widgetdata->{'ProcessUid'} = CWRT_WIDGET_UI_NON_NOKIA_UID;
-  		}
-  		else
-  		{
-      		$widgetdata->{'ProcessUid'} = CWRT_WIDGET_UI_UID;
-      	}
-      
-      $widgetdata->{'MimeType'} = "application/widget";
-    }         
-
-    print "Identifier: $widgetdata->{'BundleIdentifier'}\n" if $self->{args}->{'verbose'};
-    
-    # Set widget package properties
-    $widgetdata->{'FileName'} = $filename;
-    $widgetdata->{'FileSize'} = $size;
-
-    # Load the language translations for BundleDisplayName
-    if ($self->{'args'}->{'l10n'})
-      {
-      my $localised = $self->getLocalisedStringByLangCode(catfile($tempdir, $root), 'DisplayName', $self->{'args'}->{'l10n'});
-      $widgetdata->{'BundleDisplayName'} = $localised if $localised;
-      }
-    else
-      {
-      $widgetdata->{'LocBundleDisplayName'} = $self->getLocalisedStrings(catfile($tempdir, $root), 'DisplayName');
-      }
-
-    # Fix up some of the fields
-    $widgetdata->{'BundleName'} = $widgetdata->{'BundleDisplayName'} if !$widgetdata->{'BundleName'};
-    $widgetdata->{'AllowNetworkAccess'} = $widgetdata->{'AllowFullAccess'} if !$widgetdata->{'AllowNetworkAccess'};
-    $widgetdata->{'DriveName'} = $drive;
-    
-    if( $w3c_widget )
-      {
-      $widgetdata->{'PropertyListVersion'} = 4;
-      my $widget_uid;
-      
-      if($non_nokia_widget)
-  		{
-  			$widget_uid = CWRT_WIDGET_UI_NON_NOKIA_UID;
-  		}
-  		else
-  		{
-      	$widget_uid = CWRT_WIDGET_UI_UID;
-      }
-      
-      if($isSharedLibrary)
-      {
-        #In case of NOKIA:sharedlibrary, the extracted widget contents and data source are stored under private\<uid>\..\lib\<sharedfoldername>\
-        $widgetdata->{'BasePath'} = sprintf('%s\\private\\%08X\\%s\\%s\\%s\\', $widgetdata->{'DriveName'}, $widget_uid, "widgets_21D_4C7","lib",$sharedFolderName);
-        $widgetdata->{'IconPath'} = sprintf('%s\\private\\%08X\\%s\\%s\\%s\\',$widgetdata->{'DriveName'}, $widget_uid, "data" ,"lib" ,$sharedFolderName);
-      }
-      else
-      {
-        $widgetdata->{'BasePath'} = sprintf('%s\\private\\%08X\\%s\\%s\\', $widgetdata->{'DriveName'}, $widget_uid, "widgets_21D_4C7", hashpjw($widgetdata->{'BundleIdentifier'}));
-        $widgetdata->{'IconPath'} = sprintf('%s\\private\\%08X\\%s\\%s\\',$widgetdata->{'DriveName'}, $widget_uid, "data" , hashpjw($widgetdata->{'BundleIdentifier'}));
-      }
-      $widgetdata->{'MainHTML'} = "$widgetdata->{'BasePath'}$startsrc";
-      $widgetdata->{'AllowNetworkAccess'} = 1;
-      
-      }
-    else
-      {
-      $widgetdata->{'PropertyListVersion'} = 1;
-      $widgetdata->{'BasePath'} = sprintf('%s\\private\\%08x\\%s\\', $widgetdata->{'DriveName'}, WIDGET_UI_UID, $widgetdata->{'BundleIdentifier'});
-      $widgetdata->{'MainHTML'} = "$widgetdata->{'BasePath'}$root\\$widgetdata->{'MainHTML'}";
-      $widgetdata->{'IconPath'} = "$widgetdata->{'BasePath'}$root\\";
-      }
-      
-    $widgetdata->{'BlanketPermissionGranted'} = 0 if( ! $widgetdata->{'BlanketPermissionGranted'} );
-    $widgetdata->{'MiniViewEnabled'} = 0  if( ! $widgetdata->{'MiniViewEnabled'} );
-    
-    # Indicate that the widget was pre-installed
-    $widgetdata->{'PreInstalled'} = 1;
-    
-    # Set BlanketPermissionGranted flag if Widget is listed as a homescreen widget in the INI file
-    # Error if MiniViewEnabled isn't set
-    if ($self->{'homescreen'}{lc $filename})
-      {
-      $widgetdata->{'BlanketPermissionGranted'} = 1;
-      die "ERROR: $filename - MiniViewEnabled not set for homescreen widget" if !$widgetdata->{'MiniViewEnabled'};
-      }
-
-    # Defining UID  
-    if($self->{'staticUID'}{lc $filename})
-      {
-      print "Using Static UID from INI file\n";
-      $widgetdata->{'Uid'} = $self->{'staticUID'}{lc $filename};
-      }
-    else
-      {
-      # Find the next free UID to use
-      $widgetdata->{'Uid'} = $self->findfreeUid($widgetdata);
-      }
-    print sprintf("Using UID for midlet: 0x%08X\n", $widgetdata->{'Uid'}) if $self->{args}->{'verbose'};
-
-    # Make sure the destination exists
-    my $dest = $self->regFileName($drive);
-    mkpath $dest;
-
-    my $icon;
-    if($w3c_widget)
-    {
-      my $locate = $self->{'args'}->{'l10n'};
-      my $seperator ='-';
-      my $position = -1;
-      my $found = 0 ;
-      if ($self->{'args'}->{'l10n'})
-          {
-            do
-               {
-                my $searchdir = '.\\'.$tempdir.'\\locales\\'.$locate;
-                if( opendir(DIR, $searchdir))
-                    {
-                    my @files = grep(/$iconsrc$/,readdir(DIR));
-                    closedir(DIR);
-                    if(@files)
-                       {
-                        $iconsrc = 'locales\\'.$locate.'\\'.$iconsrc ;
-                        $found = 1;
-                       }
-                    }  
-                if(($position = rindex($locate,$seperator)) > 0 )
-                    {
-                    $locate = substr($locate,0,$position);
-                    }
-               } while (!$found && $position > 0);
-          }
-          if ($iconsrc)
-          {
-            $icon = catfile($tempdir, $root, $iconsrc);    
-          }
-            
-          if(-e $icon)
-          {
-             $widgetdata->{'DBIconPath'}= "$widgetdata->{'BasePath'}$iconsrc";
-             print "Icon found -- $widgetdata->{'DBIconPath'} \n";
-          }
-          else
-          {
-              $icon = findCmd('default_widget_icon.png');
-              print "default_widget_icon.png used \n";    
-              $widgetdata->{'DBIconPath'}= ":/resource/default_widget_icon.png";
-          }
-      }
-    else
-    {
-      $icon = catfile($tempdir, $root, 'Icon.png');
-            die "ERROR: Widget bundle must include an Icon.png file in $root directory.\n" unless -e $icon;
-    }
-    
-    # Create the MBM file icon - in case of sharedlibrary, create only if NOKIA:widget is true
-    my $mbm;
-    
-    print("\nIs shared library - $isSharedLibrary \nIs sharedlib widget - $isSharedWidget \nIs Secure WGZ - $self->{'secure'}{lc $filename}\n");
-    
-		if( ((!$isSharedLibrary) || ($isSharedLibrary && $isSharedWidget)) && (!$self->{'secure'}{lc $filename}))
-    {
-    	  print "Creating mbm !!!\n";
-        die "ERROR: Can't find PNG2MBM command in PATH." if !(my $cmd = findCmd('png2mbm.exe'));
-        $mbm = $self->regFileName($drive, sprintf("[%08x].mbm", $widgetdata->{'Uid'}));
-        print "Generating: $mbm\n";
-                    die "Failed to create MBM $mbm " if system("$cmd $self->{args}->{'verbose'} -in \"$icon\" -out $mbm -sizes ".ICON_SIZES) != 0;
-    
-        # Add the mbm to the list of files
-        $self->addToRomList($drive, $mbm);
-    
-        # Create the INI file which defines the registry info
-        my $ini = catfile($tempdir, 'reg.ini');
-        $self->makeIni($widgetdata, $ini);
-        unlink 'debug.ini'; copy($ini, 'debug.ini') if $debug;
-        print "Generated INI file: $ini\n" if $self->{args}->{'verbose'};
-    
-        # Generate the registry files
-        die "ERROR: Can't find WidgetRegFiles.exe command in PATH." if !($cmd = findCmd('WidgetRegFiles.exe'));
-        die "Failed to generate registry files" if system("$cmd $ini") != 0;
-        my ( $reg, $loc ) = ( catfile($dest, sprintf("%08x_reg.rsc", $widgetdata->{'Uid'})), catfile($dest, sprintf("%08x_loc.rsc", $widgetdata->{'Uid'})) );
-        die "Failed to generate REG file: $!" if !-e $reg;
-        $self->addToRomList($drive, $reg);
-        die "Failed to generate LOC file: $!" if !-e $loc;
-        if ($self->{'args'}->{'l10n'})
-          {
-              $self->addToRomList($drive, $loc);
-          }
-        else
-          {
-              $self->addToRomList($drive, $loc, 'localised');
-          }
-        }
-        
-    # Create install folder
-    my $dir = $self->installDir($drive, $widgetdata->{'BundleIdentifier'});
-    mkpath $dir;
-
-    # Now copy the widget files to the right place
-    print "Install Directory: $dir\n";
-    foreach my $widgetfile ( @$extracted )
-    {
-      my ( $sourceFile, $destFile ) = ( catfile($tempdir, $widgetfile), catfile($dir, $widgetfile) );
-      print "Copying $sourceFile to $destFile\n" if $self->{args}->{'debug'};
-
-      # Create the directory if it doesn't exist already
-      my $dir = dirname($destFile);
-      if (!-d $dir)
-        {
-        mkpath ($dir) or die "Failed to create $dir $!";
-        }
-      unlink $destFile;
-      if (!copy($sourceFile, $destFile))
-        {
-        warn "WARNING: Failed to copy $sourceFile to $destFile: $!";
-        }
-      #else
-        {
-        $self->addToRomList($drive, $destFile);
-        }
-    }
-
-    # Copy the MBM file into the widget install directory
-    # because native installation does and uses it after
-    # installation to manage UID consistency.
-    if( (!$isSharedLibrary) || ($isSharedLibrary && $isSharedWidget))
-    {
-        my $mbmName = sprintf("[%08x].mbm", $widgetdata->{'Uid'});
-        my $destFile;
-        if($w3c_widget)
-        {
-            my $dataDir;
-            
-            my $widget_uid;
-      
-			      if($non_nokia_widget)
-			  		{
-			  			$widget_uid = CWRT_WIDGET_UI_NON_NOKIA_UID;
-			  		}
-			  		else
-			  		{
-			      	$widget_uid = CWRT_WIDGET_UI_UID;
-			      }
-            
-            # NOKIA:sharedlibrary check
-            if($isSharedWidget)
-            {
-                $dataDir = fixFilename(catfile($self->destLocation($drive), 'private', sprintf("%08X", $widget_uid),"data","lib",$sharedFolderName));
-            }
-            else
-            {
-                #in case of WGT copy .mbm to \epoc32\winscw\C\private\200267c0\data\hash<BundleId>\
-                $dataDir = fixFilename(catfile($self->destLocation($drive), 'private', sprintf("%08X", $widget_uid),"data", $hashval));
-            }
-            mkpath $dataDir;
-            $destFile = catfile($dataDir,$mbmName);
-        }
-        else
-        {
-           $destFile = catfile($dir, $root, $mbmName);
-        }
-    		# Exclude securewidget from making a mbm file
-			if (!$self->{'secure'}{lc $filename}){
-            print "Copying $mbm to $destFile\n" if $self->{args}->{'debug'};
-            copy $mbm, $destFile or die "Failed to copy $mbm to $destFile: $!";
-            $self->addToRomList($drive, $destFile);
-          	}
-        }
-        
-    # Remember the data for the registry
-    if( $w3c_widget )
-      {
-      push @installedCWRTProps, $widgetdata;
-      }
-    else
-      {
-	    if (!$self->{'secure'}{lc $filename}){
-      		push @installedProps, $widgetdata;
-      	}
-      }
-
-    if (!$debug)
-      {
-      # Perl v5.6 can't delete files with unicode in their name on Windows
-      if ($] < 5.008 && $^O =~ /MSWin32/)
-        {
-        system("rmdir /s /q $tempdir");
-        }
-      else
-        {
-        rmtree $tempdir;
-        }
-      }
-    #Generate the secsession for .wgt widgets
-    if( $w3c_widget ) 
-      {
-      $self->addToRomList($drive, $self->makeSecSession($drive));
-      }
-  }
-
-  my $cwrtdbPath = catfile($self->destLocation($drive), CWRT_WEBAPP_REGISTRY);
-  $self->addToRomList($drive, $cwrtdbPath);
-  
-  # Generate the registry and IBY file
-  $self->addToRomList($drive, $self->makeRegistry($drive, \@installedProps, 0));
-  $self->addToRomList($drive, $self->makeRegistry($drive, \@installedCWRTProps, 1));
-    
-
-  print "\n\n %%%%%          WIDGET PRE-INSTALLATION completed for Drive $drive          %%%%% \n\n";
-  }
-
-sub un7zipWidget
-  {
-  my ( $self, $filename, $tempdir ) = @_;
-
-  # Unzip the file
-  die "Can't find 7z.exe tool on PATH." if !findCmd('7z.exe');
-  die "Failed to extract widget contents using 7zip: $!" if (system("7z x -aoa -o$tempdir \"$filename\" >nul 2>&1") != 0);
-  }
-
-sub unzipWidget
-  {
-  my ( $self, $filename, $tempdir ) = @_;
-
-  # Unzip the file
-  die "Can't find unzip.exe tool on PATH." if !findCmd('unzip.exe');
-  die "Failed to extract widget contents using zip: $!" if (system("unzip.exe \"$filename\" -d $tempdir >nul 2>&1") != 0);
-  }
-
-# Recursively get list of files in a folder
-sub getFiles
-  {
-  my ( $self, $tempdir ) = @_;
-
-  my $root = '.';
-  my @extracted;
-  my $size =0;
-  
-  my @dirs = '.';
-  foreach my $dir ( @dirs )
-    {
-    opendir DIR, catfile($tempdir, $dir) or die "Failed to opendir $dir: $!";
-    foreach ( grep !/^\.{1,2}$/, readdir DIR )
-      {
-      my $name = catfile($dir, $_);
-      my $fullname = catfile($tempdir, $name);
-      if (-d $fullname)
-        {
-        push @dirs, $name;
-        }
-      else
-        {
-        # Remember total size for later
-        if (-e $fullname)
-          {
-          push @extracted, $name;
-          print "Extracted: $name\n" if $self->{args}->{'debug'};
-          $size += -s $fullname;
-
-          # Get root
-          if ($name =~ /info.plist$/i && $name =~ /^([^\/\\]+)[\/\\]/)
-            {
-            $root = $1;
-            }
-          }
-        else
-          {
-          warn "WARNING: Failed to find extracted file $fullname";
-          }
-        }
-      }
-    closedir DIR;
-    }
-
-  return ( $root, \@extracted, $size );
-  }
-
-## see http://www.loc.gov/standards/iso639-2/php/code_list.php
-## see http://www.loc.gov/standards/iso639-2/faq.html#2
-sub getLocalisedStringByLangCode
-  {
-  my ( $self, $dir, $strName, $langCode ) = @_;
-  my $localised;
-
-  # Generate the name of the file containing localised strings for this language
-  my $locfile = catfile($dir, "$langCode.lproj", "InfoPlist.strings");
-  if (-e $locfile)
-        {
-    # Open the file
-    print "Found $langCode language translations in $locfile\n" if $verbose;
-    open LOC, $locfile or die "Failed to open $locfile: $!";
-
-    # Get the byte order mark from the start of the file
-    my $bom;
-    $bom = unpack("S", $bom) if (read(LOC, $bom, 2) == 2);
-    if ($bom)
-      {
-      if ($bom == 0xEFBB)
-        {
-        # Skip utf8 bom
-        seek LOC, 3, 0;
-        }
-      elsif ($bom != 0xFFFE && $bom != 0xFEFF)
-        {
-        seek LOC, 0, 0;
-        undef $bom;
-        }
-      }
-    else
-      {
-      # go back to start of file if no bom
-      seek LOC, 0, 0;
-      undef $bom;
-      }
-
-    while(my $line = <LOC>)
-      {
-      # Do unicode conversion
-      my $ustr;
-      if ($bom)
-        {
-        $ustr = utf16($line);
-        $ustr->byteswap if $bom != 0xFFFE;
-        }
-      else
-        {
-        $ustr = utf8($line);
-        }
-
-      # Find the string we're looking for
-      if ($ustr->utf8 =~ /(?:^|\s)$strName\s*=\s*\"([^\"]*)\"/)
-        {
-        print "\t...$strName => $1\n" if $debug;
-        $localised = utf8($1);
-        }
-      }
-    close LOC;
-    }
-    return $localised;
-  }
-
-# Get localised version of strings if they exist
-sub getLocalisedStrings
-  {
-  my ( $self, $dir, $strName ) = @_;
-  return if (!$self->{'langmapping'});
-
-  # Iterate through all the languages we know about
-  my %result;
-  for(my $i = 0; $i < scalar(@{ $self->{'langmapping'}->{LangID} }); $i++)
-    {
-    my ( $langid, $langname ) = ( $self->{'langmapping'}->{LangID}->[$i], $self->{'langmapping'}->{LangDir}->[$i] );
-
-    my $localised = $self->getLocalisedStringByLangCode($dir, $strName, $langname);
-    $result{$langid} = $localised if $localised;
-    }
-
-  return \%result if keys %result;
-  }
-
-# Find and execute a command
-sub findCmd
-  {
-  my $cmd = shift;
-  return fixFilename("./$cmd") if -e $cmd;
-
-  # PATH separator differs on Windows and Linux
-  my $sep = $^O =~ /MSWin32/ ? ';' : ':';
-
-  # Search each entry in the PATH
-  my @paths = split /$sep/, $ENV{PATH};
-  push @paths, dirname($0);
-  foreach my $path ( @paths )
-    {
-    my $fullcmd = fixFilename(catfile($path, $cmd));
-    return $fullcmd if -e $fullcmd;
-    }
-  }
-
-# Make INI file describing widget - this is passed to widgetregfiles.exe
-sub makeIni
-  {
-  my ( $self, $data, $file ) = @_;
-  open INI, ">$file" or die "Failed to open $file for writing: $!";
-  binmode INI, ":utf8" if $] >= 5.008;
-
-  # Get directory where mbm should go
-  my $dir = $self->regFileName($data->{'DriveName'});
-
-  print INI "[app_registration_info]\n";
-  print INI sprintf("uid=%08x\n", $data->{'Uid'});
-  print INI "app_file=$data->{'MainHTML'}\n";
-  print INI "caption=$data->{'BundleDisplayName'}\n";
-  print INI "drive_name=$data->{'DriveName'}\n";
-  print INI "results_dir=$dir\n";
-  
-  if( $w3c_widget )
-  {
-    print INI "app_type=200267DC\n";
-    print " WGT Widget:: app_type added to ini of widgetregfiles.exe \n" if $debug;
-  }
-  
-
-  # Add language stuff if we have the mapping
-  if ($data->{'LocBundleDisplayName'})
-    {
-    my @langList;
-    foreach my $langid ( sort { $a <=> $b } keys %{ $data->{'LocBundleDisplayName'} } )
-      {
-      my $symid = sprintf("%02d", $langid);
-      push @langList, $symid;
-      print INI "caption$symid=", $data->{'LocBundleDisplayName'}->{$langid}->utf8, "\n";
-      }
-    print INI "languages=", join(' ', @langList), "\n";
-    }
-
-  close INI;
-  convert2Unicode($file);
-  }
-
- sub findfreeUid
-  {
-  my ( $self, $data ) = @_;
-  my $appfile = lc $data->{'MainHTML'};
-  my $uid;
-  my $size;
-    if($w3c_widget)     #CWRT Widget
-    {
-      # pick the next free CWRT Internal UID
-      if(isInternal($data->{'DriveName'}))
-      {
-        print "\nInternal CWRT UID";
-        $size = scalar @staticUidCwrtIntList;
-        print " Static UID :: @staticUidCwrtIntList Length -- $size \n" if($size);
-        for(my $i=0; $i<$size; $i++)
-        {
-		  #skip looping if freeUid found
-          if( $self->{'freeuidcwrtint'} lt $staticUidCwrtIntList[$i] ) {last};
-          
-          if($self->{'freeuidcwrtint'} == $staticUidCwrtIntList[$i]) 
-          { 
-            $self->{'freeuidcwrtint'}++; 
-          }
-        }
-        $uid = $self->{'freeuidcwrtint'}++;   # Assign and then set next free UID
-      } 
-      else
-      {
-        # pick the next free CWRT External UID
-        print "\nExternal CWRT UID ";
-        $size = scalar @staticUidCwrtExtList;
-        print "Static UID :: @staticUidCwrtExtList Length -- $size \n";
-        
-        for(my $i=0; $i<$size; $i++)
-        {
-          if( $self->{'freeuidcwrtext'} lt $staticUidCwrtExtList[$i] ) {last};
-          
-          if($self->{'freeuidcwrtext'} == $staticUidCwrtExtList[$i]) 
-          { 
-            $self->{'freeuidcwrtext'}++; 
-          }
-        }
-        $uid = $self->{'freeuidcwrtext'}++;   # Assign and then set next free UID
-      }
-    }
-    else      #WRT widget
-    {
-      # pick the next free WRT Internal UID
-      if(isInternal($data->{'DriveName'}))
-      {
-        # pick the next free CWRT Internal UID
-        if(isInternal($data->{'DriveName'}))
-        {
-          print "\nInternal WRT UID ";
-          $size = scalar @staticUidWrtIntList;
-          print " STATIC UID :: @staticUidWrtIntList Length -- $size\n";
-                 
-          for(my $i=0; $i<$size; $i++)
-          {
-            if( $self->{'freeuidwrtint'} lt $staticUidWrtIntList[$i] ) {last};
-            
-            if($self->{'freeuidwrtint'} == $staticUidWrtIntList[$i]) 
-            { 
-              $self->{'freeuidwrtint'}++; 
-            }
-          }
-          $uid = $self->{'freeuidwrtint'}++;   # Assign and then set next free UID
-        }
-      }
-      else
-      {
-        # pick the next free WRT External UID
-        print "\nExternal WRT UID ";
-        $size = scalar @staticUidWrtExtList;
-        print "STATIC UID :: @staticUidWrtExtList Length -- $size\n";
-        
-        for(my $i=0; $i<$size; $i++)
-        {
-          if( $self->{'freeuidwrtext'} lt $staticUidWrtExtList[$i] ) {last};
-          
-          if($self->{'freeuidwrtext'} == $staticUidWrtExtList[$i]) 
-          { 
-            $self->{'freeuidwrtext'}++; 
-          }
-        }
-        $uid = $self->{'freeuidwrtext'}++;   # Assign and then set next free UID
-      }
-    }
-  print sprintf("Generated UID: hex->0x%08X dec->$uid\n \n",$uid);
-  return $uid;
-  }
-
-# Fix slash problems in a filename
-sub fixFilename
-  {
-  my $filename = shift;
-  $filename =~ s/([\\\/])[\\\/]/$1/g;
-  return catfile(split(/[\\\/]/, $filename));
-  }
-
-# Get install location
-sub destLocation
-  {
-  my ( $self, $drive ) = @_;
-  my $letter = uc(substr($drive, 0, 1));
-  
-  # Was any destination location specified in the config file?
-  if ($self->{destination} && $self->{destination}->{$letter})
-    {
-    return catfile($self->{'args'}->{'epocroot'}, $self->{destination}->{$letter});
-    }
-    
-  # No destination specified - use emulator location
-  return catfile($self->{'args'}->{'epocroot'}, $letter eq 'Z' ? ROM_DEST : sprintf(DRIVE_DEST, $letter));
-  }
-  
-# Get the destination for REG/LOC/MBM file
-sub regFileName
-  {
-  my ( $self, $drive, $filename ) = @_;
-  my $result = catfile($self->destLocation($drive), DESTINATION, $filename);
-  return fixFilename($result);
-  }
-
-# Widget install directory
-sub installDir
-  {
-  my ( $self, $drive, $id ) = @_;
-  my $result ;
-  $hashval = hashpjw($id);
-  if( $w3c_widget )
-  {
-  	my $widget_uid;
-    if($non_nokia_widget)
-	{
-		$widget_uid = CWRT_WIDGET_UI_NON_NOKIA_UID;
-	}
-	else
-	{
-		$widget_uid = CWRT_WIDGET_UI_UID;
-	}
-    if($isSharedLibrary)
-    {
-    	$result = catfile($self->destLocation($drive), 'private', sprintf("%08X", $widget_uid),"widgets_21D_4C7", "lib",$sharedFolderName);
-    }
-    else
-    {
-        $result = catfile($self->destLocation($drive), 'private', sprintf("%08X", $widget_uid),"widgets_21D_4C7", $hashval);
-    }
-  }
-  else
-      {
-	  	if ($isSecureWidget){
-	   		print "Installing secure WGZ Widget\n";
-	    	$result = catfile($self->destLocation($drive), 'private', sprintf("%08x", SWIDGET_UI_UID), $id);
-	  	} else {
-	   		print "Installing WGZ Widget\n";
-        	$result = catfile($self->destLocation($drive), 'private', sprintf("%08x", WIDGET_UI_UID), $id);
-	  	}
-      }    
-  return fixFilename($result);
-  }
-
-# Determines whether a drive should be considered internal or not
-sub isInternal
-  {
-  my $drive = shift;
-  die "Invalid drive format: $drive" if $drive !~ /^[a-zA-Z]:/;
-  return 1 if $drive =~ /^[zcZC]/;
-  }
-
-# Parse these awful PLIST files
-sub parsePList
-  {
-  my $file = shift;
-
-  # Create parser object
-  our ($key, $val, $plisthash ) = ('', '', {});
-  my $parser = new XML::Parser;
-  $parser->setHandlers('Doctype' => \&docT, 'Start' => \&startH, 'End' => \&endH, 'Char' => \&dataH);
-
-  # Parse the file
-  open XML, $file or die "Couldn't open $file";
-
-  # Skip the UTF8 BOM - perl 5.6 can't handle it
-  my $bom;
-  read XML, $bom, 3;
-  $bom = join('', map(sprintf('%X', $_), unpack("CCC", $bom)));
-  print "Testing the following for BOM: $bom\n" if $debug;
-  seek(XML, 0, 0) if $bom ne 'EFBBBF';
-
-  $parser->parse(*XML);
-  close XML;
-
-  # Check required fields exist
-  die "Widget MainHTML unknown" if !$plisthash->{'MainHTML'};
-  die "Widget BundleIdentifier unknown" if !$plisthash->{'BundleIdentifier'};
-  die "Widget BundleDisplayName unknown" if !$plisthash->{'BundleDisplayName'};
-
-  # Return result
-  return $plisthash;
-
-  # Called on a start tag
-  sub startH
-    {
-    my ($p, $el, %atts) = @_;
-    undef $key if ($el =~ /^key$/i);
-    $val = '';
-    }
-
-  # Receives document type
-  sub docT
-    {
-    my ($expat, $name, $sysid, $pubid, $internal ) = @_;
-    die "PLIST format looks wrong!" if lc($name) ne 'plist';
-    $plisthash->{'NokiaWidget'} = ( $pubid =~ m[^-//Nokia//DTD PLIST]i ) ? 1 : 0;
-    }
-
-  # Receives character data
-  sub dataH
-    {
-    my ($p, $s) = @_;
-    $val .= $s;
-    }
-
-  # Called on an end tag
-  sub endH
-    {
-    my ($p, $el) = @_;
-    if ($el =~ /^key$/i)
-      {
-      $key = $val;
-      }
-    elsif ($key)
-      {
-      $val = 1 if $el =~ /^true$/i;
-      $val = 0 if $el =~ /^false$/i;
-
-      # Fix stuff so it's in the correct format
-      $key =~ s/^CF//;
-      $key = 'BundleIdentifier' if $key =~ /^Identifier$/i;
-      $key = 'BundleDisplayName' if $key =~ /^DisplayName$/i;
-      $key = 'BundleVersion' if $key =~ /^Version$/i;
-
-      $plisthash->{$key} = $val;
-      undef $key;
-      }
-    $val = ''
-    }
-  }
-
-
-sub parseConfXml
-  {
-    my ( $file , $language ) = @_;
-
-  our ($key, $val, $plisthash, $localizationValue,$localizationIconValue, $lang,$langIcon) = ('', '', {}, '','', {},{});
-  our ($featureCount, $paramCount, $accessCount) = (1,1,1);
-  our ($attributeMap, $featureMap, $featureParamMap, $accessMap)=('','','','');
-  
-  # Create parser object
-  my $parser = new XML::Parser;
-  $parser->setHandlers( 'Start' => \&startC, 'End' => \&endC, 'Char' => \&dataC);
-   
-  # Parse the file
-  open XML,$file or die "Couldn't open $file";
-  # Skip the UTF8 BOM - perl 5.6 can't handle it
-  my $bom;
-  read XML, $bom, 3;
-  $bom = join('', map(sprintf('%X', $_), unpack("CCC", $bom)));
-  print "Testing the following for BOM: $bom\n" if $debug;
-  seek(XML, 0, 0) if $bom ne 'EFBBBF';
-    $plisthash->{'NokiaWidget'} = 2 ;
-    $plisthash->{'WidgetPackagingFormat'} = "w3c-partial-v1" ;
-  
-  $parser->parse(*XML);
-  close XML;
-
-    if( $language )
-        {
-         if($lang->{$language})
-         { 
-          $plisthash->{'BundleDisplayName'} = $lang->{$language};
-         }
-         if($langIcon->{$language})
-         {
-          $plisthash->{'IconPath'} = $langIcon->{$language};
-         }
-        }
-  die "Widget BundleIdentifier unknown" if !$plisthash->{'BundleIdentifier'};
-  die "Widget BundleDisplayName unknown" if !$plisthash->{'BundleDisplayName'};
-  
-   $attributeMap = $attributeMap.WIDGET_NAME.KEY_VALUE_SEPERATOR.$plisthash->{'BundleDisplayName'}.KEY_VALUE_PAIR_SEPERATOR;
-
-   if($non_nokia_widget)
-   {
-       $attributeMap = $attributeMap.WIDGET_PROCESSUID.KEY_VALUE_SEPERATOR."200267D6".KEY_VALUE_PAIR_SEPERATOR;
-   }
-   else
-   {
-       $attributeMap = $attributeMap.WIDGET_PROCESSUID.KEY_VALUE_SEPERATOR."200267C0".KEY_VALUE_PAIR_SEPERATOR;
-   }
-
-    if($attributeMap)
-    {      
-        $plisthash->{'AttributeList'} = $attributeMap;
-        print "\nAttributeList::$plisthash->{'AttributeList'}\n"
-    }
-
-  # Return result
-  return $plisthash;
-
-  # Called on a start tag
-  sub startC
-    {
-    my ($p, $el, %atts) = @_;
-    
-    if($el eq "widget")
-        {
-         if ( $atts{"id"} )
-             {
-            $plisthash->{'BundleIdentifier'} = $atts{"id"};
-            $attributeMap = $attributeMap.WIDGET_ID.KEY_VALUE_SEPERATOR.$atts{"id"}.KEY_VALUE_PAIR_SEPERATOR;
-            
-             }
-         if ( $atts{"version"} )
-             {
-            $plisthash->{'BundleVersion'} = $atts{"version"};
-            $attributeMap = $attributeMap.WIDGET_VERSION.KEY_VALUE_SEPERATOR.$atts{"version"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-         if ( $atts{"viewmodes"} && $atts{"viewmodes"} eq "all" )
-             {
-            $plisthash->{'MiniViewEnabled'} = 1;
-             }
-         $attributeMap = $attributeMap.WIDGET_HEIGHT.KEY_VALUE_SEPERATOR.$atts{"height"}.KEY_VALUE_PAIR_SEPERATOR;
-         $attributeMap = $attributeMap.WIDGET_WIDTH.KEY_VALUE_SEPERATOR.$atts{"width"}.KEY_VALUE_PAIR_SEPERATOR;
-        }
-      elsif ($el eq "icon")
-          {
-           if ( $atts{"xml:lang"} )
-             {
-              $localizationIconValue = lc($atts{"xml:lang"}) ;
-             }
-           if ( $atts{"src"} )
-             {
-            $plisthash->{'IconPath'} = $atts{"src"};
-                 }
-          }
-      elsif ($el eq "content")
-          {
-           $attributeMap = $attributeMap.WIDGET_CONTENT.KEY_VALUE_SEPERATOR.KEY_VALUE_PAIR_SEPERATOR;	
-           if ( $atts{"src"} )
-             {
-            $plisthash->{'MainHTML'} = $atts{"src"};
-            $attributeMap = $attributeMap.WIDGET_CONTENT.KEY_ATTR_SEPERATOR."src".KEY_VALUE_SEPERATOR.$atts{"src"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-          }
-      elsif ($el eq "name")
-          {
-           if ( $atts{"xml:lang"} )
-             {
-              $localizationValue = lc($atts{"xml:lang"}) ;
-             }
-          }
-      elsif ($el eq "feature")
-          {
-           $featureMap = WIDGET_FEATURE . $featureCount;
-           $attributeMap = $attributeMap.$featureMap.KEY_VALUE_SEPERATOR.KEY_VALUE_PAIR_SEPERATOR;
-           
-           if ( $atts{"name"} )
-             {
-              $attributeMap = $attributeMap.$featureMap.KEY_ATTR_SEPERATOR."name".KEY_VALUE_SEPERATOR.$atts{"name"}.KEY_VALUE_PAIR_SEPERATOR;
-              my $jilFeature = "http://jil.org/jil";
-              if($atts{"name"}=~ m/^$jilFeature/i)
-              {
-                $plisthash->{'WidgetPackagingFormat'} = "jil";
-              }
-             }
-         if ( $atts{"required"} )
-             {
-              $attributeMap = $attributeMap.$featureMap.KEY_ATTR_SEPERATOR."required".KEY_VALUE_SEPERATOR.$atts{"required"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-         }
-       elsif($el eq "param")
-          {
-              $featureParamMap = $featureMap. WIDGET_FEATURE_PARAM . $paramCount;
-              $attributeMap = $attributeMap.$featureParamMap.KEY_VALUE_SEPERATOR.KEY_VALUE_PAIR_SEPERATOR;
-              if ($atts{"name"}) 
-              {
-                  $attributeMap = $attributeMap.$featureParamMap.KEY_ATTR_SEPERATOR."name".KEY_VALUE_SEPERATOR.$atts{"name"}.KEY_VALUE_PAIR_SEPERATOR;
-              }
-              if ($atts{"value"})
-              {
-                  $attributeMap = $attributeMap.$featureParamMap.KEY_ATTR_SEPERATOR."value".KEY_VALUE_SEPERATOR.$atts{"value"}.KEY_VALUE_PAIR_SEPERATOR;
-              }
-          }
-       elsif ($el eq "access" || $el eq "jil:access")
-          {
-              $accessMap = WIDGET_ACCESS . $accessCount;
-              $attributeMap = $attributeMap.$accessMap.KEY_VALUE_SEPERATOR.KEY_VALUE_PAIR_SEPERATOR;
-           
-              if ( $atts{"network"} )
-             {
-                $attributeMap = $attributeMap.$accessMap.KEY_ATTR_SEPERATOR."network".KEY_VALUE_SEPERATOR.$atts{"network"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-            if ( $atts{"remotescripts"} )
-             {
-                $attributeMap = $attributeMap.$accessMap.KEY_ATTR_SEPERATOR."remotescripts".KEY_VALUE_SEPERATOR.$atts{"remotescripts"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-             if ( $atts{"localfs"} )
-             {
-                $attributeMap = $attributeMap.$accessMap.KEY_ATTR_SEPERATOR."localfs".KEY_VALUE_SEPERATOR.$atts{"localfs"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-             if ( $atts{"origin"} )
-             {
-                $attributeMap = $attributeMap.$accessMap.KEY_ATTR_SEPERATOR."origin".KEY_VALUE_SEPERATOR.$atts{"origin"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-             if ( $atts{"subdomains"} )
-             {
-                $attributeMap = $attributeMap.$accessMap. KEY_ATTR_SEPERATOR."subdomains".KEY_VALUE_SEPERATOR.$atts{"subdomains"}.KEY_VALUE_PAIR_SEPERATOR;
-             }
-        }
-        elsif ($el eq "NOKIA:sharedlibrary")
-        {
-            print " \n\n ^^^^^^^^^^^^^^^^^^^^^^^NOKIA:sharedlibrary ^^^^^^^^^^^^^^^^^^^^ \n\n";
-            $isSharedLibrary = 1;
-            $plisthash->{'WidgetPackagingFormat'} = "shared-library";
-            $attributeMap = $attributeMap.WIDGET_NOKIA_SHAREDLIB.KEY_VALUE_SEPERATOR.KEY_VALUE_PAIR_SEPERATOR;
-        }
-     $val = '';    
-     }
-    
-sub docC{}
-# Receives character data
-  sub dataC
-    {
-    my ($p, $s) = @_;
-    $val .= $s;
-    }
-
-  # Called on an end tag
-  sub endC
-    {
-    my ($p, $el) = @_;
-    if ($el eq "name")
-        {
-       if( $localizationValue )
-           {
-            chomp($val);
-            $lang->{$localizationValue} = $val;
-            $localizationValue = '';
-             }
-         else
-             {
-              chomp($val);
-              $plisthash->{'BundleDisplayName'} = $val;
-             }   
-      }
-      elsif ($el eq "icon")
-      {
-        if( $localizationIconValue )
-           {
-            $langIcon->{$localizationIconValue} = $plisthash->{'IconPath'};
-            print "\n %%%%%%%%%%%  $localizationIconValue  :: $plisthash->{'IconPath'}%%%%%%%%%%%%%\n";
-            $localizationIconValue = '';
-           }
-      }
-    elsif($el eq "feature")
-      {
-          $featureCount++;
-          $paramCount = 0;
-      }
-    elsif($el eq "param")
-      {
-          $paramCount++;
-      }
-      elsif($el eq "access" || $el eq "jil:access")
-      {
-          $accessCount++;
-      } 
-      elsif ($el eq "NOKIA:folder")
-        {
-            chomp($val);
-            $sharedFolderName = $val;
-            $attributeMap = $attributeMap.WIDGET_NOKIA_SHAREDLIB_FOLDER.KEY_VALUE_SEPERATOR.$sharedFolderName.KEY_VALUE_PAIR_SEPERATOR;
-        }
-    elsif ($el eq "NOKIA:widget")
-        {
-            chomp($val);
-            if( lc($val) eq "true" )
-            {
-                $isSharedWidget = 1;
-                $plisthash->{'WidgetPackagingFormat'} = "w3c-partial-v1";
-            }
-            $attributeMap = $attributeMap.WIDGET_NOKIA_SHAREDLIB_WIDGET.KEY_VALUE_SEPERATOR.$val.KEY_VALUE_PAIR_SEPERATOR;
-        }
-    elsif ($el eq "NOKIA:icon")
-        {
-            chomp($val);
-            if( lc($val) eq "true" )
-            {
-                $isSharedIcon = 1;
-            }
-            $attributeMap = $attributeMap.WIDGET_NOKIA_SHAREDLIB_ICON.KEY_VALUE_SEPERATOR.$val.KEY_VALUE_PAIR_SEPERATOR;
-        }
-    $val = ''
-    }
-
-  }
-
-
-# Stores the details of files to be added to "rom"
-sub addToRomList
-  {
-  my ( $self, $drive, $file, $localised ) = @_;
-  $file = fixFilename($file);
-
-  # All files should be under epoc32 somewhere - need to drop a bit of the path for the rom destination
-  my $localpath = $self->destLocation($drive);
-
-  my $dest = fixFilename($file);
-  $dest =~ s/^\Q$localpath\E//i;
-
-  # Add the file to the list for the rom
-  # It may be localised - in which it'll be put in a different IBY file
-  $localised = $localised ? '_rsc' : '';
-  $self->{"installedFiles${localised}"}->{$drive}->{$file} = $dest;
-  }
-
-# Make the IBY file
-sub makeIBY
-  {
-  my ( $self, $drive, $localised ) = @_;
-
-  # Generate the file name for the IBY file
-  $localised = $localised ? '_rsc' : '';
-  my $name = $drive =~ /^[zZ]/ ? "preinstalledwidgets${localised}.iby" : sprintf("preinstalledwidgets_drive%s${localised}.iby", substr($drive, 0, 1));
-  my $iby = fixFilename(catfile($self->{'args'}->{'epocroot'}, 'epoc32', 'rom', 'include', $name));
-  print "Generating: $iby\n";
-
-  mkpath dirname($iby);
-  open IBY, ">$iby" or die "Failed to open $iby for writing: $!";
-  $name =~ s/\./_/g; $name = uc($name);
-  print IBY "// GENERATED FILE: EDIT WITH CARE\n\#ifndef __${name}__\n\#define __${name}__\n\n";
-  foreach my $file ( sort keys %{ $self->{"installedFiles${localised}"}->{$drive} } )
-    {
-    my $dest = $self->{"installedFiles${localised}"}->{$drive}->{$file};
-
-    # Quote filenames as they may contain spaces!
-    print IBY "data=\"$file\"\t\"$dest\"\n";
-    }
-  print IBY "\#endif\n";
-  close IBY;
-  }
-
-# Unregister (with Apparc) existing Widgets
-sub unregisterWidgets
-{
-  my ( $self, $drive ) = @_;
-    
-    my $registry = fixFilename(catfile($self->destLocation($drive), WIDGET_REGISTRY));
-  # If the WRT registry already exists, remove apparc registry info for those widgets
-  # This should avoid problems with unregistered widget icons in the emulator?
-    if (-e $registry)
-    {
-        print("\n			UNREGISTERING WGZ WIDGETS       \n");
-        
-      my $ref = XMLin($registry, 'forcearray' => [ 'entry' ], 'keyattr' => { 'prop' => 'content' } );
-    foreach my $entry ( @{ $ref->{entry} } )
-      {
-      my $uid = $entry->{prop}->{Uid}->{val}->{content};
-
-      print "Unregistering existing Widget: $entry->{prop}->{BundleIdentifier}->{val}->{content}\n" if $verbose;
-      my $dest = $self->regFileName($drive);
-      my $mbm = catfile($dest, sprintf("[%08x].mbm", $uid));
-      my ( $reg, $loc ) = ( catfile($dest, sprintf("%08x_reg.rsc", $uid)), catfile($dest, sprintf("%08x_loc.rsc", $uid)) );
-      unlink $mbm, $reg, $loc;
-    
-      # We also have to delete the widget directory otherwise it'll be re-registered
-      my $id = $entry->{prop}->{BundleIdentifier}->{val}->{content};
-      $w3c_widget = 0;
-      my $dir = $self->installDir($drive, $id);
-      rmtree $dir;
-      }
-    }
-    
-  $registry = fixFilename(catfile($self->destLocation($drive), CWRT_WIDGET_REGISTRY));
-
-  # If the CWRT registry already exists, remove apparc registry info for those widgets
-  # This should avoid problems with unregistered widget icons in the emulator?
-  if (-e $registry)
-    {
-        print("\n			UNREGISTERING WGT WIDGETS       \n");
-        
-          my $ref = XMLin($registry, 'forcearray' => [ 'entry' ], 'keyattr' => { 'prop' => 'content' } );
-        foreach my $entry ( @{ $ref->{entry} } )
-      {
-          my $uid = $entry->{prop}->{Uid}->{val}->{content};
-    
-          print "Unregistering existing Widget: $entry->{prop}->{BundleIdentifier}->{val}->{content}\n" if $verbose;
-          my $dest = $self->regFileName($drive);
-            my $mbm = catfile($dest, sprintf("[%08x].mbm", $uid));
-          my ( $reg, $loc ) = ( catfile($dest, sprintf("%08x_reg.rsc", $uid)), catfile($dest, sprintf("%08x_loc.rsc", $uid)) );
-          unlink $mbm, $reg, $loc;
-       
-          # We also have to delete the widget directory otherwise it'll be re-registered
-          my $id = $entry->{prop}->{BundleIdentifier}->{val}->{content};
-          print " Unregistering $id ";
-          my $basepath = $entry->{prop}->{BasePath}->{val}->{content};
-          $w3c_widget = 1;
-          my $sharedLib = "lib";          #BasePath will have lib only if the widget is shared Library
-          
-          if($basepath =~ m/$sharedLib/)
-          {
-              $isSharedLibrary = 1;
-          }
-          
-          if($basepath =~ m/\\200267d6\\/i)
-          {
-          	$non_nokia_widget = 1;	
-          }
-           #sharedFolderName TBD
-          my $dir = $self->installDir($drive, $id);
-          rmtree $dir;
-                
-          print("BasePath:$basepath \nIs Non-Nokia? $non_nokia_widget		Is SharedLibrary? $isSharedLibrary \nDirectory:$dir \n");
-    
-            $dir =~ s/widgets_21D_4C7/data/;
-          rmtree $dir;
-        }
-    }
-    #delete CWRT webapp DB if exists
-    my $cwrtdbPath = catfile($self->destLocation($drive), CWRT_WEBAPP_REGISTRY);
-    if($cwrtdbPath)
-    {
-    	print "Deleting CWRT_WEBAPP_REGISTRY \n";
-    	rmtree $cwrtdbPath;
-    }
-  }
-
-# Make the registry
-sub makeRegistry
-  {
-  my ($self, $drive, $installed, $w3c) = @_;
-  
-  my ($registry);
-  if($w3c)
-    {
-    $registry = fixFilename(catfile($self->destLocation($drive), CWRT_WIDGET_REGISTRY));
-    }
-  else
-    {
-    $registry = fixFilename(catfile($self->destLocation($drive), WIDGET_REGISTRY));
-    }
-    
-  print "\nGenerating: $registry\n";
-
-  # Write the file
-  mkpath dirname($registry);
-  open OUT, ">$registry" or die "Failed to open WidgetEntryStore.xml: $!";
-
-  print OUT "<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"yes\" ?>\n<widgetregistry>\n";
-  binmode OUT, ":utf8" if $] >= 5.008;
-  foreach my $pList ( @$installed )
-    {
-    $self->dumpPList(\*OUT, $pList, $w3c);
-    }
-  print OUT "</widgetregistry>\n";
-  close OUT;
-
-  # Convert the file to unicode
-  convert2Unicode($registry);
-
-  # Return the generated file
-  return $registry;
-  }
-
-# Converts a file to Unicode
-sub convert2Unicode
-  {
-  my $file = shift;
-
-  my @lines;
-  open IN, $file or die "Failed to open $file: $!";
-  binmode IN;
-  while(<IN>)
-    {
-    my $u = utf8($_);
-    $u->byteswap;
-    push @lines, $u->utf16;
-    }
-  close IN;
-
-  open OUT, ">$file" or die "Failed to open $file for writing: $!";
-  binmode OUT;
-  print OUT pack("CC", 0xff, 0xfe);
-  print OUT @lines;
-  close OUT;
-  }
-
-sub hashpjw {
-  my $s = shift;
-  my $hashval = 0;
-  my $g;
-
-  for ( split //, $s ) {
-    $hashval = ( $hashval << 4 ) + ord $_; 
-    
-    if ($g = $hashval & 0xf0000000) {
-      $hashval ^= $g >> 23;
-    }
-    $hashval &= ~$g;
-  }
-  #print "$hashval \n";
-  return $hashval;
-} 
-
-# Dumps a single PList hash object
-sub dumpPList
-  {
-  my ($self, $fh, $data, $w3c) = @_;
-  my @regProperties = (
-    [ 'PropertyListVersion', 'int' ],
-    [ 'BundleIdentifier', 'string' ],
-    [ 'BundleName', 'string' ],
-    [ 'BundleDisplayName', 'string' ],
-    [ 'MainHTML', 'string' ],
-    [ 'BundleVersion', 'string' ],
- #  [ 'Height', 'int' ],
- #  [ 'Width', 'int' ],
-    [ 'AllowNetworkAccess', 'int' ],
-    [ 'DriveName', 'string' ],
-    [ 'BasePath', 'string' ],
-    [ 'IconPath', 'string' ],
-    [ 'FileSize', 'int' ],
-    [ 'Uid', 'int' ],
-    [ 'NokiaWidget', 'int' ],
-    [ 'MiniViewEnabled', 'int' ],
-    [ 'ProcessUid', 'int' ],
-    [ 'MimeType', 'string'],
-    [ 'WidgetPackagingFormat', 'string'],
-    [ 'DBIconPath', 'string'],
-    [ 'AttributeList', 'string'],
-    [ 'BlanketPermissionGranted', 'int' ],
-    [ 'PreInstalled', 'int' ],
-  );
-    
-  print $fh "<entry>\n";
-  my $encodeddata = {};
-  foreach my $prop ( @regProperties )
-    {
-    my ( $key, $type ) = @$prop;
-    if($key ne "DBIconPath" && $key ne "WidgetPackagingFormat" && $key ne "AttributeList" && $key ne "BlanketPermissionGranted" && $key ne "PreInstalled")
-    {
-        print $fh "<prop>$key<val>$data->{$key}<type>$type</type></val></prop>\n" if defined $data->{$key};
-    }
-    
-    if( $w3c )
-      {
-      $encodeddata->{$key} = encodeChar($data->{$key}) if defined $data->{$key};
-      }
-    else
-    {
-    	if($key eq "BlanketPermissionGranted" || $key eq "PreInstalled")
-    	{
-    	 print $fh "<prop>$key<val>$data->{$key}<type>$type</type></val></prop>\n" if defined $data->{$key};
-    	}
-    }
-    }
-  print $fh "</entry>\n";
-  print "\n Is a w3c widget? -- $w3c\n";
-  if( $w3c )
-    {
-  my $dbPath = fixFilename(catfile($self->destLocation('C'), CWRT_WEBAPP_REGISTRY));
-    mkpath dirname($dbPath);
-    die "ERROR: Can't find CWRTWebAppRegistry.exe in PATH" if !(my $cmd = findCmd('CWRTWebAppRegistry.exe'));
-    my $regCmd;
-    
-    if($encodeddata->{'AttributeList'})
-    {
-        print "\n AttributeList argument sent to DB\n";
-        $regCmd = "$cmd $dbPath $encodeddata->{'BundleIdentifier'} $encodeddata->{'Uid'} $encodeddata->{'BundleDisplayName'} $encodeddata->{'BasePath'} $encodeddata->{'DBIconPath'} $encodeddata->{'WidgetPackagingFormat'} $encodeddata->{'MainHTML'} $encodeddata->{'AttributeList'}";
-    }
-    else
-   {
-        print "\n AttributeList argument not sent to DB\n";
-        $regCmd = "$cmd $dbPath $encodeddata->{'BundleIdentifier'} $encodeddata->{'Uid'} $encodeddata->{'BundleDisplayName'} $encodeddata->{'BasePath'} $encodeddata->{'DBIconPath'} $encodeddata->{'WidgetPackagingFormat'} $encodeddata->{'MainHTML'}";
-    }
-    print "\n regCmd : $regCmd \n\n";
-    system($regCmd);
-    }
-  }
-
-#encode the space character
-sub encodeChar  
-  {
-    my  ($encoded) = @_;
-
-    $encoded =~ s/%/%10/g;
-    $encoded =~ s/\s/%40/g;
-    $encoded =~ s/\'/%apos/g;   
-    $encoded =~ s/&/%amp/g;
-    $encoded =~ s/</%lt/g;
-    $encoded =~ s/>/%gt/g;
-    $encoded =~ s/\"/%quot/g;
-    return $encoded;
-  }
-  
-  
-# Make secssion
-sub makeSecSession
-    {
-  my ($self, $drive) = @_;
-  my $secSession;
-  my $widget_uid;
-  if($non_nokia_widget)
-	{
-		$widget_uid = CWRT_WIDGET_UI_NON_NOKIA_UID;
-	}
-	else
-	{
-  	$widget_uid = CWRT_WIDGET_UI_UID;
-  }
-
-  if($isSharedLibrary)
-  {
-      $secSession = fixFilename(catfile($self->destLocation($drive), 'private', sprintf("%08X", $widget_uid),"data","lib",$sharedFolderName,"secsession"));
-  }
-  else
-  {
-      $secSession = fixFilename(catfile($self->destLocation($drive), 'private', sprintf("%08X", $widget_uid),"data", $hashval,"secsession"));
-  }
-  print "\nGenerating: $secSession\n\n";
-  
-  # Write the file
-  mkpath dirname($secSession);
-  open OUT, ">$secSession" or die "Failed to open SecSession.xml: $!";
-
-  print OUT "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n<accesspolicy>\n";
-  if($non_nokia_widget)
-  {
-  	print OUT "<domain name=\"Operator\">\n";
-  }
-  else
-  {
-  	print OUT "<domain name=\"TrustedWidgets\">\n";
-  }
-  
-  if(CWRT_ACCESS_POLICY_PATH) {
-      my $accesspolicypath = findCmd(CWRT_ACCESS_POLICY_PATH);   
-        # Copy Secsession capabilities from browser_access_policy.xml if it exists
-      if (-e $accesspolicypath) {
-          print "Browser Access Policy File exists :: ",$accesspolicypath,"\n" ;
-          my $accesspolicy = XMLin($accesspolicypath, keyattr => {domain => 'name'}, forcearray =>['domain'] );
-            my $domainName;
-            
-            if($non_nokia_widget)
-            {
-            	$domainName = $accesspolicy->{domain}->{Operator};
-            }
-            else
-            {
-            	$domainName = $accesspolicy->{domain}->{TrustedWidgets};
-            }
-          
-          my $xml = XMLout($domainName, keeproot => 1);
-          print OUT $xml;
-      }
-      #browser_access_policy.xml does not exist in the path
-      else {      
-          print "\n Browser Access policy file '$accesspolicypath' does not exist in the given path\n";
-          if(!$non_nokia_widget)
-          {
-          	print OUT "   <capability name=\"Download\"/>\n   <capability name=\"ApplicationManagement\"/>\n   <capability name=\"WebAppUpdate\"/>\n   <capability name=\"DeviceConfiguration\"/>\n   <capability name=\"NokiaAccount\"/>\n   <capability name=\"ConnectionManagement\"/>\n   <capability name=\"ApplicationManagement.Launch\"/>\n   <capability name=\"SecureStorage\"/>\n   <capability name=\"EventsAndMessaging\"/>\n   <capability name=\"Vibra\"/>\n   <capability name=\"RuntimeInfo\"/>\n   <capability name=\"OviMessagingBus\"/>\n   <capability name=\"NativeUpdate\"/>\n   <capability name=\"LocalConnectivity\"/>\n   <capability name=\"Network\"/>\n   <capability name=\"Cryptographic\"/>\n   <capability name=\"pim.*\"/>\n   <capability name=\"devicestatus.*\"/>\n   <capability name=\"message.*\"/>\n   <capability name=\"sensor.*\"/>\n   <capability name=\"landmark.*\"/>\n   <capability name=\"camera.*\"/>\n   <capability name=\"commlog.*\"/>\n   <capability name=\"media.*\"/>\n   <capability name=\"io.file.*\"/>\n   <capability name=\"player.*\"/>\n   <capability name=\"location.position\"/>\n   <capability name=\"telephony.voicecall\"/>\n   <capability name=\"NokiaAdEnabler\"/>\n";
-          }
-        }
-    }
-    #Access policy path not defined
-  else {
-      print "\n Browser Access policy path not defined \n";
-      if(!$non_nokia_widget)
-      {
-      	print OUT "   <capability name=\"Download\"/>\n   <capability name=\"ApplicationManagement\"/>\n   <capability name=\"WebAppUpdate\"/>\n   <capability name=\"DeviceConfiguration\"/>\n   <capability name=\"NokiaAccount\"/>\n   <capability name=\"ConnectionManagement\"/>\n   <capability name=\"ApplicationManagement.Launch\"/>\n   <capability name=\"SecureStorage\"/>\n   <capability name=\"EventsAndMessaging\"/>\n   <capability name=\"Vibra\"/>\n   <capability name=\"RuntimeInfo\"/>\n   <capability name=\"OviMessagingBus\"/>\n   <capability name=\"NativeUpdate\"/>\n   <capability name=\"LocalConnectivity\"/>\n   <capability name=\"Network\"/>\n   <capability name=\"Cryptographic\"/>\n   <capability name=\"pim.*\"/>\n   <capability name=\"devicestatus.*\"/>\n   <capability name=\"message.*\"/>\n   <capability name=\"sensor.*\"/>\n   <capability name=\"landmark.*\"/>\n   <capability name=\"camera.*\"/>\n   <capability name=\"commlog.*\"/>\n   <capability name=\"media.*\"/>\n   <capability name=\"io.file.*\"/>\n   <capability name=\"player.*\"/>\n   <capability name=\"location.position\"/>\n   <capability name=\"telephony.voicecall\"/>\n   <capability name=\"NokiaAdEnabler\"/>\n";
-      }
-  }
-   
-    print OUT "</domain>\n";
-    print OUT "</accesspolicy>\n";
-    close OUT;
-
-  # Return the generated file
-  return $secSession;
-  }
-__END__
-
-=head1 NAME
-
-installwidgets.pl - A script for generating all the files needed to install Widgets
-
-=head1 SYNOPSIS
-
-installwidgets.pl [-h] [-ver] [-v] [-debug] [-e <dir>] [-l <lang_code|lproj.xml>] config.ini
-
- Options:
-   -help|h                        Show this help
-   -version|ver                   Show version number
-   -verbose|v                     Show verbose output
-   -debug                         Show debug output
-   -epocroot|e                    Override value of EPOCROOT
-   -localization|l                lproj_dir
-
-A script for generating all the files needed to preinstall Widgets.
-
- Example:
-   perl installwidgets.pl -l fr config.ini       Install widgets listed in config.ini using French localization
-
- Author:
-   peter.harper@sosco.com
-
-=head1 DESCRIPTION
-
-This tool can be used to pre-generate all the files needed to install Widgets. The tool and its dependencies can be placed anywhere on your PATH.
-It generates the results in the epoc32 folder - in the appropriate locations for the emulator.
-It finds the epoc32 folder using the EPOCROOT environment variable which can be overridden via the -e command line option.
-
-=head2 CONFIG FILE
-
-The preferred way to run the tool is via a configuration INI file.
-You can list the widgets to install on each drive. You can specify the exact location of the Widget, otherwise it will try and find the Widget via EPOCROOT.
-
-You can specify whether a widget is intended for the homescreen by adding the text [HomeScreen] after the filename
-This will set the BlanketPermissionGranted attribute in the registry.
-Widgets intended for the homescreen must have the MiniViewEnabled attribute set in its PLIST file otherwise an error is generated.
-
-    # Widgets to be pre-installed for the ROM
-    [drive-z]
-    \somepath\foo.wgz
-    \somepath\bar.wgz
-
-    # Widgets for the internal disk
-    [drive-c]
-    \somepath\widget1.wdgt.zip [HomeScreen]
-
-    # Widgets for the removable disk
-    [drive-e]
-    \somepath\widget2.wdgt.zip
-
-    # Commands to run at the end
-    [run-commands]
-    dostuff.pl
-    domorestuff.exe
-
-=head2 DEPENDENCIES
-
-The tool has some dependencies which must exist for it to work.
-
-=over
-
-=item 1
-
-png2mbm.pl - A script to generate an MBM file from a PNG
-
-=item 2
-
-WidgetRegFiles.exe - an EXE which can generate Symbian REG and LOC files for registering non-native Widget apps.
-This tool is built with "SymPort" a native tools port of basic Symbian OS services.
-
-=item 3
-
-7z/unzip - For extracting files from the Widget archive.
-7Zip will be used in preference to unzip if it's found on your path because it handles Unicode a better.
-
-=item 4
-
-GD.pm - Perl support for the GD graphics library for PNG support, see http://www.libgd.org .
-
-=back
-
-=head3 INSTALLING GD
-
-You can install GD automatically with a simple command - however the command you need to use differs depending on the version of Perl you have installed.
-At the time of writing Symbian requires Perl version 5.6 - although in my experience Perl 5.8 works okay. To find out which version of Perl you have type "perl -v" on the command line.
-
-To install the GD library:
-
-=over
-
-=item *
-
-For Perl v5.6: "ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/GD.ppd "
-
-=item *
-
-For Perl v5.8: "ppm install http://theoryx5.uwinnipeg.ca/ppms/GD.ppd "
-
-=back
-
-=head2 WIDGET INSTALL PROCESS
-
-Here's a detailed breakdown of what the script does.
-
-=over
-
-=item 1
-
-It gets the lists of Widgets from the config.ini file passed on the command line.
-This process is repeated for all Widgets and all drives listed in the config file.
-
-=item 2
-
-Any existing Widgets listed in "private\10282f06\WidgetEntryStore.xml" are deleted from the epoc32 tree.
-This ensures that there are no problems when testing Widgets in the emulator.
-
-=item 3
-
-All the compressed files in the Widget are extracted to a temporary folder.
-
-=item 4
-
-The details for the Widget are loaded from its "Info.plist" file.
-
-=item 5
-
-A UID is chosen for the widget. This differs depending on whether installation is for an internal drive (z: or c:) or an external drive (e: etc).
-
-=item 5
-
-A Symbian MBM file is generated from the "Icon.png" file supplied by the Widgets.
-Three different sized icons are generated "88x88", "32x32" and "24x24".
-The MBM file is placed in "private/10003a3f/import/apps/NonNative/Resource/[<UID>].mbm".
-
-=item 6
-
-"WidgetRegFiles.exe" is executed to generate REG and LOC resource files used to register the Widget as an app in Symbian OS.
-These files are placed in "private/10003a3f/import/apps/NonNative/Resource".
-
-=item 7
-
-All the widgets files are copied to a folder under "private\10282822".
-The Widget's bundle identifier is used to create a unique folder under here for the Widget.
-
-=item 8
-
-The Widget registry is generated in "private\10282f06\WidgetEntryStore.xml"
-
-=item 9
-
-If Widgets are being preinstalled for ROM an IBY file is created in "epoc32\rom\include\preinstalledwidgets.iby".
-A separate IBY file is generated for the localised parts of a Widget "epoc32\rom\include\preinstalledwidgets_rsc.iby".
-Separate IBY files (per drive) are generated for Widgets preinstalled to UDA, e.g. preinstalledwidgets_driveC.iby and preinstalledwidgets_driveC_rsc.iby.
-These IBY files can be used to add all the Widgets to ROM, ROFS or UDA.
-
-=back
-
-=head3 INSTALLING ON HARDWARE USING iMaker
-
-=over
-
-=item 1
-
-Create the following folder structure at the root level.
-
-X:\variants\content
-
-=item 2
-
-Copy the files specified in the generated ibys (preinstalledwidgets_driveC.iby and preinstalledwidgets_driveC_rsc.iby) to X:\variants\content. Preserve the dir structure. (Note, this step will be automated in the future)
-
-For example if you want the following file on UDA (User Disk Area, C drive on phone) at the following location C:\private\10282f06\WidgetEntryStore.xml
-
-Drop the file under X:\variants\content\private\10282f06\WidgetEntryStore.xml 
-
-=item 3
-
-Run the foll command to generate UDA
-
-B<Gadget:>
-X:\epoc32\tools>imaker -f /epoc32/rom/s60_makefiles/image_conf_sp_rnd_gadget.mk VARIANT_DIR=/variants variantuda
-
-B<Tube:>
-Y:\epoc32\tools>imaker -f /epoc32/rom/config/ncp52/tube/image_conf_tube_ui.mk VARIANT_DIR=/variants variantuda 
-
-=item 4
-
-Flash the fpsx file generated under X:\epoc32\rombuild\gadget\uda for Gadget and Y:\epoc32\rombuild\tube\uda for Tube to your device.
-
-Note: More info on iMaker tool at: L<http://configurationtools.nmp.nokia.com/imaker/wiki/iMakerUserGuide>
-
-=back
-
-=head3 LOCALISATION
-
-Widget handles localization by providing localized resources in various language project directories(lproj_dir), one level deep than the root directory. In order to specify a language variant for pre-installing widget, you need to provide the language project directory name, e.g. 'en' for english, 'fr' for French.
-
-A list of Nokia supported languages can be found in Widget_lproj.xml or at L<http://wiki.forum.nokia.com/index.php/Web_Runtime_localisation_support>. If the widget does not provide the localized resource for the variant you specified, the default resources in widget's home directory will be used instead. 
-
-=head3 NOTES
-
-=over
-
-=item 1
-
-The location of the private folder is in the appropriate place for the files to appear in the emulator.
-This is different depending on the intended destination drive (see -dd command line option) for the Widget.
-e.g. "epoc32/release/winscw/udeb/z/", "epoc32/winscw/c" or "epoc32/winscw/e"
-
-=item 2
-
-Files are extracted to epoc32 on the current drive relative to the EPOCROOT environment variable or the value given for -epocroot (-e) on the command line.
-
-=item 3
-
-A different IBY file is generated for each drive.
-
-=over
-
-=item *
-
-Z: - \epoc32\rom\include\preinstalledwidgets.iby
-
-=item *
-
-C: - \epoc32\rom\include\preinstalledwidgets_driveC.iby
-
-=item *
-
-E: - \epoc32\rom\include\preinstalledwidgets_driveE.iby
-
-=back
-
-There are separate resource files for localised resources e.g. preinstalledwidgets_rsc.iby.
-
-=cut