misccomponents/emulatorlauncher/perl/epoc.pl
changeset 0 83f4b4db085c
child 1 d4b442d23379
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misccomponents/emulatorlauncher/perl/epoc.pl	Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,256 @@
+# Copyright (c) 1999-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:
+# Launcher for the Symbian Emulator, including
+# functionality to read the $ENV{EPOCROOT}epoc32\data\BuildInfo.txt
+# file to find out information regarding the current Emulator.
+# Depends on the current working directory providing
+# the drive of the currently used SDK.
+# 
+#
+
+use Cwd;
+
+#
+# Check the argument(s), if any.
+#
+$numArgs = $#ARGV + 1;
+
+if($numArgs == 0) 
+	{
+    	&launchEmulator("udeb","winscw");
+    	exit(0);
+	}
+
+if($numArgs > 2) 
+	{
+    	&printHelp;
+    	die "ERROR: Too many arguments.\n";
+	}
+
+if($numArgs == 1)
+	{ 
+	if(lc($ARGV[0]) eq "-rel") 
+		{
+    		&launchEmulator("urel","winscw");
+    		exit(0);
+		}
+
+	if (lc($ARGV[0]) eq "-version") 
+		{
+    		&printVersion;
+    		exit(0);
+		}
+
+	if(lc($ARGV[0]) eq "-wins") 
+		{
+    		&launchEmulator("udeb", "wins");
+    		exit(0);
+		}
+
+	if(lc($ARGV[0]) eq "-winscw") 
+		{
+    		&launchEmulator("udeb", "winscw");
+    		exit(0);
+		}
+
+	if(lc($ARGV[0]) eq "-help") 
+		{
+    		&printHelp;
+    		exit(0);
+		}
+	}
+
+if ($numArgs == 2)
+	{
+	if(lc($ARGV[0]) eq "-rel") 
+		{
+		if (lc($ARGV[1]) eq "-wins")
+			{
+    			&launchEmulator("urel","wins");
+    			exit(0);
+			}
+
+		if (lc($ARGV[1]) eq "-winscw")
+			{
+    			&launchEmulator("urel","winscw");
+    			exit(0);
+			}
+		}	
+	
+	if (lc($ARGV[0]) eq "-winscw")
+		{
+		if (lc($ARGV[1] eq "-rel"))
+			{
+			&launchEmulator("urel","winscw");
+			exit(0);	
+			}
+		}
+	
+	if (lc($ARGV[0]) eq "-wins")
+		{
+		if (lc($ARGV[1] eq "-rel"))
+			{
+			&launchEmulator("urel","wins");
+			exit(0);	
+			}
+		}	
+	}
+
+# Error, unknown argument.
+&printHelp;
+die "ERROR: Unknown argument " . "\"" . $ARGV[0] . "\".\n";
+
+sub launchEmulator
+{
+    my ($type,$win) = @_;
+
+    my $epocroot = &getEpocroot;
+    my $drive = &getDrive;
+    my $emu = $drive . $epocroot . "epoc32" . "\\" 
+	      . "release\\" . $win . "\\" . $type . "\\" . "epoc.exe";
+    -e $emu ||
+	die "ERROR: File \"$emu\" not found.\n\n" .
+	    "The EPOCROOT environment variable does not identify\n" .
+	    "a valid Symbian emulator installation on this drive.\n" . 
+		"EPOCROOT must be an absolute path to an existing\n" .
+		    "directory - it should have no drive qualifier and\n" .
+			"must end with a backslash.\n";
+    # If the execute is successful, this never returns.
+    exec("\"" . $emu . "\"") || die "Failed to execute the emulator \"$emu\": $!";
+}
+
+sub printHelp
+{
+    print "Symbian Platform Emulator Launcher\n";
+    print "Syntax :\tepoc [-rel] [-wins|-winscw] [-version] [-help]\n";
+    print "(no options)\tLaunch active winscw debug emulator\n";
+    print "-rel\t\tLaunch active release emulator\n";
+    print "-wins\t\tLaunch active wins emulator\n";
+    print "-winscw\t\tLaunch active winscw emulator\n";
+    print "-version\tDisplay active emulator details\n";
+    print "-help\tOutput this help message\n";
+}
+
+sub printVersion
+{
+    my $epocroot = &getEpocroot;
+    my $drive = &getDrive;
+
+    my $binfo = $drive . $epocroot . "epoc32" . "\\" 
+	        . "data" . "\\" . "BuildInfo.txt";
+
+    -e $binfo || die "ERROR: File \"" . $binfo . "\" does not exist.\n";
+    open(IFILE, $binfo) ||
+	die "ERROR: Failed to open file \"" . $binfo . "\": $!";
+
+    my $DeviceFamily = "";
+    my $DeviceFamilyRev = "";
+    my $ManufacturerSoftwareRev = "";
+    my $ManufacturerSoftwareBuild = "";
+
+    while(<IFILE>) {
+	if(/DeviceFamily\s+(.*\S)\s*$/i) {
+	    $DeviceFamily = $1;
+	}
+	if(/DeviceFamilyRev\s+(.*\S)\s*$/i) {
+	    $DeviceFamilyRev = $1;
+	}
+	if(/ManufacturerSoftwareRev\s+(.*\S)\s*$/i) {
+	    $ManufacturerSoftwareRev = $1;
+	}
+	if(/ManufacturerSoftwareBuild\s+(.*\S)\s*$/i) {
+	    $ManufacturerSoftwareBuild = $1;
+	}
+    }
+
+    close(IFILE);
+
+    #
+    # Verify that we got everything we should have.
+    #
+    $DeviceFamily ne "" ||
+	die "ERROR: Device family not specified in file \"" . $binfo .
+	    "\".\n";
+    $DeviceFamilyRev ne "" ||
+	die "ERROR: Device family revision not specified in file \"" . $binfo .
+	    "\".\n";
+    $ManufacturerSoftwareBuild ne "" ||
+	die "ERROR: Manufacturer software build not specified in file \"" .
+	    $binfo . "\".\n";
+
+    $Revision = (($ManufacturerSoftwareRev eq "")?($DeviceFamilyRev):
+		 ($ManufacturerSoftwareRev));
+
+    $DeviceFamily = getDFRDName($DeviceFamily);
+
+    #
+    # Make the standard revision representation prettier,
+    # but leave other representations untouched.
+    #
+    if($Revision =~ /^0x([0-9])([0-9][0-9])$/) {
+	$Revision = $1 . "." . $2;
+    }
+   
+    print $DeviceFamily . " " .
+	"version " . $Revision . " " .
+	    "build " . $ManufacturerSoftwareBuild . "\n";
+}
+
+#
+# Determines, validates, and returns EPOCROOT.
+#
+sub getEpocroot
+{
+    my $epocroot = $ENV{EPOCROOT};
+    die "ERROR: Must set the EPOCROOT environment variable.\n"
+	if (!defined($epocroot));
+    $epocroot =~ s-/-\\-go;	# for those working with UNIX shells
+    die "ERROR: EPOCROOT must be an absolute path, " .
+	"not containing a drive letter.\n" if ($epocroot !~ /^\\/);
+    die "ERROR: EPOCROOT must not be a UNC path.\n" if ($epocroot =~ /^\\\\/);
+    die "ERROR: EPOCROOT must end with a backslash.\n" if ($epocroot !~ /\\$/);
+    die "ERROR: EPOCROOT must specify an existing directory.\n" 
+	if (!-d $epocroot);
+    return $epocroot;
+}
+
+#
+# Determines and returns the current drive, if any.
+#
+sub getDrive
+{
+    my $wd = cwd;
+    my $drive;
+    if($wd =~ /^([a-zA-Z]:)/) {
+	$drive = $1;
+    } else {
+	# Perhaps we're on a machine that has no drives.
+	$drive = "";
+    }
+    return $drive;
+}
+
+#
+# The DFRD may be represented by a numeric value, as defined by HAL.
+# Changes known numeric values to the name of the DFRD,
+# and leaves all other values untouched.
+#
+sub getDFRDName
+{
+    my $dfrd = shift;
+    return "Crystal" if $dfrd eq "0";
+    return "Pearl" if $dfrd eq "1";
+    return "Quartz" if $dfrd eq "2";
+    return $dfrd; # as fallback
+}